/*
 * fxliverate.js
 *
 * Copyright (c) 2007 Global Link Development,
 * State Street Bank and Trust Corp.
 * All rights reserved.
 *
 * This software is the confidential and proprietary information of State
 * Street Bank and Trust Corporation ("Confidential Information").
 * You shall not disclose such Confidential Information and shall use it
 * into with State Street Bank.
 * 
 * Revision History
 *
 * Date      Programmer       Notes
 * --------- ---------------- --------------------------------------------
 * 2007-7-23 Chen	Wang   	  initial
 * 2007-7-23 Junxiang Ji  	  initial
 * 2007-9-19 Junxiang Ji  	  add error handler function
 * 
 * Javascript file with core functions and variable declarations to support
 * client side implementation for streaming quotes.
 */

// remote url for csv data
var lrCsvUrl = "";
var lrisRightCol = "";
var lrImgPath = "";
var lrStrInfo = ""; 
var lrCurrencyPair = new Array();
var lrBid = new Array();
var lrAsk = new Array();
var lrTick = new Array();
var lrUpdate = "";
var lrLastUpdate = "";

// handle to the repeating process						   
var lrPollId;

// polling interval for updates			
var lrPollInterval = 5000;

// header string for the quotes table
var lrTableHeaderRight = "<table align=left border=0 cellpadding=0 cellspacing=0 STYLE='table-layout:fixed' >" + 
					"<COL WIDTH=70><COL WIDTH=60><COL WIDTH=15><COL WIDTH=60><thead><tr bgcolor=#013589><th class=report-head>" + 
					"Currency</th><th class=report-head>Bid&nbsp;&nbsp</th><th class=report-head>&nbsp;</th>" +
					"<th class=report-head>Ask&nbsp;&nbsp</th></tr></thead><tbody>";

var lrTableHeaderLeft =	"<table align=left border=0 cellpadding=0 cellspacing=0 STYLE='table-layout:fixed' >" + 
					"<COL WIDTH=68><COL WIDTH=55><COL WIDTH=15><COL WIDTH=55><thead><tr bgcolor=#013589><th class=report-head>" + 
					"Currency</th><th class=report-head>Bid&nbsp;&nbsp</th><th class=report-head>&nbsp;</th>" +
					"<th class=report-head>Ask&nbsp;&nbsp</th></tr></thead><tbody>";
		
// tail string for the quotes table
var lrTableTail = "</tbody></table>";

// image constants
var lrUpTickImg = "";
var lrDownTickImg = "";
var lrNoneTickImg = "";

// row constants for even and odd numbered style classes
var lrEvenClass	=	"reportdata-even";
var lrOddClass	=	"reportdata-odd";

//error happens
var lrAjaxErrFlag = "false";
var errorMsg = "<div class=\"rightnavcontent\">Live rate data is temporarily unavailable.<div>";

//ajax request object
//var xmlHttp = null;

//<table width="178" cellspacing="0" cellpadding="0" border="0"><tr><td></td></tr></table>
/**
 *asynchronism request form remote data
 */
function lrAjaxCall()
  {
   
	var xmlHttp;
	try{
		// Firefox, Opera 8.0+, Safari
		xmlHttp=new XMLHttpRequest();
	}catch (e){
		// Internet Explorer
		try{
			xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
		}catch (e){
			try	{//IE 6
				xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
			}catch (e){
				alert("Your browser does not support AJAX!");
				return false;
			}
		 }
	}

	//catch ajax timeout
	window.setTimeout(
		function(){
			if(xmlHttp.readyState == 1){
				lrAjaxErrFlag = "true";
				ajaxErrMsg();
				xmlHttp.abort();
			}
		}
		,3000
	);

	  xmlHttp.onreadystatechange=function()
      {try{
		if(xmlHttp.readyState==4){
			if(xmlHttp.status == 200){
				if (xmlHttp.responseText){
					lrParseServerData(xmlHttp.responseText);
					if(lrAjaxErrFlag == "false"){
						lrPollTimer = window.setTimeout('lrAjaxCall()', lrPollInterval);
					}
				}else{
					lrAjaxErrFlag = "true";
					ajaxErrMsg();
				}
			}else{
				lrAjaxErrFlag = "true";
				ajaxErrMsg();
			}			
		}
		}catch(e){/*there might be a exception in firefox only.*/}
      }

    xmlHttp.open("GET",lrCsvUrl + "?ms=" + new Date().getTime(),true);
	try{		
		xmlHttp.send(null);		
	}catch(e){
		//alert("send err...");
	}	
  }
  
function ajaxErrMsg(){
	var area = document.getElementById("fxrates");
	area.innerHTML = errorMsg;
}    

/**
 *Operation information from the csvContents into a two-dimensional array
 */  
function lrGetFromCsvFileContents(csvFileContents) {
	var lineEndingCharacters = new RegExp("\r\n|\n|\r");
	var leadingWhiteSpaceCharacters = new RegExp("^\\s+", "g");
	var trailingWhiteSpaceCharacters = new RegExp("\\s+$", "g");
	var doubleQuotes = new RegExp("\"\"", "g");
	var arrayOfOutputRecords = [];
	var arrayOfInputLines = csvFileContents.split(lineEndingCharacters);
	for (var i = 0; i< arrayOfInputLines.length; i++) {
		var singleLine = new String(arrayOfInputLines[i]);
		if (singleLine.length > 0) {
			var listOfFields = singleLine.split(",");
			var j = 0;
			while (j < listOfFields.length) {
				var space_field_space = listOfFields[j];
				var field_space = space_field_space.replace(leadingWhiteSpaceCharacters, "");
				var field = field_space.replace(trailingWhiteSpaceCharacters, "");
				var firstChar = field.charAt(0);
				var lastChar = field.charAt(field.length - 1);
				var secondToLastChar = field.charAt(field.length - 2);
				var thirdToLastChar = field.charAt(field.length - 3);
				if ((firstChar == "\"") && ((lastChar != "\"") || ((lastChar == "\"") && (secondToLastChar == "\"") && (thirdToLastChar != "\"")))) {
					if (j + 1 === listOfFields.length) {
						return null;
					}
					var nextField = listOfFields[j + 1];
					listOfFields[j] = field_space + "," + nextField;
					listOfFields.splice(j + 1, 1);
				} else {
					if ((firstChar == "\"") && (lastChar == "\"")) {
						field = field.slice(1, (field.length - 1));
						field = field.replace(doubleQuotes, "\"");
					}
					listOfFields[j] = field;
					j += 1;
				}
			}
			arrayOfOutputRecords.push(listOfFields);
		}
	}
	return arrayOfOutputRecords;
}

/**
 *Operation information from two-dimensional array into each output array 
 */
function lrGetArrayFromArrays(csvData){

var arrayList = lrGetFromCsvFileContents(csvData);
for (var i = 1 ; i < arrayList.length; i++) {
			var row = arrayList[i];
			for (var j in row) {
				var value = row[j];

			if(j == 0){
			lrCurrencyPair.push(value);
			}
			if(j == 1){
			lrBid.push(value);
			}
			if(j == 2){
			lrAsk.push(value);
			}
			if(j == 3){
			lrTick.push(value);
			}
			if(j == 4&&value != ""){
			lrUpdate = value;
			}
			}
	}
}

/**
 * Parses the data from the server and re-initializes the displayed quotes table.
 */	

function lrParseServerData(csvData) {

	lrCurrencyPair = new Array();
	lrBid = new Array();
	lrAsk = new Array();
	lrTick = new Array();

	lrUpTickImg = lrImgPath + "up.gif";
	lrDownTickImg = lrImgPath + "down.gif";
	lrNoneTickImg = lrImgPath + "none.gif";

	if (lrisRightCol == "false"){
	lrStrInfo = lrTableHeaderLeft;
	}else {
	lrStrInfo = lrTableHeaderRight;
	}



	lrGetArrayFromArrays(csvData);


	if(lrCurrencyPair.length == 0)
	return;

	for(var i = 0; i < lrCurrencyPair.length; i++){
	
	if( lrTick[i] == 0 )
			tickImg = lrDownTickImg;
		else if( lrTick[i] == 1 )
			tickImg = lrNoneTickImg;
		else
			tickImg = lrUpTickImg;
	
	if( i%2 == 0 )
			rowClass = lrEvenClass;
		else
			rowClass = lrOddClass;

	lrStrInfo += "<tr height=15 class ='" + rowClass + "'><td>&nbsp;&nbsp;";
	lrStrInfo += lrCurrencyPair[i] + "</td><td align=center>";
	lrStrInfo += lrBid[i] + "</td><td><div align=center><img width=12 height=12 src='";
	lrStrInfo += tickImg +"'></div></td><td align=center>";
	lrStrInfo += lrAsk[i] + "</td></tr>";

	}

	lrStrInfo += lrTableTail;

	var area = document.getElementById("fxrates");
	area.innerHTML = lrStrInfo;

}


/**
 * Pulls the lates quotes from the server and initializes the polling
 * timer.
 */
function lrPrepareDataPump(ImgPath, DataUrl, isRightCol){
	
	lrImgPath = ImgPath;
	lrCsvUrl = DataUrl;
	lrisRightCol = isRightCol;

	// check to see if it is instantiated in the dom
	if( DataUrl ) {

		// rebind and set poll function
		try{
			lrAjaxCall();		
		}catch(e){
			//alert("Ajax error");
		}
	}
}