
<!--
/*
+----------------------------------+
|          MessageMorph            |
|              V1.01               |
|            by QarnoS             |
| This program is free for all to  |
| use on the condition that this   |
| message is left intact.          |
|                                  |
| http://www.geocities.com/~qarnos |
+----------------------------------+
*/

var morphOn=true;

function MakeArray(num) {
        this.length = num
        for (var i = 0; i <this.length; i++) {
        this[i+1] = 0}
}

/* This function is called whenever the message is updated - modify these
lines if you need to re-direct the output. At the moment it is set to display
the message in the window and ALL it's frames (if any) - this reduces the
message flicker when the mouse is moved around. */

function ShowMessage(TextHere) {
if (morphOn==true) {
self.window.status=TextHere;
for (var i=0; i<top.frames.length; i++) {
if (navigator.appName!='Microsoft Internet Explorer') {top.frames[i].defaultStatus=TextHere};
}}}

function MessageMorph(MessageText) {
LSP   = 0;
MSP   = 0;
CurrentText='';
PrefixText='';
LetterCount=0
LetterOffset=0;
Uncoded='';
FlashCycles=0;
CycleCount=0;
Direction=0;
var GoAgain=setTimeout("", 10);
ShowOff(MessageText)}

// This routine decodes the argument list.
function ShowOff(MessageText) {
if (morphOn==true) {
uncoded=MessageText;
var cont=true;
while (cont==true) {
var Prefix=uncoded.substring(MSP, MSP+1);

// This checks to see if it's a control
if (Prefix=='^') {
var Type=uncoded.substring(MSP+1, MSP+2);
if (Type=='C') {CurrentText='';PrefixText='';MSP++}             // Clear text, that was simple enough
if (Type=='D') {PrefixText=PrefixText+CurrentText; CurrentText='';MSP++}

if (Type=='M') {LetterCount=0;
                Direction=(uncoded.substring(MSP+2, MSP+3)=='R') ? 1 : 0;
                FlashCycles=uncoded.substring(MSP+3, MSP+4)
                LetterOffset=0;
                MSP=MSP+3;
                cont=false;
                Scrolly();}

if (Type=='S') {MSP++;
                ShowMessage(PrefixText+CurrentText);
                }

if (Type=='P') {var HalfSecs=uncoded.substring(MSP+2, MSP+3)*500;
                cont=false;
                MSP=MSP+2;
                var Pause=setTimeout("ShowOff(uncoded)", HalfSecs);
                }


if (Type=='B') {LetterCount=1;
                LetterOffset=5;
                BuildRightToLeft();
                cont=false;MSP++}

if (Type=='F') {FlashCycles=uncoded.substring(MSP+2, MSP+3)*2
                CycleCount=0;
                MSP=MSP+2;
                cont=false;
                Flash();}

if (Type=='W') {Direction=(uncoded.substring(MSP+2, MSP+3)=='L') ? 1 : 0;
                LetterCount=(Direction==1) ? CurrentText.length : 0
                cont=false;
                MSP=MSP+2;
                Wave();
                }

if (Type=='X') {FlashCycles=uncoded.substring(MSP+2, MSP+3);
                LetterOffset=0;
                Direction=1;
                cont=false;
                MSP=MSP+2;
                Stretch();
                }

if (Type=='L') {                                        // Christ! It's a loop. Is it starting or finishing?
        Start=(uncoded.substring(MSP+2, MSP+3)!='0');
        if (Start==true) {                              // Starting...
        LSP++;
        Loops[(LSP*2)-1]=uncoded.substring(MSP+2, MSP+3);
        Loops[LSP*2]=MSP+3;
        MSP=MSP+2;} else {
        Loops[(LSP*2)-1]--;
        if (Loops[(LSP*2)-1]==0) {LSP--;MSP=MSP+2} else
        {MSP=Loops[LSP*2]-1}
}}

if (Type=='^') {CurrentText+='^';MSP++};

if (Type=='*') {MSP=-1}

} else {CurrentText+=Prefix;}
if (MSP>uncoded.length) {cont=false};
MSP++;
}}}

function BuildRightToLeft() {
var ThisText=CurrentText.substring(0, LetterCount);
for (var i=0; i<LetterOffset; i++) {ThisText+=' ';}
ThisText+=CurrentText.substring(LetterCount, LetterCount+1);
LetterOffset--;
if (LetterOffset<=1) {
LetterCount++;
if (CurrentText.substring(LetterCount,LetterCount+1)==' ') {LetterCount++};
LetterOffset=5;
}
ShowMessage(PrefixText+ThisText);
if (LetterCount<=CurrentText.length) {var GoAgain=setTimeout("BuildRightToLeft()", 50)} else {ShowOff(uncoded)};
}


function Flash() {
var ShowIt = (CycleCount/2==Math.round(CycleCount/2)) ? true : false;
if (ShowIt==true) {
ShowMessage(PrefixText+CurrentText);
} else {
ShowMessage(PrefixText);
}
CycleCount++;
if (CycleCount<=FlashCycles) {var GoAgain=setTimeout("Flash()", 500)} else {ShowOff(uncoded)}
}


function Wave() {
var ThisText=CurrentText.substring(0, LetterCount)+CurrentText.substring(LetterCount, LetterCount+1).toUpperCase()+CurrentText.substring(LetterCount+1, CurrentText.length+1);
upDateText=PrefixText+ThisText;
ShowMessage(PrefixText+ThisText);
if (Direction==0) {
LetterCount++
if (LetterCount==CurrentText.length) {ShowOff(uncoded)} else {var GoAgain=setTimeout("Wave()", 100)}}
else {
LetterCount--
if (LetterCount==-1) {ShowOff(uncoded)} else {var GoAgain=setTimeout("Wave()", 100)}}
}

function Stretch() {
var Spaces='';
var ThisText='';
for (var i=0; i<LetterOffset; i++) {Spaces+=' '};
for (var i=0; i<=CurrentText.length; i++) {
ThisText+=CurrentText.substring(i, i+1)+Spaces;
}
upDateText=PrefixText+ThisText;
ShowMessage(PrefixText+ThisText);
LetterOffset=LetterOffset+Direction;
if (LetterOffset==FlashCycles) {Direction=-1}
if (LetterOffset!=-1) {var GoAgain=setTimeout("Stretch()", 50)} else {ShowOff(uncoded)}
}

function Scrolly() {
var Spaces='';
for (var i=0; i<40; i++) {Spaces+=' '}
var ScrollyText=CurrentText+Spaces;
var ThisText=ScrollyText.substring(LetterCount, ScrollyText.length+1);
var StopAt=FlashCycles;
if (Direction==1) {StopAt++}
ThisText+=ScrollyText.substring(0, LetterCount);
upDateText=PrefixText+ThisText;
ShowMessage(PrefixText+ThisText);
if (Direction==0) {LetterCount++} else {LetterCount--};
if (LetterCount>ScrollyText.length) {LetterCount=0;LetterOffset++};
if (LetterCount<0) {LetterCount=ScrollyText.length;LetterOffset++};
if (LetterOffset<StopAt) {var GoAgain=setTimeout("Scrolly()", 50)} else {ShowOff(uncoded)};
}

// These are the global variables
var Loops = new MakeArray(100);
var LSP   = 0;
var MSP   = 0;
var CurrentText='';
var PrefixText='';
var LetterCount=0
var LetterOffset=0;
var Uncoded='';
var FlashCycles=0;
var CycleCount=0;
var Direction=0;

// -->

