// Script: Calculator v2.00
// Company: Interaxis
// Author: dynamicreport.com
// Website: http://dynamicreport.com/ddobj_calc.html
// License: Commercial (original author info. must remain in all files)


// calculator storage (memory register, current calculation registers)
var calc_mem = 0;
var calc_val1 = 0;
var calc_val2 = 0;
var calc_valb = 0;
var calc_op = '';
var calc_str = "";
var calc_op_prev = '';
var calc_recover = "";
var calc_kcode = 0;
var calc_shift = 0;
var calc_period = 0;
var calc_tape = 1;
var calc_path = "ddobj/calc/images/";


function calc_catchkey (e)
{
	if (!is_ns)
	{
		if (window.event.srcElement.id != 'calctxt')
			return true;
		calc_kcode = window.event.keyCode;
		calc_shift = window.event.shiftKey;
		if (calc_kcode == 0x006E || calc_kcode == 0x00BE)
			calc_kcode = 0x002E; // convert to fullstop ASCII code
		// numeric keypad ASCII code to ASCII character code conversion
		else if (calc_kcode >= 0x0060 && calc_kcode <= 0x0069)
			calc_kcode -= 0x0030;
	}
	else
	{
		if (e.target.name != 'calctxt')
			return true;
		calc_kcode = e.which;
	}
	calc_activate ("");
	if (calc_tape)
		document.getElementById ('calctape').scrollTop = document.getElementById ('calctape').scrollHeight;
	return false;
}


function calc_trackkey ()
{
	if (features == 1)
	{
		if (is_opera || is_ns)
			document.onkeypress = calc_catchkey;
		else
			document.onkeydown = calc_catchkey;
	}
}


// -------------------- main calculator function

function calc_activate (ch)
{
	var kcode = calc_kcode;
	var sTemp = "";

	document.getElementById ('calctxt').focus ();

	if (ch != "")
		kcode = calc_getOpFromCh (ch);

	// BACKSPACE HANDLER
	if (kcode == 0x0008)
	{ // backspace
		if (calc_op == '=') // cannot modify a result value
			return false;
		if (calc_str.charAt (calc_str.length - 1) == '.')
			calc_period = 0;
		calc_str = calc_str.substr (0, calc_str.length > 0 ? calc_str.length - 1 : 0);
		document.getElementById ('calctxt').value = calc_str;
		return false;
	}
	// PERIOD INPUT
	else if (kcode == 0x002E)
	{ // enforce max. of one fullstop per value
		if (calc_period)
			return false;
		else
			calc_period = 1;
	}

	// NUMERIC INPUT (VALUES)
	if (((kcode >= 0x0030 && kcode <= 0x0039) || kcode == 0x002E) && !calc_shift && calc_op != '=')
	{ // accept valid numeric characters or a fullstop if currently awaiting numeric input only
		calc_str += String.fromCharCode (kcode);
		sTemp = String.fromCharCode (kcode);
		document.getElementById ('calctxt').value = calc_str;
	}
	// OPERAND INPUT
	else if (calc_getOp (kcode) != null)
	{ // accept only valid mathematical operator characters
		calc_op = calc_getOp (kcode);
		if (calc_str == ".")
			calc_str = "0"; // assign zero value if only a fullstop is provided
		if (calc_op == '=' && calc_str == "")
			calc_op = ""; // ignore equals operand when awaiting value input
		if (calc_str == "" && calc_val2 == 0)
			return false; // cannot modify operation -- accept a value next
		else if (calc_op == '=' && calc_op_prev == '=')
			return false; // cannot re-equate redundantly (only once per calc.)
		sTemp = " [ " + calc_op + "]<br>"; // current operand
		if (!calc_val1 && (calc_op_prev == '' || calc_op_prev == '='))
		{ // if equals operand occured as previous operand, then avoid displaying value again, since it has been shown 
			// in calc_recover previously for equals operand... show just the current operand calc_op in formatted sTemp string
			calc_val1 = parseFloat (calc_str);
			calc_recover += (calc_op_prev != '=' ? calc_val1.toFixed (document.getElementById ('calcdec').value) : "") + sTemp; // avoid duplicate value display
			calc_op_prev = calc_op;
			calc_str = "";
		}
		else if (!calc_val2)
		{ // if mathematical operand occurs (+, -, =, etc.)
			calc_val2 = parseFloat (calc_str);
			calc_recover += calc_val2.toFixed (document.getElementById ('calcdec').value);
			calc_str = "";
			if (calc_op_prev == '^') // power operand
				calc_val1 = Math.pow (calc_val1, calc_val2);
			else // all other operands
				calc_val1 = eval ("(calc_val1 " + calc_op_prev + " calc_val2);");
			calc_val2 = 0;
			calc_op_prev = calc_op;
			if (calc_op != '=')
				sTemp += parseFloat (calc_val1).toFixed (document.getElementById ('calcdec').value) + " [=" + calc_op + "]<br>";
			document.getElementById ('calctxt').value = parseFloat (calc_val1).toFixed (document.getElementById ('calcdec').value);
			calc_recover += sTemp;
		}
		if (calc_op == '=')
		{ // if equals operand occurs, display result only, disregard operand.  Result calculated from one of the two conditions selected from above 
			// depending on the operand (previous equals operand or operand performed on two values)
			document.getElementById ('calctxt').value = parseFloat (calc_val1).toFixed (document.getElementById ('calcdec').value);
			calc_str = "" + calc_val1;
			calc_val1 = 0;
			calc_recover += parseFloat (calc_str).toFixed (document.getElementById ('calcdec').value);
			calc_op_prev = '='; // store as previous operand for reference in 
		}
		calc_period = 0;
	}
	if (calc_tape)
	{ // update tape with data and scroll to the bottom
		document.getElementById ('calctape').innerHTML = calc_recover;
		document.getElementById ('calctape').scrollTop = document.getElementById ('calctape').scrollHeight;
	}
	return false;
}

// -------------------- operational functions

function calc_getOp (kcode)
{
	switch (kcode)
	{ // pre-defined functions
		case "pow":
			return kcode;
	}

	if (!is_opera && !is_ns)
	{
		if ((kcode == 0x00BB) && calc_shift)
			kcode = calc_kcode = 0x006B;
		if ((kcode == 0x0038) && calc_shift)
			kcode = calc_kcode = 0x006A;
		if ((kcode == 0x0036) && calc_shift)
			kcode = calc_kcode = 0x005E;

		switch (kcode)
		{
			case 0x000D:
			case 0x00BB:
				return '='
			case 0x006F:
			case 0x00BF:
				return '/';
			case 0x006A:
				return '*';
			case 0x006B:
				return '+';
			case 0x006D:
			case 0x00BD:
				return '-';
			case 0x005E:
				return '^';
			default:
				return null;
		}
	}
	switch (kcode)
	{
		case 0x000D:
		case 0x003D:
			return '='
		case 0x002F:
			return '/';
		case 0x002A:
			return '*';
		case 0x002B:
			return '+';
		case 0x002D:
			return '-';
		case 0x005E:
			return '^';
		default:
			return null;
	}
}

// -------------------- operational functions

function calc_getOpFromCh (ch)
{
	if (!is_opera && !is_ns)
	{
		switch (ch)
		{
			case '=':
				return 0x000D;
			case '/':
				return 0x006F;
			case '*':
				return 0x006A;
			case '+':
				return 0x006B;
			case '-':
				return 0x006D;
			case '^':
				return 0x005E;
			default:
				return ch.charCodeAt (0);
		}
	}
	switch (ch)
	{
		case '=':
			return 0x000D;
		case '/':
			return 0x002F;
		case '*':
			return 0x002A;
		case '+':
			return 0x002B;
		case '-':
			return 0x002D;
		case '^':
			return 0x005E;
		default:
			return ch.charCodeAt (0);
	}
}

function calc_neg ()
{
	document.getElementById ('calctxt').focus ();
	if (calc_val1 == "" && calc_op)
		return false;
	if (calc_str.charAt (0) == '-')
		calc_str = calc_str.substr (1, calc_str.length > 0 ? calc_str.length - 1 : 0);
	else if (calc_str)
		calc_str = "-" + calc_str;
	document.getElementById ('calctxt').value = calc_str;
	return true;
}

function calc_reset ()
{
	calc_mem = calc_val1 = calc_val2 = calc_valb = calc_kcode = calc_shift = calc_period = 0;
	calc_str = calc_op = calc_op_prev = calc_recover = calc_recover = "";
}

function calc_getEntry ()
{
	if (calc_val1 && calc_str != "")
		return parseFloat (calc_str);
	else if (!calc_val1 && calc_str != "")
		return parseFloat (calc_str);
	else if (calc_val1 && calc_str == "")
		return calc_val1;
	return 0;
}

function calc_clre ()
{
	if (calc_val1 == "" && calc_op)
		return false;

	calc_str = "";
	calc_period = 0;
	document.getElementById ('calctxt').focus ();
	document.getElementById ('calctxt').value = "";
	return true;
}

function calc_memstore ()
{
	calc_mem = calc_getEntry ();
	document.getElementById ('memshow').value = calc_mem;
	document.getElementById ('mshow').innerHTML = calc_mem;
	document.getElementById ('calctxt').focus ();
}

function calc_memread ()
{
	var sTemp = "";
	if (calc_str == "")
	{
		calc_str += calc_mem;
		document.getElementById ('calctxt').value = calc_str;
	}
	document.getElementById ('calctxt').focus ();
}

function calc_memclr ()
{
	calc_mem = 0;
	document.getElementById ('memshow').value = 0;
	document.getElementById ('mshow').innerHTML = "0";
	document.getElementById ('calctxt').focus ();
}

function calc_memadd ()
{
	calc_mem += calc_getEntry ();
	document.getElementById ('memshow').value = calc_mem;
	document.getElementById ('mshow').innerHTML = calc_mem;
	document.getElementById ('calctxt').focus ();
}

function calc_memsub ()
{
	calc_mem -= calc_getEntry ();
	document.getElementById ('memshow').value = calc_mem;
	document.getElementById ('mshow').innerHTML = calc_mem;
	document.getElementById ('calctxt').focus ();
}

function calc_memmul ()
{
	calc_mem *= calc_getEntry ();
	document.getElementById ('memshow').value = calc_mem;
	document.getElementById ('mshow').innerHTML = calc_mem;
	document.getElementById ('calctxt').focus ();
}

function calc_clr ()
{
	var sTemp = "";
	if (calc_str.length > 0 && calc_op != '=')
	{ // cannot clear non-existent or equated value
		var len = calc_recover.length;
		calc_str = "";
	}
	sTemp = " [ C]<br><br>";
	calc_val1 = calc_val2 = 0;
	calc_op = calc_op_prev = '';
	calc_str = "";
	calc_period = 0;
	calc_recover += sTemp;
	if (calc_tape)
	{
		document.getElementById ('calctape').innerHTML += sTemp;
		document.getElementById ('calctape').scrollTop = document.getElementById ('calctape').scrollHeight;
	}
	document.getElementById ('calctxt').value = "";
	document.getElementById ('calctxt').focus ();
}

function calc_preload ()
{
	dd_img_preload (0, calc_path, "c.gif", "ce.gif", "ms.gif", "mplus.gif", "mminus.gif", "mmul.gif", "mr.gif", "mc.gif", "div.gif", "mul.gif", "1.gif", "2.gif", "3.gif", "4.gif", "5.gif", "6.gif", "7.gif", "8.gif", "9.gif", "0.gif", "minus.gif", "plus.gif", "equals.gif", "dot.gif", "neg.gif", "pow.gif", "blank.jpg");
}

function calc_init (bTape)
{
	calc_reset ();

	if (features != 1)
	{
		sLayout = "<p class = 'dd_calc'><b>This widget supports contemporary W3C compliant browsers only!</b></p>" +
		"<p class = 'dd_calc'>Tested Compatible Browsers:<br><ul><li>NN6+</li><li>IE4+</li><li>FF (Mozilla)</li><li>Opera</li></ul></p>";
		return sLayout;
	}

	calc_tape = bTape;

	calc_trackkey ();
	var sLayout = "<center>" + 
	"<form id = 'calc' name = 'calc'>" +
	"<table border = '0' width = '*'>" +
	"<tr><td valign = 'top' align = 'right'>" +
	"<span class = \"dd_calc_content\">[M] register:<input id = 'memshow' name = 'memshow' type = 'hidden' value = '0'><div id = 'mshow' name = 'mshow' style = 'text-align: left; font-family: courier; width: 180; height: 20; background-color: #DEDEDE;'>0</div><br></span>";
	if (calc_tape)
	{
		sLayout += "<div id = 'calctape' name = 'calctape' style = 'text-align: right; font-family: courier; width: 180; height: 200; overflow: auto; background-color: #FFFFFF;'></div>" +
		"</td><td align = 'right' valign = 'middle'>";
	}
	sLayout += "<span class = \"dd_calc_content\">Input:<br><input type = 'text' id = 'calctxt' name = 'calctxt' size = '12' class = 'dd_calc'></span>" +

	"<table border = '0'>" +

	"<tr><td colspan = '3' align = 'right'><a href = '#' onclick = 'javascript: calc_clre (); return false;'><img src = '"+calc_path+"ce.gif' alt = 'Clear Entry (CE)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_clr (); return false;'><img src = '"+calc_path+"c.gif' alt = 'Clear (C)' border = '0' width = '33' height = '20'></a></td></tr>" +

	"<tr><td><a href = '#' onclick = 'javascript: calc_memstore (); return false;'><img src = '"+calc_path+"ms.gif' alt = 'Memory Store (MS)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_memadd (); return false;'><img src = '"+calc_path+"mplus.gif' alt = 'Memory Add (+)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_memsub (); return false;'><img src = '"+calc_path+"mminus.gif' alt = 'Memory Subtract (-)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_memmul (); return false;'><img src = '"+calc_path+"mmul.gif' alt = 'Memory Multiply (M*)' border = '0' width = '33' height = '20'></td></tr>" +

	"<tr><td><a href = '#' onclick = 'javascript: calc_memread (); return false;'><img src = '"+calc_path+"mr.gif' alt = 'Memory Read (MR)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_memclr (); return false;'><img src = '"+calc_path+"mc.gif' alt = 'Memory Clear (MC)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"/\"); return false;'><img src = '"+calc_path+"div.gif' alt = 'Divide (/)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"*\"); return false;'><img src = '"+calc_path+"mul.gif' alt = 'Multiply' (*) border = '0' width = '33' height = '20'></a></td></tr>" +

	"<tr><td><a href = '#' onclick = 'javascript: calc_activate (\"7\"); return false;'><img src = '"+calc_path+"7.gif' alt = 'Seven (7)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"8\"); return false;'><img src = '"+calc_path+"8.gif' alt = 'Eight (8)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"9\"); return false;'><img src = '"+calc_path+"9.gif' alt = 'Nine (9)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"-\"); return false;'><img src = '"+calc_path+"minus.gif' alt = 'Minus (-)' border = '0' width = '33' height = '20'></a></td></tr>" +

	"<tr><td><a href = '#' onclick = 'javascript: calc_activate (\"4\"); return false;'><img src = '"+calc_path+"4.gif' alt = 'Four (4)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"5\"); return false;'><img src = '"+calc_path+"5.gif' alt = 'Five (5)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"6\"); return false;'><img src = '"+calc_path+"6.gif' alt = 'Six (6)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"+\"); return false;'><img src = '"+calc_path+"plus.gif' alt = 'Plus (+)' border = '0' width = '33' height = '20'></a></td></tr>" +

	"<tr><td><a href = '#' onclick = 'javascript: calc_activate (\"1\"); return false;'><img src = '"+calc_path+"1.gif' alt = 'One (1)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"2\"); return false;'><img src = '"+calc_path+"2.gif' alt = 'Two (2)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"3\"); return false;'><img src = '"+calc_path+"3.gif' alt = 'Three (3)' border = '0' width = '33' height = '20'></a></td>" +
	"<td rowspan = '2'><a href = '#' onclick = 'javascript: calc_activate (\"=\"); return false;'><img src = '"+calc_path+"equals.gif' alt = 'Equals (=)' border = '0' width = '33' height = '40'></a></td></tr>" +

	"<tr><td colspan = '2'><a href = '#' onclick = 'javascript: calc_activate (\"0\"); return false;'><img src = '"+calc_path+"zero.gif' alt = 'Zero (0)' border = '0' width = '66' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\".\"); return false;'><img src = '"+calc_path+"dot.gif' alt = 'Point (.)' border = '0' width = '33' height = '20'></a></td></tr>" +

	"<tr><td><a href = '#' onclick = 'javascript: calc_neg (); return false;'><img src = '"+calc_path+"neg.gif' alt = 'Negate (+/-)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><a href = '#' onclick = 'javascript: calc_activate (\"^\"); return false;'><img src = '"+calc_path+"pow.gif' alt = 'Power (x^y)' border = '0' width = '33' height = '20'></a></td>" +
	"<td><img src = '"+calc_path+"blank.jpg' alt = 'Reserved' border = '0' width = '33' height = '20'></a></td>" +
	"<td><img src = '"+calc_path+"blank.jpg' alt = 'Reserved' border = '0' width = '33' height = '20'></a></td></tr>" +

	"</table>" +

	"<p class = \"dd_calc_content\">" +
	"Decimals: <input id = 'calcdec' name = 'calcdec' style = 'text-align: right;' value = '2' size = '2' maxlength = '1'></p>" +
	"</td></tr>" +
	"</table>" +
	"</form>" +
	"</center>";
	return sLayout;
}
