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 canv_width;
var chart_width;
var chart_offsettop;
var xoffset = 3;	//offset for chart
var yoffset;		//not used yet

var data_min;	//min x on chart
var data_max;	//max x on chart
var chartcount;	//# of charts

//var priceOffsetTop = 31;	//line offset for price chart
var priceOffsetTop = 6;	//line offset for price chart

var priceOffsetBot = 426;   //line offset for price chart
var indiOffsetTop = 6;		//line offset for indi chart
var indiOffsetBot = 126;	//line offset for indi chart
	
//var datalist = new Array();  //for data innerHTML
var datalist = new Object();  //for data innerHTML
var datacount = 0;				//number of data to show
var data_noid = new Array;

var prev_xline = 0;
var offsetx = 12;	//move to right so tip is better visible
var offsety =  8;	
var tip = "";
var imgID = "";		//store id of mouse over

var dqtime;			//delayed quote time
var pricemagnet;	//price magnet

//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 dayofweek = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
var monthofyear = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];

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 showsign(v){
	if(v>0)
		return "+" + v;
	return v;
}
  
function keycheck(e)
{
var keynum;
var keychar;
var numcheck;
	if(window.event)
		keynum = e.keyCode;
	else if(e.which) // Netscape/Firefox/Opera
		keynum = e.which;
}

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){		//get coord and data
	imgID = img;
	$(img).onmousemove = getPosData;
	$(img).onmouseout = clearToolTip;
}

function getPosData(e){
	getMouseXY(e);
	showData();
}

function getMouseXY(e) {
	evt = (e)?e:event;
	if (IE || window.opera) { // grab the x-y pos.s if browser is IE
		tempX=evt.offsetX;
		tempY=evt.offsetY;
		if(window.opera){
			iebody = $("1");
		}
		pageX=evt.clientX + iebody.scrollLeft + offsetx;
		pageY=evt.clientY + iebody.scrollTop + offsety;
	}else {  // grab the x-y pos.s if browser is NS
		var elem = $("1");
		var xpos;
		var ypos;
		if(evt.x){
			xpos = evt.x;
			ypos = evt.y;
			elemx = elem.x;
			elemy = elem.y;
		}else{
			xpos = evt.layerX;
			ypos = evt.layerY;
			elemx = elem.offsetLeft;
			elemy = elem.offsetTop;
		}
		
		tempX = xpos - elemx;
		tempY = ypos - elemy;
		pageX = evt.clientX + window.pageXOffset + offsetx;
		pageY = evt.clientY + window.pageYOffset + offsety;
	}
}

function showData(){
	var xline;
	var xline2;
	var yline;
	
	var yline_pm;
	
	//get data from array based on x
	if(tempX>data_max){
		tempX = data_max;
	}else if(tempX<data_min){
		tempX = data_min;
	}
	
	if(data[dataindex[tempX]]){
		var x = dataindex[tempX];
		var t = data[x];
		
		xline = dataindex_point[x];	//x-coord for line (not actual mouse x)
		
		yline = parseInt(dataindex_ypoint[x]);
		
		tip = t["s_date"];
		tip += "<br>" + t["s_close"];
		if(t["s_psignal"])
			tip += psignal[(+t["psignal"])+2];
		
		if(chartcount>0 && xline != prev_xline){
			setValues(tempX);			//update new value
			prev_xline = xline;			//save current line position
			drawlines(xline - xoffset,yline,tempX);	//draw new lines,add offset so line in middle
			showtooltip(tip,yline,t["s_close"]);			//showdate as tooltip
			
			//if not most recent date, hide time
			if(x==(datacount-1))
				show_time();
			else
				hide_time();
		}
	}
	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,x){
	//draw new lines
	jg_vertical[0].clear();  //clears old line
	jg_vertical[0].drawLine(xline,priceOffsetTop,xline,priceOffsetBot);  //send coord for new line
	
	//jg_vertical[0].drawLine(dataindex_point[0]-4,yline,dataindex_point[dataindex_point.length-1],yline);  //horizontal on close
	if(yline)
		jg_vertical[0].drawLine(dataindex_point[0]-4,yline,chart_width,yline);  //horizontal on close
	
	//horizontal on price magnet
	if(pricemagnet && x){
		//alert(x + " " + data[dataindex[x]]["s_ma3"]);
		
		var pm_line = parseInt(data[dataindex[x]]["s_ma3"]);
		var pm_line_color = ["#ff0000","#06d406"];
		if(pm_line != yline){
			jg_vertical[0].setColor(pm_line_color[(pm_line<yline)?1:0]);
			jg_vertical[0].setStroke(Stroke.DOTTED);  //set width of line
			jg_vertical[0].drawLine(dataindex_point[0]-4,pm_line,chart_width,pm_line);  //horizontal on close of 
			jg_vertical[0].setColor("#339982");//set color of the tracker
			jg_vertical[0].setStroke(1);  //set width of line
		}
	}
	
	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){	//update the value of each chart
	var d1;
	var tempval;
	
	var expect = ["Major Shift SELL","Fall from 200 SELL","Signal: Sell","Alert: Sell","","","","Alert: Buy","Signal: Buy","Rise from 0 BUY","Major Shift BUY"];
	
	var addcomma_list = ["s_vol","s_vol2","s_avgvol","s_nvol","s_nvol2"];
	var expect_list = ["s_expect2"];
	var showsign_list = ["s_ma2"]; //only if pricemagnet = 1
	
	d1 = data[dataindex[x]];
	/*
	for(var key in d1){
		document.write(key);
	}	
	*/
	for(var key in d1){
		tempval = d1[key];
		
		/* make int, add commas  */
		if(in_array(key,addcomma_list))tempval = addCommas(Math.round(tempval));
		else if(in_array(key,expect_list))tempval = expect[tempval*1+5];
		else if(pricemagnet && in_array(key,showsign_list)) tempval = showsign(tempval);
		else if(key == "s_date"){
			/* modify date to show day of week */
			tempdate = new Date(tempval);
			tempval = dayofweek[tempdate.getDay()] + " " + tempval.substr(0,tempval.length-4)+tempval.substr(tempval.length-2,2)
			//tempval = dayofweek[tempdate.getDay()] + " " + monthofyear[tempdate.getMonth()] + " " + tempdate.getDate()
			//tempdate = null;
		}
			
		$(key).innerHTML =  addCommas(tempval);
	}
	
	/* set dq time */
	if(dqtime.length>0)
		$('s_time').innerHTML = dqtime.substr(0,dqtime.length-1) + " ET";
		
}

function createDataList(){
//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_mtm1:"MTM1",
	s_mtm2:"MTM2",
	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_aroon1:"AROON1",
	s_aroon2:"AROON2",
	s_aroon3:"AROON3",
	s_expect1:"EXPECT1",
	s_expect2:"EXPECT2",
	s_conv:"CONV",
	s_chop:"CHOP",
	s_psy1:"PSY1",
	s_psy2:"PSY2",
	s_spvolp:"SPVOLP",
	s_iaosc:"IAOSC",
	s_psignal:"psignal",
	s_avgtr:"AVGTR",
	s_bbi:"BBIMP",
	s_perbw:"PERBW",
	s_bwdelta:"BWDELTA"
	};
	
	for (key in d){
		if($(key)){
			datalist[key] = d[key];
		}
	}
}

var xmlDoc;
var xmlDoc_resp;
function importXML(param)
{	
	var url = "/common/getxml.php?" + param;
	if(window.XMLHttpRequest) //opera,safari,chrome,firefox
	{	
		if(navigator.userAgent.indexOf("Firefox")!=-1 ){	//firefox 
			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"; 
		xmlDoc_resp = xmlDoc; 
		xmlDoc.onreadystatechange = function () {
		try{
			if (xmlDoc.status==200 || xmlDoc.readyState==4){ 
				storeData();
			}
		}catch(err){
			//do nothing?
		}
		};
		xmlDoc.load(url);
 	}
	else{return;}
}

function storeData()
{
	//alert("storedata")
	createDataList();
	
	try
	{
		var x = xmlDoc.getElementsByTagName('data');
	}
	catch(err){
		try{
			var x = xmlDoc_resp.getElementsByTagName('data');
		}catch(err){
			var x = false;
		}
	}
	
	/* dq time */
	try{
		var dqx = xmlDoc.getElementsByTagName('time');
	}
	catch(err){
		try{
			var dqx = xmlDoc_resp.getElementsByTagName('time');
		}catch(err){
			var dqx = false;
		}
	}
	dqtime = "";
	if(dqx[0])dqtime = dqx[0].firstChild.nodeValue;
	
	/* price magnet 
	second horizontal line
	format ma2
	*/
	try{
		var pmagx = xmlDoc.getElementsByTagName('pricemag');
	}
	catch(err){
		try{
			var pmagx = xmlDoc_resp.getElementsByTagName('pricemag');
		}catch(err){
			var pmagx = false;
		}
	}
	pricemagnet = (pmagx[0] && parseInt(pmagx[0].firstChild.nodeValue))?parseInt(pmagx[0].firstChild.nodeValue):0;	
	
	//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 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>
			var theData = x[i].childNodes[j].firstChild.nodeValue;  //value inside name
			
			if(theData == invalid)
				theData = "";
			
			rowdata[nodename] = theData;
		}
		
		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 */
		//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
			}
		}
		
		tdataindex_point[i] =  Math.floor((rowdata.x1 + rowdata.x2)/2);	//middle point is between x1 and x2
		dataindex_ypoint[i] = rowdata.yc;
		
		tdata[i] = new Object();
		
		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;
	
	chart_width = $('1').offsetWidth-63;

/*	
	chart_offsettop = $('1').offsetTop / 2;
	if(chart_offsettop>16)chart_offsettop += 8;
	if(chart_offsettop>8)chart_offsettop += 6;
*/
	setValues(c-1);
	if(jg_vertical.length>0)drawlines(dataindex_point[dataindex[c-1]]-xoffset)
}

function showtooltip(tip,yline,last)
{
	var tooltip_date = $('tooltip');
	tooltip_date.style.left = (pageX+10) + 'px';
	tooltip_date.style.top = (pageY-10) + 'px';
	tooltip_date.style.display = 'block';
	tooltip_date.innerHTML = tip;
	
	/* show price on right side */
	var tooltip_price = $('tooltip_price');
	/*
	tooltip_price.style.left = ($('1').offsetWidth + $('1').offsetLeft) + 'px';
	*/
	tooltip_price.style.top = (yline + $('1').offsetTop - 14)+ 'px';	//subtract 10 to center horiz line
	tooltip_price.style.display = 'block';
	tooltip_price.innerHTML = last;
}

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 in_array(string, array)  {  
	for (i=0,len=array.length;i<len;i++){  
		if(array[i] == string){  
			return true;  
		}  
    }  
	return false;  
}  

function hide_time(){
	if($('s_time')){
		$('s_time').innerHTML = '';
		$('s_time').style.visibility = 'hidden';
	}
}

function show_time(){
	if($('s_time'))
		$('s_time').style.visibility = 'visible';
}
