// Debugging log window 
var logWin;
var logging = false;

function log(msg) {

	// Simply return, if logging NOT required
	if ( !logging ) {
		return;
	}

	if ( logWin == null ) {
		logWin = window.open("","logWin");
		logWin.document.writeln("<PRE style='font: 8pt courier'>");
	}

	logWin.document.writeln(msg);
}

// alert("LOG LOADED");
log("Logging loaded");


function setStatus(s) {
	window.status=s;
	return true;
}

function showPage(href) {
	location.href = href;
    return false;
}

// Front page functions
function changeCurrency() {
	var sel = document.forms[0].considerationCurrency;
	var currency = sel.options[sel.selectedIndex].value;
	if (currency) {
		showPage("/gold_prices.do?considerationCurrency=" + currency);
	}
}

function showMarketLast() {
	setParamCookie("Menu","menu","Markets");
	showPage("/gold_market.do");
}

function showMarketAll() {
	showMarket("","","","","");
}

function showMarket(action, vault, currency, limit, quantity) {

	setParamCookie("Menu","menu","Markets");
	setParamCookie("Menu","menu.Markets","0");

	setCookie("viewMarket.params","securityId=" + vault + "&considerationCurrency=" + currency + "&quantity=" + quantity);
	setCookie("viewMarketDepth.params","securityId=" + vault + "&considerationCurrency=" + currency);
	setCookie("viewMarketSpreads.params","considerationCurrency=" + currency + "&quantity=0.001");

	showPage("/gold_market.do");
}

function showSecurePage( menu, item ) {
    setParamCookie("Menu", "menu", menu);
    setParamCookie("Menu", "menu." + menu, item);
	showPage("/secure/main_frame.do");
}

function showBalance() { showSecurePage( "Account", "0" ); }
function showDeposit() { showSecurePage( "Account", "2" ); }
function showValidationStatus() { showSecurePage( "Account", "6" ); }

function getPublicPort(securePort) {

	var publicPort = securePort;

	if ( securePort == 443 )  { publicPort = 80 };
	if ( securePort == 5443 ) { publicPort = 5050 };
	if ( securePort == 6443 ) { publicPort = 6060 };
	if ( securePort == 7443 ) { publicPort = 7070 };
	if ( securePort == 8443 ) { publicPort = 8080 };
	if ( securePort == 9443 ) { publicPort = 9090 };

	return publicPort;
}

function getPublicPortStr(securePort) {
	var port = ":" + getPublicPort(location.port);
	if ( port == ":80" || port == ":") { port = ""; }
	return port;
}

function showHelp(title) {

	var port = getPublicPortStr(location.port);
	var helpBaseUrl = "http://" + location.hostname + port;

	var helpParams = "";

	if ( title != null ) {
        helpParams = "?content=" + title;
	}

	var helpWin = window.open(helpBaseUrl+"/help/index.do"+helpParams, "bvHelp", 'width=860,height=530,resizable=yes,dependent=no,scrollbars=no');

	helpWin.focus();
}

function showChart(url) {

    url = url || "/gold-price-chart.do";

	var hostname = location.hostname;
	var port = getPublicPortStr(location.port);

	var url = "http://" + hostname + port + url;

	var chartWin = window.open(url, "_blank", 'width=720,height=430,resizable=yes,dependent=no,scrollbars=no');
	chartWin.focus();
}

function showNews( url ) {
	var win = window.open(url, "_blank", 'width=940,height=650,location=1,menubar=1,toolbar=1,resizable=yes,scrollbars=yes,dependent=no');
	win.focus();
}

function showBrochure() {

	var hostname = location.hostname;
	var port = getPublicPortStr(location.port);

	var url = "http://" + hostname + port + "/help/brochure/page1.html";

	var brochureWin = window.open(url, "bvBrochure", 'width=620,height=600,resizable=yes,dependent=no,scrollbars=yes');
	brochureWin.focus();
}

function showLiveSupport() {

	var hostname = location.hostname;
	var port = getPublicPortStr(location.port);

	var url = "http://www.providesupport.com?messenger=bullionvault";

	var liveSupportWin = window.open(url, "bvLiveSupport", 'width=500,height=540,resizable=yes,dependent=no,scrollbars=no');
	liveSupportWin.focus();
}

// Popup a small, detailed help window on some elements - copied from help.js
function moreInfo( urlStr ) {
	var hostname = location.hostname;

	var port = getPublicPortStr(location.port);
	var urlStr = "http://" + hostname + port + urlStr;

	var moreInfoWin = window.open(urlStr, "bvMoreHelp", 'width=320,height=480,resizable=yes,dependent=no,scrollbars=yes');
	moreInfoWin.focus();
}

function showInfoPage(href, width ) {

    if ( ! width ) { width = 900; }

	var win = window.open(href, "popupWin", 'width=' + width + ',resizable=yes,dependent=no,scrollbars=yes');
	win.focus();
}


// Cookies: see http://www.netspade.com/articles/javascript/cookies.xml
//		  and http://www.quirksmode.org/js/cookies.html

function getCookie(name) {
	var dc = document.cookie;
	var prefix = name + "=";

	log("DOING - getCookie(" + name + ") - " + dc);

	// Search for cookie part-way through the list 
	var begin = dc.indexOf("; " + prefix);

	// Search for cookie at start of list --%>
	if (begin == -1) {
		begin = dc.indexOf(prefix);
		if (begin != 0) return "";
	} else {
		begin += 2;
	}

	// Find the terminating ';' of the Cooki>
	var end = document.cookie.indexOf(";", begin);
	if (end == -1) { end = dc.length; }

	var result = unescape(dc.substring(begin + prefix.length, end));

	if ( result == null ) { result = ""; }

    // Remove any surrounding "quotes" inserted by webserver - except "logintest"
    if ( name != "logintest" ) {
        result = result.replace( /^"/, '' ).replace( /"$/, '');
    }

	log("DONE - getCookie(" + name + ") : " + begin + "," + end + " => [" + result + "]");

	return result;
}

function setCookieFull(name, value, expires, path, domain, secure) {

	log("setCookieFull(" + name + "," + value + "," + path + "," + domain + "," + secure + "," + expires + ");");

	var curCookie = name + "=" + escape(value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
	document.cookie = curCookie;
}

function setCookie(name, value, path) {

	var expires = new Date();

	expires.setTime(expires.getTime() + (365 * 24 * 60 * 60 * 1000));

	path = path ? path : "/";

	setCookieFull(name, value, expires, path);
}

function eraseCookie(name, path, domain) {
    var expires = new Date();
    expires.setTime( expires.getTime() - 1 );
    setCookieFull(name, "", expires, path, domain);
}

function getCookieNames() {
	var dc = document.cookie;

    var cookies = dc.split("; ");
    var names = new Array();

    for ( var i=0; i<cookies.length; i++ ) {
        names[i] = cookies[i].split("=")[0];
    }

    return names;
}

// Set a parameter within the BullionVault SINGLE 'parameters' cookie
//
// param1~value1^param2~value2
//
// Browsers can only store so many cookies before the ditch old ones
// http://www.caucho.com/quercus/faq/question.xtp?question_id=1225

function splitParamCookie(cookieName) {

	var cookieValue = getCookie(cookieName);
	var params = cookieValue.split('^');

	log("splitParamCookie(" + cookieName + ") = " + cookieValue);
	log("splitParamCookie(" + cookieName + ") => " + params);

	return params;
}

function makeParamCookie(cookieName, params) {

	log("makeParamCookie(" + cookieName + "," + params + ")");

	var cookieValue = "";
	var i;

	if ( params == null ) {
		log("makeParamCookie(null) - ignoring");
		return;
	}

	for (i=0; i<params.length; i++) {
		if ( i == 0 ) {
			cookieValue = params[i];
		}
		else {
			cookieValue = cookieValue + '^' + params[i];
		}
	}

	log("makeParamCookie(" + cookieName + ") <= " + cookieValue);

	setCookie(cookieName, cookieValue);
}

function setParamCookie(cookieName, name, value) {
	var params = splitParamCookie(cookieName);
	
	if ( params == null ) {
		params = new Array();
	}
	
	var found = 0;
	var i;

	for ( i=0; i<params.length; i++) {
		var param = params[i];
		var fields = param.split('~');
		if ( fields[0] == name ) {
			log("setParamCookie - " + name + " = " + value + " OVERRIDE");
			found = 1;
			params[i] = name + '~' + value;
		}
	}

	if ( found == 0 ) {
		log("setParamCookie - " + name + " = " + value + " APPENDED");
		params.push(name + '~' + value);
	}

	makeParamCookie(cookieName, params);
}

function getParamCookie(cookieName, name) {

	var params = splitParamCookie(cookieName);
	
	var i;
	for ( i=0; i<params.length; i++) {
		var param = params[i];
		var fields = param.split('~');
		if ( fields[0] == name ) {
			log("getParamCookie - " + fields[0] + " = " + fields[1]);
			return fields[1];
		}
	}

	log("getParamCookie - " + name + " NOT FOUND");

	return null;
}

// Simple function to reduce liklihood of spiders picking up our email addresses for spamming
function writeEmail(username, subject, extension, linktext, style) {

    if ( extension == null ) {
        extension = 'com';
    }

    var addr = username + '@' + "BullionVault" + '.'+ extension;
    var link = "mailto:" + addr;

    if ( subject != null ) {
        subject = subject.replace("'","&rsquo;");
        link += "?subject=" + subject;
    }

    if ( linktext == null ) {
        linktext = addr;
    }

    if ( style != null ) {
        style = ' style="' + style + '"';
    }

    document.write("<a href='" + link + "'" + style + ">" + linktext + "</a>");
}

// Send user to equivalent page on alernative locale website
function switchLocaleSite(url) {
    location.href = url + location.pathname;
    return false;
}

// Based on the following:
// http://dean.edwards.name/weblog/2005/10/add-event/
// http://www.quirksmode.org/index.html?/blog/archives/2005/09/addevent_recodi.html

function addEvent(element, type, handler) {
	// assign each event handler a unique ID
	if (!handler.$$guid) handler.$$guid = addEvent.guid++;
	// create a hash table of event types for the element
	if (!element.events) element.events = {};
	// create a hash table of event handlers for each element/event pair
	var handlers = element.events[type];
	if (!handlers) {
		handlers = element.events[type] = {};
		// store the existing event handler (if there is one)
		if (element["on" + type]) {
			handlers[0] = element["on" + type];
		}
	}
	// store the event handler in the hash table
	handlers[handler.$$guid] = handler;
	// assign a global event handler to do all the work
	element["on" + type] = handleEvent;
};
// a counter used to create unique IDs
addEvent.guid = 1;

function removeEvent(element, type, handler) {
	// delete the event handler from the hash table
	if (element.events && element.events[type]) {
		delete element.events[type][handler.$$guid];
	}
};

function handleEvent(event) {
	// grab the event object (IE uses a global event object)
	event = event || window.event;
	// get a reference to the hash table of event handlers
	var handlers = this.events[event.type];
	// execute each event handler
	for (var i in handlers) {
		this.$$handleEvent = handlers[i];
		this.$$handleEvent(event);
	}
};

function getParams() {

    var h = location.href;
    var pos;

    if ( h.indexOf('?') >= 0 ) {
        pos = h.indexOf("?") + 1;
    }
    else {
        pos = h.indexOf("#") + 1;
    }

    var paramStr = h.substring(pos,h.length);

    var paramStrArray = paramStr.split("&");
    var paramArray = new Array();

    for (var i = 0; i <= paramStrArray.length - 1; i++) {
        var lhs = paramStrArray[i].substring(0, paramStrArray[i].indexOf("="));
        var rhs = paramStrArray[i].substring(paramStrArray[i].indexOf("=") + 1, paramStr.length);

        paramArray[lhs] = rhs;
    }

    return paramArray;
}

function setReferrerFromUrlAnchorName( defaultReferrer, overwrite ) {
	// Get the text after the hash in the URL, if any.
	var urlHash = location.hash;
	var anchorName = urlHash.substring( urlHash.lastIndexOf( '#' ) + 1 );

	if ( anchorName ) {
		setReferrer( anchorName, overwrite );
	} else {
		setReferrer( defaultReferrer, overwrite );
	}
}

function setReferrerFromUrl( defaultReferrer, overwrite ) {

    var p = getParams();

    var r = p['referrer'] || p['ref'] || p['r'];

    if ( r ) {
        setReferrer( r, overwrite );
    }
    else {
        setReferrerFromUrlAnchorName( defaultReferrer, overwrite );
    }
}

function getTopLevelDomain() {

	var domain = location.hostname.replace( /(.*)(\.bullionvault.*)/, "$2" );

	domain = domain == location.hostname ? "" : domain;

	return domain;
}

function setReferrer(
	referrer,
	overwrite
) {
	var referrer = referrer ? referrer.toUpperCase() : "";
	var overwrite = overwrite ? overwrite : false;

	// Get the existing referrer cookie value, if any.
	var cookiedReferrer = getCookie( "referrer" );

	// Set, if appropriate.
	if (
		referrer.length > 0
		&&
		(
			overwrite
			||
			cookiedReferrer.length == 0
		)
	) {

		var expires = (new Date())
		expires.setTime(expires.getTime() + (60 * 24 * 60 * 60 * 1000));

		var domain  = getTopLevelDomain(); 

		// Use setCookieFull to control top-level domain use for sub-sites
		setCookieFull("referrer", referrer, expires, "/", domain);
	}
}

function testTopLevelCookies() {
    // setCookieFull(name, value, expires, path, domain, secure)

	var expires = (new Date())
	expires.setTime(expires.getTime() + (60 * 60 * 1000));

    setCookieFull("Menu", "^menu~Account", expires, "/", getTopLevelDomain());
}

function eraseOldTopLevelCookies() {

    var topdomain = getTopLevelDomain();
    var names = getCookieNames();

    for ( var i=0; i<names.length; i++ ) {
        var name = names[i];

        if ( name == "Menu" 
        ||   name == "viewOrders.params"
        ||   name == "orderId"
        ||   name == "orderform.considerationCurrency"
        ||   name == "orderform.securityId"
        ||   name == "viewMarketSpreads.params"
        ||   name == "viewMarketDepth.params"
        ||   name == "viewMarket.params" ) {
            eraseCookie(name,"/",topdomain);
        }
    }
}

eraseOldTopLevelCookies();

// Call setReferrerFromUrlAnchorName() after each page loads
var overwriteReferrer = overwriteReferrer || false;
var defaultReferrer = defaultReferrer || "BV";

if ( defaultReferrer != "NONE" ) {
    setReferrerFromUrl( defaultReferrer, overwriteReferrer );
}
