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;

	//Index Names		
	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) 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;
	//Index Names		
	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) 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 method ="start_multi_index_overview('"+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);
		
		if (!nIndex) {
		  if (debug) alert("Data doesn't exist: "+indexNo+"."+sectorNo+", 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 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 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;
    
    	//Index Names		
    	if (eName) eName.innerText = locale=="zh_hk"?cname:name;

    	var d = new Date(datetime);
    	if (eDate) eDate.innerHTML= d.format('dd/mm HH:MM:ss');	//24/10 16:10:30
    
    	var ed = new Date(effdate);
    
    	if (eCurrent) eCurrent.innerHTML=current;
    
    	if (d < ed) {
    		if (eChange) eChange.innerHTML="--";
    		if (ePercent) ePercent.innerHTML="--";
    		if (eHigh) eHigh.innerHTML="--";
    		if (eLow) eLow.innerHTML="--";
    		if (ePrevious) ePrevious.innerHTML="--";
    	} else {
    		if (eChange) eChange.innerHTML=change;			
    		if (ePercent) ePercent.innerHTML=percent+"%";		
    		if (eHigh) eHigh.innerHTML=high;		
    		if (eLow) eLow.innerHTML=low;		
    		if (ePrevious) ePrevious.innerHTML=(current - change).toFixed(2);
    	}
    }
    
   	//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;
	}
	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 index = no	;
	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 eWk52High = $("rt-idx-wk52high-"+index);				//For Phase 2
//	var eWk52Low = $("rt-idx-wk52low-"+index);				//For Phase 2			
	var isRaised = change.indexOf('-')==-1;
	//Index Names		
	if (!eCurrent) return;
	var d = new Date(datetime);
	if (eDate) eDate.innerHTML= d.format('dd/mm HH:MM:ss');	//24/10 16:10:30

	var ed = new Date(effdate);

	if (eCurrent) eCurrent.innerHTML=current;

	if (d < ed) {
		if (eChange) eChange.innerHTML="--";
		if (ePercent) ePercent.innerHTML="--";
		if (eHigh) eHigh.innerHTML="--";
		if (eLow) eLow.innerHTML="--";
		if (ePrevious) ePrevious.innerHTML="--";
	} else {
		if (eChange) eChange.innerHTML=change;			
		if (ePercent) ePercent.innerHTML=percent+"%";		
		if (eHigh) eHigh.innerHTML=high;		
		if (eLow) eLow.innerHTML=low;		
		if (ePrevious) ePrevious.innerHTML=(current - change).toFixed(2);
	}

	//Ajax
	restart_ajax(method,refreshFreq*1000);	
	
}


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){
	try{
		var url = simpleindexUrl + "&keys="+keys;	
		loadXMLDoc(url,displayMultiIndexOverview,[keys]);
	}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;
}
