Array.prototype.findIndex = function(value){
    var ctr = -1;
    for (var i=0; i < this.length; i++) {
        if (this[i] == value) {
            return i;
        }
    }
    return ctr;
};

String.prototype.commafy = function() {
	return this.replace(/(\D?)(\d{4,})/g, function($0, $1, $2) {
		return /[.\w]/.test($1) ? $0 : $1 + $2.replace(/\d(?=(?:\d\d\d)+(?!\d))/g, '$&,');
	});
};

Number.prototype.commafy = function() {
	return String(this).commafy();
};

function sortNumber(a,b) {
    return a - b
}

var TYPE_SECTOR = 1;
var TYPE_STOCK = 2;

var functionsToDynamicallyInvoke = new Array();
function dynamicInvocation() {
    for (var i = 0; i < functionsToDynamicallyInvoke.length; i++) {
        functionsToDynamicallyInvoke[i]();
    }
    setTimeout("dynamicInvocation()", dynamicFunctionTimer);
}

var marketSummary;

function getMarketSummary() {
    PublicTickerJS.getMarketSummary({
        callback:function(dataFromServer) {
            marketSummary=dataFromServer;
            updateMarketSummary(dataFromServer);
        }
    });
}

function updateMarketSummary(ms){
 if(dwr != null){
        if(ms != null){
            dwr.util.setValue("m_volume",ms.s.commafy());
            dwr.util.setValue("m_turnover", ms.t.toFixed(2).commafy());
        }
    }
}

var stockNameCodeMap = new Map();
var stockCodeNameMap = new Map();


function updateStocksMaps() {
    var stocks = stockCodesList.split(",");
    for (var i = 0; i < stocks.length; i++) {
        var stock = stocks[i].split("~");
        stockNameCodeMap.put(stock[1], stock[0]);
        stockCodeNameMap.put(stock[0], stock[1]);
    }
}

function getStockId(stockname) {
    return  stockNameCodeMap.get(stockname);
}

function getStockName(id) {
    return  stockCodeNameMap.get(id);
}

var sectorsNameCodeMap = new Map();
var sectorsCodeNameMap = new Map();

function updateSectorsMaps() {
    var sectors = sectorCodesList.split(",");
    for (var i = 0; i < sectors.length; i++) {
        var sector = sectors[i].split("~");
        sectorsNameCodeMap.put(sector[1], sector[0]);
        sectorsCodeNameMap.put(sector[0], sector[1]);
    }
}

function getSectorId(name) {
    return  sectorsNameCodeMap.get(name);
}

function getSectorName(id) {
    return  sectorsCodeNameMap.get(id);
}

var lastSeq = 0;

function getPublicTickerData() {
    PublicTickerJS.getPublicTickerData(clientId, lastSeq, {
        callback:function(dataFromServer) {
            updatePublicTickerData(dataFromServer);
        }
    });
}

function updatePublicTickerData(trades) {
    var trade
    for (var i = 0; i < trades.length - 1; i++) {
        trade = trades[i];
        updateTradeToTicker(trade);
    }
    if (trades.length > 1) {
        //newUpdated = true;
        newUpdateTrade = 1;
    }
    lastSeq = trades[trades.length - 1].s;
}

function updateTradeToTicker(trade) {
    var tickerTrade = new Object();
    tickerTrade.SymbolCompany = getStockName(trade.s) == null ? trade.s : getStockName(trade.s);
    tickerTrade.LTSPrice = trade.p.toFixed(2).commafy();
    tickerTrade.LTVolume = trade.q.commafy();
    tickerTrade.Change_Price = trade.c.toFixed(2).commafy();
    myArray.push(tickerTrade);
}

var marketStatus = "N/A~N/A";
function getMarketStatus(){
    PublicTickerJS.getMarketStatus({
        callback:function(dataFromServer) {
            updateMarketStatus(dataFromServer);
            marketStatus = dataFromServer;
        }
    });
}

function updateMarketStatus(status){
    if(dwr != null){
        if(status != null){
            var statusArray = status.split("~");
            var tickerTrade = new Object();
            tickerTrade.SymbolCompany = "Market Status :";
            if (statusArray[0]=="OPEN"){
                tickerTrade.LTVolume=statusArray[0];
                tickerTrade.Change_Price=1;
            }
            else if (statusArray[0]=="CLOSED"){
                tickerTrade.LTVolume=statusArray[0];
                tickerTrade.Change_Price=-1;
            }
            else{
                tickerTrade.LTVolume=statusArray[0];
                tickerTrade.Change_Price=0;
            }
            tickerTrade.LTSPrice = "As of "+statusArray[1];
            myArray.push(tickerTrade);
            //newUpdated = true;
            newUpdateStatus = 1;
        }else{
            var tickerTrade = new Object();
            tickerTrade.SymbolCompany = "Market Status :";
            tickerTrade.LTSPrice = "As of -";
            tickerTrade.LTVolume = "-";
            tickerTrade.Change_Price = 0;
            myArray.push(tickerTrade);
            //newUpdated = true;
            newUpdateStatus = 1;
        }
    }
}

var indicesMap={};

function getPublicIndicesData() {
    PublicTickerJS.getPublicIndicesData({
        callback:function(dataFromServer) {
            updateIndicesToday(dataFromServer);
        }
    });
}

function updateIndicesToday(indices) {
    var index;
    indicesMap={};
    for (var i = 0; i < indices.length; i++) {
        index=indices[i];
        indicesMap[index.id]=index;
        updateIndicesToTicker(index);
    }
    //newUpdated = true;
    newUpdateIndices = 1;
}

function updateIndicesToTicker(item){
    var tickerTrade = new Object();
    tickerTrade.SymbolCompany = /*" "+*/getSectorName(item.id);
    tickerTrade.LTSPrice = item.p.toFixed(2).commafy();
    tickerTrade.LTVolume = item.v.toFixed(2).commafy();
    tickerTrade.Change_Price = item.c.toFixed(2).commafy();
    myArray.push(tickerTrade);
}

function getIndex(id){
    return indicesMap[id];
}

var newUpdated = false;
var myArray=new Array();

var newUpdateValue = 0;

var newUpdateIndices=0;
var newUpdateStatus = 0;
var newUpdateTrade=0;

function getArrayVal() {
	var tempArray = new Array();
    var arrayLength = myArray.length;

    /*if (newUpdated==true){
		//for(i=0; i<arrayLength; i++){
        while(myArray.length > 0){
            //tempArray[i] = myArray[i];
            tempArray.push(myArray.pop()) ;
        }
		*//*for(x in myArray){
			myArray.splice(x,arrayLength);
		}*//*
        if(myArray.length == 0) myArray = new Array();
        newUpdated = false;
	}*/

    newUpdateValue = newUpdateIndices + newUpdateStatus + newUpdateTrade;

    if (newUpdateValue==3){
        while(myArray.length > 0){
            tempArray.push(myArray.pop()) ;
        }
        if(myArray.length == 0) myArray = new Array();

        newUpdateValue = 0;
        newUpdateIndices =0;
        newUpdateStatus =0;
        newUpdateTrade =0;
    }

    return tempArray;
}

function init() {
    updateSectorsMaps()
    updateStocksMaps();


    getPublicIndicesData();
    //getMarketSummary();
    getMarketStatus();
    getPublicTickerData();

    functionsToDynamicallyInvoke.push(getPublicTickerData);
    functionsToDynamicallyInvoke.push(getPublicIndicesData);
    functionsToDynamicallyInvoke.push(getMarketStatus);
    //functionsToDynamicallyInvoke.push(getMarketSummary);
    setTimeout("dynamicInvocation()", dynamicFunctionTimer);
}
