// CSS-SPRITESHEET LCD SCROLLER, (C)2011 SIMON PITTOCK, APEX WEB WORKS
// THIS SCRIPT AND ITS RESOURCES MAY NOT BE USED, ALTERED, REPRODUCED, SOLD OR RESOLD WITHOUT THE AUTHOR'S EXPRESS PERMISSION
var lcdSpriteChar = 16, lcdBlank = 0, lcdLexicon = '~ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+-*/=.[]"\'!@:\\, ';
var lcdMessage = '¦C¦Welcome to the new Click Convention 2011 website!¦T¦~';
var lcdChars = 62, lcdPrefix = 'lCh', lcdInlinePause = 2000, lcdPostHold = 0, lcdScrollSpeed = 90, lcdMsgPadChar = ' ';
var lcdMsgArray = new Array(), lcdObjArray = new Array(lcdChars);
var lcdMsgStep = 0, lcdMsgStepFlag = 0, lcdTimer, lcdCutoffZone = 100;

function startLCD(){
	//RENDER THE INITIAL HTML TO THE PAGE
	var lcdCont = document.getElementById('lcdCont');
	var lcdCharWidth = 12, lcdCharHeight = 24, lcdCharSpace = 2, lcdXOffset = -1;
	var lcdCurve = 1, lcdCurveRate = 190;
	var i, temDiv, temClone, temStyle, temWidth, temParentWidth, temHalfChars = lcdChars / 2, temCurve, temMaxCurve, tema;
	
	//SET UP THE CUTOFF ZONE, WHICH IF SCROLLED PAST WILL FREEZE RENDERING FOR EFFICIENCY
	lcdCutoffZone = lcdCutoffZone + lcdCont.offsetTop;
	
	//COPY ANY CONTENT FROM THE DIV TO THE SCROLLER
	tema = document.getElementById('lcdMessage').innerHTML.toString();
	if(tema.length > 0){
		lcdMessage = tema;
		
	}

//	return false;
	
	//EXIT THIS IF IS IE AND VERSION <= 7
	if((isIE) && (isIEver <= 7)){
		return false;
		
	}
	//SET THE CORRECT LEFT-PADDING TO ALIGN THE DIGITS CENTRALLY
	temWidth = (lcdChars * (lcdCharWidth + lcdCharSpace)) - lcdCharSpace;
	temParentWidth = lcdCont.parentNode.clientWidth;
	
	lcdCont.style.width = temWidth + 'px';
	lcdCont.style.left = (((temParentWidth - temWidth) / 2) + lcdXOffset) + 'px';

	//CALCULATE THE MAXIMUM CURVATURE DEVATION FROM X=0
	temMaxCurve = temHalfChars  *(temHalfChars / lcdCurveRate);
	
	//SEARCH FOR THE INDEX OF THE BLANK CHARACTER (SPACE) AND STORE IN GLOBAL SCOPE VARIABLE
	lcdBlank = lcdLexicon.indexOf(' ');
	
	//CREATE AND CONFIGURE A NEW IMAGE ELEMENT
	temDiv = document.createElement('div');
	temDiv.setAttribute('class', 'lcdChar');

	lcdCont.innerHTML = '';
	
	//RENDER THE LCD DISPLAY TO THE DOM
	for (i=0; i<lcdChars; i++){
		temClone = temDiv.cloneNode(true);
		temClone.setAttribute('id', lcdPrefix + i);
		
		temStyle = 'width: ' + lcdCharWidth + 'px; height: ' + lcdCharHeight + 'px; '
		temStyle = temStyle + 'background-position: -' + (lcdLexicon.indexOf(' ') * lcdSpriteChar) + 'px 0px; ';

		//CALCULATE DEVATION FROM X=0 ACCORDING TO CURVE PARAMETERS
		if (lcdCurve == 1){
			temCurve = i - temHalfChars;
			temCurve = temCurve * (temCurve / lcdCurveRate);
			temStyle = temStyle + 'top: ' + (temMaxCurve - temCurve) + 'px; ';
		}

		if(i == lcdChars-1){
			temStyle = temStyle + 'margin-right: 0px;'
		}else{
			temStyle = temStyle + 'margin-right: ' + lcdCharSpace + 'px;'
		}
		
		temClone.setAttribute('style', temStyle + '');
		
		//APPEND ELEMENT TO THE DIV
		lcdCont.appendChild(temClone);
		
		//ADD REFERENCE TO THE OBJECT TO lcdObjArray
		lcdObjArray[i] = document.getElementById(lcdPrefix + i);
	}
	
	//MAKE THE LCD DISPLAY CONTAINER VISIBLE
	lcdCont.style.visibility = 'visible';
	
	//INDEX THE MESSAGE AS SPRITESHEET POSITIONS
	indexLCD();
	
	//RETRIEVE THE POSITION FROM COOKIE IF SET
	storeLCDPos(0);
	
	//TRIGGER DISPLAY REFRESH ROUTINE
	redrawLCD();
	
	//ANIMATE THE DISPLAY
	animateLCD();
}

function indexLCD(){
	var i = 0, temPadIndex = -1 * (lcdLexicon.indexOf(lcdMsgPadChar) * lcdSpriteChar), temIndexOf = -1, temIndexOfTerminus = -1, tema, temCentreLen = 0, temCentrePadL, temCentrePadR;
	
	//SET MESSAGE TO ALL UPPER CASE CHARACTERS
	lcdMessage = lcdMessage.toUpperCase() + lcdMsgPadChar;
	
	//REPLACE CONTROL CHARACTERS IN MESSAGE STRING
	while((i < lcdMessage.length) && (lcdMessage.indexOf('¦P¦') != -1)){
		lcdMessage = lcdMessage.replace('¦P¦', repeatString(lcdChars));
		i++;

	}

	i = 0;
	while((i < lcdMessage.length) && (lcdMessage.indexOf('¦R¦') != -1)){
		temIndexOf = lcdMessage.indexOf('¦R¦');
		tema = parseInt(lcdMessage.substr(temIndexOf + 3, 2), 10);
		lcdMessage = lcdMessage.slice(0, temIndexOf) + repeatString(tema) + lcdMessage.slice(temIndexOf + 5, lcdMessage.length);
		
		i++;
	}
	
	while((i < lcdMessage.length) && (lcdMessage.indexOf('¦C¦') != -1)){
		//PARSE MESSAGE FOR CENTRE ALIGNMENT CODES ¦C¦ AND TERMINAL ¦T¦ ENCASING BLOCKS OF TEXT
		temIndexOf = lcdMessage.indexOf('¦C¦');
		temIndexOfTerminus = lcdMessage.indexOf('¦T¦', temIndexOf);
		temCentreLen = temIndexOfTerminus - temIndexOf - 3;
		temCentrePadL = parseInt((lcdChars - temCentreLen) / 2, 10);
		temCentrePadR = lcdChars - temCentreLen - temCentrePadL;

		lcdMessage = lcdMessage.substring(0, temIndexOf) + '~' + repeatString(temCentrePadL - 1) + lcdMessage.substr(temIndexOf + 3, temCentreLen) + repeatString(temCentrePadR) + lcdMessage.substring(temIndexOfTerminus + 3, lcdMessage.length);
		//alert('TIO=' + temIndexOf + ', TIOT=' + temIndexOfTerminus + ', TCL=' + temCentreLen + ', PL=' + temCentrePadL + ', PR=' + temCentrePadR);
		
		//lcdMessage = lcdMessage.slice(0, temIndexOf) + repeatString(tema) + lcdMessage.slice(temIndexOf + 5, lcdMessage.length);
		
		i++;
	}
	
	//COPY SPRITE SHEET OFFSETS INTO THE ARRAY
	for(i=0; i<lcdMessage.length; i++){
		
		if(i<lcdMessage.length){
			lcdMsgArray[i] = -1 * (lcdLexicon.indexOf(lcdMessage.substring(i, i+1)) * lcdSpriteChar);
			
		}else{
			lcdMsgArray[i] = temPadIndex;
		
		}
	}
	
}

function redrawLCD(){
	//REDRAW THE LCD DISPLAY AT THE CURRENT POSITION OF lcdMsgStep
	var i;
	
	for(i=0; i<lcdChars; i++){
		lcdObjArray[i].style.backgroundPosition = lcdMsgArray[Math.min(i + lcdMsgStep, lcdMsgArray.length-1)] + 'px 0px';

	}
}

function animateLCD(){
	//KEEP THE ANIMATION RUNNING FOR THE LCD DISPLAY

	//IF A PAUSE CHARACTER (~) IS AT POSITION 0, PAUSE THE DISPLAY
	if((lcdMsgArray[lcdMsgStep - 1] == 0) && (lcdMsgStepFlag == 0)){
		lcdMsgStepFlag = 1;
		lcdTimer = setTimeout('animateLCD();', lcdInlinePause);
		return false;
	
	}
	
	//IF CODE REACHES THIS POINT - PERFORM THE SCROLL
	lcdMsgStepFlag = 0;
//	if(window.scrollY <= lcdCutoffZone){
		//ONLY PHYSICALLY REDRAW IF THE SCROLLER IS IN VIEW
		redrawLCD();
		
//	}
	if(lcdMsgStep < lcdMsgArray.length){
		lcdMsgStep++;
		
		lcdTimer = setTimeout('animateLCD();', lcdScrollSpeed);

	}else{
		//RESET TO 0, PAUSE IF A HOLD IS SET
		lcdMsgStep = 0;
//		if(window.scrollY <= lcdCutoffZone){
			//ONLY PHYSICALLY REDRAW IF THE SCROLLER IS IN VIEW
			redrawLCD();
			
//		}		
		lcdTimer = setTimeout('animateLCD();', ((lcdPostHold > 0)?lcdPostHold:lcdScrollSpeed));
		
	}
}

function storeLCDPos(temMode){
	//STORE AND RETRIEVE THE POSITION OF THE LCD MESSAGE SCROLLING
	var tema;
	
	if(temMode == 0){
		//RETRIEVE (& RESET TO 0)
		tema = parseInt(getCookie('lcdMsgStep'), 10);
		if(typeof(tema) == 'number'){
			lcdMsgStep = tema;
			
		}
		setCookie('lcdMsgStep', 0, -1);
		
	}else if(temMode == 1){
		//SET
		setCookie('lcdMsgStep', lcdMsgStep, 1);
		//alert('set');
	}
	
} 
