/*droppingText0416_1611 
revisions: jiggleText(); alexEffect(); droppingTextMaster();droppingTextSlave(); textEFX()*/
 
var j = new Array();

function textEFX() { 
	   		
	droppingTextMaster.dropWordArray = new Array()
	jiggleText.jiggleTextArray = new Array()
	alexEffectMaster.alexEffectArray = new Array()
	
	var spanElementsArray = document.getElementsByTagName('span');
	var numSpanElements = spanElementsArray.length
	
	

	for (var i = 0; i < numSpanElements; i++) {
	
		if (spanElementsArray[i].id && document.getElementById) { // only for elements with id names -- catches Safari bug
			
			var speed = null
			if ((spanElementsArray[i].id).search("slothful") != -1)
				speed = "slothful"
			else if ((spanElementsArray[i].id).search("slow") != -1)
				speed = "slow"
			else if ((spanElementsArray[i].id).search("fast") != -1)
				speed = "fast"
			else if ((spanElementsArray[i].id).search("exuberant") != -1)
				speed = "exuberant"
			else
				speed = "medium"
		
			if ((spanElementsArray[i].id).search("none") != -1) {
			
				spanElementsArray[i].style.visibility = "visible";
				
			} 
			if ((spanElementsArray[i].id).search("expand") != -1) {
			
				spanElementsArray[i].style.visibility = "visible";
				j[j.length] = spanElementsArray[i];
				
			} 
			if ((spanElementsArray[i].id).search("jiggle") != -1) {
				
				var jiggleSpeed = null;
				switch(speed) {
					case 'slothful':
						jiggleSpeed = 200;
					break;
					case 'slow':
						jiggleSpeed = 100;
					break;
					case 'medium':
						jiggleSpeed = 60;
					break;
					case 'fast':
						jiggleSpeed = 30;
					break;
					case 'exuberant':
						jiggleSpeed = 10;
					break;
				}
				
				jiggleText.jiggleTextArray[jiggleText.jiggleTextArray.length] = new Array(spanElementsArray[i],jiggleSpeed,jiggleSpeed,0,2);
				spanElementsArray[i].style.position = "relative"
				spanElementsArray[i].style.visibility = "visible"	
							
			} 			
			if ((spanElementsArray[i].id).search("alexEffect") != -1) {

				
				var alexSpeed = null;
				switch(speed) {
					case 'slothful':
						alexSpeed = 2;
					break;
					case 'slow':
						alexSpeed = 5;
					break;
					case 'medium':
						alexSpeed = 10;
					break;
					case 'fast':
						alexSpeed = 20;
					break;
					case 'exuberant':
						alexSpeed = 30;
					break;
				}
			
				alexEffectMaster.alexEffectArray[alexEffectMaster.alexEffectArray.length] = new Array(spanElementsArray[i],alexSpeed);
				spanElementsArray[i].style.visibility = "visible";
							
			} else if ((spanElementsArray[i].id).search("dropWord") != -1) {
				
				var dropSpeed = null;
				switch(speed) {
					case 'slothful':
						dropSpeed = 5;
					break;
					case 'slow':
						dropSpeed = 20;
					break;
					case 'medium':
						dropSpeed = 40;
					break;
					case 'fast':
						dropSpeed = 60;
					break;
					case 'exuberant':
						dropSpeed = 80;
					break;
				}
				
		    	if ((spanElementsArray[i].id).search("bottom") != -1){ 	
					var browserName=navigator.appName; 
					if (browserName=="Netscape") //disable "fly from bottom" effect  for  netscape browsers (incompatible at this time)
					{ 
						 spanElementsArray[i].style.visibility = "visible";
					}
					else {
						droppingTextMaster.dropWordArray[droppingTextMaster.dropWordArray.length] = new Array(spanElementsArray[i],"bottom",20,3,dropSpeed);
					}
				}
				else if ((spanElementsArray[i].id).search("left") != -1) 
		    		droppingTextMaster.dropWordArray[droppingTextMaster.dropWordArray.length] = new Array(spanElementsArray[i],"left",20,3,dropSpeed);
		    	else if ((spanElementsArray[i].id).search("right") != -1) 
		    		droppingTextMaster.dropWordArray[droppingTextMaster.dropWordArray.length] = new Array(spanElementsArray[i],"right",20,3,dropSpeed);
		    	else if ((spanElementsArray[i].id).search("random") != -1){ 
					var browserName=navigator.appName; 
					if (browserName=="Netscape") //disable "random" effect for  netscape browsers (incompatible at this time)
					{ 
						spanElementsArray[i].style.visibility = "visible";
					}
					else {
						droppingTextMaster.dropWordArray[droppingTextMaster.dropWordArray.length] = new Array(spanElementsArray[i],"random",20,3,dropSpeed);
				   }
				}
				else
		    		droppingTextMaster.dropWordArray[droppingTextMaster.dropWordArray.length] = new Array(spanElementsArray[i],"top",20,3,dropSpeed); // default
			} 
			
		} else
			spanElementsArray[i].style.visibility = "visible";
	
	} 			
	
	expandText(-20);
	Blink()
	alexEffectMaster()
	droppingTextMaster()	
	jiggleText()
	Marquee()
	
					
}


	   
// parameters used to set jiggleText.jiggleTextArray
// 0: element
// 1: jiggle repeat (ms)
// 2: used as a counter -- set to same as jiggle speed
// 3: used to track offset -- set to zero
// 4: jiggle amount
// jiggleText() is a function that calls itself repeatedly to make text elements jiggle back and forth.
// An array of all the elements to jiggle is cycled through each time jiggleText is called.	   
function jiggleText() {

	jiggleText.jiggleTextArray
	var refreshSpeed = 10 // base refresh spped

	var numSentences = jiggleText.jiggleTextArray.length
	
	for (var i=0; i < numSentences; i++ ) { // Cycles through each sentence
	
		var currElement = jiggleText.jiggleTextArray[i][0] // Sets current element
		
		if (jiggleText.jiggleTextArray[i][2] <= 0) { // if time for jiggling
			if (jiggleText.jiggleTextArray[i][3] != 0) { // if current offset is non-zero
				jiggleText.jiggleTextArray[i][3] = 0 //set offset to zero
				currElement.style.left = jiggleText.jiggleTextArray[i][3]
			} else { // if current offset is zero
				jiggleText.jiggleTextArray[i][3] = jiggleText.jiggleTextArray[i][4] // reset offset to base
				currElement.style.left = jiggleText.jiggleTextArray[i][3]
			}
			jiggleText.jiggleTextArray[i][2] = jiggleText.jiggleTextArray[i][1]; // reset countdown
		} else 
			jiggleText.jiggleTextArray[i][2] = jiggleText.jiggleTextArray[i][2] - refreshSpeed // decrease countdown
					
	}	
	
	setTimeout("jiggleText();",refreshSpeed)
}



	   
function alexEffectMaster() {
	
	alexEffectMaster.alexEffectArray
	
	alexEffectMaster.numSentences = alexEffectMaster.alexEffectArray.length
	
	for (var i=0; i < alexEffectMaster.numSentences; i++ ) {
		
		var letters = alexEffectMaster.alexEffectArray[i][0].innerHTML.split("")
		
			
		var numLetters = letters.length	
		alexEffectMaster.alexEffectArray[i][2] = numLetters
		
		
		for (var j=0; j<numLetters; j++) 
			letters[j] = "<span style=\"position:relative;top:0;left:0;\" id=\"alex"+normNum(i,3)+normNum(j,3)+"\">" +  letters[j] + "<\/span>"			
		
		alexEffectMaster.alexEffectArray[i][0].innerHTML = letters.join("")	
		
		
		
		for (var j=0; j<numLetters; j++) {
			
			var moveThisCharVal = "alex" + normNum(i,3) + normNum(j,3)
			var moveThisChar = document.getElementById(moveThisCharVal)
			
			var moveToCharVal = ""
			
			var check2 = true
			
			
			while (check2 == true ) {
				moveToCharVal = "alex" + normNum(i,3) + normNum(Math.round(Math.random() * (numLetters-1)),3)
				if (moveToCharVal != moveThisCharVal)
					check2 = false
			}
		
			var moveToChar = document.getElementById(moveToCharVal)
			
			var holdX = getAbsX(moveThisChar)
			var holdX2 = getAbsX(moveToChar)

			var moveVal = holdX2 - holdX
			
			moveThisChar.style.left = parseInt(moveThisChar.style.left) + moveVal				
			moveToChar.style.left = parseInt(moveToChar.style.left) - moveVal	
			

		}	
				
	}
	
	alexEffectSlave()
	
	return 0;
}

function alexEffectSlave() {	
	
	var check = 0;
	
	for (var i=0; i < alexEffectMaster.numSentences; i++ ) {	
		
		var letters = alexEffectMaster.alexEffectArray[i][2]
		var stepSize = alexEffectMaster.alexEffectArray[i][1]
		
		
		for (var j=0; j < letters; j++) {

			var currElement = document.getElementById("alex" + normNum(i,3) + normNum(j,3))
			var currOffsetHorizontal = parseInt(currElement.style.left)
			
			// Horizontal Offset
			if (currOffsetHorizontal != 0) { // if horizontal offset is non-zero, adjust offset toward zero
				if (currOffsetHorizontal < -(2*stepSize))
					currElement.style.left = currOffsetHorizontal + (2*stepSize)
				else if (currOffsetHorizontal < -stepSize)
					currElement.style.left = currOffsetHorizontal + stepSize
				else if (currOffsetHorizontal > (2*stepSize))
					currElement.style.left = currOffsetHorizontal - (2*stepSize)
				else if (currOffsetHorizontal > stepSize)
					currElement.style.left = currOffsetHorizontal - stepSize
				else
					currElement.style.left = 0 // ensures that text is not moved too far
			
				//if (ieWorkaround == true)
					//currElement.innerHTML = currElement.innerHTML

			}
			
			if (check == 0)				
				if (parseInt(currElement.style.left) != 0)
					check++	// if any one letter is still non, zero, modify check
		}
		
	}
	
	if (check > 0)
		setTimeout("alexEffectSlave();",5)

	return 0;
}




// Simple browser detection for IE. IE has a flaw drawing re-positioned elements -- 
// the workaround substantially increases the work done by the script, so we detect it here
// and skip the workaround for all other browsers.
var browserVersion = navigator.appVersion
var ieWorkaround = false

if (browserVersion.search("MSIE") != -1)
	ieWorkaround = true


// Adds leading zeros to the beginning of a number
function normNum(original,numDigits) {
	var tempLength = original.toString().length

	while ( tempLength < numDigits ) {	
		original = "0" + original
		tempLength++
	}	
	return(original)
}

// This function re-formats the SPAN elements from the dropWordArray, slicing the sentence
// apart and making each word addressable through a unique id. It sets the initial position
// of all the words, makes them visible, and calls droppingTextSlave(), initiating the
// motion.
// Options for textDirection: top, bottom, left, right, random
// textStaggeringFactor & textDecay factor take any number. 0-3 or so look good, anything beyond wasteful
function droppingTextMaster() {

		
	// Browser width and height
	var pageHeight = findPageHeight();
	var pageWidth = findPageWidth();
	
	droppingTextMaster.dropWordArray // An array containing all the sentences
	droppingTextMaster.allElements = new Array(); // A list of names of all elements to be moved	
	
	var numSentences = droppingTextMaster.dropWordArray.length // Number of sentences to be split
	

	for (var i=0; i < numSentences; i++ ) { // Cycles through each sentence
		
		var text = ""

		var prelim = (droppingTextMaster.dropWordArray[i][0].innerHTML).replace(/ \/>/g, "\>") // for pesky fulfillment people who use html
		var words = prelim.split(' ');

		for (var j=0; j<words.length; j++) { // loop through each word of the sentence and format new sentence	
			text = text + "<span style=\"position:relative;top:0;\" id=\"drop"+normNum(i,3)+normNum(j,3)+"\"> " + words[j] + " <\/span>"
			
			var newPos = droppingTextMaster.allElements.length
			droppingTextMaster.allElements[newPos] = new Array()
			droppingTextMaster.allElements[newPos][0] = "drop" + normNum(i.toString(),3) + normNum(j.toString(),3) // puts the name of every word
			droppingTextMaster.allElements[newPos][1] = droppingTextMaster.dropWordArray[i][4] // into allElements array
		}
		
		droppingTextMaster.dropWordArray[i][0].innerHTML = text // commit re-formatted sentence
		
		var wordsInSentence = words.length		
		
		var currStyle = droppingTextMaster.dropWordArray[i][1]
		var currStagger = droppingTextMaster.dropWordArray[i][2]
		var currDecay = droppingTextMaster.dropWordArray[i][3]
		
		for ( var j=0; j < wordsInSentence; j++) { // cycles through each word of the sentence
		
			var currElement = document.getElementById("drop" + normNum(i.toString(),3) + normNum(j.toString(),3))
					
			if ( currStyle == "top" )
				currElement.style.top = -(getAbsY(currElement) + 80) + (j*-currStagger) + (j*j*-currDecay) + (i*-50) // sets position
			else if ( currStyle == "bottom" )
				currElement.style.top = pageHeight - getAbsY(currElement) + 20 + (j*currStagger) + (j*j*currDecay) + (i*50)
			else if ( currStyle == "right" )
				currElement.style.left = pageWidth + 20 + (j*currStagger) + (j*j*currDecay) 
			else if ( currStyle == "left" )
				currElement.style.left = -(getAbsX(currElement) + (j*currStagger) + (j*j*currDecay))
			else if ( currStyle == "random" ) {
				currElement.style.top = (pageHeight * Math.random()) - getAbsY(currElement)
				currElement.style.left = (pageWidth * Math.random() ) - getAbsX(currElement)
			}	
				
			if ( ieWorkaround == true )
				currElement.innerHTML = currElement.innerHTML
			
			currElement.style.visibility = "visible" // make element visible		
			
		}
	}		

	droppingTextSlave()
	
	return 0;

}


// This function moves offset elements back to their original position.
function droppingTextSlave() {
	
	var check = 0 
	
	var numElements = droppingTextMaster.allElements.length
	
	for (var i=0; i < numElements ; i++) { // cycles through all the words
		
		var stepSize = droppingTextMaster.allElements[i][1]
	
		var currElement = document.getElementById(droppingTextMaster.allElements[i][0])
	
		var currOffsetVertical = parseInt(currElement.style.top)
		var currOffsetHorizontal = parseInt(currElement.style.left)
	
		// Vertical Offset
		if (currOffsetVertical != 0) { // if vertical offset is non-zero, adjust offset toward zero
			if (currOffsetVertical < -stepSize)
				currElement.style.top = currOffsetVertical + stepSize
			else if (currOffsetVertical > stepSize)
				currElement.style.top = currOffsetVertical - stepSize
			else
				currElement.style.top = 0 // ensures that text is not moved too far
			
			if (ieWorkaround == true)
				currElement.innerHTML = currElement.innerHTML
		
		if (check == 0)				
			if (parseInt(currElement.style.top) != 0)
				check++	// if any one word is still non, zero, modify check
		}
		
		// Horizontal Offset
		if (currOffsetHorizontal != 0) { // if horizontal offset is non-zero, adjust offset toward zero
			if (currOffsetHorizontal < -stepSize)
				currElement.style.left = currOffsetHorizontal + stepSize
			else if (currOffsetHorizontal > stepSize)
				currElement.style.left = currOffsetHorizontal - stepSize
			else
				currElement.style.left = 0 // ensures that text is not moved too far
			
			if (ieWorkaround == true)
				currElement.innerHTML = currElement.innerHTML
		
		if (check == 0)				
			if (parseInt(currElement.style.left) != 0)
				check++	// if any one word is still non, zero, modify check
		}
				
	}
	
	if (check > 0)
		setTimeout("droppingTextSlave();",50) // calls itself if any words are not zeroed
		
	return 0;
	
}


// get the true offset of anything on NS4, IE4/5 & NS6
function getAbsX(elt) { 
	return (elt.x) ? elt.x : getAbsPos(elt,"Left"); 
}
function getAbsY(elt) { 
	return (elt.y) ? elt.y : getAbsPos(elt,"Top"); 
}
function getAbsPos(elt,which) {
	iPos = 0;
 	while (elt != null) {
  		iPos += elt["offset" + which];
  		elt = elt.offsetParent;
 	}
 	return iPos;
}

// returns the page width / height
function findPageHeight() {
	if (window.innerHeight != null )
		return window.innerHeight;
	if (document.body.clientHeight != null )
		return document.body.clientHeight;
	return(null);
}
function findPageWidth() {
	if (window.innerWidth != null )
		return window.innerWidth;
	if (document.body.clientWidth != null )
		return document.body.clientWidth;
	return(null);
}

	   
function expandText(amount) {

	 amount++;
	   		
	 for (var i=0; i< j.length ; i++)		
	 j[i].style.letterSpacing = amount;
	   			
	 if (amount < 0) {
	   	setTimeout("expandText(" + amount + ");",50);
	   	
	  }
           		
     return 0;
}

/*This function sorts <Blink> elements by tag name and searches by ID's to determine speed. Blink() then passes the appropriate elements to doBlink(). doBlink() threads are activated at specified intervals for each speed.*/ 
function Blink() {

	var a = document.getElementsByTagName('blink');
	if(document.getElementById){	
		for (var i=0; i< a.length; i++) {
			if (a[i].id) {		
				if ((a[i].id).search("slothful") != -1){
						eval('setInterval("doBlink(' + i + ')",2000)');
					}	
				else if ((a[i].id).search("slow") != -1){
						eval('setInterval("doBlink(' + i + ')",1000)');
					}
				else if ((a[i].id).search("medium") != -1){
						eval('setInterval("doBlink(' + i + ')",500)');
					}  
				else if ((a[i].id).search("fast") != -1){
						eval('setInterval("doBlink(' + i + ')",250)');
					}
				else if ((a[i].id).search("exuberant") != -1){
						eval('setInterval("doBlink(' + i + ')",100)');
					}
				}
			}
		}
}	

/*This function recieves elements from Blink() and alternates visibility */
function doBlink(index)
{
	var a = document.getElementsByTagName('blink');

	if (a[index].style.visibility == "hidden")
		a[index].style.visibility = "visible";
	else
		a[index].style.visibility = "hidden";
}

/*This function sorts marquee elements by tag Name, and serches the ID array for keywords to determine speed. Loops for each speed setting adjust scrollAmmount and scrollDelay for browsers which support marquees.*/
function Marquee() {
	if(document.getElementById)
    {
		var obj = document.getElementsByTagName("marquee");
        for (var i=0; i< obj.length; i++)
        {  
			obj[i].style.visibility="visible";
			
            if ((obj[i].id).indexOf("slothful") != -1)
				obj[i].scrollAmount=1;
            else if ((obj[i].id).indexOf("slow") != -1)
				obj[i].scrollAmount=10;
            else if ((obj[i].id).indexOf("fast") != -1)
                obj[i].scrollAmount=30;
            else if ((obj[i].id).indexOf("exuberant") != -1)
				obj[i].scrollAmount=75;
		}
	}
}	
