
jQuery.fn.reverse = [].reverse;	// reverse "plugin" for jquery

String.prototype.trim = function() {
	return (this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, ""));
}

String.prototype.startsWith = function(str) {
	return (this.match("^"+str)==str);
}

String.prototype.endsWith = function(str) {
	return (this.match(str+"$")==str);
}

var webCore = {
    cookieName: 'N2EX',
    preferredMarket : 'NOR',
    baseURL: "/",    
    proxyURL: "/webproxy/DataFeedProxy.aspx",
    graphURL: "http://www.nasdaqomxnordic.com/charting/ChartingBin.aspx",
    defaultNodeInstrument: null,
    personalized: {},
    reloadFunctionHandler: {},
    
    cookies : {
    	/*
    	 * returns a date from (client's) now
    	 */
		expires: function() {
			var expires = new Date();
			expires.setFullYear(expires.getFullYear() + 1, expires.getMonth() + 1, 28);// One year from client's  now..
			return expires;
		},
		
		/*
		 * Simple key value pair for setting a value in a cookie.
		 * @param name the name key
		 * @value the value for a given (name) key
		 * @expires a valid date object; example date 29/05/2008 23:59:00
		 */
		set: function (name, value, expires) {
			document.cookie = name + "=" + escape(value) + "; expires=" + expires.toGMTString();
		},
		/*
		 * returns a value for a given key. See set for more info.
		 */
		get: function (name) {
			var v = document.cookie.match("(^|;)?" + name + "=([^;]*)(;|$)");
			return v != null ? unescape(v[2]) : null;
		}
	},
    
    /* Returns a float or 0.0 */ 
    parseNumber: function ( string ) {
    	var result = "";
      	result = string.replace( webCore.numberFormat[currentLanguage].separator, '' );
      	result = result.replace( webCore.numberFormat[currentLanguage].decimal, '.' );
      	var num = parseFloat( result );
		return (isNaN(num))?0.0:num;  
    },  
    
    goToPage: function( path, instrument, params ) {
    	var url = webCore.baseURL + path;
    	if ( instrument != null ) {
    		url += "?Instrument=" + instrument;
    	}
    	url += (params != null ? params : "");
        document.location = url;
    },
    
    goToExternalPage: function( path, instrument, params ) {
    	var url = path;
    	if ( instrument != null ) {
    		url += "?Instrument=" + instrument;
    	}
    	url += (params != null ? params : "");
        document.location = url;
    },
    
     /* Gets the current date in iso format and adds the values if exists.
       usage: getISODate(); -> todays date in format yyyy-mm-dd
       getISODate(0,-3,0); -> todays date subtracting 3 month in format as above
       getISODate(0,0,-1,true); -> Get latest working day, mon-fri.
     */
    getISODate: function( yearAdd, monthAdd, dateAdd, lastWeekDay ) {
    	var dateString = "";
    	var date = new Date();
    	if ( yearAdd != null || yearAdd != undefined ) {
    		date.setFullYear( date.getFullYear() + yearAdd );
    	}
    	if ( monthAdd != null || monthAdd != undefined ) {
    		date.setMonth( date.getMonth() + monthAdd );
    	}
    	if ( dateAdd != null || dateAdd != undefined ) {
    		date.setDate( date.getDate() + dateAdd );
    	}
		if ( lastWeekDay == true ) {
    		if ( date.getDay() == 0 ) { //sunday
    			date.setDate( date.getDate() -2 );
    		} else if ( date.getDay() == 6 ) {	//satday
    			date.setDate( date.getDate() -1 );
    		}
    	}
    	dateString += date.getFullYear() + "-";
    	dateString += ((date.getMonth()+1) < 10 )?"0":"";
    	dateString += (date.getMonth()+1) + "-";
    	dateString += (date.getDate() < 10 )?"0":"";
    	dateString += date.getDate();
    	return dateString;
    },
    getXMLParams: function(data) {
      var xml = "<post>\n";
      for ( var i in data ) {
        // check if the param is an array, this is to have several of the same name on the parameters
        if (typeof(data[i]) == "object" ) {
          if ("Instrument" == i) {
            for ( var j in data[i]) {
              xml += '<param name="Instrument" value="' + data[i][j] + '"/>\n';
            }
          } else if ("Market" == i) {
            for ( var k in data[i]) {
              xml += '<param name="Market" value="' + data[i][k] + '"/>\n';
            }
          } else if ("List" == i) {
            for ( var l in data[i]) {
              xml += '<param name="List" value="' + data[i][l] + '"/>\n';
            }
          } else if ("Lang" == i) {
            for ( var m in data[i]) {
              xml += '<param name="Lang" value="' + data[i][m] + '"/>\n';
            }
          } else if ("MarketCode" == i) {
            for ( var l in data[i]) {
              xml += '<param name="MarketCode" value="' + data[i][l] + '"/>\n';
            }
          } else if ("LegalEntity" == i) {
            for ( var l in data[i]) {
              xml += '<param name="LegalEntity" value="' + data[i][l] + '"/>\n';
            }
          }
        } else {
          xml += '<param name="' + i + '" value="' + data[i] + '"/>\n';
        }
      }
      xml += "</post>";
      return xml;
    },

    getGraphUrl: function( params, instId, moreParams ) {
        params.instid = instId;
        var result = webCore.graphURL + '?';
        for ( var i in params ) {
            result += i + '=' + params[i] + '&';
        }
        for ( var j in moreParams ) {
            result += j + '=' + moreParams[j] + '&';
        }
        result += "rnd=" + new Date().getTime() + "&";
        return result.substring( 0, result.length -1 );
    },
    
    getInstrument: function() {
      return (webCore.getParameter("Instrument") != null) ?
      	webCore.getParameter("Instrument"): webCore.defaultNodeInstrument;
    },
    
    getParameter: function(param, fakeURL) {
        var paramMap = {};
        var useFakeURL = fakeURL != null;
        if (useFakeURL) {
        	if (fakeURL.charAt(0) != '?') {
        		fakeURL = "?" + fakeURL;
        	}
        }
        var url = useFakeURL ? fakeURL : new String(document.location);
        if (url.indexOf('?') != -1) {            
            var query = url.substring(url.indexOf('?') + 1);
            query = query.replace(/\&$/, '');
            jQuery.each(query.split('&'), function() {
                    var pair = this.split('=');
                    var key = pair[0];
                    var val = pair[1];
                    paramMap[key] = val;                
                }                
            );
            
        }
        return paramMap[param];
    },

    createQuery: function(action, market, local) {
      var resultObject = {};
      for ( var i in action) {
        resultObject[i] = action[i];
      }
      for ( var j in market) {
        resultObject[j] = market[j];
      }
      for ( var k in local) {
        resultObject[k] = local[k];
      }
      return webCore.getXMLParams(resultObject);
    },
	
	simpleEncode: function(valueArray,maxValue) {
		var simpleEncoding = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
		var chartData = ['s:'];
		  for (var i = 0; i < valueArray.length; i++) {
		    var currentValue = valueArray[i];
		    if (!isNaN(currentValue) && currentValue >= 0) {
		    chartData.push(simpleEncoding.charAt(Math.round((simpleEncoding.length-1) * 
		      currentValue / maxValue)));
		    }
		      else {
		      chartData.push('_');
		      }
		  }
		  return chartData.join('');
	},

	extendedEncode: function (values) {
		var encodingString = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.';
		var chartData = [''];
		var esln = encodingString.length;
		var firstChar, secondChar;
		for (var i = 0; i < values.length; i++) {
	    	var currentValue = values[i];
	    	if (!isNaN(currentValue) && currentValue >= 0) {
	    		firstChar = encodingString.charAt(Math.floor(currentValue/esln));
				secondChar = encodingString.charAt((currentValue % esln));
	    		chartData.push(firstChar+secondChar);
	    	} else {
	      		chartData.push('__');
	      	}
		}
		return chartData.join('');
	},

    numberFormat: {
    	en: { decimal: RegExp('\\.'), separator: RegExp(',','g') },  
    	sv: { decimal: RegExp(','), separator: RegExp('\\s|\\u00a0','g') }, // \\u00a0 -> nbrsp
    	fi: { decimal: RegExp(','), separator: RegExp('\\s|\\u00a0','g') },
    	da: { decimal: RegExp(','), separator: RegExp('\\.','g') },
    	is: { decimal: RegExp(','), separator: RegExp('\\.','g') }
    }
};


