// Change Current Symbol
chart.prototype.changeSymbol = function(symbol) {
	//console.log(this.symbol);
	this.symbol = symbol;
	this.load();
}

// Validates and Adds user entered symbols
chart.prototype.addCompareSymbol = function(newsymbol,name) {
	var currSymbol = this.symbol.toUpperCase();
	name = unescape(name);
	try {
	if (newsymbol && newsymbol != currSymbol) {
		var who = [];
			who.id = newsymbol;
			who.innerHTML = name;
			this.addUpper(who,"compare");
	}
	} catch(e) {}
}

// change duration
chart.prototype.chgDuration = function(duration){
	this.dMin = 0;
	this.dMax = 0;
	if (!duration) {duration = this.duration;}
	this.duration = duration;
	this.updateFrequency(duration);
	this.load();
}

// Updates Frequency Menu Options
chart.prototype.updateFrequency = function(){
	this.freqOptions = this.durations[this.duration].options;
	this.frequency = this.durations[this.duration].interval; // if previous default not avail, use data default
}

// Change Chart Display Style
chart.prototype.changeDisplay = function(who) {
	this.display = who.id;
	this.load();
}
// Change Chart Frequency
chart.prototype.changeFrequency = function(who,duration) {
	if (duration != this.duration) {
		this.dMin = 0;
		this.dMax = 0;
	}
	this.duration = duration;
	this.frequency = who.id;
	this.load();
}
// Change Chart Scaling Type
chart.prototype.changeScale = function(who) {
	this.scaling = who.id;
	this.load();
}
// Save Current Settings
chart.prototype.SaveSetting = function(who) {
	var savedSettingName = document.getElementById('aSavedSetting').value + '';
	if (savedSettingName && savedSettingName.length > 2 && savedSettingName.indexOf("undefined") == -1) {
		document.location.href = "?action=save&action_value="+escape(savedSettingName);
	} else {
		alert("Please enter a name with at least 3 characters");
	}
}
// show current settings
chart.prototype.showSaveSetting = function() {
	document.getElementById('settingsContent').style.display = 'block';
}

// open chart fullscreen
chart.prototype.popchart = function(id) {
	this.popWindow = window.open("fullscreen.asp?User_SessionID="+id+"&fullscreen=1", 'pop_chart', 'width=1040,height=800,scrollbars=yes,menubar=0,status=no,toolbar=0,resizable=yes');
	this.popWindow.focus();
}

// open chart fullscreen
chart.prototype.initstream = function() {
	this.strtime = 0;
	this.tlimit = 1000 * 60 * 60;
	this.sInterval = 1000 * 5;
	this.sEle = Element.get('streaming');
	if (this.sEle.innerHTML == 'Stop Streaming') {
		window.clearTimeout(chart.stID);
		this.sEle.innerHTML = 'Active Streaming';
	} else {
		this.stream();
		this.sEle.innerHTML = 'Stop Streaming';
	}
}
chart.prototype.stream = function() {
	if (this.duration < 10 && this.strtime < this.tlimit) {
		this.strtime += this.sInterval;
		this.stID = window.setTimeout("chart.stream1();",this.sInterval);
	} else {
		this.sEle.innerHTML = 'Active Streaming';
	}
}
chart.prototype.stream1 = function() {
	if (this.duration < 10 && this.strtime < this.tlimit) {
		window.clearTimeout(chart.stID);
		this.stream();
		this.load();
	} else {
		this.sEle.innerHTML = 'Active Streaming';
	}
}

// Validates and Adds user entered symbols
chart.prototype.addUpperSymbols = function() {
	var val = document.getElementById('symbolsC').value + '';
		val = val.toUpperCase();
	var currSymbol = this.symbol.toUpperCase();
	if (val && val != currSymbol) {
		var symQS = "../../common/charts/validateChartSym.asp?symbols="+val+"&s="+currSymbol+'&type=upper';
		symbolGen.document.location.replace(symQS);
	} else {
		alert('Please enter a unique symbol');
	}
}

chart.prototype.addLowerSymbol = function() {
	var val = document.getElementById('symbolsLC').value + '';
		val = val.toUpperCase();
	if (val) {
		var symQS = "../../common/charts/validateChartSym.asp?symbols="+val+'&type=lower';
		symbolGen.document.location.replace(symQS);
	}
}
chart.prototype.addLowerCompareSymbol = function() {
	var val = document.getElementById('symbolsLCS').value + '';
		val = val.toUpperCase();
	if (val) {
		var symQS = "../../common/charts/validateChartSym.asp?symbols="+val+'&type=lowerC';
		symbolGen.document.location.replace(symQS);
	}
}

// Add Upper Indicator
chart.prototype.addUpper = function(who,type,forceParams){
	this.upperOptionsMenu.className = "fLeft uOptionsMenu";

	if (typeof who != 'object') {
		var tempID = who;
		var who = [];
			who.id = tempID;
	}
	// set limit
	if (this.upperManager.length > this.upperLimit) {
		try {
		document.getElementById("u"+this.upperManager[this.upperLimit].key).style.display = "none"; // removes over limit
		} catch(err) {}
		this.limit = this.upperLimit;
	} else {
		this.limit = this.upperManager.length;
	}

	// moves upper indicators around, and enforces limit
	for (var i=this.limit;i>0;i--) {
		this.upperManager[i] = {value:this.upperManager[(i-1)].value,color:this.upperManager[(i-1)].color,label:this.upperManager[(i-1)].label,type:this.upperManager[(i-1)].type, key:this.upperManager[(i-1)].key,params:this.upperManager[(i-1)].params}
	}

	var iColor = this.selectUpperColor();
	var iKey = parseInt(Math.random() * 1000000); // random key used for ID

	this.exportData = 1;
	if (type == 'compare' || type == 'event') {

		if (type == 'compare') {
			var val = escape(who.id);
		} else {
			var val = who.id;
		}

		var label = who.innerHTML;
		this.upperManager[0] = {value:val,color:iColor,label:label,type:type,key:iKey,params:""}
		this.addUpperOptions();
	} else {
		var u = this.upper[who.id];
		if (forceParams) {
			params = forceParams + '';
		} else {
			params = u.params;
		}
		var label = u.label;
		this.upperManager[0] = { value:who.id,color:iColor,label:label,type:type,key:iKey,params:params }
		this.addUpperOptions();
	}
	this.load();
}

chart.prototype.addUpperOptions = function(){
	var params = this.upperManager[0].params;
	if (params) {
		var label = this.upperManager[0].label + ' ('+params+')';
	} else {
		var label = this.upperManager[0].label;
	}

	var content = '<div id="u'+this.upperManager[0].key+'" class="fLeft upperOption" style="color:#'+this.upperManager[0].color+';" onmouseover="showUpperItem(this,1);" onmouseout="showUpperItem(this,0);">'+label+'</div>';

	this.upperOptionsMenu.innerHTML = content + this.upperOptionsMenu.innerHTML;
}

// Updates the Upper Indicator
chart.prototype.updateUpper = function(upperIndex,numParams) {
	// get props
	var label = this.upperManager[upperIndex].label;
	var key = this.upperManager[upperIndex].key;
	var uType = this.upperManager[upperIndex].value;

	// get all params
	var params = [];
	for (var i=0;i<numParams;i++) {
		var value = document.getElementById("i"+key+"_"+i).value;
		if (label.indexOf("Envelope") > -1 && i == 0) { // basic upper error checking
			value = value.toUpperCase();
			if (value == 'EMA' || value == 'SMA' || value == 'WMA') {
			} else {
				alert("Value must be either SMA, EMA, or WMA");
				return null;
			}
		} else if (uType.indexOf("news") > -1) {
			value = String(value);
			if (value.length > 25) {
				alert("Keyword must be less then 25 characters");
				return null;
			}
		} else {
			value = parseFloat(value);
			if (value < 0 || value > 10000 || isNaN(value)) {
				alert("Value must be within acceptable range");
				return null;
			}
		}
		params.push(value);
	}
	var tmpParams = params.join(",");
	this.upperManager[upperIndex].params = tmpParams;

	if (tmpParams) {
		label += ' ('+tmpParams+')';
	}
	document.getElementById("u"+key).innerHTML = label;

	this.exportData = 1;
	this.subuppermenu.style.display = 'none';
	this.closeUpperItem();
	this.load();
}

// Removes an Uppper Indicator
chart.prototype.removeUpper = function(value,key) {
	// Handles removing from manager w/standard js
	var len = this.upperManager.length;

	// When only 1 force clean
	if (len == 1) {
		this.upperOptionsMenu.className = "fLeft uOptionsMenu collapse";
		this.upperOptionsMenu.innerHTML = '&nbsp;';
		this.upperManager = [];
	} else {
		var tempArray = [];
		var count = 0;

		for (var i=0;i<len;i++) {
			if (this.upperManager[i].key == key) {
				var count = parseInt(i);
				break;
			} else {
				tempArray[i] = {value:this.upperManager[i].value,color:this.upperManager[i].color,type:this.upperManager[i].type,label:this.upperManager[i].label,key:this.upperManager[i].key,params:this.upperManager[i].params }
			}
		}

		for (var c = count;c<(len - 1);c++) {
			var x = parseInt(c) + 1;
			tempArray[c] = {value:this.upperManager[x].value,color:this.upperManager[x].color,type:this.upperManager[x].type,label:this.upperManager[x].label,key:this.upperManager[x].key,params:this.upperManager[x].params }
		}
		// replace upperManager Array
		this.upperManager = tempArray;

		// get rid of menu item
		document.getElementById("u"+key).style.display = "none";
	}
	this.exportData = 1;
	this.subuppermenu.style.display = 'none';
	this.closeUpperItem();
	this.load();
}

// Add Lower Indicator
chart.prototype.addLower = function(who,lowObj){
	if (!lowObj) {
		var lowObj = this.lower[who.id];
	}
	if (this.lowerManager.length > this.lowerLimit) {
		this.limit = this.lowerLimit;
	} else {
		this.limit = this.lowerManager.length;
	}
	// moves lower indicators, and enforces limit
	for (var i=this.limit;i>0;i--) {
		this.lowerManager[i] = {value:this.lowerManager[(i-1)].value,params:this.lowerManager[(i-1)].params}
	}
	this.lowerManager[0] = {value:who.id,params:lowObj.params}
	this.load();
}
// Updates the Lower Indicator
chart.prototype.updateLower = function(lowerIndex,numParams) {
	// get props
	var type = this.lowerManager[lowerIndex].value;
	// get all params
	var params = [];
	for (var i=0;i<numParams;i++) {
		var value = document.getElementById("i"+lowerIndex+"_"+i).value;
		if (type.indexOf("volume") > -1 && i == 0 && type.indexOf("rateofchange") < 1) {
			value = value.toUpperCase();
			if (value == 'EMA' || value == 'SMA' || value == 'WMA') {

			} else {
				alert("Value must be either SMA, EMA, or WMA");
				return null;
			}
		} else if (type.indexOf("relativeratio") > -1) {
			value = value + '';
			if (value.length < 1 || value.length > 6) {
				alert("Please enter a valid symbol to compare");
				return null;
			}
		} else {
			value = parseFloat(value);
			if (value < 0 || value > 1000 || isNaN(value)) {
				alert("Value must be within acceptable range");
				return null;
			}
		}
		params.push(value);
	}

	var tmpParams = params.join(",");
	this.lowerManager[lowerIndex].params = tmpParams;

	this.sublowermenu.style.display = 'none';
	this.closeLowerItem();
	this.load();
}

// Removes an Lower Indicator
chart.prototype.removeLower = function(key) {
	var len = this.lowerManager.length;

	// When only 1 force clean
	if (len == 1) {
		this.lowerManager = [];
	} else {
		var tempArray = [];
		var count = 0;

		for (var i=0;i<len;i++) {
			if (i == key) {
				var count = parseInt(i);
				break;
			} else {
				tempArray[i] = {value:this.lowerManager[i].value,params:this.lowerManager[i].params}
			}
		}

		for (var c = count;c<(len - 1);c++) {
			var x = parseInt(c) + 1;
			tempArray[c] = {value:this.lowerManager[x].value,params:this.lowerManager[x].params}
		}
		// replace Array
		this.lowerManager = tempArray;
	}

	//this.closeLowerItem();
	this.load();
}

// -- Top Menu Display --
chart.prototype.showSubItem = function(who,show,offset) {
	if (show == 1 || show == 4) {
		if (!offset) {offset = 0;}
		if (typeof(document.all) == "undefined") {
			var pos = this.getPos(who,1 + offset,20);
		} else {
			var pos = this.getPos(who,1 + offset,20);
		}
		if (pos.x > 880 && this.fullscreen == 2) {
			var pos = this.getPos(who,1 + offset - 100,20);
		}

		this.submenu.style.display = 'block';
		this.submenu.style.left = pos.x + 'px';
		this.submenu.style.top = pos.y + 'px';
		if (offset) {
			this.submenu.style.width = 180 + offset + 'px';
		} else {
			this.submenu.style.width = '180px';
		}
		if (show == 4) {
			this.submenu.style.width = '100px';
		}
		this.submenu.innerHTML = document.getElementById(who.id+'Content').innerHTML;
		this.mView = 0;
		this.clearMenuTimeout();
		this.clearMenuTimeout2();
	} else if (show == 2) {
		if (typeof(document.all) == "undefined") {
			var left = 180;
		} else {
			var left = 182;
		}
		var pos = this.getPos(who,left,0);
		if (pos.y > 540 && this.fullscreen != 2) {
			var url = window.location + '';
			if(url.indexOf('public') < 0){
			  pos = this.getPos(who,left,-140);
			}
		}

		if (pos.x > 700 && this.fullscreen == 2) {
			pos = this.getPos(who,(left - 363),0);
		}

		if (who.id == 'breadth') {
			pos = this.getPos(who,left,-280);
		}
		else if(who.id == 'currencyLower'){
			pos = this.getPos(who,left,-120);
		}

		this.submenu2.style.display = 'block';
		this.submenu2.style.left = pos.x + 'px';
		this.submenu2.style.top = pos.y + 'px';
		this.submenu2.innerHTML = document.getElementById(who.id+'Content').innerHTML;
		this.mView = 0;
		this.mView2 = 0;
		this.clearMenuTimeout();
		this.clearMenuTimeout2();
	} else if (show == 3) {
		this.mView = 1;
		this.mView2 = 1;
		this.mViewID = window.setTimeout("chart.closeSubItem();",200);
		this.mViewID2 = window.setTimeout("chart.closeSubItem2();",200);
	}else {
		this.mView = 1;
		this.mView2 = 1;
		this.mViewID = window.setTimeout("chart.closeSubItem();",200);
		this.mViewID2 = window.setTimeout("chart.closeSubItem2();",200);
	}
}
// close menu
chart.prototype.closeSubItem = function() {
	if (this.mView) {
	this.submenu.style.display = 'none';
	this.submenu2.style.display = 'none';
	}
	window.clearTimeout(chart.mViewID);
}
chart.prototype.clearMenuTimeout = function() {
	this.mView = 0;
	window.clearTimeout(chart.mViewID);
}
// close secondary menu
chart.prototype.closeSubItem2 = function() {
	if (this.mView2) {
	this.submenu2.style.display = 'none';
	}
	window.clearTimeout(chart.mViewID2);
}
chart.prototype.clearMenuTimeout2 = function() {
	this.mView = 0;this.mView2 = 0;
	window.clearTimeout(chart.mViewID);
	window.clearTimeout(chart.mViewID2);
}

// highlight menu item
chart.prototype.hlMenu = function(who,what)
{
	if (what) {
		who.className = 'subitem subitemHL';
	} else {
		who.className = 'subitem';
	}
}

// -- Upper Options Menu --
chart.prototype.showUpperItem = function(who,show) {
	if (show == 1) {
		if (typeof(document.all) == "undefined") {
			var pos = this.getPos(who,1,17); // firefox
		} else {
			var pos = this.getPos(who,2,18); // ie
		}
		this.lastWho = who;
		this.subuppermenu.style.display = 'block';
		this.subuppermenu.style.left = pos.x + 'px';
		this.subuppermenu.style.top = pos.y + 'px';

		this.subuppermenu.innerHTML = this.getUpperOptions(who.id);
		this.uView = 0;
		this.clearUpperTimeout();
	} else {
		this.uView = 1;
		this.uViewID = window.setTimeout("chart.closeUpperItem();",200);
	}
}
chart.prototype.getUpperOptions = function(key){
	for (var i = 0;i<this.upperManager.length;i++) {
		if (key == 'u'+this.upperManager[i].key) {
			var u = this.upperManager[i];
			var content = [];
			if (u.type == 'event' || u.type == 'compare') {
				var paramslength = 0;
			} else {
				var params = u.params.split(",");
				var paramLabels = this.upper[u.value].paramLabel.split(",");
					content.push('<table class="paramsTable"><tr>');
				for (var p = 0;p<params.length;p++) {
					content.push('<td>'+paramLabels[p]+'</td>');
				}
					content.push('</tr><tr>');
				for (var p = 0;p<params.length;p++) {
					if (u.value.indexOf("news") > -1) {
						content.push('<td><input id="i'+u.key+'_'+p+'" class="paramsInput" style="width:50px;" type="text" value="'+params[p]+'" maxlength="25" /></td>');
					} else {
						content.push('<td><input id="i'+u.key+'_'+p+'" class="paramsInput" type="text" value="'+params[p]+'" maxlength="8" /></td>');
					}
				}
					content.push('</tr></table>');
			}

			content.push('<table><tr><td align="left">');
			if (paramslength != 0) {
				content.push('<div class="gButton" style="width:50px;" onclick="chart.updateUpper('+i+','+params.length+');">Update</div>&nbsp;&nbsp;&nbsp;</td>');
			}

			content.push('<td align="left" valign="top"><div class="gButton" style="width:60px;" onclick="chart.removeUpper(\''+u.value+'\',\''+u.key+'\');">Remove <img src="../../common/img/charts/icon_x.gif" alt="Remove"  /></div>');
			content.push('</td></tr></table>');

			return content.join("");
			break;
		}
	}
}
// close upper menu
chart.prototype.closeUpperItem = function() {
	if (this.uView) {
		this.subuppermenu.style.display = 'none';
	}
	window.clearTimeout(chart.uViewID);
}
chart.prototype.clearUpperTimeout = function() {
	this.uView = 0;
	//this.lastWho.className = 'fLeft upperOption upperOptionHL';
	window.clearTimeout(chart.uViewID);
}

// -- Lower Options Menu --
chart.prototype.showLowerItem = function(who,show) {
	if (show == 1) {
		var pos = this.getPos(who,1,18);
		//this.lastWho = who;
		this.sublowermenu.style.display = 'block';
		this.sublowermenu.style.left = pos.x + 'px';
		this.sublowermenu.style.top = pos.y + 'px';
		this.sublowermenu.innerHTML = this.getLowerOptions(who.id);
		this.lView = 0;
		//this.clearLowerTimeout();
		//who.className = 'lowerOption lowerOptionHL';
	} else {
		this.lView = 1;
		//who.className = 'lowerOption';
		//this.lastWho.className = 'lowerOption';
		this.lViewID = window.setTimeout("chart.closeLowerItem();",200);
	}
}
chart.prototype.getLowerOptions = function(key) {
	var key = key.split("_");
		lIndex = key[1] - 1;

	var lowObj = this.lowerManager[lIndex];
	var params = lowObj.params + '';
	var params = params.split(",");
	if (this.lower[lowObj.value]) {
		var paramLabels = this.lower[lowObj.value].paramLabel.split(",");
		var numParams = this.lower[lowObj.value].numParams;
	} else {
		var paramLabels = [];var numParams = 0;
	}

	var content = [];

	if (numParams > 0) {
			content.push('<table class="paramsTable"><tr>');

		for (var p = 0;p<numParams;p++) {
			content.push('<td>'+paramLabels[p]+'</td>');
		}
			content.push('</tr><tr>');

		for (var p = 0;p<numParams;p++) {
			content.push('<td><input id="i'+lIndex+'_'+p+'" class="paramsInput" type="text" value="'+params[p]+'" maxlength="5" /></td>');
		}
		content.push('</tr></table>');


		content.push('<table><tr><td align="left">');
		content.push('<div class="gButton" onclick="chart.updateLower(\''+lIndex+'\','+numParams+');">Update</div>');
		content.push('</td></tr></table>');
	} // end if params check

	return content.join("");
}
// close lower menu
chart.prototype.closeLowerItem = function() {
	if (this.lView) {
		this.sublowermenu.style.display = 'none';
	}
	window.clearTimeout(chart.lViewID);
}
chart.prototype.clearLowerTimeout = function() {
	this.lView = 0;
	//this.lastWho.className = 'lowerOption lowerOptionHL';
	window.clearTimeout(chart.lViewID);
}

// wrappers
function clearUpperTimeout() {try {chart.clearUpperTimeout();} catch(e){}}
function showUpperItem(who,what) {try {chart.showUpperItem(who,what);} catch(e) {}}
function clearLowerTimeout() {try {	chart.clearLowerTimeout();} catch(e) {}}
function showLowerItem(who,what) {try {chart.showLowerItem(who,what);} catch(e) {alert(e);}}
function hl(who,what) {try { chart.hlMenu(who,what);} catch(e) {}}
function showSubItem(who,show,offset) {try {chart.showSubItem(who,show,offset);} catch(e) {}}
function aU(who,what,forceParams) {try {chart.addUpper(who,what,forceParams);} catch(e) {}}
function aL(who) {try {chart.addLower(who);} catch(e) {}}

// Builds Interactive Chart
chart.prototype.load = function(action,action_value){
	var uM = serializer.serialize(this.upperManager);
	var lM = serializer.serialize(this.lowerManager);
		uM = uM.replace(/&amp;/gi,"-AND-");
		uM = uM.replace(/&/gi,"-AND-");
		lM = lM.replace(/&/gi,"-AND-");

	if (!action) {action = '';}
	if (!action_value) {action_value = '';}

	var qs = '../../common/charts/update_chart.asp?sym='+escape(this.symbol)+'&duration='+this.duration+'&frequency='+this.frequency+'&scaling='+this.scaling+'&display='+this.display+'&exportData='+this.exportData+'&dMin='+this.dMin+'&dMax='+this.dMax+'&uppers='+uM+'&lowers='+lM+'&lastColorUsed='+this.lastColorUsed+'&action='+action+'&action_value='+action_value+'&fullscreen='+this.fullscreen;

	commonGen.document.location.replace(qs);
	this.resizeMe = 0;
}

chart.prototype.resize = function(){
	if (!this.resizeMe) {
		this.lcid = window.setTimeout("chart.load()",100);
		this.resizeMe = 1;
	}
}

// -- Helper --
// keeps track of which color to assign to upper indicator nav item
chart.prototype.selectUpperColor = function() {
	if (this.lastColorUsed < this.colors.length) {
		var color = this.colors[this.lastColorUsed];
		this.lastColorUsed++;
	} else {
		this.lastColorUsed = 0;
		var color = this.colors[this.lastColorUsed];
		this.lastColorUsed++;
	}
	return color;
}
// get pos of any element
chart.prototype.getPos = function(who,xOff,yOff){
	this.eleOffset = who;

	if (!xOff) { xOff = 0; }
	if (!yOff) { yOff = 0; }

	var x = 0;var y = 0;
	var pos = Element.getXY(who);
	pos.x += xOff;
	pos.y += yOff;

	var brow = navigator.userAgent + '';

	return pos;
}

// -- Events --
// Displays Insider/splits/earngs transaction rollover

chart.prototype.displayInfo = function(who,what,left,top,trigger, bubble) {
	try {
		if (what) {
			this.iWin = Element.get(who+"Win");
			var content = this.iWin.innerHTML;
			var xy = Element.getXY(trigger);
			bubble.SetContent(Element.create("div", {}, content));
			bubble.MoveBubble(xy.x, xy.y, Element.getSize(trigger));
			bubble.BlowBubble();

			//this.iWin.style.display = "block";
			//this.iWin.style.left = left + 20 + 'px';
			//this.iWin.style.top = top + 'px';
		} else {
			//this.iWin.style.display = "none";
			bubble.PopBubble();
		}
	} catch(e){alert(e);};
}
function rWrap(who,what,left,top, trigger) {
	try {
		chart.displayInfo(who,what,left,top,trigger, this.bubble);
	} catch(e) {alert(e);}
}