var IE = document.all?true:false;
if (!IE) 
	document.captureEvents(Event.MOUSEMOVE)
else{
	var iebody=(document.compatMode && 
			document.compatMode != 'BackCompat') ? 
				document.documentElement : document.body;
}

//for json data
var dataobj = new Object();
var dataobjPtr = new Array();

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 = 3;	//offset for chart
var yoffset;		//not used yet

var chartcount;	//# of charts

//price clip window height (420px)
var priceOffsetTop = 6;		//price clip window top offset from whole image
var priceOffsetBot = 426;   //price clip window bottom offset from whole image
var priceOffsetLeft = 1;	//adjustable?
var priceOffsetRight;		//set when import called
var indiOffsetTop = 6;		//line offset for indi chart
var indiOffsetBot = 126;	//line offset for indi chart

var canv_width;
var chart_offsettop;

var data_min;	//min x on chart
var data_max;	//max x on chart

var mmove = 0;					//mousemove

//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

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) {
	mmove = 1;
	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;
		}
	
		// set variables /
		tempX = xpos - elemx;
		tempY = ypos - elemy;
		pageX = evt.clientX + window.pageXOffset + offsetx;
		pageY = evt.clientY + window.pageYOffset + offsety;
	
	}
}

function showData(){
	var prev_xline;
	var xline2;
	var yline_pm;
	
	//tempx set by getmouse()
	//data_max - global var set by 
	if(tempX>data_max){
		tempX = data_max;
	}else if(tempX<data_min){
		tempX = data_min;
	}
	
	var objIndex = dataobjPtr[tempX];
	
	if(dataobj[objIndex]){
		var t = dataobj[objIndex];
		
		var xline = Math.floor((t['x1'] + t['x2'])/2); 	//x position to draw line
		var yline = parseInt(t['yc']);					//y position of close (used only by price)

		var tip = t["date"];
		tip += "<br>" + t["close"].toFixed(2);
		tip += "<br>" + t["change"];
		tip += "<br>" + t["changeper"]+"%";
		
		/*
		if(t["s_psignal"])
			tip += psignal[(+t["psignal"])+2];
		*/
		
		var pricetip;
		//compare
		if(jQuery("#label_cmp").attr('s2') || jQuery("#label_cmp").attr('s3')){
			
			//price
			pricetip = t["close"].toFixed(2) + " " + t["cumchangeper"] + "%";
			//check compares - 2 max for now
			
			if(jQuery("#label_cmp").attr('s2'))
				pricetip += "<br><span style=\"font-size:110%;color:" + colorObj.compare[0] + "\">"+ jQuery("#label_cmp").attr('s2') + " " + t["change2"] + "%</span>";
			if(jQuery("#label_cmp").attr('s3'))
				pricetip += "<br><span style=\"font-size:110%;color:" + colorObj.compare[1] + "\">"+ jQuery("#label_cmp").attr('s3') + " " + t["change3"] + "%</span>";
			
		}else{
			pricetip = ($("pc").value==1)?t["cumchangeper"] + "%":t["close"].toFixed(2);
		}
		
		//alert(pricetip);
		if(chartcount>0 && xline != prev_xline){
			setValues(tempX);						//update new value
			prev_xline = xline;						//save current line position
		
			//moved here from import due to async import
			priceOffsetRight = $('1').offsetWidth - 25;
			
			drawlines(xline - xoffset,yline,tempX);	//draw new lines,add offset so line in middle
			
			if(mmove)
				showtooltip(tip);	//showdate as tooltip
				
			showtooltip_price(pricetip,yline);	
			
			//if not most recent date, hide time
			
			if(objIndex==(datacount-1)){
				show_time();
			}else{
				hide_time();
			}
		}
	}
	return false;
}

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
	
	//horizontal line on close
	//adjust automatically when overlays added
	if(yline)
		//jg_vertical[0].drawLine(dataindex_point[0]-4,yline,priceOffsetRight,yline);  //horizontal on close
		jg_vertical[0].drawLine(priceOffsetLeft,yline,priceOffsetRight,yline);  
	
	jg_vertical[0].paint();  //draw new line
	
	
	for(var i=1;i<chartcount;i++){
		if(jg_vertical[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 expect = ["Major Shift SELL",
	              "Fall from 200 SELL",
	              "Signal: Sell",
	              "Alert: Sell",
	              "",
	              "",
	              "",
	              "Alert: Buy",
	              "Signal: Buy",
	              "Rise from 0 BUY",
	              "Major Shift BUY"];
	
	//volume indicator, use same data as price volume
	var addcomma_list = ["volume","avgvol","vol1","vol2"];
	
	var expect_list = ["expect2"];
	var showsign_list = ["ma2"]; //only if pricemagnet = 1
	
	var objIndex = dataobjPtr[x];
	var tempval;
	
	if(objIndex){
		var obj = dataobj[objIndex];
		
		for(var prop in obj){
			tempval = obj[prop];
			if(in_array(prop,addcomma_list))tempval = addCommas(Math.round(tempval));
			
			jQuery("#s_"+prop).html(tempval);
		}
		//adjust vol
	}
}
/*
function multiplyBBTrendPar(param){
	//multiply bbtrend second parameter with 100 to remove decimal
	var searchIndex = param.indexOf("bbtrend-");//get start of bbtrend vars string
	var lastIndex = -1;
	var bbTrendPar = "";
	var k;
	if(searchIndex!=-1){
		lastIndex = param.indexOf(",",searchIndex);//get end of bbtrend vars string
		if(lastIndex==-1){//no comma, possible end of query string
			lastIndex = param.indexOf("&",searchIndex);//get end of bbtrend vars string
			if(lastIndex==-1){//no &, end of query string
				lastIndex = param.length;
			}
		}
		bbTrendPar = param.substring(searchIndex+8,lastIndex);//bbtrend vars string: 10-2.0
		var pars = bbTrendPar.split("-");//split all bbtrend parameters
		if(pars.length>=2){
			pars[1] = parseInt(parseFloat(pars[1])*100);//multiple second parameter by 100
		}
		//rebuild the bbtrend vars string
		bbTrendPar="bbtrend";
		for(k=0;k<pars.length;k++){
			bbTrendPar += "-"+pars[k];
		}
		param = param.substring(0,searchIndex)+bbTrendPar+param.substr(lastIndex);//update bbtrend parameter vars in param string
	}
	return param;
}
*/
function importXML(param){
	//jQuery("#yc").html(param);
	//param = multiplyBBTrendPar(param);//multiply bbtrend second parameter with 100 to remove decimal
	//offset for yline price tooltip
	//priceOffsetRight = $('1').offsetWidth - 60;	
	var url = "/common/getjson.php?" + param;
	
	var indexStart;
	var indexEnd;
	
	//alert(url);
	jQuery.ajax({
		url: url,
		async: true,
		dataType: 'json',
		success: function (data) {
			jQuery.each(data.stockdata, function(i,sdata){
				if(i=="data"){
					//sets dataobj to data = array()
					dataobj = sdata;
					//fix last element change and changeper
					if(dataobj.length>1){
						dataobj[dataobj.length-1]["change"] = dataobj[dataobj.length-1]["close"] - dataobj[dataobj.length-2]["close"];
						dataobj[dataobj.length-1]["changeper"] = (dataobj[dataobj.length-1]["close"] - dataobj[dataobj.length-2]["close"])/dataobj[dataobj.length-2]["close"]*100;
						//2 digits after decimal point
						dataobj[dataobj.length-1]["change"] = parseInt(dataobj[dataobj.length-1]["change"]*100)/100;
						dataobj[dataobj.length-1]["changeper"] = parseInt(dataobj[dataobj.length-1]["changeper"]*100)/100;
					}
					for(var i=0,len=dataobj.length;i<len;i++){
						//modified by Bassam on 07/18/11, initially each bar was taken from x1 to x2, however sometimes x1 was less than x2, need to sort order, also space between bars not taken into account
						//now x1 and x2 are sorted to find index start and end for bar, also bar end is taken as bar start of next bar -1
						//sort x1 and x2 to find current bar start and end index
						if(parseInt(dataobj[i]['x1'])<=parseInt(dataobj[i]['x2'])){
							indexStart = parseInt(dataobj[i]['x1']);
							indexEnd = parseInt(dataobj[i]['x2']);
						}else{
							indexStart = parseInt(dataobj[i]['x2']);
							indexEnd = parseInt(dataobj[i]['x1']);
						}
						//get next bar start index and set current bar end to next start - 1 to cover space between bars
						if(i<len-1){
							if(parseInt(dataobj[i+1]['x1'])<=parseInt(dataobj[i+1]['x2'])){
								indexEnd = parseInt(dataobj[i+1]['x2'])-1;
							}else{
								indexEnd = parseInt(dataobj[i+1]['x1'])-1;
							}
						}
						//for(var j = parseInt(dataobj[i]['x1']);j<=parseInt(dataobj[i]['x2']);j++){
						for(var j = indexStart;j<=indexEnd;j++){
							dataobjPtr[j] = i;
						}
					}
					//alert(dataobj[1]['x2']+","+dataobj[1]['x1']);
					datacount = dataobj.length;
					//max x coords
					data_min = dataobj[0]['x1'];
					data_max = dataobj[datacount-1]['x2'];
					
				}else if(i=="lastdq"){
				
				}else if(i=="extra"){
				
				}else if(i=="color"){
					colorObj = sdata;				
				
					//set colors for overlay labels
					for(var j=0,len=colorObj.overlay.length;j<len;j++){
						jQuery("#label_"+colorObj.overlay[j].label).css("color",colorObj.overlay[j].color);
					
						if(colorObj.overlay[j].dash){
							jQuery("#label_"+colorObj.overlay[j].label).addClass('border-bot')
						}
					}
						
				}
			});
			
			tempX = data_max;
			showData();
		},
		error: function (data, status, e){
			//alert(status+":"+e);//display error
	    }
	});

}


function showtooltip(tip){
	//mouse
	var tooltip_date = $('tooltip');
	
	tooltip_date.style.left = (pageX+14) + 'px';
	tooltip_date.style.top = (pageY) + 'px';
	tooltip_date.style.display = 'block';
	tooltip_date.innerHTML = tip;
}

function showtooltip_price(tip,yline){
	//yline
	var tooltip_price = $('tooltip_price');
	tooltip_price.style.marginLeft = priceOffsetRight + 'px';
	tooltip_price.style.top = (yline + $('1').offsetTop - 14)+ 'px';	//subtract 10 to center horiz line
	tooltip_price.style.display = 'block';
	tooltip_price.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 in_array(string, array)  {  
	for (i=0,len=array.length;i<len;i++){  
		if(array[i] == string){  
			return true;  
		}  
    }  
	return false;  
}  

//if getting position, assume time exists
function hide_time(){
	//if($('s_time')){
	$('s_time').style.visibility = 'hidden';
	//}
}

function show_time(){
//	if($('s_time'))
	$('s_time').style.visibility = 'visible';
}

