
/**************************************************************************\
| JAVASCRIPT OBJECTS UPDATES
\**************************************************************************/
/*
Array.prototype.map = function(fn) { 
	var i, r; for(i = 0; i < this.length; i++) if(typeof(r = fn(this[i],i)) != "undefined") this[i] = r; 
}
*/
/**************************************************************************\
| JAVASCRIPT ROOT STRUCTURE
\**************************************************************************/

var Root = {
	Config: {},

	Classes: {},

	Objects: {},

	Stack: {
		window: {
			load: {},
			unload: {},
			resize: {},
			scroll: {}
		}
	},

	Hidden: {}
}

Root.newObject = function(a,b) {
	if (typeof(b)=="object") for (var i in b) a[i] = b[i];
	Root.Objects[a.id] = new Root.Classes[a.jsClass](a);
}

Root.createElement = function(a) {
	var o, i, j;
	if (!a.document) a.document = document;
	o = a.document.createElement(a.tagName);
	if (a.tagName=="INPUT") {
		o.type = a.type;
	}
	if (a.parent) {
		a.parent.appendChild(o);
	}
	for (i in a) {
		switch (i) {
		case "style":
			for (j in a[i]) o[i][j] = a[i][j];
			break;

		case "tagName": case "type": case "parent":
			break;

		default:
			o[i] = a[i];
		}
	}
}

Root.getElementInfo = function(obj, root) {
	var left=0, top=0, width=0, height=0, right=0, bottom=0, element=obj;
	width = obj.offsetWidth;
	height = obj.offsetHeight;
	if (obj.offsetParent) { 
		top += obj.offsetTop; 
		left += obj.offsetLeft; 
		while (obj.offsetParent) { 
			if (root && root==obj.offsetParent.id) break;
			obj = obj.offsetParent; 
			top += obj.offsetTop; 
			left += obj.offsetLeft; 
		}
	} else if (obj.x) { 
		top += obj.y; 
		left += obj.x; 
	}
	return {left:left, top:top, width:width, height:height, right:left+width, bottom:top+height, element:element};
}

Root.fixIESelectBoxes = function(box) {
	if (navigator.appName!="Microsoft Internet Explorer") return;
	var i, pos = Root.getElementInfo(box), o, elems = document.getElementsByTagName("SELECT"), show, hide;
	var box_shown = box.style.display!='none' && box.style.visibility!='hidden', o_shown;
	if (!Root.Hidden[box.id]) Root.Hidden[box.id] = {};
	for (i=0; i<elems.length; i++) {
		o = Root.getElementInfo(elems[i]);
		o_shown = elems[i].style.display!='none' && elems[i].style.visibility!='hidden';
		hide = (o_shown) && (!Root.Hidden[box.id][elems[i].id]) && ((o.left<pos.right && o.right>pos.left && o.top<pos.bottom && o.bottom>pos.top) && box_shown);
		show = (!o_shown) && (Root.Hidden[box.id][elems[i].id]) && (!(o.left<pos.right && o.right>pos.left && o.top<pos.bottom && o.bottom>pos.top) || !box_shown);
		if (hide) {
			Root.Hidden[box.id][elems[i].id] = elems[i];
			elems[i].style.visibility = 'hidden';
		} else if (show) {
			delete Root.Hidden[box.id][elems[i].id];
			elems[i].style.visibility = 'visible';
		}
	}
}

Root.findElements = function(elems, parent, attribute, pattern, comments) {
	if (!parent) { alert('findElements error: no parent: '+comments); return; }
	var i, a;
	if ((a=parent[attribute]) && ((pattern===true && a) || (pattern===false && !a) || (typeof(a)=="string" && a.match(pattern)))) {
		elems[elems.length] = parent;
//		if (comments.match(/^find enable validate/)) alert(a+','+pattern+','+parent.id);
	}
	for (i=0; i<parent.childNodes.length; i++) Root.findElements(elems, parent.childNodes[i], attribute, pattern, comments+" . "+parent.id);
}

Root.instanceOf = function(object, constructorFunction) {
  while (object!=null) {
    if (object==constructorFunction.prototype) return true;
    object = object.__proto__;
  }
  return false;
}

Root.dispatch = function(self, event) {
	try {
	// make IE,FF compatible
		if (typeof(event)=="undefined") event = window.event;
		if (typeof(event.target)=="undefined") event.target = event.srcElement;
/*
		if (typeof(event.relatedTarget)=="undefined") {
			if (event.type=="mouseout") { event.relatedTarget = event.toElement; }
			else if (event.type=="mouseover") { event.relatedTarget = event.fromElement; }
		}
*/
// get mouse position
		if (event.pageX || event.pageY) { event.mouseX = event.pageX; event.mouseY = event.pageY; }
		else if (event.clientX || event.clientY) { event.mouseX = event.clientX + document.body.scrollLeft; event.mouseY = event.clientY + document.body.scrollTop; }

// get object and event handler information
		var m = self.id.match(/^([^:]+):([^:]+):?(.*)$/);
		if (!m) { alert(self.id); return }
		var obj = Root.Objects[m[1]];
		var doc = self.ownerDocument;
		var win = doc.defaultView ? doc.defaultView : doc.parentWindow;
	} catch(error) {
//		alert(error);
	}
// if everything is ok perform action
	if (typeof(error)=="undefined" && obj && obj.events && obj.events[m[2]] && typeof(obj.events[m[2]][event.type])=="function") {
		return obj.events[m[2]][event.type]({element:self, event:event, obj:obj, id:m[1], data:m[3], document:doc, window:win});
	}
}

Root.Stack.Run = function(a) {
	if (Root.Stack[a.node] && Root.Stack[a.node][a.event]) {
		for (var i in Root.Stack[a.node][a.event]) {
			f = Root.Stack[a.node][a.event][i];
			a.obj = f.obj;
			if (typeof(f.func)=="function") f.func(a);
		}
	}
}

Root.Stack.Add = function(a) {
	var i = Root.Stack[a.node][a.event].length;
	Root.Stack[a.node][a.event][i] = {func:a.func,obj:a.obj};
}

window.onload = function(){ Root.Stack.Run({node:'window',event:'load'}); }
window.onunload = function(){ Root.Stack.Run({node:'window',event:'unload'}); }
window.onresize = function(){ Root.Stack.Run({node:'window',event:'resize'}); }
window.onscroll = function(){ Root.Stack.Run({node:'window',event:'scroll'}); }

if (typeof(loadAfterRoot)=="function") loadAfterRoot();

Root.formatCurrency = function(amount, cur) {
	var i = parseFloat(amount);
	if (!cur) cur='';
	if(isNaN(i)) { i = 0.00; }
	var minus = '';
	if(i <= -0.01) { minus = '-'; }
	i = Math.abs(i);
	i = parseInt((i + .005) * 100);
	i = i / 100;
	s = new String(i);
	if(s.indexOf('.') < 0) { s += '.00'; }
	if(s.indexOf('.') == (s.length - 2)) { s += '0'; }
	s = minus + cur + s;
	return s;
}
// end of function CurrencyFormatted()