var allindexUrl = constants['com.hsi.client.real-time.allindexUrl'];
var simpleindexUrl = constants['com.hsi.client.real-time.simpleindexUrl'];
var refreshFreq = constants['com.hsi.client.real-time.refreshFreq'];
var locale = constants['com.hsi.client.locale'].toLowerCase();
var debug = constants['com.hsi.client.debug'];
var ros = new Array;	//to reuse the XMLHTTP objects

function parseXml(text){
	var xmlDoc = createDOMObject();
	xmlDoc.loadXML(text);
	return xmlDoc;		
}

function displayIndexes(xmlDoc, args){
	var keys = args[0];
	var method ="start_realtime('"+keys+"')";
	//restart
	if (xmlDoc == null){
		if (debug) 	alert("Failure occured, Auto restarting: "+method);
		restart_ajax(method);
		return;
	}
	var oXMLNodeList = xmlDoc.selectNodes("/allindex/index"); 
	for (var i = 0; i<oXMLNodeList.length; i++){
		var nIndex = oXMLNodeList.item(i);
		displayIndex(xmlDoc, null, nIndex);	
	}	
	
	//Ajax
	restart_ajax(method,refreshFreq*1000);
}

function displayIndex(xmlDoc, sParentIndexNo, nIndex){
		
	var no = nIndex.selectSingleNode("./@no").value;
	var code = nIndex.selectSingleNode("./@code").value;
	var sector = nIndex.selectSingleNode("./@sector").value;
	var status = nIndex.selectSingleNode("./@status").value;
	var datetime = nIndex.selectSingleNode("./@datetime").value;
	var current = nIndex.selectSingleNode("./@current").value;
	var high = nIndex.selectSingleNode("./@high").value;
	var low = nIndex.selectSingleNode("./@low").value;
	var change = nIndex.selectSingleNode("./@change").value;
	var percent = nIndex.selectSingleNode("./@percent").value;
	var eas = nIndex.selectSingleNode("./@eas").value;
	var name = nIndex.selectSingleNode("./name/text()").text;

	
	var cname = nIndex.selectSingleNode("./cname/text()").text;
	var index = no	+ "." + (!sParentIndexNo?"00":sector);
	var eName = $("rt-idx-name-"+index);
	var eCurrent = $("rt-idx-current-"+index);
	var eChange = $("rt-idx-change-"+index);
	var ePercent = $("rt-idx-percent-"+index);				
	var isRaised = change.indexOf('-')==-1;

	//Fill-in data	
	if (!eName) return;
	if (eName) eName.innerText = locale=="zh_hk"?cname:name;
	if (eCurrent) eCurrent.innerHTML="<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+current+"</span>";
	if (eChange) eChange.innerHTML="<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+change+"</span>";			
	if (ePercent) {
		percent =  (current - change == 0)?"--":percent+"%";
		ePercent.innerHTML="<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+percent+"</span>";		
	}
	
	//Sub Indexes
	var lSubIndexes = nIndex.selectNodes("./sub-indexes/index");
	if (lSubIndexes.length > 0){
		for (var j = 0 ; j< lSubIndexes.length; j++){
			var nSubIndex = lSubIndexes.item(j);
			displayIndex(xmlDoc, no, nSubIndex);
		}
	}

	//Last Update
	var df = "dd-mm-yyyy HH:MM";
	var aLastUpdate = nIndex.selectSingleNode("./@datetime");	
	var lastUpdate = new Date(aLastUpdate.value);
	var eLastUpdate = $("rt-idx-lastupdated-"+index);
	if (eLastUpdate){
		eLastUpdate.innerHTML = lastUpdate.format(df);
	}
	
}

/*
For Real time MAIN Index only
*/
function displayConstituents(xmlDoc,args){
	var indexNo = args[0];
	var sectorNo = args[1];
	var method ="start_constituents('"+indexNo+"','"+sectorNo+"')";
	//restart
	if (xmlDoc == null){
		if (debug) 	alert("Failure occured, Auto restarting: "+method);
		restart_ajax(method);
		return;
	}
	
	var nIndex = xmlDoc.selectSingleNode("/allindex/index[@no="+indexNo+"]");
	if (!nIndex) {
		if (debug) alert("Constituent Data doesn't exist: "+indexNo+", retrying.");
		restart_ajax(method);
		return;
	}
	var no = nIndex.selectSingleNode("./@no").value;
	var code = nIndex.selectSingleNode("./@code").value;
	var sector = nIndex.selectSingleNode("./@sector").value;
	var status = nIndex.selectSingleNode("./@status").value;
	var datetime = nIndex.selectSingleNode("./@datetime").value;
	var current = nIndex.selectSingleNode("./@current").value;
	var high = nIndex.selectSingleNode("./@high").value;
	var low = nIndex.selectSingleNode("./@low").value;
	var change = nIndex.selectSingleNode("./@change").value;
	var percent = nIndex.selectSingleNode("./@percent").value;
	var eas = nIndex.selectSingleNode("./@eas").value;
	var name = nIndex.selectSingleNode("./name/text()").text;
		
	
	var cname = nIndex.selectSingleNode("./cname/text()").text;
	var index = no	;
	var eCurrent = $("rt-idx-current-"+index);
	var eChange = $("rt-idx-change-"+index);
	var ePercent = $("rt-idx-percent-"+index);				
	var isRaised = change.indexOf('-')==-1;
	
	//Fill-in data	
	if (!eCurrent) return;
	if (eCurrent) eCurrent.innerHTML="<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+current+"</span>";
	if (eChange) eChange.innerHTML="<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+change+"</span>";			
	if (ePercent) {	
		percent =  (current - change == 0)?"--":percent+"%";
		ePercent.innerHTML="<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+percent+"</span>";		
	}
	
	//Constituents
	var lConstituents = nIndex.selectNodes("./constituents/stock");
	for (var i = 0 ;i < lConstituents.length ; i++){
		var nStock = lConstituents.item(i);
		var code = nStock.selectSingleNode("./@code").value;
		var nName = nStock.selectSingleNode(locale=="zh_hk"?"./cname/text()":"./name/text()");
		var contribution = nStock.selectSingleNode("./@contribution").value;
		var eCode = $("rt-const-code-"+code);
		var eName = $("rt-const-name-"+code);
		var eContribution = $("rt-const-contribution-"+code);
		var isRaised = contribution.indexOf('-')==-1;		
		if (eCode) eCode.innerHTML = code.ltrim("0");
		if (eName && nName) eName.innerText =  nName.text;
		if (eContribution) eContribution.innerHTML = "<span class=\""+(isRaised?"generaltxtrise":"generaltxtfall")+"\">"+contribution+"</span>";
	}
	
	//Ajax
	restart_ajax(method,refreshFreq*1000);	
	
}


function displayMultiIndexOverview(xmlDoc,args){
	var keys = args[0];
	var dateFmt = args[1] ||  'dd/mm HH:MM:ss';	//24/10 16:10:30
	var method ="start_multi_index_overview('"+keys+"','"+dateFmt+"')";

	//restart
	if (xmlDoc == null){
		if (debug) 	alert("Failure occured, Auto restarting: "+method);
		restart_ajax(method);
		return;
	}
	var oXMLNodeList = xmlDoc.selectNodes("/allindex/index"); 
	for (var i = 0; i<oXMLNodeList.length; i++){
		var nIndex = oXMLNodeList.item(i);
		
		if (!nIndex) {
		  if (debug) alert("Data doesn't exist: "+indexNo+"."+sectorNo+", retrying.");
		  restart_ajax(method);
		  return;
	    }
	    
		displayIndexOverviewNode(nIndex, [dateFmt]);	    

    }
    
   	//Ajax
	restart_ajax(method,refreshFreq*1000);
}


function displayIndexOverview(xmlDoc,args){
	var indexNo = args[0];
	var sectorNo = args[1];
	var method ="start_index_overview('"+indexNo+"','"+sectorNo+"')";
	//restart
	if (xmlDoc == null){
		if (debug) 	alert("Failure occured, Auto restarting: "+method);
		restart_ajax(method);
		return;
	}	
	
	var query;
	if (!sectorNo || sectorNo == 0){
		query = "/allindex/index[@no="+indexNo+"]";
	}else{
		query = "/allindex/index[@no="+indexNo+" and @sector="+sectorNo+"]";
	}

	
	var nIndex = xmlDoc.selectSingleNode(query);
	if (!nIndex) {
		if (debug) alert("Data doesn't exist: "+indexNo+"."+sectorNo+", retrying.");
		restart_ajax(method);
		return;
	}
	
	displayIndexOverviewNode(nIndex, []);

	//Ajax
	restart_ajax(method,refreshFreq*1000);	
	
}

/*
* Display index overview for a index
* @param 0: date format, default dd/mm HH:MM:ss, e.g. 24/10 16:10:30
*/
function displayIndexOverviewNode(nIndex, args){
	var dateFmt = args[0] ||  'dd/mm HH:MM:ss';
	
	var no = nIndex.selectSingleNode("./@no").value;
	var code = nIndex.selectSingleNode("./@code").value;
	var sector = nIndex.selectSingleNode("./@sector").value;
	var status = nIndex.selectSingleNode("./@status").value;
	var datetime = nIndex.selectSingleNode("./@datetime").value;
	var effdate = nIndex.selectSingleNode("./@effdate").value;
	var current = nIndex.selectSingleNode("./@current").value;
	var high = nIndex.selectSingleNode("./@high").value;
	var low = nIndex.selectSingleNode("./@low").value;
	var change = nIndex.selectSingleNode("./@change").value;
	var percent = nIndex.selectSingleNode("./@percent").value;
	var eas = nIndex.selectSingleNode("./@eas").value;
	var name = nIndex.selectSingleNode("./name/text()").text;
	var cname = nIndex.selectSingleNode("./cname/text()").text;
   	var meta = new Array();
   	var lMetaValues = nIndex.selectNodes("./meta/value");
	for (var j = 0 ;j < lMetaValues.length ; j++){
		var nValue = lMetaValues.item(j);
		var key = nValue.selectSingleNode("./@key").value;			
		var value = nValue.selectSingleNode("./text()").text;			
		meta[key] = value;
	}    
	
	var index = no	;
   	var eName = $("rt-idx-name-"+index);	
	var eDate = $("rt-idx-date-"+index);	
	var eCurrent = $("rt-idx-current-"+index);
	var eChange = $("rt-idx-change-"+index);
	var ePercent = $("rt-idx-percent-"+index);				
	var eHigh = $("rt-idx-high-"+index);				
	var eLow = $("rt-idx-low-"+index);				
	var ePrevious = $("rt-idx-previous-"+index);				
	var isRaised = change.indexOf('-')==-1;
	//Fill-in data
   	if (eName) eName.innerText = locale=="zh_hk"?cname:name;	
	if (eCurrent) eCurrent.innerHTML= current;
	var d = new Date(datetime);
	if (eDate) eDate.innerHTML= d.format(dateFmt);
	var ed = new Date(effdate);
	if (d < ed) {											//Non-effective index
		if (eChange) eChange.innerHTML="--";
		if (ePercent) ePercent.innerHTML="--";
		if (eHigh) eHigh.innerHTML="--";
		if (eLow) eLow.innerHTML="--";
		if (ePrevious) ePrevious.innerHTML="--";	
   	} else if (meta['isReset']=="true") {	//Reseted Index
   		if (eChange) eChange.innerHTML=change;			
   		if (ePercent) ePercent.innerHTML="--";
   		if (eHigh) eHigh.innerHTML="--";
   		if (eLow) eLow.innerHTML="--";
   		if (ePrevious) ePrevious.innerHTML="--";		
	} else {													//Normal index
		var previous = (current - change).toFixed(2);
		if (eChange) eChange.innerHTML= change;			
   		if (ePercent) ePercent.innerHTML= (previous == 0)?"--":percent+"%";
		if (eHigh) eHigh.innerHTML= high;		
		if (eLow) eLow.innerHTML= low;		
		if (ePrevious) ePrevious.innerHTML= previous;
	}
}

function createRequestObject(func) {
	if (ros[func]) return ros[func];
	var ro;

	try {			// Firefox, Opera 8.0+, Safari, IE7
		ro=new XMLHttpRequest();
	}
	catch (e) {		// Internet Explorer
		try{	//Internet Explorer 6
			ro=new ActiveXObject("Msxml2.XMLHTTP");
		}
	 	catch (e) {	//Internet Explorer 5.5 or earlier
			ro=new ActiveXObject("Microsoft.XMLHTTP");
	 	}
	 }

	ros[func]=ro;
	return ro;
}

function loadXMLDoc(url,func,args){
	if (!url){
		alert("No Url defined, please contact adiministartor.");
	 	return;
	}
	
	if (!refreshFreq){
		alert("No refreshFreq defined, please contact adiministartor.");
		return;
	}

	var xmlhttp = null;

    xmlhttp = createRequestObject(func);


    if (xmlhttp!=null)
    {      
        xmlhttp.open("GET",url,true);
//        alert(url);
        xmlhttp.onreadystatechange=function(){
	        if (xmlhttp.readyState==4){
	        	// 4 = "loaded"
	   		    if (xmlhttp.status==200||xmlhttp.status==304){		   		    
	        		// 200 = "OK"
	        		var xml = parseXml(xmlhttp.responseText);
	        		func.call(this,xml, args);
	            }
	            else {
	            	var errMsg =  "Problem retrieving data:" + xmlhttp.statusText+"\nurl:"+url;
	            	if (debug) alert(errMsg);
	        		func.call(this,null, args);	            
	            }
	        }
        };        	
        xmlhttp.setRequestHeader("Cache-Control", "no-cache");
        xmlhttp.setRequestHeader("If-Modified-Since", "Thu, 1 Jan 1970 00:00:00 GMT");
        xmlhttp.send(null);
        //setTimeout('xmlhttp = null',5000);        
    }else{
        	alert("Your browser does not support XMLHTTP.");
    }    

}


function start_multi_index_overview(keys, date_fmt){
	try{
		var url = simpleindexUrl + "&keys="+keys;	
		loadXMLDoc(url,displayMultiIndexOverview,[keys, date_fmt]);
	}catch(e){
		if (debug) alert(e);
	}
}

function start_realtime(keys){
	try{
		var url = simpleindexUrl + "&keys="+keys;	
		loadXMLDoc(url,displayIndexes,[keys]);
	}catch(e){
		if (debug) alert(e);
	}
}

function start_constituents(indexNo, sectorNo){
	try{
		var url = allindexUrl + "&index="+indexNo+"&sector="+sectorNo;
		loadXMLDoc(url,displayConstituents, [indexNo, sectorNo]);
	}catch(e){
		if (debug) alert(e);
	}
}

function start_index_overview(indexNo, sectorNo){
	try{
		var url = simpleindexUrl + "&index="+indexNo+"&sector="+sectorNo;
		loadXMLDoc(url,displayIndexOverview, [indexNo,sectorNo]);
	}catch(e){
		if (debug) alert(e);
	}
}

function restart_ajax(method, ms){
	ms = ms || 5000;
	window.setTimeout(method,parseInt(ms));        
}

// --------------------------------------------------------------
// Return true if arrray contains obj

function contains(array, obj) {
	for (var i = 0; i < array.length; i++) {		
		if (array[i] == obj) return true;		
	}
	return false;
}
