// KanjiDateScroll.js
// contains all javascript required for the KanjiDateScript.gadget to function

// global vars
	var PreviousDateTime;
	var count=0;

	var stroke = new Array();
	stroke['0'] = 1;
	stroke['1'] = 1;
	stroke['2'] = 2;
	stroke['3'] = 3;
	stroke['4'] = 5;
	stroke['5'] = 4;
	stroke['6'] = 4;
	stroke['7'] = 2;
	stroke['8'] = 2;
	stroke['9'] = 2;
	stroke['10'] = 2;
	stroke['thousand'] = 3;
	stroke['year'] = 6;
	stroke['moon'] = 4;
	stroke['day'] = 4;
	stroke['o'] = 1;

	function qItem() {
		this.value="";	// the stroke array reference
		this.id="";	// the div id
		this.stroke=0; // current stroke
	}

	var queue = new Array();
	var queueSeconds = new Array();

	var killFlag=false;
	var secondsGo=false;


// queue management, FIFO
function addToQueue(newid,newvalue,que) {
	var newQItem = new qItem();
	newQItem.id = newid;
	newQItem.value= newvalue;
	newQItem.stroke = stroke[newvalue];
	que[que.length] = newQItem;
	return(que);
}

// kick out first item in this queue
function FIFOQ(que) {
	var newQue = new Array();
	for (i=1;i<que.length;i++) {
		newQue[(i-1)] = que[i];
	}
	return(newQue);
}

// find the next active item and process it
// if item is at end of life then FIFO q
function processQueue(que,qname) {
	if (que.length>0) {
		// increment stroke
		que[0].stroke--;
		if (que[0].stroke<=0) { 
			que=FIFOQ(que); 
		} // next item in queue then becomes available
	}
	if (que.length>0) {
		// update div with stroke
		div = document.getElementById(que[0].id);
		value = que[0].value;
		strokec = 1+stroke[value]-que[0].stroke;
		div.innerHTML='<img src="images/' + value + '__' + strokec + '.png" id="' + div.id+value + '" alt="image ' + value + '__' + strokec + '" />';
	}
	if (secondsGo==false && qname=="Q" && que.length<=0) {
		secondsGo=true;

	}
	return(que);
}

// thread for everything queue-wise
function queueMain() {
	queue=processQueue(queue,"Q");
	if (secondsGo==true) { queueSeconds=processQueue(queueSeconds,"QS"); }
	if (!killFlag)  setTimeout("queueMain()",300); // tenth of second
}

// check for value not being in either queue
function notInQueue(id,value) {
	var ret=true;
	for (var i=0;i<queue.length;i++) {
		if ( (queue[i].id == id) && (queue[i].value == value) ) {
			i=queue.length;
			ret=false;
		}
	}
	for (var i=0;i<queueSeconds.length;i++) {
		if ( (queueSeconds[i].id == id) && (queueSeconds[i].value == value) ) {
			i=queueSeconds.length;
			ret=false;
		}
	}
	return(ret);
}

		// main function called every 1/2 a second
		function setContent()
		{
			var datetime = new Date();
			if (PreviousDateTime) {
				if (datetime.getHours()!=PreviousDateTime.getHours()) { showHours(datetime); }
				if (datetime.getMinutes()!=PreviousDateTime.getMinutes()) { showMinutes(datetime); }
				if (datetime.getSeconds()!=PreviousDateTime.getSeconds()) { showSeconds(datetime); }
				if (datetime.getYear()!=PreviousDateTime.getYear()) { showYear(datetime); }
				if (datetime.getMonth()!=PreviousDateTime.getMonth()) { showMonth(datetime); }
				if (datetime.getDay()!=PreviousDateTime.getDay()) { showDay(datetime); }
				if (!killFlag) { setTimeout("setContent()",500); } // half a sec
			} else {
				refreshAll(new Date(),false);
			}
		}

		// refresh all display elements
		function refreshAll(datetime,reset) 
		{
			secondsGo=false;
			PreviousDateTime=datetime;
			invalidateAll();
			showHours(datetime);
			div = document.getElementById("HoursSpace");
			buildImage("o",div);
			showMinutes(datetime);
			div = document.getElementById("MinutesSpace");
			buildImage("o",div);
			showSeconds(datetime);
			showYear(datetime);
			div = document.getElementById("YearIdeo");
			buildImage("year",div);
			showMonth(datetime);
			div = document.getElementById("MonthIdeo");
			buildImage("moon",div);
			showDay(datetime); 
			div = document.getElementById("DayIdeo");
			buildImage("day",div);
			if (!reset) {
				setTimeout("queueMain()",800);
				setTimeout("setContent()",500);
			}
		}

		function showHours(dtstamp) 
		{
			var hours = dtstamp.getHours();
			update3DigitIdeo("Hours",hours);
		}

		function showMinutes(dtstamp) 
		{
			var minutes = dtstamp.getMinutes();
			update3DigitIdeo("Minutes",minutes);
			if (minutes==0) { }
		}

		function showSeconds(dtstamp) 
		{
			var seconds = dtstamp.getSeconds();
			if (secondsGo==true) { update3DigitIdeo("Seconds",seconds); }
		}

		function showMonth(dtstamp) 
		{
			var month = dtstamp.getMonth();
			update2DigitIdeo("Month",month+1);	// 0 based
		}

		function showDay(dtstamp) 
		{
			var day = dtstamp.getDate();	// note getDate() not getDay()
			update3DigitIdeo("Day",day);
		}

		function showYear(dtstamp) 
		{
			var year = dtstamp.getYear();
			if (year<1000) { year=year+1900; }
			update5DigitIdeo("Year",year);
		}

		// update3DigitIdeo
		// uses value to update identified DIV
		// allows 3 digits
		function update3DigitIdeo(id,value) 
		{
			var pos0 =  Math.floor(value/10);
			var pos1=0,pos2=0;
			if (pos0==1) {
				pos1=10;
				pos0=0;
			} 
			if (pos0>1) {
				pos1=10;
			}
			pos2=value-(Math.floor(value/10)*10);
			var div = document.getElementById(id+"Pos0");
			if (pos0) {
				buildImage(pos0,div);
				showIdeo(div);
			} else {
				hideIdeo(div);			}
			div = document.getElementById(id+"Pos1");

			if (pos1) {
				buildImage(pos1,div);
				showIdeo(div);
			} else {
				hideIdeo(div);			}
			div = document.getElementById(id+"Pos2");
			if (pos2) {
				buildImage(pos2,div); 
				showIdeo(div);
			} else { 
				hideIdeo(div);			}
		} 

		// update2DigitIdeo
		// uses value to update identified DIV
		// allows 2 digits (0-19)
		function update2DigitIdeo(id,value) 
		{
			var pos0 =  Math.floor(value/10);
			var pos1=0;
			if (pos0==1) {
				pos0=10;
			}
			pos1=value-(Math.floor(value/10)*10);
			var div = document.getElementById(id+"Pos0");
			if (pos0) {
				buildImage(pos0,div);
				showIdeo(div);
			} else {
				hideIdeo(div);			}
			div = document.getElementById(id+"Pos1");
			if (pos1) {
				buildImage(pos1,div);
				showIdeo(div);
			} else {
				hideIdeo(div);
			}
		} 

		// update5DigitIdeo
		// this used to be plain kanji digits but I have updated it to be the more incorrect but more interesting
		// 5 kanji character 
		// limited to 2000 - 2099 (i.e. no hundereds)
		// its worth pointing out that the date is normally expressed in romanised digits 2007/06/14
		// or even kanji but as digits not values.
		function update5DigitIdeo(id,value) 
		{
			// not interested in making this work in the past or after a couple of decades.
			div = document.getElementById(id+"Pos"+0);
			buildImage(2,div);
			div = document.getElementById(id+"Pos"+1);
			buildImage("thousand",div);
			update3DigitIdeo(id+"T",value-2000); 
		}

		// if necessary, add requested image to the queue
		function buildImage(num,div) {
			// if not new value upate
			if (!document.getElementById(div.id+num) && notInQueue(div.id,num)) {
				var dtype = div.id;
				if (dtype.indexOf("Seconds")==0) {
					queueSeconds = addToQueue(div.id,num,queueSeconds);
				} else {
					queue = addToQueue(div.id,num,queue);
				}
			}
		}

		// hide ideo
		function hideIdeo(div) {
				div.setAttribute('class',"shrunk");
				div.className = "shrunk";
				div.innerHTML="<img src='images/1__1.png' />";
		}

		// show ideo
		function showIdeo(div) {
				div.setAttribute('class',"ideo");
				div.className = "ideo";
		}

		// clear all the images out, really should do this in a loop.
		function invalidateAll() {
			div = document.getElementById("HoursSpace");
			div.innerHTML="";
			div = document.getElementById("HoursPos0");
			div.innerHTML="";
			div = document.getElementById("HoursPos1");
			div.innerHTML="";
			div = document.getElementById("HoursPos2");
			div.innerHTML="";
			div = document.getElementById("MinutesSpace");
			div.innerHTML="";
			div = document.getElementById("MinutesPos0");
			div.innerHTML="";
			div = document.getElementById("MinutesPos1");
			div.innerHTML="";
			div = document.getElementById("MinutesPos2");
			div.innerHTML="";
			div = document.getElementById("SecondsPos0");
			div.innerHTML="";
			div = document.getElementById("SecondsPos1");
			div.innerHTML="";
			div = document.getElementById("SecondsPos2");
			div.innerHTML="";
			div = document.getElementById("YearPos0");
			div.innerHTML="";
			div = document.getElementById("YearPos1");
			div.innerHTML="";
			div = document.getElementById("YearTPos0");
			div.innerHTML="";
			div = document.getElementById("YearTPos1");
			div.innerHTML="";
			div = document.getElementById("YearTPos2");
			div.innerHTML="";
			div = document.getElementById("YearIdeo");
			div.innerHTML="";
			div = document.getElementById("MonthPos0");
			div.innerHTML="";
			div = document.getElementById("MonthPos1");
			div.innerHTML="";
			div = document.getElementById("MonthIdeo");
			div.innerHTML="";
			div = document.getElementById("DayPos0");
			div.innerHTML="";
			div = document.getElementById("DayPos1");
			div.innerHTML="";
			div = document.getElementById("DayPos2");
			div.innerHTML="";
			div = document.getElementById("DayIdeo");
			div.innerHTML="";
		}

	// hide the place holder show the scroll, restart display queue
	function openKanjiDataScroll() {
		document.getElementById("placeHolder").style.display='none';
		document.getElementById("scrollBG").style.display='block';
		refreshAll(new Date(),true);
	}

	// hide the scroll and show the place holder
	function closeKanjiDataScroll() {
		document.getElementById("placeHolder").style.display='block';
		document.getElementById("scrollBG").style.display='none';
	}
