/*
	* Hantec FX Calculator.
	*/
// USD Rates
var toUSDRates = new Array();
toUSDRates["AUDUSD"]= 0.8158;
toUSDRates["EURUSD"]= 1.4106;
toUSDRates["GBPUSD"]= 1.6567;
toUSDRates["NZDUSD"]= 0.6427;
toUSDRates["USDCAD"]= 1.1070;
toUSDRates["USDCHF"]= 1.0713;
toUSDRates["USDJPY"]= 97.925;
toUSDRates["XAGUSD"]= 1.0;
toUSDRates["XAUUSD"]= 1.0;

// P/L Currency Labels
var plCurrencyLabels = new Array();
plCurrencyLabels["USDCAD"] = "USDCAD";
plCurrencyLabels["USDCHF"] = "USDCHF";
plCurrencyLabels["USDJPY"] = "USDJPY";
plCurrencyLabels["XAUDJPY"] = "USDJPY";
plCurrencyLabels["XAUDNZD"] = "NZDUSD";
plCurrencyLabels["XCHFJPY"] = "USDJPY";
plCurrencyLabels["XEURAUD"] = "AUDUSD";
plCurrencyLabels["XEURCHF"] = "USDCHF";
plCurrencyLabels["XEURGBP"] = "GBPUSD";
plCurrencyLabels["XEURJPY"] = "USDJPY";
plCurrencyLabels["XGBPAUD"] = "AUDUSD";
plCurrencyLabels["XGBPCHF"] = "USDCHF";
plCurrencyLabels["XGBPJPY"] = "USDJPY";
plCurrencyLabels["XAGUSD"] = "XAGUSD";
plCurrencyLabels["XAUUSD"] = "XAUUSD";


// Contract Size (IMM)
var immContractSizes = new Array();
immContractSizes["AUDUSD"] = "100,000";
immContractSizes["EURUSD"] = "100,000";
immContractSizes["GBPUSD"] = "62,500";
immContractSizes["NZDUSD"] = "100,000";
immContractSizes["USDCAD"] = "100,000";
immContractSizes["USDCHF"] = "125,000";
immContractSizes["USDJPY"] = "12,500,000";
immContractSizes["XAUDJPY"] = "100,000";
immContractSizes["XAUDNZD"] = "100,000";
immContractSizes["XCHFJPY"] = "100,000";
immContractSizes["XEURAUD"] = "100,000";
immContractSizes["XEURCHF"] = "100,000";
immContractSizes["XEURGBP"] = "100,000";
immContractSizes["XEURJPY"] = "100,000";
immContractSizes["XGBPAUD"] = "100,000";
immContractSizes["XGBPCHF"] = "100,000";
immContractSizes["XGBPJPY"] = "100,000";
immContractSizes["XNZDJPY"] = "100,000";
immContractSizes["XAGUSD"] = "5,000";
immContractSizes["XAUUSD"] = "100";

// Contract Currency (IMM)
var immContractCurrencies = new Array();
immContractCurrencies["AUDUSD"] = "AUD";
immContractCurrencies["EURUSD"] = "EUR";
immContractCurrencies["GBPUSD"] = "GBP";
immContractCurrencies["NZDUSD"] = "NZD";
immContractCurrencies["USDCAD"] = "CAD";
immContractCurrencies["USDCHF"] = "CHF";
immContractCurrencies["USDJPY"] = "JPY";
immContractCurrencies["XAUDJPY"] = "AUD";
immContractCurrencies["XAUDNZD"] = "AUD";
immContractCurrencies["XCHFJPY"] = "CHF";
immContractCurrencies["XEURAUD"] = "EUR";
immContractCurrencies["XEURCHF"] = "EUR";
immContractCurrencies["XEURGBP"] = "EUR";
immContractCurrencies["XEURJPY"] = "EUR";
immContractCurrencies["XGBPAUD"] = "GBP";
immContractCurrencies["XGBPCHF"] = "GBP";
immContractCurrencies["XGBPJPY"] = "GBP";
immContractCurrencies["XNZDJPY"] = "NZD";
immContractCurrencies["XAGUSD"] = "oz";
immContractCurrencies["XAUUSD"] = "oz";

// Contract Size (USD)
var usdContractSizes = new Array();
usdContractSizes["AUDUSD"] = "100,000";
usdContractSizes["EURUSD"] = "100,000";
usdContractSizes["GBPUSD"] = "100,000";
usdContractSizes["NZDUSD"] = "100,000";
usdContractSizes["USDCAD"] = "100,000";
usdContractSizes["USDCHF"] = "100,000";
usdContractSizes["USDJPY"] = "100,000";
usdContractSizes["XAUDJPY"] = "100,000";
usdContractSizes["XAUDNZD"] = "100,000";
usdContractSizes["XCHFJPY"] = "100,000";
usdContractSizes["XEURAUD"] = "100,000";
usdContractSizes["XEURCHF"] = "100,000";
usdContractSizes["XEURGBP"] = "100,000";
usdContractSizes["XEURJPY"] = "100,000";
usdContractSizes["XGBPAUD"] = "100,000";
usdContractSizes["XGBPCHF"] = "100,000";
usdContractSizes["XGBPJPY"] = "100,000";
usdContractSizes["XNZDJPY"] = "100,000";
usdContractSizes["XAGUSD"] = "5,000";
usdContractSizes["XAUUSD"] = "100";

// Contract Currency (USD)
var usdContractCurrencies = new Array();
usdContractCurrencies["AUDUSD"] = "AUD";
usdContractCurrencies["EURUSD"] = "EUR";
usdContractCurrencies["GBPUSD"] = "GBP";
usdContractCurrencies["NZDUSD"] = "NZD";
usdContractCurrencies["USDCAD"] = "USD";
usdContractCurrencies["USDCHF"] = "USD";
usdContractCurrencies["USDJPY"] = "USD";
usdContractCurrencies["XAUDJPY"] = "AUD";
usdContractCurrencies["XAUDNZD"] = "AUD";
usdContractCurrencies["XCHFJPY"] = "CHF";
usdContractCurrencies["XEURAUD"] = "EUR";
usdContractCurrencies["XEURCHF"] = "EUR";
usdContractCurrencies["XEURGBP"] = "EUR";
usdContractCurrencies["XEURJPY"] = "EUR";
usdContractCurrencies["XGBPAUD"] = "GBP";
usdContractCurrencies["XGBPCHF"] = "GBP";
usdContractCurrencies["XGBPJPY"] = "GBP";
usdContractCurrencies["XNZDJPY"] = "NZD";
usdContractCurrencies["XAGUSD"] = "oz";
usdContractCurrencies["XAUUSD"] = "oz";

var directionBuySell = new Array();
directionBuySell["sell"] = "-1";
directionBuySell["buy"] = "1";


function updateExchangeRates() {
	updateExchangeRate("pl_");
	//updateExchangeRate("margin_");
}

function updateExchangeRate(prefix) {
	var accountCurrency = document.getElementById(prefix + "accountCurrency");
	var contract = document.getElementById(prefix + "contract");
//	var exchangeRateLabel = document.getElementById(prefix + "exchangeRateLabel");
	var contractTerm = document.getElementById(prefix + "contractTerm");
	var contractSize = document.getElementById(prefix + "contractSize");
	var usdExchangeRateRow = document.getElementById(prefix + "usdExchangeRateRow");
	var usdExchangeRate = document.getElementById(prefix + "usdExchangeRate");

	if (prefix == "pl_") {
		if (contractTerm.value == "IMM") {
			if (contract.value.indexOf("X") == 0 && plCurrencyLabels[contract.value]) {
//				exchangeRateLabel.innerHTML = "Rate " + plCurrencyLabels[contract.value];
				usdExchangeRateRow.style.display = "";
				usdExchangeRate.value = toUSDRates[plCurrencyLabels[contract.value]];
			} else {
//				exchangeRateLabel.innerHTML = "-";
//				usdExchangeRateRow.style.display = "none";
				usdExchangeRate.value = "1.0000";
			}
		} else if (contractTerm.value == "USD") {
			if (plCurrencyLabels[contract.value]) {
//				exchangeRateLabel.innerHTML = "Rate " + plCurrencyLabels[contract.value];
				usdExchangeRateRow.style.display = "";
				usdExchangeRate.value = toUSDRates[plCurrencyLabels[contract.value]];
			} else {
//				exchangeRateLabel.innerHTML = "-";
//				usdExchangeRateRow.style.display = "none";
				usdExchangeRate.value = "1.0000";
			}
		}
	}

	if (contract.value == "---") {
		contractSize.innerHTML = "-";
	} else {
		if (contractTerm.value == "IMM") {
			contractSize.innerHTML = immContractSizes[contract.value] + " (" + immContractCurrencies[contract.value] + ")";
		} else if (contractTerm.value == "USD") {
			contractSize.innerHTML = usdContractSizes[contract.value] + " (" + usdContractCurrencies[contract.value] + ")";
		}
	}
	
	if (accountCurrency.value == "USD") {
		//do nothing
	}else if (accountCurrency.value == "JPY") {
		// account currency in USD
		if (contractTerm.value == "IMM") { // IMM term
			if (contract.value == "XEURCHF"
				|| contract.value == "XEURJPY"
				|| contract.value == "XGBPCHF"
				|| contract.value == "XGBPJPY"
				|| contract.value == "XAUDJPY") {
				usdExchangeRate.value=usdExchangeRate.value/toUSDRates["USDJPY"];
			} else {
				usdExchangeRate.value=usdExchangeRate.value*toUSDRates["USDJPY"];
			}
		} else if (contractTerm.value == "USD") { // USD term
			if (contract.value == "USDCAD"
				|| contract.value == "USDCHF"
				|| contract.value == "USDJPY"
				|| contract.value == "XEURCHF"
				|| contract.value == "XEURJPY"
				|| contract.value == "XGBPCHF"
				|| contract.value == "XGBPJPY"
				|| contract.value == "XAUDJPY") {
				usdExchangeRate.value=usdExchangeRate.value/toUSDRates["USDJPY"];
			} else {
				usdExchangeRate.value=usdExchangeRate.value*toUSDRates["USDJPY"];
			}
		}
	}else if (accountCurrency.value == "NZD") {
		// account currency in USD
		if (contractTerm.value == "IMM") { // IMM term
			if (contract.value == "XEURCHF"
				|| contract.value == "XEURJPY"
				|| contract.value == "XGBPCHF"
				|| contract.value == "XGBPJPY"
				|| contract.value == "XAUDJPY") {
				usdExchangeRate.value=usdExchangeRate.value*toUSDRates["NZDUSD"];
			} else {
				usdExchangeRate.value=usdExchangeRate.value/toUSDRates["NZDUSD"];
			}
		} else if (contractTerm.value == "USD") { // USD term
			if (contract.value == "USDCAD"
				|| contract.value == "USDCHF"
				|| contract.value == "USDJPY"
				|| contract.value == "XEURCHF"
				|| contract.value == "XEURJPY"
				|| contract.value == "XGBPCHF"
				|| contract.value == "XGBPJPY"
				|| contract.value == "XAUDJPY") {
				usdExchangeRate.value=usdExchangeRate.value*toUSDRates["NZDUSD"];
			} else {
				usdExchangeRate.value=usdExchangeRate.value/toUSDRates["NZDUSD"];
			}
		}
	}
	
	/*
		if (accountCurrency.value == "USD") {
			//do nothing
		}else if (accountCurrency.value == "JPY") {
				if(reverseForumla[contract.value]!="Y" || contractTerm.value == "IMM"){
					usdExchangeRate.value=usdExchangeRate.value*toUSDRates["USDJPY"];
				}else{
					usdExchangeRate.value=usdExchangeRate.value/toUSDRates["USDJPY"];
				}
		}else if (accountCurrency.value == "NZD") {
				if(reverseForumla[contract.value]!="Y" || contractTerm.value == "IMM"){
					usdExchangeRate.value=usdExchangeRate.value/toUSDRates["NZDUSD"];
				}else{
					usdExchangeRate.value=usdExchangeRate.value*toUSDRates["NZDUSD"];
				}
		}
	*/	
}

function calculateProfitLoss() {
	var prefix = "pl_";

	var contract = document.getElementById(prefix + "contract");
	var contractTerm = document.getElementById(prefix + "contractTerm");
	var buyingPrice = document.getElementById(prefix + "buyingPrice");
	var sellingPrice = document.getElementById(prefix + "sellingPrice");
	var usdExchangeRate = document.getElementById(prefix + "usdExchangeRate");
	var contractAmount = document.getElementById(prefix + "contractAmount");
	var accountCurrency = document.getElementById(prefix + "accountCurrency");
	var profitLoss = document.getElementById(prefix + "profitLoss");
	var buySell = document.getElementById(prefix +"buySell");

	if (contract.value == "---") {
		alert("Please select contract.");
		return;
	}

	if (!isPriceValid(buyingPrice.value)) {
		alert("Invalid Buying Price.");
		buyingPrice.focus();
		return;
	}

	if (!isPriceValid(sellingPrice.value)) {
		alert("Invalid Selling Price.");
		sellingPrice.focus();
		return;
	}

	if (!isContractAmountValid(contractAmount.value)) {
		alert("Invalid Contract Amount.");
		contractAmount.focus();
		return;
	}

	var profitLossVal = 0.0;
	if (contract.value == "USDCAD"
		|| contract.value == "USDCHF"
		|| contract.value == "USDJPY") { // indirect contract
		if (contractTerm.value == "IMM") {
			profitLossVal = formatDecimal(1 / sellingPrice.value, 6, false) - formatDecimal(1 / buyingPrice.value, 6, false);
		} else if (contractTerm.value == "USD") {
			profitLossVal = sellingPrice.value - buyingPrice.value;
		}
	} else { // direct contract
		profitLossVal = sellingPrice.value - buyingPrice.value;
	}

	if (contractTerm.value == "IMM") {
		var contractSize = immContractSizes[contract.value];
	} else if (contractTerm.value == "USD") {
		var contractSize = usdContractSizes[contract.value];
	}

	while(contractSize.indexOf(",") != -1) {
		contractSize = contractSize.replace(",", "");
	}

	// account currency in USD
	if (contractTerm.value == "IMM") { // IMM term
		if (contract.value == "XEURCHF"
			|| contract.value == "XEURJPY"
			|| contract.value == "XGBPCHF"
			|| contract.value == "XGBPJPY"
			|| contract.value == "XAUDJPY") {
			profitLossVal = profitLossVal * contractAmount.value * contractSize / usdExchangeRate.value;
		} else {
			profitLossVal = profitLossVal * contractAmount.value * contractSize * usdExchangeRate.value;
		}
	} else if (contractTerm.value == "USD") { // USD term
		if (contract.value == "USDCAD"
			|| contract.value == "USDCHF"
			|| contract.value == "USDJPY"
			|| contract.value == "XEURCHF"
			|| contract.value == "XEURJPY"
			|| contract.value == "XGBPCHF"
			|| contract.value == "XGBPJPY"
			|| contract.value == "XAUDJPY") {
			profitLossVal = profitLossVal * contractAmount.value * contractSize / usdExchangeRate.value;
		} else {
			profitLossVal = profitLossVal * contractAmount.value * contractSize * usdExchangeRate.value;
		}
	}
	
	
	
	if (buySell.value == "sell") {
		profitLossVal = profitLossVal * directionBuySell["sell"];
	} else {
		profitLossVal = profitLossVal * directionBuySell["buy"];
	}

	if (accountCurrency.value == "USD") {
		profitLoss.innerHTML = "<b>US$ " + formatDecimal(profitLossVal, 2, true) + "</b>";
	}else if (accountCurrency.value == "JPY") {
		profitLoss.innerHTML = "<b>JPY$ " + formatDecimal(profitLossVal, 2, true) + "</b>";
	}else if (accountCurrency.value == "NZD") {
		profitLoss.innerHTML = "<b>NZD$ " + formatDecimal(profitLossVal, 2, true) + "</b>";
	}
}

function calculateMargin(site) {
	var prefix = "margin_";

	var contract = document.getElementById(prefix + "contract");
	var contractTerm = document.getElementById(prefix + "contractTerm");
	var usdExchangeRate = document.getElementById(prefix + "usdExchangeRate");
	var contractAmount = document.getElementById(prefix + "contractAmount");
	var accountCurrency = document.getElementById(prefix + "accountCurrency");
	var minimumInitialMargin = document.getElementById(prefix + "minimumInitialMargin");
	var maintenanceMargin = document.getElementById(prefix + "maintenanceMargin");

	if (contract.value == "---") {
		alert("Please select contract.");
		return;
	}

	if (!isContractAmountValid(contractAmount.value)) {
		alert("Invalid Contract Amount.");
		contractAmount.focus();
		return;
	}

	var margin = 0.0;
	if (contractTerm.value == "IMM") {
		var contractSize = immContractSizes[contract.value];
	} else if (contractTerm.value == "USD") {
		var contractSize = usdContractSizes[contract.value];
	}

	while(contractSize.indexOf(",") != -1) {
		contractSize = contractSize.replace(",", "");
	}

	// account currency in USD
	if (contractTerm.value == "IMM") { // IMM term
		if (contract.value == "USDCAD"
			|| contract.value == "USDCHF"
			|| contract.value == "USDJPY") {
			margin = contractAmount.value * contractSize / usdExchangeRate.value;
		} else {
			margin = contractAmount.value * contractSize * usdExchangeRate.value;
		}
	} else if (contractTerm.value == "USD") { // USD term
		margin = contractAmount.value * contractSize * usdExchangeRate.value;
	}

	if (accountCurrency.value == "HKD") {
		margin = margin * 7.8;
		if (site == 'NZ') {
			minimumInitialMargin.innerHTML = "<b>HK$ " + formatDecimal(margin * 0.01, 2, true) + "</b>";
			maintenanceMargin.innerHTML = "<b>HK$ " + formatDecimal(margin * 0.007, 2, true) + "</b>";
		} else {
			minimumInitialMargin.innerHTML = "<b>HK$ " + formatDecimal(margin * 0.05, 2, true) + "</b>";
			maintenanceMargin.innerHTML = "<b>HK$ " + formatDecimal(margin * 0.03, 2, true) + "</b>";
		}
	} else if (accountCurrency.value == "USD") {
		if (site == 'NZ') {
			minimumInitialMargin.innerHTML = "<b>US$ " + formatDecimal(margin * 0.01, 2, true) + "</b>";
			maintenanceMargin.innerHTML = "<b>US$ " + formatDecimal(margin * 0.007, 2, true) + "</b>";
		} else {
			minimumInitialMargin.innerHTML = "<b>US$ " + formatDecimal(margin * 0.05, 2, true) + "</b>";
			maintenanceMargin.innerHTML = "<b>US$ " + formatDecimal(margin * 0.03, 2, true) + "</b>";
		}
	}
}

function isPriceValid(strPrice) {
	var valid = false;

	if (parseFloat(strPrice)) {
		if (strPrice > 0) {
			valid = true;
		}
	}

	return valid;
}

function isContractAmountValid(strContractAmount) {
	var valid = false;

	if (parseFloat(strContractAmount)) {
		if (strContractAmount > 0) {
			if (strContractAmount.indexOf(".") == -1) {
				valid = true;
			} else {
				var tmp = strContractAmount.substring(strContractAmount.indexOf(".") + 1);
				if (tmp.length <= 1) {
					valid = true;
				}
			}
		}
	}

	return valid;
}

//format a decimal number to a fixed number of decimals
function formatDecimal(value, decimals, keepZero) {
	var mul = new String("1");
	var zero = new String("0");

	for (var i = decimals; i > 0; i--) {
		mul += zero;
	}
	value = Math.round(value * mul);
//	value = Math.floor(value * mul);
	value = value / mul;
	var strVal = new String(value);
	if (!keepZero) {
		return strVal;
	}

	var nowDecimals = 0;
	var dot = strVal.indexOf(".");
	if (dot == -1) {
		strVal += ".";
	} else {
		nowDecimals = strVal.length - dot - 1;
	}

	for (var i = nowDecimals; i < decimals; i++) {
		strVal = strVal + zero;
	}

	return strVal;
}

