var IE = document.all?true:false;
if (!IE) 
	document.captureEvents(Event.MOUSEMOVE)
else{
	var iebody=(document.compatMode && 
			document.compatMode != 'BackCompat') ? 
				document.documentElement : document.body;
}

var data = new Array();				//stock data
var dataindex = new Array();		//x-coord for data
var dataindex_point = new Array();	//middle x-coord of each bar/candle
var dataindex_ypoint = new Array();	//y-coord of close for each x

var jg_vertical = new Array();		//for vertical line

var tempX = 0;		//temp mouse x
var tempY = 0;		//temp mouse y
var pageX = 0;
var pageY = 0;
var xoffset = 2;	//offset for chart
var yoffset;		//not used yet

var data_min;	//max x on chart
var data_max;	//min x on chart

var index_max;	//max index (min always 0)

var chartcount;	//# of charts

//var priceOffsetTop = 20;	//line offset for price chart
var priceOffsetTop = 24;	//line offset for price chart
var priceOffsetBot = 429;   //line offset for price chart
var indiOffsetTop = 6;		//line offset for indi chart
var indiOffsetBot = 125;	//line offset for indi chart

//price offset adjust -- needed because of div margin for charts
var padjust = 0;

//var datalist = new Array();  //for data innerHTML
var datalist = new Object; 		//for data innerHTML
var datacount = 0;				//num of data points
var data_noid = new Array;

var prev_xline = 0;
var offsetx = 12;
var offsety =  8;	
var tip = "";		
var imgID = "";		//store id of mouse over

var market = "gp_scond_td"; //id for market only

var cur_index = 0;

//signal value determined by chart pgm
//add 2 to signal since...
//-2 = - pivot
//-1 = - powershift
// 0 = no signal
// 1 = + powershift
// 2 = + pivot
var psignal = ["<Br>Down Pivot","<Br>Down PowerShift","","<Br>Up PowerShift","<Br>Up Pivot"];
var philo = ["<Br>52wk LO","<Br>26wk LO","<Br>13wk LO","","<Br>13wk HI","<Br>26wk HI","<Br>52wk HI"];
var pxover = ["","<Br>TRIN X DOWN","","<Br>TRIN X UP",""];

function gptrend(t){
	var stype = ["s_trends","s_trendi","s_trendl","s_trendp"];
	var ttype = ["Short Mtm","Int Mtm","Long Mtm","PSMF"];
	var txt = "";
	var up = [];
	var dn = [];
	u=0;
	d=0;
	for(var i=0,l=stype.length;i<l;i++){
		if(parseInt(t[stype[i]]) == 1){
			up[u++] = i;
		
		}else if(parseInt(t[stype[i]]) == -1)
			dn[d++] = i;
	}

	if(u){
		txt += "<br><br>UP TREND:";
		for(i=0;i<u;i++)
			txt += "<br>" + ttype[up[i]];
	}
	
	if(d){
		txt += "<br><br>DOWN TREND:";
		for(i=0;i<d;i++)
			txt += "<br>" + ttype[dn[i]];
	}
	return txt;
	
}

var mkttrend = ["<b>Strong</b> Down","Down","No Trend","Up","<b>Strong</b> Up"]
var mktobos = ["<b>Very</b> Over Sold","Over Sold","Neutral","Over Bought","<b>Very</b> Over Bought"]

var mkttrend_color = ["#ff0000","#ffa500","#e0e0e0","#ffff00","#5feb44"];
var mktobos_color = ["#5feb44","#ffff00","#e0e0e0","#ffa500","#ff0000"];

function keycheck(e)
{
var keynum;
var keychar;
var numcheck;
	if(window.event) // IE
	{
	keynum = e.keyCode;
	}
	else if(e.which) // Netscape/Firefox/Opera
	{
	keynum = e.which;
	}
	
	//alert(keynum);
	//keychar = String.fromCharCode(keynum);
	//numcheck = /\d/;
}

function createVert(count){	//create vertical line object
	chartcount = count;
	if(count>0){
		for(var i=0;i<count;i++){	//one for each chart
			jg_vertical[i] = new jsGraphics("myCanvas" + (i + 1));//myCanvas is the layer where the line is drawn";
			jg_vertical[i].setColor("#339982");//set color of the tracker
			jg_vertical[i].setStroke(1);  //set width of line
		}
	}
}

function setLength(len){	//vert line offset based on chart length
	if((len>=5 && len<=9) || len==3)
		xoffset = 2;
}

function getPosition(img,p){		//get coord and data
	imgID = img;
	
	$(img).onmousemove = getPosData;
	$(img).onmouseout = clearToolTip;

	if(p)
	padjust = p; //adjust price line if stock (for grouppower only)
}

function getPosData(e){
	getMouseXY(e);
	showData();
}

function setXY() {
	
	if (IE) { // grab the x-y pos.s if browser is IE
		
		tempX = event.offsetX;
		tempY = event.offsetY;
	
		pageX = event.clientX + iebody.scrollLeft + offsetx;
		pageY = event.clientY + iebody.scrollTop + offsety;
		
	}
	else {  // grab the x-y pos.s if browser is NS
		var elem = $("1");
		
		//tempX = e.layerX - elem.x;
		//tempY = e.layerY - elem.y;
		var xpos;
		var ypos;

		if(e.x){
			xpos = e.x;
			ypos = e.y;
		}else{
			xpos = e.layerX;
			ypos = e.layerY;
		}
		
		tempX = xpos - elem.x;
		tempY = ypos - elem.y;
		pageX = e.clientX + window.pageXOffset + offsetx;
		pageY = e.clientY + window.pageYOffset + offsety;
	}
	
}

function getMouseXY(e) {
	
	if (IE) { // grab the x-y pos.s if browser is IE
		
		tempX = event.offsetX;
		tempY = event.offsetY;
	
		pageX = event.clientX + iebody.scrollLeft + offsetx;
		pageY = event.clientY + iebody.scrollTop + offsety;
		
	}
	else {  // grab the x-y pos.s if browser is NS
		var elem = $("1");
		
		//tempX = e.layerX - elem.x;
		//tempY = e.layerY - elem.y;
		var xpos;
		var ypos;

		if(e.x){
			xpos = e.x;
			ypos = e.y;
		}else{
			xpos = e.layerX;
			ypos = e.layerY;
		}
		
		tempX = xpos - elem.x;
		tempY = ypos - elem.y;
		pageX = e.clientX + window.pageXOffset + offsetx;
		pageY = e.clientY + window.pageYOffset + offsety;
	}
	
}

function showData(adj){
	var xline;
	var xline2;
	var yline;
	
	var diff = 1;	//dont get new data if diff is 0
	
	
	if(adj!=null){
		if(adj){
			//tempx and tempy not set
			//set pagex and pagey 
			
			if(cur_index+adj>=0 && cur_index+adj<dataindex_point.length){
				cur_index += adj;
				prev_xline += adj;
				
				//adjust pagex and pagey to chart point
				obj = $("1");
				var left, top;
				left = top = 0;
				if (obj.offsetParent) {
					do {
						left += obj.offsetLeft;
						top  += obj.offsetTop;
					} while (obj = obj.offsetParent);
				}

				pageX = left + dataindex_point[cur_index] + offsetx;
				pageY = top + parseInt(dataindex_ypoint[cur_index]) + offsetx;
			}else
				diff = 0;
		}
	}else{
		//get data from array based on x
		if(tempX>data_max){
			tempX = data_max;
		}else if(tempX<data_min){
			tempX = data_min;
		}		
		cur_index = dataindex[tempX];
	}
	
	//if(data[dataindex[tempX]]){
	if(data[cur_index] && diff){
		//x-coord for line
		//var x = dataindex[tempX];
		var x = cur_index;
		var t = data[x];
		
		xline = parseInt(dataindex_point[x]);
		yline = parseInt(dataindex_ypoint[x]);
		
		tip = t["s_date"];
		if(t["s_psignal"] && t["s_psignal"]!=" ")
			tip += psignal[parseInt(t["s_psignal"])+2];

		
		/* not grouppower market */
		if(!$(market)){
			if(t["s_nhl"] && t["s_nhl"]!=" "){
				tip += philo[parseInt(t["s_nhl"])+3];
				
			}
			if(t["s_xover"] && t["s_xover"]!=" ")
				tip += pxover[parseInt(t["s_xover"])+2];
			
			/* show trend */
			if($('stock_bobb') && t["stock_bobb"]!=" ")
				tip += gptrend(t);
		}
		
		if(chartcount>0 && xline != prev_xline){
			//setValues(tempX);			//update new value
			setValues(x);			//update new value
			prev_xline = xline;			//save current line position
			xline2 = xline - xoffset;	//add offset for line
			drawlines(xline2,yline);	//draw new lines
			showtooltip(tip);			//show tooltip
			
		}
	}else{
		/* hide data */
		clearToolTip;
	}
	return false;
}

function addCommas(nStr)
{
	nStr += '';
	x = nStr.split('.');
	x1 = x[0];
	x2 = x.length > 1 ? '.' + x[1] : '';
	var rgx = /(\d+)(\d{3})/;
	while (rgx.test(x1)) {
		x1 = x1.replace(rgx, '$1' + ',' + '$2');
	}
	return x1 + x2;
}

function drawlines(xline,yline){
	//draw new lines
	jg_vertical[0].clear();  //clears old line
	jg_vertical[0].drawLine(xline,(priceOffsetTop+2*padjust),xline,priceOffsetBot-padjust);  //vertical on date
	jg_vertical[0].paint();  //draw new line
	for(var i=1;i<chartcount;i++){
		jg_vertical[i].clear();
		jg_vertical[i].drawLine(xline,indiOffsetTop,xline,indiOffsetBot);
		jg_vertical[i].paint();
	}
}

function setValues(x){
	/* set values of all ids in datalist */
	var d1;
	var tempval;
	var count;
	
	var addcomma_list = ["s_vol","s_vol2","s_avgvol","s_nvol","s_nvol2","s_advance","s_decline","s_upvol","s_dnvol","s_nh52wk","s_nl52wk"];
	var percentile_list = ["s_s_rank","s_i_rank","s_l_rank"];
	var ratio_list = ["s_advratio"];
	
	/* gp market */
	var overma_list = ["s_overma10","s_overma50","s_overma200"];
	
	//d1 = data[dataindex[x]];
	d1 = data[x];
	count = d1["s_count"];
	for(var key in d1){
		if(!in_array(key,data_noid) && !in_array(key,mkt_data)){
			/* price chart */
			tempval = d1[key];
			
			/* make int, add commas  */
			if(in_array(key,addcomma_list))tempval = addCommas(Math.round(tempval));
				
			/* advance ratio */
			if(in_array(key,ratio_list)){
				tempval /= count;
				tempval = tempval.toPrecision(2);
			//	tempval = tempval + " (" + Math.round(d1[key]) + ")"
			}
			
			if(in_array(key,overma_list)){
				tempval *= count/100;
				tempval = d1[key] + "% (" + Math.round(tempval) + ")";
			}
		
			/* rank = percentile * total */
			//if(in_array(key,percentile_list))tempval = Math.round((1-(d1[key]/100)) * count);
			if(in_array(key,percentile_list))tempval = Math.round(count - (d1[key]/100 * (count-1)));

			$(key).innerHTML =  tempval;
		}
	}
	//market specific
	if($(market)){
		marketsummary(x);
	}else{
		//add gear data
		gear_data(x);
	}

}

function createDataList(){	//create array of data for mouse over change, to prevent invalid object errors
	//id , xml node
	var d = {
	s_date:"date",
	s_open:"open",
	s_high:"high",
	s_low:"low",
	s_close:"close",
	s_vol:"volume",
	s_nvol:"nvol",
	s_change:"change",
	s_changeper:"changeper",
	s_change2:"change2",
	s_ma:"ma",
	s_upper:"upper",
	s_lower:"lower",
	s_ma1:"ma1",
	s_ma2:"ma2",
	s_ma3:"ma3",
	s_ma4:"ma4",
	s_perb:"PERB",
	s_bwdth1:"BWDTH1",
	s_bwdth2:"BWDTH2",
	s_bwdth3:"BWDTH3",
	s_vwmacd1:"VWMACD1",
	s_vwmacd2:"VWMACD2",
	s_vwmacd3:"VWMACD3",
	s_normvol:"NORMVOL",
	s_rmi:"RMI",
	s_rsi:"RSI",
	s_kd1:"KD1",
	s_kd2:"KD2",
	s_mtm:"MTM",
	s_roc:"ROC",
	s_pos:"POS",
	s_vos:"VOS",
	s_cci:"CCI",
	s_vhf:"VHF",
	s_uos:"UOS",
	s_wr:"WR",
	s_dmi1:"DMI1",
	s_dmi2:"DMI2",
	s_dmi3:"DMI3",
	s_macd1:"MACD1",
	s_macd2:"MACD2",
	s_macd3:"MACD3",
	s_wsad:"WSAD",
	s_qstk:"QSTK",
	s_cmo:"CMO",
	s_adosc:"ADOSC",
	s_iiosc:"IIOSC",
	s_mfi:"MFI",
	s_dfa:"DFA",
	s_rs1:"RS1",
	s_rs2:"RS2",
	s_rs3:"RS3",
	s_nrsi:"NRSI",
	s_vol2:"volume",
	s_nvol2:"nvol",
	s_avgvol:"avgvol",
	s_psignal:"psignal",
	
	//groups and sectors only
	s_nhl:"nhl",
	s_xover:"xover",
	s_shrtmtm:"shrtmtm",
	s_intmtm:"intmtm",
	s_longmtm:"longmtm",
	s_psmf:"psmf",
	s_gear:"gear",
	s_shrtrank:"shrtrank",
	s_intrank:"intrank",
	s_longrank:"longrank",
	s_rankscore:"rankscore",
	s_s_rank:"shrtrank",
	s_i_rank:"intrank",
	s_l_rank:"longrank",
	s_close2:"close2",
	s_close3:"close3",
	s_pchg_gear:"pchg_gear",
	s_pchg3:"pchg3",
	
	//up/dn trends 
	s_trends:"trends",
	s_trendi:"trendi",
	s_trendl:"trendl",
	s_trendp:"trendp",
	//gp orig mtm
	s_o1:"gpORG1",
	s_o2:"gpORG2",
	s_o3:"gpORG3",
	
	//used by both market and group/sectors
	s_advance:"advance",
	s_decline:"decline",
	s_upvol:"upvol",
	s_dnvol:"dnvol",
	s_count:"count",		//get by default
	//s_trin:"trin",
	s_advdec10:"advdec10",
	//s_updnvol10:"updnvol10",
	s_trin10:"trin10",
	
	//market only
	s_overma10:"overma10",
	s_overma50:"overma50",
	s_overma200:"overma200",
	s_hilo:"hilo",
	s_hilologic:"hilologic",
	s_hilologicavg:"hilologicavg",
	s_shrttrend:"shrttrend",
	s_inttrend:"inttrend",
	s_longtrend:"longtrend",
	s_shrtobos:"shrtobos",
	s_intobos:"intobos",
	s_longobos:"longobos",
	s_advratio:"advance",
	s_nh52wk:"nh52wk",
	s_nl52wk:"nl52wk"
	};
	
	for (key in d){
		if($(key)){
		datalist[key] = d[key];
		}
	}
	
	/* store but data not used by setvalue() */
	data_noid = ["s_count","s_psignal","s_trends","s_trendi","s_trendl","s_trendp","s_nhl","s_xover"];
	for(i=0;i<data_noid.length;i++){
		datalist[data_noid[i]] = d[data_noid[i]]
	}

	/* store but data not used by setvalue() */
	mkt_data = new Array();
	if($(market)){
		mkt_data = ["s_shrttrend","s_inttrend","s_longtrend","s_shrtobos","s_intobos","s_longobos","s_advance","s_decline","s_upvol","s_dnvol"];
		for(i=0;i<mkt_data.length;i++){
			datalist[mkt_data[i]] = d[mkt_data[i]]
		}
	}
	
}

var xmlDoc;
var xmlDoc_resp;
function importXML(param,lev)
{	
	var url = "/common/getxml.php?" + param;
	
	if(window.XMLHttpRequest) //opera,safari,firefox
	{
		if(navigator.userAgent.indexOf("Firefox")!=-1){	//firefox -cross browser error
			
			xmlDoc = document.implementation.createDocument("", "", null);
			xmlDoc.async="true";
			xmlDoc.load(url);  //load xml file
			xmlDoc_resp = xmlDoc;
			xmlDoc.onload = storeData;
		}else{	//opera,safari,chrome
			try{
				xmlDoc = new XMLHttpRequest();	
			}catch(err){
				xmlDoc = false;
			}
			
			
			if(xmlDoc){
				xmlDoc.onreadystatechange = function(){
					try{
						if (xmlDoc.status==200 && xmlDoc.readyState==4){ 
							xmlDoc_resp = xmlDoc.responseXML;
							storeData();
						}
					}catch(err){
						//do nothing?
					}
				}
					
				//async true
				xmlDoc.open("GET", url, true);
		        xmlDoc.send(null);
			}
		}
	}
	else if (window.ActiveXObject) //IE
	{
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
		xmlDoc.async = "true"; //changed 3/5/08
		xmlDoc_resp = xmlDoc; //for storing data
		xmlDoc.onreadystatechange = function () {
			try{
				if (xmlDoc.status==200 || xmlDoc.readyState==4){ 
					storeData();
				}
			}catch(err){
				//do nothing?
			}
		};
		xmlDoc.load(url);  //load xml file
 	}
	else
	{
		return;
	}
}

function storeData()
{
	createDataList();

	//var x = xmlDoc.getElementsByTagName('data');
	try
	{
		var x = xmlDoc.getElementsByTagName('data');
	}
	catch(err)
	{
		try
		{
			var x = xmlDoc_resp.getElementsByTagName('data');
		}catch(err){
			var x = false;
		}
		
	}
	if(x){
		//var rowdata = new sdata();
		var rowdata = new Array();
		var tdata = new Array();
		var tdataindex = new Array();
		var tdataindex_point = new Array();	//store x coord
		//var tdataindex_ypoint = new Array(); //store y coord of close
		var c=0;
		var invalid = 134217728;	//xml pgm prints invalid data for offset
		
		datacount = x.length;
		for (i=0;i<datacount;i++)
		{
			for (j=0;j<x[i].childNodes.length;j++)
			{	
				if (x[i].childNodes[j].nodeType != 1) continue;
				
				var nodename = x[i].childNodes[j].nodeName;  //<name>
				
				try{
					var theData = x[i].childNodes[j].firstChild.nodeValue;  //value inside name
				}catch(err){
					var theData = "";
				}
				
				
				if(theData == invalid)
					theData = "";
				
				rowdata[nodename] = theData;
			
			}
			
			/* starting and ending x coord */
			rowdata.x1 = parseInt(rowdata.x1);  //convert to int
			rowdata.x2 = parseInt(rowdata.x2);  //convert to int
			
			/* each x-coord values assinged a number, number is index to data 
			--replace with search algo?
			*/
			/* for xGap = 1, the x1 is greater x2, set lower limit to x2 in this case and upper limit to x1 */
			if (rowdata.x1 <= rowdata.x2){
				for(c=rowdata.x1;c<=rowdata.x2;c++){
					tdataindex[c] = i;	//any coord between x1 and x2 will show same data
				}
			} else{
				xoffset = 2;  //move offset to right
				for(c=rowdata.x2;c<=rowdata.x1;c++){
					tdataindex[c] = i;	//any coord between x1 and x2 will show same data
				}
			}
			
			/* index of x coord */
			tdataindex_point[i] =  Math.floor((rowdata.x1 + rowdata.x2)/2);	//mid point is between x1 & x2	
			dataindex_ypoint[i] =  rowdata.yc;
			
			tdata[i] = new Object();
		
			//for(var name in rowdata){	
			for(key in datalist){
				tdata[i][key] = rowdata[datalist[key]];
			}
		}
	
		
		data_min = tdataindex_point[0];
		data_max = tdataindex_point[i-1];
		
		data = tdata;
		
		dataindex = tdataindex;
		dataindex_point = tdataindex_point;
	
		cur_index = tdataindex_point.length-2;
		showData(1);
	}
}

function showtooltip(tip)
{
	var tooltip_date = $('tooltip');
	/* adjust tooltip position level with pointer */
	tooltip_date.style.left = (pageX+3) + 'px';
	tooltip_date.style.top = (pageY-8) + 'px';
	tooltip_date.style.display = 'block';
	tooltip_date.innerHTML = tip;
}

function clearToolTip(e)
{	
	
	var yTop = 0;
	var yBot = 126;
	if(imgID == 1){	//for mouseout, set chart y values
		yTop = 10;
		yBot = 445;
	}
	
	getMouseXY(e);
	
	if($('tooltip')){
		if(IE){
			if(tempX>=data_min && tempX<=data_max && tempY>=yTop && tempY<=yBot){
				return false;
			}
		}else if(tempX <= 1 || (tempX>=data_min && tempX<=data_max)){
			return false;
		}
		exit();
	}
		
}


function exit(){
	if($('tooltip')){
		$('tooltip').style.display = 'none';
	}
}

function mkt_cond(item,gp_id,gp_td_id,type){
	bg = eval("mkt"+type+"_color");
	ihtml = eval("mkt"+type);

	if(item == " "){
		$(gp_id).innerHTML =  "N/A";
		$(gp_td_id).style.backgroundColor = "#ffffff";
	}else{
		var st = Math.round(item)+2;
		$(gp_td_id).style.backgroundColor = bg[st];
		$(gp_id).innerHTML = ihtml[st];
	}
}

function gear_data(x){
	//if(x == null){
	//	x = data_max;
	//}
	
	//var loc = data[dataindex[x]];
	var loc = data[x];
	
	if($('s_close_gear'))
		$('s_close_gear').innerHTML = loc["s_close"];
	
}	

function marketsummary(x){
	//if(x == null){
	//	x = data_max;
	//}
	
	//var loc = data[dataindex[x]];
	var loc = data[x];

	mkt_cond(loc["s_shrttrend"],"gp_scond","gp_scond_td","trend");
	mkt_cond(loc["s_inttrend"],"gp_icond","gp_icond_td","trend");
	mkt_cond(loc["s_longtrend"],"gp_lcond","gp_lcond_td","trend");
	
	mkt_cond(loc["s_shrtobos"],"gp_sobos","gp_sobos_td","obos");
	mkt_cond(loc["s_intobos"],"gp_iobos","gp_iobos_td","obos");
	mkt_cond(loc["s_longobos"],"gp_lobos","gp_lobos_td","obos");
	
	$('gp_date').innerHTML = loc["s_date"];
	
	$('gp_trin10').innerHTML = loc["s_trin10"];
	$('gp_advdec10').innerHTML = loc["s_advdec10"];
	//$('gp_updnvol10').innerHTML = loc["s_updnvol10"];
	$('gp_hiloindex').innerHTML = loc["s_hilo"];
	$('gp_hilologic').innerHTML = loc["s_hilologic"];
	$('gp_hilologicavg').innerHTML = loc["s_hilologicavg"];

	$('gp_nh250').innerHTML = Math.round(loc["s_nh52wk"]);	
	$('gp_nl250').innerHTML = Math.round(loc["s_nl52wk"]);	
	
	$('gp_over10').innerHTML = Math.round(loc["s_overma10"] * loc["s_count"]/100);
	$('gp_over10per').innerHTML = loc["s_overma10"];
	$('gp_over50').innerHTML = Math.round(loc["s_overma50"] * loc["s_count"]/100);
	$('gp_over50per').innerHTML = loc["s_overma50"];
	$('gp_over200').innerHTML = Math.round(loc["s_overma200"] * loc["s_count"]/100);
	$('gp_over200per').innerHTML = loc["s_overma200"];
	
	if($('gp_adv'))
		$('gp_adv').innerHTML = addCommas(Math.round(loc["s_advance"]));
	
	if($('gp_adv'))
		$('gp_dec').innerHTML = addCommas(Math.round(loc["s_decline"]));
		
	$('gp_advvol').innerHTML = addCommas(Math.round(loc["s_upvol"]));
	$('gp_decvol').innerHTML = addCommas(Math.round(loc["s_dnvol"]));
	
}

function in_array(string, array)  {  
	for (i=0,len=array.length;i<len;i++){  
		if(array[i] == string){  
			return true;  
		}  
    }  
	return false;  
}  