/////////////////////////////////////////////////////////////////////////////////////////////////////
// Developer	: Chris Hack
// Date			: 2006/11/11
// Description	: This module provides dynamic content for the Toolbar.ascx page elements
// Dependencies : const.js, load.js, utils.js
/////////////////////////////////////////////////////////////////////////////////////////////////////

// Member variables
var m_calculatorStockPrice;
var m_calculatorStrikePrice;
var m_calculatorOptionPrice;

// Elements
var optionsListLoading = true;
var tableOptionsList;
var tableOptionsListRows;    
var calculator;
var calculatorClose; 
var calculatorStockPrice;
var calculatorStrikePrice;
var calculatorOptionPrice;
var calculatorContracts;
var calculatorStockPurchaseExpense;
var calculatorStockCommission;
var calculatorOptionProceeds;
var calculatorOptionCommission;
var calculatorNetExpense;
var calculatorAssignmentProceeds;
var calculatorAssignmentFee;
var calculatorTotalAssignmentProceeds;
var calculatorNetGain;
var calculatorNetROI;
var calculatorAddContract;
var calculatorSubtractContract;
var calculatorAddOptionPrice;
var calculatorSubtractOptionPrice;

/////////////////////////////////////////////////////////////////////////////////////////////////////
// Bind event handlers to elements in the options list control
/////////////////////////////////////////////////////////////////////////////////////////////////////

function bindOptionsListElements() {
	var i;
	var chartButton;
	var chart;
	var popup;
	var offsetRect; 
	var divRect;
	var chartImage;
	
	initOptionsGrid(); // <-- invoke the initialize code embedded in the OptionsList control

	/*
	// Chart objects
	for (i = 1; document.getElementById("ChartButton" + i); i++) {
		chartButton = document.getElementById("ChartButton" + i);
		chart = document.getElementById("Chart" + i);
		chartImage = document.getElementById("ChartImage" + i);
		
		// Does the chart button have a popup chart associated with it?
		if (chart) {
			offsetRect = getElementRect(chartButton.parentNode);
			divRect = getElementRect(chart);
			popup = new Popup(chart, chartButton, new Rect(offsetRect.top, divRect.left, divRect.width, divRect.height + (divRect.top - offsetRect.top)));
		}// if
		
		//chartImage.src = "http://app.quotemedia.com/quotetools/getChart?snap=true&symbol=" + chartImage.getAttribute("symbol") + "&chscale=1m&chtype=AreaChart&chwid=290&chhig=150&chfrmon=false"
		chartImage.src = chartImage.getAttribute("OptionListChart") + chartImage.getAttribute("symbol");
		//chartImage.src = "http://www.optionsbuddy.com/images/nochart.gif";
	}// for	   
	*/
	// Calculator object
	calculator = document.getElementById("Calculator");
	
	if (calculator) {

		// Calculator Close Button
		calculatorClose = document.getElementById("CalculatorClose");
		calculatorClose.onclick = calculatorClose_Click;    

		// Calculator Values
		calculatorStockPrice = document.getElementById("CalculatorStockPrice");
		calculatorStrikePrice = document.getElementById("CalculatorStrikePrice");
		calculatorOptionPrice = document.getElementById("CalculatorOptionPrice");
		calculatorContracts = document.getElementById("CalculatorContracts");
		calculatorStockPurchaseExpense = document.getElementById("CalculatorStockPurchaseExpense");
		calculatorStockCommission = document.getElementById("CalculatorStockCommission");
		calculatorOptionProceeds = document.getElementById("CalculatorOptionProceeds");
		calculatorOptionCommission = document.getElementById("CalculatorOptionCommission");
		calculatorNetExpense = document.getElementById("CalculatorNetExpense");
		calculatorAssignmentProceeds = document.getElementById("CalculatorAssignmentProceeds");
		calculatorAssignmentFee = document.getElementById("CalculatorAssignmentFee");
		calculatorTotalAssignmentProceeds = document.getElementById("CalculatorTotalAssignmentProceeds");
		calculatorNetGain = document.getElementById("CalculatorNetGain");
		calculatorNetROI = document.getElementById("CalculatorNetROI");
		
		calculatorAddContract = document.getElementById("CalculatorAddContract");
		calculatorAddContract.onclick = calculatorAddContract_Click;
		calculatorSubtractContract = document.getElementById("CalculatorSubtractContract");
		calculatorSubtractContract.onclick = calculatorSubtractContract_Click;
		calculatorAddOptionPrice = document.getElementById("CalculatorAddOptionPrice");
		calculatorAddOptionPrice.onclick = calculatorAddOptionPrice_Click;
		calculatorSubtractOptionPrice = document.getElementById("CalculatorSubtractOptionPrice");
		calculatorSubtractOptionPrice.onclick = calculatorSubtractOptionPrice_Click;

		// Center the calculator over the options list table
		offsetRect = getElementRect(tableOptionsList); 
		divRect = getElementRect(calculator);

		//alert(offsetRect.toString() + "\n\n" + divRect.toString());
		setElementX(calculator, offsetRect.left + ((offsetRect.width - divRect.width) / 2));
		setElementY(calculator, offsetRect.top + ((offsetRect.height - divRect.height) / 2));
	}
	
	optionsListLoading = false;
} // bindOptionsListElements
registerLoadHandler(bindOptionsListElements);
registerAjaxLoadHandler(bindOptionsListElements);

/////////////////////////////////////////////////////////////////////////////////////////////////////
                              
function showCalculator(stockPrice, strikePrice, optionPrice) {
	m_calculatorStockPrice = stockPrice;
	m_calculatorStrikePrice = strikePrice;
	m_calculatorOptionPrice = optionPrice;

	if (!optionsListLoading) {
		var contracts;
		var stockPurchaseExpense;
		var optionProceeds;
		var optionCommission;
		var netExpense;
		var assignmentProceeds;
		var assignmentFees;
		var assignmentTotal;
		var netGain;
		var netROI;
	
		// Stock and Option data
		contracts = parseInt(getInnerText(calculatorContracts));
		setInnerText(calculatorStockPrice, formatCurrency(stockPrice));
		setInnerText(calculatorStrikePrice, formatCurrency(strikePrice));
		setInnerText(calculatorOptionPrice, formatCurrency(optionPrice));
		
		// Expense data
		stockPurchaseExpense = stockPrice * (contracts * 100);
		setInnerText(calculatorStockPurchaseExpense, formatCurrency(stockPurchaseExpense));		
		setInnerText(calculatorStockCommission, formatCurrency(m_tradingCommission));
		optionProceeds = (optionPrice * contracts);
		setInnerText(calculatorOptionProceeds, formatCurrency(optionProceeds));
		optionCommission = (m_tradingCommission + (contracts * m_optionCommission));
		setInnerText(calculatorOptionCommission, formatCurrency(optionCommission));
		netExpense = stockPurchaseExpense + m_tradingCommission - optionProceeds + optionCommission;
		if (netExpense < 0) {
			calculatorNetExpense.className = 'OptionsListCalculatorPositive';
		}
		else {
			calculatorNetExpense.className = 'OptionsListCalculatorNegative';
		}
		setInnerText(calculatorNetExpense, formatCurrency(Math.abs(netExpense)));
		
		// Assignment data
		assignmentProceeds = (strikePrice * 100) * contracts;
		setInnerText(calculatorAssignmentProceeds, formatCurrency(assignmentProceeds));
		assignmentFees = (contracts * m_assignmentFee);
		setInnerText(calculatorAssignmentFee, formatCurrency(assignmentFees));
		assignmentTotal = assignmentProceeds - assignmentFees;
		if (assignmentTotal >= 0) calculatorTotalAssignmentProceeds.className = 'OptionsListCalculatorPositive';
		else calculatorTotalAssignmentProceeds.className = 'OptionsListCalculatorNegative';
		setInnerText(calculatorTotalAssignmentProceeds, formatCurrency(Math.abs(assignmentTotal)));
		
		// Net gain data
		netGain = (assignmentTotal - netExpense);
		if (netGain >= 0) {
			calculatorNetGain.className = 'OptionsListCalculatorPositive';
			calculatorNetROI.className = 'OptionsListCalculatorPositive';
		}
		else {
			calculatorNetGain.className = 'OptionsListCalculatorNegative';
			calculatorNetROI.className = 'OptionsListCalculatorNegative'
		}
		setInnerText(calculatorNetGain, formatCurrency(Math.abs(netGain)));
		netROI = (netGain / netExpense) * 100;
		setInnerText(calculatorNetROI, formatCurrency(Math.abs(netROI)));
	
		// Show the calculator
		calculator.style.visibility = 'visible';
	}
}     
  
function formatCurrency(num) {
	// Parse the number
	num = num.toString().replace(/\$|\,/g,'');
	if(isNaN(num)) num = "0";
	// Is the number positive or negative
	sign = (num == (num = Math.abs(num)));
	
	// Parse the decimal value from the number
	num = Math.floor(num * 100 + 0.50000000001);
	cents = num % 100;
	num = Math.floor(num/100).toString();
	
	// Pad the cents to 2 decimal places
	if(cents < 10) cents = "0" + cents;
	
	for (var i = 0; i < Math.floor((num.length - (1+i))/3); i++) {
		num = num.substring(0, num.length - (4 * i + 3)) + ','
		    + num.substring(num.length - (4 * i + 3));
	}		    
	return (((sign)?'':'-') + num + '.' + cents);
}  
  
function calculatorClose_Click() {
	calculator.style.visibility = 'hidden';
}  

function calculatorAddContract_Click() {
	var contracts = parseInt(getInnerText(calculatorContracts));
	contracts++;
	setInnerText(calculatorContracts, contracts);
	showCalculator(m_calculatorStockPrice, m_calculatorStrikePrice, m_calculatorOptionPrice);
}                      

function calculatorSubtractContract_Click() {
	var contracts = parseInt(getInnerText(calculatorContracts));
	contracts--;
	if (contracts < 1) contracts = 1;
	setInnerText(calculatorContracts, contracts);
	showCalculator(m_calculatorStockPrice, m_calculatorStrikePrice, m_calculatorOptionPrice);
}

function calculatorAddOptionPrice_Click() {
	m_calculatorOptionPrice += 5;
	showCalculator(m_calculatorStockPrice, m_calculatorStrikePrice, m_calculatorOptionPrice);
}

function calculatorSubtractOptionPrice_Click() {
	m_calculatorOptionPrice -= 5;
	if (m_calculatorOptionPrice < 0) m_calculatorOptionPrice = 0;
	showCalculator(m_calculatorStockPrice, m_calculatorStrikePrice, m_calculatorOptionPrice);
}     
     
