function getFrameForCall(frame) {
	var element = bi(frame)
	if(element.contentWindow)
	{
		element = element.contentWindow
	}
	return element
}

var xmlObjs = new Array()

function getHttpXMLReq(oReq, fn) {
	try
	{
		var initial = new Date()
		var xmlRequest = new Object()
		xmlRequest.xmlhttp = getXMLHttpObj()	
		xmlRequest.oReq = oReq
		xmlRequest.fn = fn
		xmlRequest.startTime = initial.getTime()	
		if(ie)
			xmlRequest.xmlhttp.open("POST", "/m", true);
		xmlRequest.xmlhttp.onreadystatechange= function() {onReadySC(xmlRequest)};
		if(!ie)
			xmlRequest.xmlhttp.open("POST", "/m", true);
		xmlRequest.xmlhttp.setRequestHeader("Content-Type", "text/xml");
		xmlRequest.xmlhttp.send(oReq);
	}
	catch(e)
	{
		window.setTimeout(	function(){getHttpXMLReq(oReq, fn)},250	)
	}
}

function onReadySC(xmlRequest) {
	if(checkReadyState(xmlRequest))
	{
		clearTimeout(xmlRequest.timeout)
		if(xmlRequest.xmlhttp.status==200)
		{
			setLatencyMeterVal(xmlRequest.startTime)
			if(resolveAlertandAccess(xmlRequest.xmlhttp.responseXML))
			{
				xmlRequest.fn(xmlRequest.xmlhttp.responseXML)
			}
		}
		else
		{
			if(xmlRequest.xmlhttp.status == 12029 || xmlRequest.xmlhttp.status == 12030 || xmlRequest.xmlhttp.status == 12031 || xmlRequest.xmlhttp.status == 12152)
			{
				xmlRequest.xmlhttp.abort()
				window.setTimeout(	function(){getHttpXMLReq(xmlRequest.oReq, xmlRequest.fn)},2000)
			}
			else if(xmlRequest.xmlhttp.status < 12000)
			{
				xmlRequest.xmlhttp.abort()		
				window.setTimeout(	function(){getHttpXMLReq(xmlRequest.oReq, xmlRequest.fn)},2000)
			}
		}
	}
	else
	{
		clearTimeout(xmlRequest.timeout)
		var cd = new Date()
		var cdTime = cd.getTime()
		var delay = 60000
		var httpTimer = (xmlRequest.startTime + delay) - cdTime
		if(httpTimer < 0){httpTimer = 1}
		window.status = "Time left for request:" + httpTimer
		xmlRequest.timeout = window.setTimeout(
			function()
			{
				if(!checkReadyState(xmlRequest))
				{
					xmlRequest.xmlhttp.onreadystatechange = function(){};
					xmlRequest.xmlhttp.abort()
					window.setTimeout(	function(){getHttpXMLReq(xmlRequest.oReq, xmlRequest.fn)},2000)
				}
			},httpTimer
		)
	}
}

function getXMLHttpObj() {
	var makeObj = true;
	if(xmlObjs.length > 0)
	{
		for(var i = 0; i < xmlObjs.length; i++)
		{
			if(xmlObjs[i].readyState == 4)
			{
				makeObj = false
				return xmlObjs[i]
				i = xmlObjs.length
			}
			else
			{
				makeObj = true
			}
		}
	}
	if(makeObj == true)
	{
		if(window.XMLHttpRequest)
		{
			xmlObjs[xmlObjs.length] = new XMLHttpRequest();
		}
		else
		{
			xmlObjs[xmlObjs.length] = new ActiveXObject("Msxml2.XMLHTTP");
		}
		return xmlObjs[xmlObjs.length - 1]
	}
}

function checkReadyState(xmlRequest) {
	switch(xmlRequest.xmlhttp.readyState)
	{
		case 1: case 2: case 3:
			return false;
		break;
		case 0: case 4:
			return true;
		break;			
	}
}

var averageTime = new Array()
var aveTimeCount = 0;
var aveReqUse = 8;

function setLatencyMeterVal(startTime) {
	var current = new Date()
	var newTime = current.getTime()
	var dif = newTime - startTime
	averageTime[aveTimeCount] = dif
	aveTimeCount  = aveTimeCount + 1
	if(aveTimeCount > aveReqUse - 1)
	{
		aveTimeCount = 0
	}	
}
function resolveAlertandAccess(oXml) {
	return true;
}

function requestEnv(action, requestObj) {
	var acct = (top.accountNumber== "null" || top.accountNumber== null)?"":top.accountNumber;
	var aTok = top.authToken;
	if(action)
	{
		var request = "<EZMessage action='" + action +"'><data><authToken>" + aTok + "</authToken>"
		switch(action)
		{
			case "account.info":
				request += "";
			break;
			case "load.preferences":
				request += "";
			break;
			case "auth.logout":
				request += "";
			break;

			case "view.quote":
				if(requestObj.secKey)
				{
					request += 	"<securityKey>" + requestObj.secKey + "</securityKey>";
					request +=	"<account>" + acct + "</account>";
				}
				else
				{
					var desc = (requestObj)?requestObj.desc:"true";
					var sym = (requestObj)?requestObj.symbol: top.defaultSymbol;
					request +=	"<description>" + desc + "</description>" +
								"<fundamentals>true</fundamentals>" +
								"<bs>true</bs>" +
								"<symbol>" + sym  + "</symbol>" +
								"<account>" + acct + "</account>";
					if(requestObj.newSymbol == true)
					{
						request += "<setDefault>" + top.defaultSymbol + "</setDefault>";
					}
				}
			break;			
			case "view.series":
				var sym = (requestObj)?requestObj.symbol: top.defaultSymbol;	
				request +=	"<symbol>" + sym  + "</symbol>";
				if(acct != null && acct != "null" && acct != "")
				{
					request +=	"<account>" + acct + "</account>";
				}
			break;
			case "stock.lookup":
				var company = (requestObj)?requestObj.company: '';
				request +=	"<company>" + company + "</company>";
			break;
			case "account.cash":
				request += "<account>" +acct + "</account><portfolio>true</portfolio>";
				request += "<historical>true</historical>";
			break;
			case "view.exchange.quote":
				request += "<k>" + requestObj.secKey+ "</k>";
			break;
			case "account.positions":
				request += "<account>" +acct + "</account>";
			break;
			case "account.orders":
				request += "<account>" +acct + "</account>";		
			break;
			case "account.activity":
				request += "<account>" +acct + "</account>";		
			break;
			case "news.symbol":
				var sym = (requestObj)?requestObj.symbol: top.defaultSymbol;	
				request +=	"<symbol>" + sym  + "</symbol>";
				if(acct != null && acct != "null" && acct != "")
				{
					request +=	"<account>" + acct + "</account>";
				}
			break;
			case "view.chain":
				var gr = (requestObj)?requestObj.greeks:"true";
				var sym = (requestObj)?requestObj.symbol: top.defaultSymbol;
				var ts = (requestObj && requestObj.timeStamp)?requestObj.timeStamp:"";
				request += 	"<greeks>"  + gr + " </greeks>" + 
							"<quotesAfter>" + ts  +"</quotesAfter>" +
							"<symbol>" + sym + "</symbol>";
				if(acct != null && acct != "null" && acct != "")
				{
					request +=	"<account>" + acct + "</account>";
				}
			break;
			case "echo":
				var echo = (requestObj)?requestObj.echo:"";
				echo += "<basePageId>" + top.basePageId + "</basePageId>";
				echo += "<pathName>" + ("/" +  top.pathName) + "</pathName>";
				echo += "<configXML>" + top.configXML + "</configXML>";		
				request += "<echo>" + echo + "</echo>";
			break;
			case "security.definition":
				request += "<securityKey>" + requestObj.secKey+ "</securityKey>";
			break;
		}
		request += "</data></EZMessage>"
		return request
	}
}





if ( document.implementation.hasFeature("XPath", "3.0") ) {  
	XMLDocument.prototype.selectNodes = function(cXPathString, xNode) {
		if( !xNode ) { xNode = this; }
		var oNSResolver = this.createNSResolver(this.documentElement)
		var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
		var aResult = [];
		for( var i = 0; i < aItems.snapshotLength; i++)
		{
			aResult[i] =  aItems.snapshotItem(i);
		}
		return aResult;  
	}
	Element.prototype.selectNodes = function(cXPathString) {
		if(this.ownerDocument.selectNodes)
		{
			return this.ownerDocument.selectNodes(cXPathString, this);
		}
		else{throw "For XML Elements Only";}  
	}
}

if ( document.implementation.hasFeature("XPath", "3.0") ) {  
	XMLDocument.prototype.selectSingleNode = function(cXPathString, xNode) {
		if( !xNode ) { xNode = this; }
		var xItems = this.selectNodes(cXPathString, xNode);
		if( xItems.length > 0 )
		{
			return xItems[0];
		}
		else
		{
			return null;
		}
	}
	Element.prototype.selectSingleNode = function(cXPathString) {
		if(this.ownerDocument.selectSingleNode)
		{
			return this.ownerDocument.selectSingleNode(cXPathString, this);
		}
		else{throw "For XML Elements Only";}
	}
}
