// Copyright (C) 2006 Daniel James
// All rights reserved
// Phone: 1800 888 981
// Email: info@netbreeze.com.au

function initformula() {
	if (document.body.getAttribute) {
		function number_format(num) {
			var str = new String(Math.round(num*100)/100);
			if (str.indexOf('.') == -1) {
				str+='.0';
			}
			str+='0';
			return '$'+str.substr(0, str.indexOf('.') + 3);
		}
		function number_unformat(str) {
			var stro = new String(str);
			return Number(stro.replace(/[^0-9.]/, ''));
		}
		var iter;
		for (iter = 0; iter < document.forms.length; iter ++) {
			var form = document.forms[iter];

			form.updateelement = function(ele) {
				var formula = ele.getAttribute('formula');
				var depends = formula.split(/\s*(\+|-|\*|\/|\(|\)|=|\?|:|>|<)\s*/);
				var y;
				for (y = 0; y < depends.length; y++) {
					if (depends[y].match(/^[a-zA-Z]/)) {
						if (ele.form[depends[y]]) {
							var number1 = '';
							var number2 = '';
							var name = depends[y];
							if (ele.form[depends[y]][0] && (ele.form[depends[y]].nodeName != 'SELECT')) {
								var z;
								for (z = 0; z < ele.form[depends[y]].length; z ++) {
									if (ele.form[depends[y]][z].checked) {
										actual = ele.form[depends[y]][z];
									}
								}
							} else {
								actual = ele.form[depends[y]];
							}

							if (typeof(actual) == 'undefined') {
								return;
							}

							name = name.replace(/(\[|\])/g, "\\$1");
							var input = new RegExp(name);
							var myvalue;

							if (actual.nodeName == 'SELECT') {
								myvalue = actual.options[actual.selectedIndex].value;
							} else {
								myvalue = actual.value;
							}

							if (myvalue.match(/^\d+(\.\d+)?$/)) {
								number1 = 'Number(';
								number2 = ')';
							} else {
								myvalue = "'"+actual.value+"'";
							}

							if (ele.form[depends[y]].nodeName == 'SELECT') {
								formula = formula.replace(input, myvalue);
							} else if (ele.form[depends[y]][0]) { // collection
								formula = formula.replace(input, myvalue);
							} else if (actual.getAttribute('type') == 'checkbox') {
								formula = formula.replace(input, actual.checked?1:0);
							} else {
								formula = formula.replace(input, myvalue);
							}
						}
					}
				}
				if (ele.nodeName == 'DIV') {
					if (eval(formula)) {
						ele.style.display='block';
					} else {
						ele.style.display='none';
					}
				} else {
					ele.value = eval(formula);
					if (ele.updatecall) {
						if (ele.getAttribute('type') == 'checkbox') {
							ele.onclick();
						} else {
							ele.onchange();
						}
					}
				}
			}
			function updatecaller() {
				var x, extra;
				if (extra = this.getAttribute('onchangeextra')) {
					eval(extra);
				}
				for (x = 0; x < this.updatecall.length; x++) {
					this.form.updateelement(this.updatecall[x]);
				}
			}

			function hookup(target) {
				var formula = target.getAttribute('formula');
				if (formula) {
					var depends = formula.split(/\s*(\+|-|\*|\/|\(|\)|=|\?|:|>|<)\s*/);
					var y;
					for (y = 0; y < depends.length; y++) {
						if (depends[y].match(/^[a-zA-Z]/) && !depends[y].match(/^(number_format|number_unformat)$/)) {
							if (form[depends[y]]) {
								if (form[depends[y]][0] && (form[depends[y]].nodeName != 'SELECT')) {
									if (!form[depends[y]][0].updatecall) {
										var z;
										for (z = 0; z < form[depends[y]].length; z ++) {
											form[depends[y]][z].onclick = updatecaller;
											form[depends[y]][z].updatecall = new Array();
										}
									}
								} else {
									if (!form[depends[y]].updatecall) {
										if (form[depends[y]].getAttribute('type') == 'checkbox') {
											form[depends[y]].onclick = updatecaller;
										} else {
											form[depends[y]].onchange = updatecaller;
										}
										form[depends[y]].updatecall = new Array();
									}
								}
								if (form[depends[y]][0] && (form[depends[y]].nodeName != 'SELECT')) {
									var z;
									for (z = 0; z < form[depends[y]].length; z ++) {
										form[depends[y]][z].updatecall[form[depends[y]][z].updatecall.length] = target;
									}
								} else {
									form[depends[y]].updatecall[form[depends[y]].updatecall.length] = target;
								}
							} else {
								alert("Error. The element you referred to '"+depends[y]+"', does not exist");
							}
						}
					}
				}
			}

			var target = form.elements;
			var x;
			for (x = 0; x < target.length; x ++) {
				hookup(target[x]);
			}
			target = form.getElementsByTagName('div');
			for (x = 0; x < target.length; x ++) {
				if (target[x].getAttribute('formula')) {
					target[x].form = form;
					hookup(target[x]);
				}
			}

			target = form.elements;
			for (x = 0; x < target.length; x ++) {
				if (target[x].getAttribute('formula')) {
					form.updateelement(target[x]);
				}
			}
			target = form.getElementsByTagName('div');
			for (x = 0; x < target.length; x ++) {
				if (target[x].getAttribute('formula')) {
					form.updateelement(target[x]);
				}
			}
		}
	}
}
