/*
	Name: KQ lenh khop cho Vang
	Version: 1.1
	CreatedDate: Feb 25th 2008
	LastUpdate: May 23th 2008
	Description: Tai va update cac thong tin va lenh khop cua san vang, viet cho ACB
	Author: Tran Thach Anh (myquartz@gmail.com)
	Copyright: Release under Artistic License.
	Changes:
		- THACHANH20080313: make script more fault tolerant
		- THACHANH20080404: add support for div tag
		- THACHANH20080422: add support for errmsg reporting
		- THACHANH20080523: add support for custom action.
*/

//Global variable;
var i = 0;
var tablist = new Array();
tablist[i++] = 'ask';
tablist[i++] = 'bid';
tablist[i++] = 'askr';
tablist[i++] = 'bidr';
tablist[i++] = 'sum';

function tabnbr(tabID) { for (ti=0;ti<tablist.length;ti++) if (tablist[ti] == tabID) return ti; }

var nochgc = 0;
var vernbrlist = new Array();
vernbrlist[tabnbr('ask')] = 0;
vernbrlist[tabnbr('bid')] = 0;
vernbrlist[tabnbr('askr')] = 0;
vernbrlist[tabnbr('bidr')] = 0;
vernbrlist[tabnbr('sum')] = 0;

var maxrow = new Array();
maxrow[tabnbr('ask')] = 12;
maxrow[tabnbr('bid')] = 12;
maxrow[tabnbr('askr')] = 5;
maxrow[tabnbr('bidr')] = 5;
maxrow[tabnbr('sum')] = 1;

var headerrow = new Array();
headerrow[tabnbr('ask')] = 2;
headerrow[tabnbr('bid')] = 2;
headerrow[tabnbr('askr')] = 2;
headerrow[tabnbr('bidr')] = 2;
headerrow[tabnbr('sum')] = 1;

var mindelaytime = 6600;
var noincdelay = 0;
var delaytime = mindelaytime;
//var delaytime = new Array();
//delaytime[tabnbr('ask')] = 1000;
//delaytime[tabnbr('bid')] = 1000;
//delaytime[tabnbr('askr')] = 2000;
//delaytime[tabnbr('bidr')] = 2000;

var xmlHttpReq = null;
var LockFlag = 0;
var LockCount = 0;
var Stop = 0;
var SetStatus = 1;
//var LockFlags = new Array();
//LockFlags[tabnbr('ask')] = 0;
//LockFlags[tabnbr('bid')] = 0;
//LockFlags[tabnbr('askr')] = 0;
//LockFlags[tabnbr('bidr')] = 0;

var debug = 0;
var debugdiv = '';
var errmsgobj = null;
var HLlist = new Array();

function DebugWrite(msg) {
	debugdiv = document.getElementById('debug');
	var MsgList;
	MsgList = debugdiv.innerHTML.split(">");
	while (!Stop && MsgList.length > 20) {
		MsgList.shift();
		debugdiv.innerHTML = MsgList.join(">");
	}
	debugdiv.innerHTML += msg + "<br />";
}

function DumpXML(xmlDoc) {
	DebugWrite("Nodename: " + xmlDoc.nodeName);
	DebugWrite(" (value: " + xmlDoc.childNodes[0].nodeValue + ")");

	//return;
	var x=xmlDoc.documentElement;

	DebugWrite("Nodename: " + x.nodeName);
	DebugWrite(" (value: " + x.childNodes[0].nodeValue + ")");

	var y=xmlDoc.documentElement.childNodes;
	//var y=xmlDoc.getElementsByTagName("")[0].childNodes;
	//DebugWrite("y = " + y);

	for (di=0;di<y.length;di++)
	{
		if (y[di].nodeType!=3)
	  {
	  DebugWrite("y Nodename: " + y[di].nodeName + " y Node ID = "+y[di].getAttribute("id")
	  	+ " (value: " + y[di].childNodes[0].nodeValue + ")");

	  for (z=0;z<y[di].childNodes.length;z++)
	    {
	    if (y[di].childNodes[z] && y[di].childNodes[z].nodeType!=3)
	      {
	      DebugWrite("z Nodename: " + y[di].childNodes[z].nodeName);
	      DebugWrite("z (value: " + y[di].childNodes[z].childNodes[0].nodeValue + ")");
	      }
	    }
	  }
	}
}

function showErr(s) {
	window.status = s;
	if(errmsgobj) {
		//alert(s);
		errmsgobj.innerHTML = s;
		errmsgobj.style.display = 'block';
	}
}

function hideErr() {
	if(errmsgobj && errmsgobj.style.display == 'block') {
		errmsgobj.style.display = 'none';
		errmsgobj.innerHTML = '';
		window.status = '';
	}
}

function kqvangGetUpdate(uri) {

	if (LockFlag == 0) {
		//if (nochgc > 2)
		//	DeHLRow();
		LockFlag = 1;
		LockCount = 0;
		if(uri.indexOf('?') == -1) {
			var param = Array();
			for (pi=0;pi<tablist.length;pi++)
				param[pi] = 'vernbr'+tablist[pi]+'='+vernbrlist[pi];
			kqvangHTTPCall('GET', uri, param.join('&'));
		} else
			kqvangHTTPCall('GET', uri);
		if (debug) DebugWrite("VerList=" + vernbrlist.join(','));
	} else {
		LockCount++;
		if (LockCount > 5) { // Bi lock qua lau, co the do dg truyen cham, reset xmlHttpReq
			showErr('Network may be too slow or there is a problem, try again...');
			xmlHttpReq.abort();
			delete xmlHttpReq;
      xmlHttpReq = null;
			LockFlag = 0;
		} else
			showErr('Slow network...');
	}

	if (noincdelay || nochgc < 200)
		delaytime = mindelaytime;
	else {
		if (nochgc < 400)
			delaytime = mindelaytime*2;
		else delaytime = mindelaytime*5;
	}
	if(!Stop) {
		setTimeout("DeHLRow()",3*mindelaytime/4);
		setTimeout("kqvangGetUpdate('"+uri+"')",delaytime);
	}
	if(debug) DebugWrite("setTimeOut = "+delaytime);
}

function kqvangHTTPCall(sHttpMethod, sURL, sParam) {
    if (sHttpMethod == null) sHttpMethod = 'GET';
    if (xmlHttpReq == null)
	    // Mozilla/Safari
	    if (window.XMLHttpRequest) {
	        xmlHttpReq = new XMLHttpRequest();
	    }
	    // IE
	    else if (window.ActiveXObject) {
			try {
		    	xmlHttpReq = new ActiveXObject("Msxml2.XMLHTTP");
		    }
			catch (e) {
		    	xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
		    }
	        //xmlHttpReq = new ActiveXObject("Microsoft.XMLHTTP");
	    } else {//Not support
	    	alert('Not supported browser');
	    	Stop = 1;
	    }
    if (sParam && sHttpMethod == 'GET')
    	sURL += "?"+sParam;
    xmlHttpReq.open(sHttpMethod, sURL, true); // Async
    if (debug)
    	DebugWrite("Send URL <input name='b' value='" + sParam + "' size='50' />");
    if (sHttpMethod == 'POST')
    	xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xmlHttpReq.onreadystatechange = function() {
      try {
	      if (xmlHttpReq.readyState == 4) {
	      	if (xmlHttpReq.status == 200) {
	      		if(SetStatus) window.status = 'Updating ' + nochgc + ' ';
	      		//if (debug) DebugWrite("Debug: HttpReq reponse<br><textarea cols='60' rows='8'>" + xmlHttpReq.responseText+"</textarea>");
	        	if (xmlHttpReq.responseXML)
	        		kqvangUpdateTable(xmlHttpReq.responseXML, xmlHttpReq.responseText);
	        	else
	        		kqvangUpdateString(xmlHttpReq.responseText);
	       		LockFlag = 0; // release lock
	       		hideErr();
	      	} else {//may be an error
	      		showErr('Problem with the network, retry... (code '+xmlHttpReq.status+')');
	      		LockFlag = 0; // release lock
	      	}
	      }
      }
    	catch(err) {
    		showErr('Problem with the network, retry...');
    		xmlHttpReq.abort();
				delete xmlHttpReq;
    		xmlHttpReq = null;
				LockFlag = 0;
    	}
    }
    if (sHttpMethod == 'GET')
    	xmlHttpReq.send(null);
    else
    	xmlHttpReq.send(sParam);
}

function DeHLRow() {
	while(r = HLlist.shift()) {
		r.className = ''; // remove class
	}
}

function kqvangUpdateString(str) {
	// do nothing, just set status bar
	window.status = 'Rsesponse is not XML';
	if (debug) DebugWrite("Debug: UpdateString = " + str);
}

function kqvangUpdateTable(xmlObj, str) {

	var tabID = '';
	var tab;
	var firsttime = 1;
	try {
	if (xmlObj) {
		if(debug) { // show xmlNodes
			//DumpXML(xmlObj);
			//window.status = xmlObj.getElementsByTagName("div");
		}
		var newvernbr = new Array();
		for (v=0;v<vernbrlist.length;v++)
			newvernbr[v] = vernbrlist[v];

		if (xmlObj.getElementsByTagName("error")[0]) {
			window.status = xmlObj.getElementsByTagName("error")[0].childNodes[0].nodeValue;
			//window.status = xmlObj.getElementsByTagName("error");
		}
		if (xmlObj.getElementsByTagName("action")[0]) {
			eval(xmlObj.getElementsByTagName("action")[0].childNodes[0].nodeValue);
		}

		nochgc++;
		if (xmlObj.getElementsByTagName("div")) {
			var divlist = xmlObj.getElementsByTagName("div");

			for (d=0;d<divlist.length;d++) {
				if (divlist[d].nodeType == 3)
	  				continue;
				divID = '';
				if (divlist[d].getAttribute("id"))
					divID = divlist[d].getAttribute("id");
				if(divID == '' || document.getElementById(divID) == null)
					continue; // bo qua vong lap, khong co field
				divobj = document.getElementById(divID);
				//window.status += ' Div:'+divobj;
				if(divlist[d].childNodes[0]) {
					if (divlist[d].getAttribute("action")
						&& divlist[d].getAttribute("action") == 'checkandreload'
						&& divobj.innerHTML != ''
						&& divobj.innerHTML != divlist[d].childNodes[0].nodeValue) {
						document.location.reload();
						return;
					}
					divobj.innerHTML = divlist[d].childNodes[0].nodeValue;
				}
				if (divlist[d].getAttribute("class"))
					divobj.className = divlist[d].getAttribute("class");
			}
		}

		if (xmlObj.getElementsByTagName("version")) {
			var verlist = xmlObj.getElementsByTagName("version");

			for (v=0;v<verlist.length;v++) {
				if (verlist[v].getAttribute("id"))
					tabID = verlist[v].getAttribute("id");
				if(!tabID && tabnbr(tabID) >= 0)
					continue; // bo qua
				if (verlist[v].nodeType == 3)
	  					continue;
	  			//if(newvernbr[tabnbr(tabID)] == 14112) alert('newvernbr wrong before');
				if (verlist[v].childNodes[0] && parseInt(verlist[v].childNodes[0].nodeValue))
					newvernbr[tabnbr(tabID)] = parseInt(verlist[v].childNodes[0].nodeValue);
				if(debug && Stop == 0 && newvernbr[tabnbr(tabID)] == 14112) {
					Stop = 1;
					//alert('newvernbr wrong after:' + verlist[v].childNodes[0].nodeValue);
					//DumpXML(xmlObj);
					DebugWrite("Stop: WRONG, type "+verlist[v].nodeType
						+" nodeValue wrong = " + verlist[v].childNodes[0].nodeValue
						+ "<br /> Text return:<br /> <textarea cols='40' rows='8'>" + str +"</textarea>");
				}
				//window.status += ' ' + tabID + ' = ' + newvernbr[tabnbr(tabID)];
	  		if(vernbrlist[tabnbr(tabID)] > 0) firsttime = 0;

				if (newvernbr[tabnbr(tabID)] > vernbrlist[tabnbr(tabID)]) {
						if(SetStatus) window.status += tabID + ' changed ' + vernbrlist[tabnbr(tabID)] + ' to ' + newvernbr[tabnbr(tabID)] + '. ';
						if(nochgc > 0) {
							DeHLRow();
	  					nochgc = 0;
	  				}
	  				// cap nhap lai so version
		  			vernbrlist[tabnbr(tabID)] = newvernbr[tabnbr(tabID)];
	  		}
			}
		}

		var xmltables = xmlObj.getElementsByTagName("table");
		if(xmltables)
			for (t=0;t<xmltables.length;t++) { // voi moi table trong ket qua

				//if (debug)
				//	DebugWrite("xmltables[t] = " + xmltables[t]);
				if (xmltables[t].getAttribute("id"))
						tabID = xmltables[t].getAttribute("id");
				if(!tabID && !document.getElementById(tabID) && tabnbr(tabID) >= 0)
					continue; // bo qua vong lap, khong co bang nay
				//if (debug)
				//	DebugWrite("TabID = " + tabID + " getAttr = "+xmltables[t].getAttribute("id"));

				tab = document.getElementById(tabID);
				var xmlrows = xmltables[t].childNodes;

				for (i=0;i<xmlrows.length;i++) {

					if (xmlrows[i].nodeType == 3)
						continue;

					var eachrow = xmlrows[i].childNodes;
					//if (debug) DebugWrite("Debug: eachrow = " + eachrow);
					// Them 1 dong vao table
					// THACHANH20080229 Append to the begin
					var newi = headerrow[tabnbr(tabID)];
					var tcol = 0;

					if (xmlrows[i].getAttribute("set") != null) { // Khong xoa ma set gia tri
						newi = headerrow[tabnbr(tabID)] + parseInt(xmlrows[i].getAttribute("set"));

						for (j=0; j < eachrow.length;j++) {
							if (eachrow[j].nodeType == 3)
								continue;
							if(eachrow[j].childNodes[0])
								tab.rows[newi].cells[tcol].innerHTML = eachrow[j].childNodes[0].nodeValue;
							if (eachrow[j].getAttribute("class"))
									tab.rows[newi].cells[tcol].className = eachrow[j].getAttribute("class");
							tcol++;
						}
						continue;
					}

					//var newi = tab.rows.length;
					tab.insertRow(newi); // insert to row

					for (j=0; j < eachrow.length;j++) {
						//if (debug) DebugWrite(
						//		"Debug: Cell ["+t+','+i+','+j+'] = '+eachrow[j].nodeName
						//		+ ', type = ' + eachrow[j].nodeType);
						if (eachrow[j].nodeType == 3)
							continue;

						tab.rows[newi].insertCell(tcol);
						tab.rows[newi].cells[tcol].innerHTML = eachrow[j].childNodes[0].nodeValue;
						//tab.rows[newi].cells[tcol].innerHTML = eachrow[j].textcontent;

						if (!firsttime) { // Neu khong phai lan dau tien
							tab.rows[newi].cells[tcol].className = 'newrow';
							HLlist.push(tab.rows[newi].cells[tcol]); // add to list to remove highlight
						}
						if (eachrow[j].getAttribute("class"))
									tab.rows[newi].cells[tcol].className = eachrow[j].getAttribute("class");
						//if (eachrow[j].getAttribute("class"))
							//tab.rows[newi].cells[tcol].className = eachrow[j].getAttribute("class");
						if (eachrow[j].getAttribute("style"))
							tab.rows[newi].cells[tcol].style = eachrow[j].getAttribute("style");
						tcol++;
					}
					if (tab.rows.length > maxrow[tabnbr(tabID)] + headerrow[tabnbr(tabID)]) {
						// THACHANH20080229 Xoa dong cuoi cung
						tab.deleteRow(tab.rows.length - 1);
						//tab.deleteRow(headerrow[tabnbr(tabID)]); // xoa dong 2, dong 0,1 la header
						if (debug) DebugWrite("max Row"+maxrow[tabnbr(tabID)]
							+ "Xoa row:"+(tab.rows.length - 1));
					}
				}
			}

		if (xmlObj.getElementsByTagName("postaction")[0]) {
			eval(xmlObj.getElementsByTagName("postaction")[0].childNodes[0].nodeValue);
		}
	}
	}
	catch(err) {
		window.status += ' Error: ' + err;
	}
}
