function isDate(date,format) {
  if(!date) return false;
  if(!format) format = 'FR';

  switch(format){
    case'FR':
      RegExpformat = /^(([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/([2][0]|[1][9])\d{2})$/; break;
    case'US':
      RegExpformat = /^([2][0]|[1][9])\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
    case'SHORTFR':
      RegExpformat = /^([0-2]\d|[3][0-1])\/([0]\d|[1][0-2])\/\d{2}$/; break;
    case'SHORTUS':
      RegExpformat = /^\d{2}\-([0]\d|[1][0-2])\-([0-2]\d|[3][0-1])$/; break;
  }

  return RegExpformat.test(date);
}

//HoNT added: Allow to check a date in DD/MM/YYYY format
function isValidDate(dateStr) {
// Checks for the following valid date formats:
// MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
// Also separates date into month, day, and year variables

//var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;

// To require a 4 digit year entry, use this line instead:
 var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{4})$/;

var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) {
//alert("Date is not in a valid format.")
return false;
}
day = matchArray[1]; // parse date into variables
month = matchArray[3];
year = matchArray[4];
if (month < 1 || month > 12) { // check month range
//alert("Month must be between 1 and 12.");
return false;
}
if (day < 1 || day > 31) {
//alert("Day must be between 1 and 31.");
return false;
}
if ((month==4 || month==6 || month==9 || month==11) && day==31) {
//alert("Month "+month+" doesn't have 31 days!")
return false
}
if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day>29 || (day==29 && !isleap)) {
//alert("February " + year + " doesn't have " + day + " days!");
return false;
   }
}
return true;  // date is valid
}

function searchboxOnFocus(input) {
	var txt = window.document.getElementById("comparekw").value;
	if(TrimString(input.value)==txt)
		input.value = "";
	//input.style.color = "inherit";
}
function searchboxOnBlur(input, text) {
	if (input.value.length == 0) {
		input.value = text;
		input.style.color = "#777";
	}
}

function changeLanguage(language) {
	var url = document.location.href;
	if (url.indexOf("l=") >= 0) {
		url = url.substring(0, url.indexOf("l=")) + "l=" + language;
	} else if (url.indexOf("?") >= 0){
		url = url + "&l=" + language;
	} else {
		url = url + "?l=" + language;
	}
	document.location = url;
}

function changeTopmovers(target, anotherTarget, iNo){
	for (var i = 1; i < 6; i++ ) {
		if(!( i == iNo)) {
			obj=document.getElementById(target+String(i));
			obj.style.display = "none";
		} else {
			obj=document.getElementById(target+String(i));
			obj.style.display = "inline";
		}
	}
	for (var j = 1; j < 6; j++ ) {
		obj=document.getElementById(anotherTarget+String(j));
		obj.style.display = "none";
	}
}

function changeTopmoversIndustry(target, iNo){
	for (var i = 1; i < 6; i++ ) {
		if(!( i == iNo)) {
			obj=document.getElementById(target+String(i));
			obj.style.display = "none";
		} else {
			obj=document.getElementById(target+String(i));
			obj.style.display = "inline";
		}
	}
}


// JavaScript Document
function LTrim(val) {
	while (val.charAt(0) == " ") {
		val = val.substring(1, val.length);
	}
	return val;
}

function RTrim(val) {
	while (val.charAt(val.length - 1) == " ") {
		val = val.substring(0, val.length - 1);
	}
	return val;
}

function TrimString(str) {
	return LTrim( RTrim(str) );
}

function Trim(fld) {
	var ret = fld.value;
	ret = LTrim(ret);
	ret = RTrim(ret);
	while (ret.search(/  /g) > 0) {
		ret = ret.replace(/  /g, " ");
	}
	return ret;
}

function IsNumeric(sText) {
var ValidChars = "0123456789.,";
var IsNumber=true;
var Char;
	for (i = 0; i < sText.length && IsNumber == true; i++) {
  Char = sText.charAt(i);
		if (ValidChars.indexOf(Char) == -1) {
	 IsNumber = false;
	 }
  }
return IsNumber;
}

function check_zero(strObjName,strContent){
 if(TrimString(strObjName.value) == ""){
   //alert("Please enter " + strContent  + " !");
   strObjName.focus();
   return true;
	} else {
  return false;
 }
}

function pp_getElementByName(name) {
	return document.getElementsByName(name)[0];
}
function selectOption(select, option) {
    var i;
    for (i = 0; i < select.options.length; i++) {
        if (select.options[i].value == option) {
            select.options[i].selected = true;
            break;
        }
    }
}

function getImageData(basepath,url, symbol, index) {
	document.getElementById("summaryChart").src = url;
	document.getElementById("mktvalue").value = symbol;
	if(symbol=="HOSE"){
		if(document.getElementById("div_HOSE")){
			document.getElementById("div_HOSE").style.display = "inline";
		}
		if(document.getElementById("div_HASTC")){
			document.getElementById("div_HASTC").style.display = "none";
		}
		window.document.getElementById("tabHO").className ="mkcurrent";
		window.document.getElementById("tabHA").className ="mkothers";
	}
	else{
		if(document.getElementById("div_HOSE")){
			document.getElementById("div_HOSE").style.display = "none";
		}
		if(document.getElementById("div_HASTC")){
			document.getElementById("div_HASTC").style.display = "inline";
		}
		window.document.getElementById("tabHO").className ="mkothers";
		window.document.getElementById("tabHA").className ="mkcurrent";
	}

	if(window.document.getElementById("linkMarket")){
		window.document.getElementById("linkMarket").href = basepath + "/investmentMarketDetail.do?marketCode=" + symbol;
	}

	if(index == '1') {
		changeTopmovers('topmovers'+index, 'topmovers2', 1);
	} else {
         changeTopmovers('topmovers'+index,  'topmovers1', 1);
	}
	//var request = getXMLHTTPRequest();
	//var response = getServerText(url, request);
}

function getXMLHTTPRequest() {
	try {
		req = new XMLHttpRequest();
	}
	catch (err1) {
		try {
			req = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (err2) {
			try {
				req = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (err3) {
				req = false;
			}
		}
	}
	return req;
}

function getServerText(url, request) {
	request.open("GET", url, true);
	request.onreadystatechange = function () {
		callBack(request);
	};
	request.send(null);
}

function callBack(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
			var mytext = request.responseText;
			//document.getElementById("summaryChart").src = request.responseXML;
		}
	} else {
		//document.getElementById("summaryChart").src = "";
	}
}

// For market
function getServerDataForMarket(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackDataForMarket(request);
	};
	request.send(null);
}

function callBackDataForMarket(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var xmlDomForMarket = null;
            var priceArrayMarket = new Array();
            var volArrayMarket = new Array();
            var endDateMarket = new Date();
            var market = null;
            var flags = new Array();
			 xmlDomForMarket = getXML(request);
            //alert(request.responseText);
			if(xmlDomForMarket == null) {
			    return;
			}

			var listVolNodeForMarket = selectNodeList(xmlDomForMarket, "/market/volume/vol-node");
			for (var i = 0; i < listVolNodeForMarket.length; i++) {
				if (listVolNodeForMarket[i].firstChild != null) {
                 	if(volArrayMarket.length < 500){
                 	volArrayMarket.push(listVolNodeForMarket[i].firstChild.nodeValue);
                 	}
                 } /* Don't show null value*/
                 else {
                 	volArrayMarket.push(null);
                 }
                 //alert(listVolNodeForMarket[i].firstChild.nodeValue);
            }

            var listPriceNodeForMarket = selectNodeList(xmlDomForMarket, "/market/price/price-node");
			for (var i = 0; i < listPriceNodeForMarket.length; i++) {
				if (listPriceNodeForMarket[i].firstChild) {
                 	if(priceArrayMarket.length < 500){
                 	priceArrayMarket.push(listPriceNodeForMarket[i].firstChild.nodeValue);
                 	}
                 } /* Don't show null value*/
                 else {
                 	priceArrayMarket.push(null);
                 }
                 //alert(listPriceNodeForMarket[i].firstChild.nodeValue);
            }

			if (priceArrayMarket.length <=0) {
			    return;
            }
            var infoNodeForMarket = selectNodeList(xmlDomForMarket, "/market/info");
            var marketId = infoNodeForMarket[0].getAttribute("id");
            var marketName = infoNodeForMarket[0].getAttribute("name");
            var marketSymbol = infoNodeForMarket[0].getAttribute("symbol");
            var year = infoNodeForMarket[0].getAttribute("year");
            var month = infoNodeForMarket[0].getAttribute("month");
            var day = infoNodeForMarket[0].getAttribute("day");
            //alert(marketId + " " + marketName + " " + marketSymbol);
            //alert(year + " " + month + " " + day);
            market = new Company(2, marketSymbol, marketName, marketId);
            endDateMarket.setFullYear(year, month - 1, day);
              // tickets
            var listNodeForTicket = selectNodeList(xmlDomForMarket, "/market/tickets/ticket");
			for (var i = 0; i < listNodeForTicket.length; i++) {
                 var id = listNodeForTicket[i].getAttribute("id");
                 var createdDate = listNodeForTicket[i].getAttribute("createdDate");
                 var date = new Date();
                 var year = createdDate.substring(0,4);
                 var month = createdDate.substring(5,7);
                 var day =createdDate.substring(8,10);
                 //date.setFullYear(year, month - 1, day);
                 date.setFullYear(year, month - 1, day);
                 var flagObject = new Flag(0, id , date, i%26);
                 flags.push(flagObject);
            }
            var dataObj = new DataObj(market.id, endDateMarket, priceArrayMarket, volArrayMarket, flags);
            companies.push(market);
            dataObjs.push(dataObj);
			addChart(companies.length -1);
    		renderCompareTable();
		}
	} else {
		//alert("Can not connect to server successfully");
	}
}



// For industry
function getServerDataForIndustry(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackDataForIndustry(request);
	};
	request.send(null);
}

function callBackDataForIndustry(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var priceArrayIndustry = new Array();
            var volArrayIndustry = new Array();
             var flags = new Array();
            var xmlDomForIndustry = null;
            var endDateIndustry = new Date();
            var industry = null;
			xmlDomForIndustry = getXML(request);
            //alert(request.responseText);
			if(xmlDomForIndustry == null){
				return;
			}
			var listVolNodeForIndustry = selectNodeList(xmlDomForIndustry, "/industry/volume/vol-node");
			for (var i = 0; i < listVolNodeForIndustry.length; i++) {
				if (listVolNodeForIndustry[i].firstChild != null) {
                 	volArrayIndustry.push(listVolNodeForIndustry[i].firstChild.nodeValue);
                 } else {
                 	volArrayIndustry.push(null);
                 }
             //   alert(listVolNodeForIndustry[i].firstChild.nodeValue);
            }

            var listPriceNodeForIndustry = selectNodeList(xmlDomForIndustry, "/industry/price/price-node");
			for (var i = 0; i < listPriceNodeForIndustry.length; i++) {
				if (listPriceNodeForIndustry[i].firstChild != null) {
                 	priceArrayIndustry.push(listPriceNodeForIndustry[i].firstChild.nodeValue);
                 } else {
                 	priceArrayIndustry.push(null);
                 }
                 ///alert(listPriceNodeForIndustry[i].firstChild.nodeValue);
            }

			if(	priceArrayIndustry.length <= 0) {
				return;
			}
            var infoNodeForIndustry = selectNodeList(xmlDomForIndustry, "/industry/info");
            var industryId = infoNodeForIndustry[0].getAttribute("id");
            var industryName = infoNodeForIndustry[0].getAttribute("name");
            var industrySymbol = infoNodeForIndustry[0].getAttribute("symbol");
            var year = infoNodeForIndustry[0].getAttribute("year");
            var month = infoNodeForIndustry[0].getAttribute("month");
            var day = infoNodeForIndustry[0].getAttribute("day");
            //alert(year + " " + month + " " + day);
            //alert(industryId + industryName + industrySymbol);
            industry = new Company(1, industrySymbol, industryName, industryId);
            endDateIndustry.setFullYear(year, month - 1 , day);
             // tickets
            var listNodeForTicket = selectNodeList(xmlDomForIndustry, "/industry/tickets/ticket");
			for (var i = 0; i < listNodeForTicket.length; i++) {
                 var id = listNodeForTicket[i].getAttribute("id");
                 var createdDate = listNodeForTicket[i].getAttribute("createdDate");
                 var date = new Date();
                 var year = createdDate.substring(0,4);
                 var month = createdDate.substring(5,7);
                 var day =createdDate.substring(8,10);
                 //date.setFullYear(year, month - 1, day);
                 date.setFullYear(year, month - 1, day);
                 var flagObject = new Flag(0, id , date, i%26);
                 flags.push(flagObject);
            }

            var dataObj = new DataObj(industry.id, endDateIndustry, priceArrayIndustry, volArrayIndustry, flags);
            companies.push(industry);
            dataObjs.push(dataObj);
			addChart(companies.length - 1);
			//addChart(companies.length - 2);
    		renderCompareTable();
		}
	} else {
		//alert("Can not connect to server successfully");
	}
}

// For company
function getServerDataForCompany(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackDataForCompany(request);
	};
	request.send(null);
}

function callBackDataForCompany(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var priceArrayCompany = new Array();
            var volArrayCompany = new Array();
            var flags = new Array();
            var xmlDomForCompany = null;
            var endDateCompany = new Date();
            var company = null;
			xmlDomForCompany = getXML(request);
            //alert(request.responseText);
			if(xmlDomForCompany == null) return;
			var listVolNodeForCompany = selectNodeList(xmlDomForCompany, "/company/volume/vol-node");
			for (var i = 0; i < listVolNodeForCompany.length; i++) {
				if (listVolNodeForCompany[i].firstChild != null) {
                 	volArrayCompany.push(listVolNodeForCompany[i].firstChild.nodeValue);
                }
                /* Don't show null value*/
                else {
                	volArrayCompany.push(null);
                }
                 //alert(listVolNodeForcompany[i].firstChild.nodeValue);
            }

            var listPriceNodeForCompany = selectNodeList(xmlDomForCompany, "/company/price/price-node");
			for (var i = 0; i < listPriceNodeForCompany.length; i++) {
				if (listPriceNodeForCompany[i].firstChild != null) {
                 	priceArrayCompany.push(listPriceNodeForCompany[i].firstChild.nodeValue);
                 }
                 /* Don't show null value*/
                 else {
                 	priceArrayCompany.push(null);
                 }
                 //alert(listPriceNodeForcompany[i].firstChild.nodeValue);
            }
            if (priceArrayCompany.length <=0) {
				return;
            }
            var infoNodeForCompany = selectNodeList(xmlDomForCompany, "/company/info");
            var companyId = infoNodeForCompany[0].getAttribute("id");
            var companyName = infoNodeForCompany[0].getAttribute("name");
            var companySymbol = infoNodeForCompany[0].getAttribute("symbol");
            var year = infoNodeForCompany[0].getAttribute("year");
            var month = infoNodeForCompany[0].getAttribute("month");
            var day = infoNodeForCompany[0].getAttribute("day");
            //alert(year + " " + month + " " + day);
            //alert(companyId + companyName + companySymbol);
            endDateCompany.setFullYear(year, month - 1, day);
            company = new Company(0, companySymbol, companyName, companyId);

            // tickets
            var listNodeForTicket = selectNodeList(xmlDomForCompany, "/company/tickets/ticket");
			for (var i = 0; i < listNodeForTicket.length; i++) {
                 var id = listNodeForTicket[i].getAttribute("id");
                 var createdDate = listNodeForTicket[i].getAttribute("createdDate");
                 var date = new Date();
                 var year = createdDate.substring(0,4);
                 var month = createdDate.substring(5,7);
                 var day =createdDate.substring(8,10);
                 //date.setFullYear(year, month - 1, day);
                 date.setFullYear(year, month - 1, day);
                 var flagObject = new Flag(0, id , date, i%26);
                 flags.push(flagObject);
            }

            var dataObj = new DataObj(company.id,endDateCompany,priceArrayCompany,volArrayCompany, flags);
            companies.push(company);
            dataObjs.push(dataObj);
			addChart(companies.length -1);
    		renderCompareTable();
		}
	} else {
		//alert("Can not connect to server successfully");
	}
}

// For company_Tickets

function getTicketsForChartCompany(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackTicketsForChartCompany(request);
	};
	request.send(null);
}

function callBackTicketsForChartCompany(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            xmlDomForTickets = getXML(request);
            //alert(request.responseText);
			var listNodeForTicket = selectNodeList(xmlDomForTickets, "/company/tickets/ticket");
			for (var i = 0; i < listNodeForTicket.length; i++) {
                 var id = listNodeForTicket[i].getAttribute("id");
                 var createdDate = listNodeForTicket[i].getAttribute("createdDate");
                 var flagObject = new Flag(0, id , new Date(createdDate),i%26);
                 flags.push(flagObject);
            }
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}




// For list_Industry

function getListIndustryForChart(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackListIndustryForChart(request);
	};
	request.send(null);
}

function callBackListIndustryForChart(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            xmlDomForListIndustry = getXML(request);
            //alert(request.responseText);
			var listNodeForListIndustry = selectNodeList(xmlDomForListIndustry, "/industry/code");
			for (var i = 0; i < listNodeForListIndustry.length; i++) {
                if (listNodeForListIndustry[i].firstChild != null) {
                 	listIndustryToCheck.push(listNodeForListIndustry[i].firstChild.nodeValue);
                } else {
                	listNodeForListIndustry.push(null);
                }
            }
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

// For Industry_listCompany
function getListCompanyOfIndustry(url) {
	request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackListCompanyOfIndustry(request);
	};
	request.send(null);
}

function callBackListCompanyOfIndustry(request) {

	if (request.readyState == 4) {
		if (request.status == 200) {
            var main = getElem("listCompany");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

//For Advertisement
//@author: anhhc

//change advertisement order
function ChangeAdvertisementOrder(url) {
	var request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackChangeAdvertisementOrder(request);
	};
	request.send(null);
}

function callBackChangeAdvertisementOrder(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var main = document.getElementById("listAdvertisements");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

//show advertisement
//bottom left
function ShowAdvertisementBottomLeft(url) {
	var request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackShowAdvertisementBottomLeft(request);
	};
	request.send(null);
}

function callBackShowAdvertisementBottomLeft(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {

            var main = document.getElementById("bottom-left-advertisements");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

//bottom right
function ShowAdvertisementBottomRight_(url) {
	var request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackShowAdvertisementBottomRight(request);
	};
	request.send(null);
}

function ShowAdvertisementBottomRight(url) {
	new Ajax.Updater({success:"bottom-right-advertisements", failure:"bottom-right-advertisements"}, url, {evalScripts:true});
}
function callBackShowAdvertisementBottomRight(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var main = document.getElementById("bottom-right-advertisements");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.style.position="inherit";
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

//news details
function ShowAdvertisementNewsDetails(url) {
	var request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackShowAdvertisementNewsDetails(request);
	};
	request.send(null);
}

function callBackShowAdvertisementNewsDetails(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var main = document.getElementById("news-details-advertisements");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.style.width='300px';
            node.style.align='center';
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

//bond details
function ShowAdvertisementBond(url) {
	var request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackShowAdvertisementBond(request);
	};
	request.send(null);
}

function callBackShowAdvertisementBond(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var main = document.getElementById("bond-advertisements");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

//change rolling advertisement
function ChangeRollingAdvertisementSpeed(url) {
	var request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackChangeRollingAdvertisementSpeed(request);
	};
	request.send(null);
}

function callBackChangeRollingAdvertisementSpeed(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var main = document.getElementById("rolling_speed");
            main.innerHTML = "";
            var node = document.createElement("div");
            node.innerHTML =  request.responseText;
            main.appendChild(node);
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

function getXML (response) {
  var contentType = response.getResponseHeader("Content-Type");
  if (contentType) {
    if (contentType.match(/^text\/xml;/i)) {
      var xml;
      if (!hasNativeXPathSupport()) {
        xml = xmlParse(response.responseText);
      } else {
        xml = response.responseXML;
      }
      if (xml.parseError && xml.parseError.errorCode != 0) { // for IE
        return null;
      }
      if (xml.documentElement.tagName == "parsererror") { // for Gecko
        return null;
      }
      if (selectString(xml, "/fault")) {
       return null;
      }
      return xml;
    } else {
      return null;
    }
  } else { // server down
    return null;
  }
};

function selectNode(context, expr) {
  if (context.documentElement) {
    var xml = context;
    context = context.documentElement;
  } else {
    var xml = context.ownerDocument;
  }
  if (!hasNativeXPathSupport()) {
    // This is for all browsers with no built in XPath support.
    var compExpr = xpathParse(expr);
    var node = compExpr.evaluate(new ExprContext(context));
    return (node.value[0]);
  } else if (window.ActiveXObject) {
    xml.setProperty("SelectionLanguage", "XPath");
    var node = context.selectSingleNode(expr);
    return node;
  } else if (xml.evaluate) {
    return xml.evaluate(expr, context, xml.createNSResolver(context),
        XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  } else {
    // Should never get here.
  }
  return null;
};

function selectNodeList (context, expr) {
  if(context==null) return null;
  if (context.documentElement) {
    var xml = context;
    context = context.documentElement;
  } else {
    var xml = context.ownerDocument;
  }
  if (!hasNativeXPathSupport()) {
    // This is for all browsers with no built in XPath support
    var compExpr = xpathParse(expr);
    var iterator = compExpr.evaluate(new ExprContext(context));
    var list = iterator.nodeSetValue();
    return (list);
  } else if (window.ActiveXObject) {
    xml.setProperty("SelectionLanguage", "XPath");
    var iterator = context.selectNodes(expr);
    var list = new Array();
    while (true) {
      var node = iterator.nextNode();
      if (node) {
        list.push(node);
      } else {
        break;
      }
    }
    return list;
  } else if (xml.evaluate) {
    var iterator = xml.evaluate(expr, context, xml.createNSResolver(context),
        XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
    var list = new Array();
    while(true) {
      var node = iterator.iterateNext();
      if (node) {
        list.push(node);
      } else {
        break;
      }
    }
    return list;
  } else {
    // Should never get here.
  }
  return null;
};


function hasNativeXPathSupport (xml) {
  var result = false;
  // An override to make debugging easier.  This override will enable the
  // Google XPath/XSLT library for all browsers
  if (window.overrideNativeXPath) {
    return (result);
  }
  if (!xml) {
    if (document.implementation &&
        document.implementation.createDocument) {
      xml = document.implementation.createDocument("", "", null);
    }
  }
  if (window.ActiveXObject) {
    result = true;
  } else if (xml.evaluate) {
    result = true;
  }
  return (result);
};

function selectString (context, expr) {
  if (context.documentElement) {
    var xml = context;
    context = context.documentElement;
  } else {
    var xml = context.ownerDocument;
  }
  if (!hasNativeXPathSupport()) {
    // This is for all browsers with no built in XPath support
    var compExpr = xpathParse(expr);
    var node = compExpr.evaluate(new ExprContext(context));
    debug("selectString: expr=" + expr + " done.");
    return (node.stringValue());
  } else if (window.ActiveXObject) {
    xml.setProperty("SelectionLanguage", "XPath");
    var node = context.selectSingleNode(expr);
    return node != null ? node.text : null;
  } else if (xml.evaluate) {
    return xml.evaluate(expr, context, xml.createNSResolver(context),
        XPathResult.STRING_TYPE, null).stringValue;
  } else {
    // Should never get here.
  }
  return null;
};

/****************************************************************************************
 *SECTOR
 ***************************************************************************************/

function getServerDataForSector(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackDataForSector(request);
	};
	request.send(null);
}

function callBackDataForSector(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
            var priceArraySector = new Array();
            var volArraySector = new Array();
             var flags = new Array();
            var xmlDomForSector = null;
            var endDateSector = new Date();
            var sector = null;
			xmlDomForSector = getXML(request);
            //alert(request.responseText);
			if(xmlDomForSector == null){
				return;
			}
			var listVolNodeForSector = selectNodeList(xmlDomForSector, "/sector/volume/vol-node");
			for (var i = 0; i < listVolNodeForSector.length; i++) {
				if (listVolNodeForSector[i].firstChild != null) {
                 	volArraySector.push(listVolNodeForSector[i].firstChild.nodeValue);
                 } else {
                 	volArraySector.push(null);
                 }
             //   alert(listVolNodeForSector[i].firstChild.nodeValue);
            }

            var listPriceNodeForSector = selectNodeList(xmlDomForSector, "/sector/price/price-node");
			for (var i = 0; i < listPriceNodeForSector.length; i++) {
				if (listPriceNodeForSector[i].firstChild != null) {
                 	priceArraySector.push(listPriceNodeForSector[i].firstChild.nodeValue);
                 } else {
                 	priceArraySector.push(null);
                 }
                 ///alert(listPriceNodeForSector[i].firstChild.nodeValue);
            }

			if(	priceArraySector.length <= 0) {
				return;
			}
            var infoNodeForSector = selectNodeList(xmlDomForSector, "/sector/info");
            var sectorId = infoNodeForSector[0].getAttribute("id");
            var sectorName = infoNodeForSector[0].getAttribute("name");
            var sectorSymbol = infoNodeForSector[0].getAttribute("symbol");
            var year = infoNodeForSector[0].getAttribute("year");
            var month = infoNodeForSector[0].getAttribute("month");
            var day = infoNodeForSector[0].getAttribute("day");
            //alert(year + " " + month + " " + day);
            //alert("sectorId= " + sectorId + ", sectorName= " + sectorName + ", sectorSymbol= " + sectorSymbol);
            sector = new Company(3, sectorSymbol, sectorName, sectorId);
            endDateSector.setFullYear(year, month - 1 , day);
             // tickets
            var listNodeForTicket = selectNodeList(xmlDomForSector, "/sector/tickets/ticket");
			for (var i = 0; i < listNodeForTicket.length; i++) {
                 var id = listNodeForTicket[i].getAttribute("id");
                 var createdDate = listNodeForTicket[i].getAttribute("createdDate");
                 var date = new Date();
                 var year = createdDate.substring(0,4);
                 var month = createdDate.substring(5,7);
                 var day =createdDate.substring(8,10);
                 //date.setFullYear(year, month - 1, day);
                 date.setFullYear(year, month - 1, day);
                 var flagObject = new Flag(0, id , date, i%26);
                 flags.push(flagObject);
            }

            var dataObj = new DataObj(sector.id, endDateSector, priceArraySector, volArraySector, flags);
            companies.push(sector);
            dataObjs.push(dataObj);
			addChart(companies.length - 1);
			//addChart(companies.length - 2);
    		renderCompareTable();
		}
	} else {
		//alert("Can not connect to server successfully");
	}
}

// For list_sector
function getListSectorForChart(url, request) {
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		callBackListSectorForChart(request);
	};
	request.send(null);
}

function callBackListSectorForChart(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
			//alert(request.responseText);
            xmlDomForListSector = getXML(request);
			var listNodeForListSector = selectNodeList(xmlDomForListSector, "/sector/code");
			for (var i = 0; i < listNodeForListSector.length; i++) {
                if (listNodeForListSector[i].firstChild != null) {
                 	listSectorToCheck.push(listNodeForListSector[i].firstChild.nodeValue);
                } else {
                	listNodeForListSector.push(null);
                }
            }
        }
	} else {
		//alert("Can not connect to server successfully");
	}
}

function removeAllChar(strInput, strFind, strRep){
	idx = strInput.indexOf(strFind);
	while(idx != -1){
		strInput = strInput.replace(strFind, strRep);
		idx = strInput.indexOf(strFind);
	}
	return strInput;
}

function popupWindowCenter(url, title, width, height) {
	var left = (screen.width/2)-(width/2);
	var top = (screen.height/2)-(height/2);
	var targetWin = window.open (url, title, 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+width+', height='+height+', top='+top+', left='+left);
}

function getListInternationalIndexes(url) {
	request = getXMLHTTPRequest();
	request.open("POST", url, true);
	request.onreadystatechange = function () {
		try{
			callBackListInternationalIndexes(request);
		}
		catch(ex){

		}
	};
	request.send(null);
}

function callBackListInternationalIndexes(request) {
	if (request.readyState == 4) {
		if (request.status == 200) {
			var xmlDomMarketIndexes = null;
			xmlDomMarketIndexes = getXML(request);
			if(xmlDomMarketIndexes == null){
				return;
			}
			var listMarketIndexes = selectNodeList(xmlDomMarketIndexes, "/index/indexChild");
				//DowJones
			renderCloseValueMarketIndex(listMarketIndexes[0].firstChild,document.getElementById("closeDowJones"));
			renderChangeValueMarketIndex(listMarketIndexes[1].firstChild,document.getElementById("changeDowJones"));

			//Nasdaq
			renderCloseValueMarketIndex(listMarketIndexes[2].firstChild,document.getElementById("closeNasdaq"));
			renderChangeValueMarketIndex(listMarketIndexes[3].firstChild,document.getElementById("changeNasdaq"));

			//Nikkei
			renderCloseValueMarketIndex(listMarketIndexes[4].firstChild,document.getElementById("closeNikkei"));
			renderChangeValueMarketIndex(listMarketIndexes[5].firstChild,document.getElementById("changeNikkei"));

			//HangSeng
			renderCloseValueMarketIndex(listMarketIndexes[6].firstChild,document.getElementById("closeHangSeng"));
			renderChangeValueMarketIndex(listMarketIndexes[7].firstChild,document.getElementById("changeHangSeng"));

			//KLSE
			//renderCloseValueMarketIndex(listMarketIndexes[8].firstChild,document.getElementById("closeKLSE"));
			//renderChangeValueMarketIndex(listMarketIndexes[9].firstChild,document.getElementById("changeKLSE"));
		}
	} else {
		//to-do
	}
}

/**
 *	Render for the Close value
 *
 *	@valueNodeClose	The value of Close
 *  @domNodeClose	The DOM element of Close
 */
function renderCloseValueMarketIndex(valueNodeClose, domNodeClose) {
	var searchStr = "\n";
	var replaceStr = "";
	var re = new RegExp(searchStr , "g");

	domNodeClose.className = "lastValue";


	if (valueNodeClose == null) {
		domNodeClose.innerHTML = "-";
	} else {
		var value = trim(valueNodeClose.nodeValue.replace(re,replaceStr));
		if(value==""){
			domNodeClose.innerHTML = "-";
		}else{
			//domNodeClose.innerHTML = formatNumber(value.toString(), 1);
			domNodeClose.innerHTML = value.toString();
		}
	}
}

/**
 *	Render for the Change value
 *
 *	@valueNodeChange	The value of Change
 *  @domNodeChange		The DOM element of Change
 */
function renderChangeValueMarketIndex(valueNodeChange, domNodeChange) {
	var searchStr = "\n";
	var replaceStr = "";
	var re = new RegExp(searchStr , "g");

	if (valueNodeChange == null) {
		domNodeChange.className = "changeLower";
		domNodeChange.innerHTML = "-";
	} else {
		var value = trim(valueNodeChange.nodeValue.replace(re,replaceStr));
		if (value == "") {
			domNodeChange.className = "changeLower";
			domNodeChange.innerHTML = "-";
		} else {
			var values = Math.round(value * 100)/100;
			if (values > 0 ) {
				domNodeChange.className = "changeHigher";
				//domNodeChange.innerHTML = formatNumber("+" + values, 2);
				domNodeChange.innerHTML = formatNumber("+" + values, 2) + "%";
			} else if (values == 0) {
				domNodeChange.className = "noChange";
				//domNodeChange.innerHTML = "0.00";
				domNodeChange.innerHTML = "0.00%";
			} else {
				domNodeChange.className = "changeLower";
				//domNodeChange.innerHTML = formatNumber(values.toString(), 2);
				domNodeChange.innerHTML = formatNumber(values.toString(), 2) + "%";
			}
	    }
    }
}

/**
 *	Format for the Last value
 *
 *	@value	    The value of Last or Change
 *	@numberType	The valid position of value
 */
function formatNumber(value, numberType) {
	var lengthNumber = value.length;
	var count = 0;
	var flag = false;
	for(var i = lengthNumber ; i>=numberType; i--) {
		count++;
		if (value.substring(i-1, i) == "."){
			flag = true;
			break;
		}
	}
	if (count == 2 && flag) {
		value = value + "0";
	} else if (!flag) {
		value = value + ".00";
	}

	//Break down by the "," character
	lengthNumber = value.length;
	count = 0;
	var temp = value.substring(lengthNumber - 3,lengthNumber);
	for (var j = lengthNumber - 3; j>= numberType; j--){
		count++;
		temp = value.substring(j-1, j) + temp;
		if (count == 3 && j !=  numberType ) {
			temp = "," + temp;
			count = 0;
		}
	}
	if (numberType == 2) {
		if (value > 0) {
			return ("+" + temp);
		} else {
			return ("-" + temp);
		}
	}
	return temp;
}

/**
 * Trim a string
 * @str A string
 */
function trim(str) {
	if(!str || typeof str != 'string') {
		return null;
	}
	return str.replace(/^[\s]+/,'').replace(/[\s]+$/,'').replace(/[\s]{2,}/,' ');
}

/**
 * Verify an email address
 *
 * @str		An email address
 */
function isValidEmail(str) {
	return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
}

/**
 * Verify an telephone number
 *
 * @strTele		A string of telephone number
 */
function isPhoneNumber(strTele) {
	var validChars = "0123456789-()+. ";
	var isNumber=true;
	var charValue;
	for (i = 0; i < strTele.length && isNumber == true; i++) {
  		charValue = strTele.charAt(i);
		if (validChars.indexOf(charValue) == -1) {
	 		isNumber = false;
	 	}
 	}
	return isNumber;
}

/**
 * Verify any special symbol for Code field
 *
 * @str		A string of Code field
 */
function hasSpecialSymbol(str) {
	var isValidCode = true;
	var strCode = trim(str);
	if (strCode == null || strCode == "") {
		isValidCode = false;
	} else {
		var isValidCode = true;
		var charValue;
		for (i = 0; i < strCode.length && isValidCode == true; i++) {
			charValue = strCode.charAt(i).charCodeAt(0);
			if (!((charValue >= 47 && charValue <= 58) ||
				  (charValue >= 65 && charValue <= 90) ||
				  (charValue == 32) ||
				  (charValue == 43) ||
				  (charValue == 45) ||
				  (charValue == 95))) {
				isValidCode = false;
			}
		}
	}
	return isValidCode;
}

/**
 * Verify any year
 *
 * @str		A string of year
 */
function isValueYear(sText) {
	var validChars = "0123456789";
	var isYear = true;
	var charOfYear;
	for (i = 0; i < sText.length && isYear == true; i++) {
		charOfYear = sText.charAt(i);
		if (validChars.indexOf(charOfYear) == -1) {
			isYear = false;
		}
	 }
	return isYear;
}

/**
 * Count the "," character of a number
 *
 * @str		A string of a value
 * @return  The amount of the ","
 */
function commaNumber(value) {
	var commaChar = ",";
	var result=0;
	var elementChar;
	for (i = 0; i < value.length; i++) {
		elementChar = value.substring(i, i + 1);
		if (commaChar == elementChar) {
			result += 1;
		}
	}
	return result;
}

/**
 * Count the "." character of a number
 *
 * @str		A string of a value
 * @return  The amount of the "."
 */
function dotNumber(value) {
	var commaChar = ".";
	var result=0;
	var elementChar;
	for (i = 0; i < value.length; i++) {
		elementChar = value.substring(i, i + 1);
		if (commaChar == elementChar) {
			result += 1;
		}
	}
	return result;
}

function isInteger(sText) {
	var validChars = "0123456789";
	var isValid = true;
	var charOfYear;
	for (i = 0; i < sText.length && isValid == true; i++) {
		charOfYear = sText.charAt(i);
		if (validChars.indexOf(charOfYear) == -1) {
			isValid = false;
		}
	}
	return isValid;
}

function isInList(arrList, vValue) {
	for(var i = 0; i < arrList.length; i++) {
		if(vValue.toLowerCase() == arrList[i].toLowerCase())
			return true;
	}
	return false;
}

function isInStringList(strList, separator, vValue) {
	return isInList(strList.split(separator), vValue);
}

function changeDateToEnFormat(strDate) {
	var dd = strDate.substring(0, 2);
	var mm = strDate.substring(3, 5);
	var yy = strDate.substring(6, 10);
	return mm + "/" + dd+ "/" + yy;
}

function calYear(x) {
	if(x < 1000)
		return x + 1900;
	return x;
}

function isFloat(x) {
	return (x == parseFloat(x));
}

function isPercent(x) {
	var flag = isFloat(x);
	if(!flag)
		return false;
	if(x <= 0 || x >100) {
		return false;
	}
	return true;
}

function onMouseOver(id) {
	obj = document.getElementById(id);
	if(obj) {
		obj.bgColor = "#E6FECF"; //"#EEFEE0"; //"#DDFDD5"; //"#DCFDBD";
	}
	obj = null;
}

function onMouseout(id) {
	obj = document.getElementById(id);
	if(obj) {
		obj.bgColor = "#FFFFFF";
	}
	obj = null;
}