/***************************************************************
* JavaScript Observer Pattern                                  *
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
* (C) Copyright 2007, Daniel Boorn, all rights are reserverd   *
*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
* THIS CODE IS NOT OPEN SOURCE CODE AND IS SUBJECT TO A        *
* SOFTWARE LICENSE AGREEMENT. YOU MAY NOT COPY, GIVE AWAY,     *
* REPRODUCE THIS CODE. SEE LICENSE AGREEMENT FOR FULL DETAILS  *
***************************************************************/

/**************************************************************************/

function isIE(){
	if( (navigator.appVersion.toLowerCase().indexOf("msie")!= -1) && !window.opera){
		return true;
	}
	return false;
}
	
/* Subject Class (Object DOM Element, String Subject Name) */
function Subject(domElement, subjectName){
	//private vars
	this.observers = new Array();
	this.self = subjectName;
	this.domElement = domElement;
	
	//private functions
	this.registerObserver = function(observer){
		this.observers[this.observers.length] = observer; //push observer
		return this.observers.length - 1; //return index
	};
	this.countObservers = function(){
		return this.observers.length;
	}; 
	this.removeObserver = function(index){
		this.observers.splice(index, 1);
	};
	this.deleteObservers = function(){
		this.observers = new Array();
	}
	this.notifyObservers = function(evt, name){
		var self = eval(name); //js overrides 'this' with the event target element. self points to what would normally be 'this'
//		alert(self.observers.length);
		for(var i=0; i<self.observers.length; i++){
			self.observers[i].notify(evt);
		}
	};
	
	this.loadIEListeners = function(){
		var attributeCode = this.self + ".notifyObservers(window.event, "+this.self+");";
		domElement.onabort = function (){ eval(attributeCode); };  //NN 3; IE: 4; DOM 2, Bubbles: No; Cancelable: No
		domElement.onactivate = function (){ eval(attributeCode); }; //NN n/a; IE: 5.5(Win); DOM n/a; Bubles: Yes; Cancelable: No
		domElement.onafterprint = function (){ eval(attributeCode); }; //NN n/a; IE: 5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.onafterupdate = function (){ eval(attributeCode); }; //NN n/a; IE: 4(Win); DOM n/a; Bubbles: Yes; Cacelable: No
		domElement.onbeforactivate = function (){ eval(attributeCode); }; //NN n/a; IE: 6(Win); DOM n/a; Bubbles: Yes; Cancelable: Sometimes
		domElement.onbeforecopy = function (){ eval(attributeCode); }; //NN n/a; IE: 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onbeforecut = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubles: Yes; Cancelable: Yes
		domElement.onbeforedeactivate = function (){ eval(attributeCode); }; //NN n/a; IE: 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onbeforeeditfocus = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onbeforepaste = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onbeforeprint = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.onafterupdate = function (){ eval(attributeCode); }; //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.onbeforeactivate = function (){ eval(attributeCode); }; //NN n/a; IE 6(Win); DOM n/a; Bubbles: Yes; Cancelable: Sometimes
		domElement.onbeforecopy = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onbeforecut = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onbeforedeactivate = function (){ eval(attributeCode); }; //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onblur = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.onbounce = function (){ eval(attributeCode); }; //NN n/a; IE 4; DOM n/a; Bubbles: No; Cancelable: Yes
		domElement.oncellchange = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.onchange = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No (IE), Yes(NN 6); Cancelable: Yes(IE), No(NN 6)
		domElement.onclick = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.oncontextmenu = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.oncontrolselect = function (){ eval(attributeCode); }; //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.oncopy = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.oncut = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondataavaiable = function (){ eval(attributeCode); }; //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondatasetchanged = function (){ eval(attributeCode); }; //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondatasetcomplete = function (){ eval(attributeCode); }; //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes		
		domElement.ondblclick = function (){ eval(attributeCode); }; //NN 4; IE 4; DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondeactivate = function (){ eval(attributeCode); }; //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.ondrag = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondragdrop = function (){ eval(attributeCode); }; //NN 4 ONLY; IE n/a; DOM n/a; Bubbles: No; Cancelable: No
		domElement.ondragend = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondragenter = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondragleave = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondragover = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondragstart = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.ondrop = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.onerror = function (){ eval(attributeCode); }; //NN 3; IE 4; DOM 2; Bubbles: No; Cancelable: Yes
		domElement.onerrorupdate = function (){ eval(attributeCode); }; //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.onfilterchange = function (){ eval(attributeCode); }; //NN n/a; IE 4(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.onfinish = function (){ eval(attributeCode); }; //NN n/a; IE 4; DOM n/a; Bubbles: No; Cancelable: Yes
		domElement.onfocus = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.onfocusin = function (){ eval(attributeCode); }; //NN n/a; IE 6; DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.onfocusout = function (){ eval(attributeCode); }; //NN n/a; IE 6; DOM n/a; Bubbles: Yes; Cancelable; No
		domElement.onhelp = function (){ eval(attributeCode); }; //NN n/a; IE 4; DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.onkeydown = function (){ eval(attributeCode); }; //NN 4; IE 4; DOM 3; Bubbles: Yes; Cancelable: Yes
		domElement.onkeypress = function (){ eval(attributeCode); }; //NN 4; IE 4; DOM 3; Bubbles: Yes; Cancelable: Yes
		domElement.onkeyup = function (){ eval(attributeCode); }; //NN 4; IE 4; DOM 3; Bubbles: Yes; Cancelable: Yes
		domElement.onlayoutcomplete = function (){ eval(attributeCode); }; //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Cancelable: Yes
//		domElement.onload = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.onlosecapture = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.onmousedown = function (){ eval(attributeCode); }; //NN 4, IE 4; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.onmouseup = function (){ eval(attributeCode); }; //NN 4, IE 4; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.onmouseenter = function (){ eval(attributeCode); }; //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.onmouseleave = function (){ eval(attributeCode); }; //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.onmousemove = function (){ eval(attributeCode); }; //NN 4; IE 4; DOM 2; Bubbles: Yes; Cancelable: No
		domElement.onmouseout = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.onmouseover = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: Yes; Cancelable: Yes		
		domElement.onpaste = function (){ eval(attributeCode); }; //NN n/a; IE 5(Win); DOM: n/a; Bubbles: Yes; Cancelable: Yes
//		domElement.onunload = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.onscroll = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No		
		domElement.onsubmit = function (){ eval(attributeCode); }; //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No		
	}

	this.loadListeners = function(){
		var attributeCode = this.self + ".notifyObservers(event, "+this.self+");";
		domElement.setAttribute('onabort', attributeCode);  //NN 3; IE: 4; DOM 2, Bubbles: No; Cancelable: No
		domElement.setAttribute('onactivate', attributeCode); //NN n/a; IE: 5.5(Win); DOM n/a; Bubles: Yes; Cancelable: No
		domElement.setAttribute('onafterprint', attributeCode); //NN n/a; IE: 5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('onafterupdate', attributeCode); //NN n/a; IE: 4(Win); DOM n/a; Bubbles: Yes; Cacelable: No
		domElement.setAttribute('onbeforactivate', attributeCode); //NN n/a; IE: 6(Win); DOM n/a; Bubbles: Yes; Cancelable: Sometimes
		domElement.setAttribute('onbeforecopy', attributeCode); //NN n/a; IE: 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforecut', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforedeactivate', attributeCode); //NN n/a; IE: 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforeeditfocus', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforepaste', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforeprint', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('onafterupdate', attributeCode); //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('onbeforeactivate', attributeCode); //NN n/a; IE 6(Win); DOM n/a; Bubbles: Yes; Cancelable: Sometimes
		domElement.setAttribute('onbeforecopy', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforecut', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onbeforedeactivate', attributeCode); //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onblur', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.setAttribute('onbounce', attributeCode); //NN n/a; IE 4; DOM n/a; Bubbles: No; Cancelable: Yes
		domElement.setAttribute('oncellchange', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('onchange', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No (IE), Yes(NN 6); Cancelable: Yes(IE), No(NN 6)
		domElement.setAttribute('onclick', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('oncontextmenu', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('oncontrolselect', attributeCode); //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('oncopy', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('oncut', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondataavaiable', attributeCode); //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondatasetchanged', attributeCode); //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondatasetcomplete', attributeCode); //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes		
		domElement.setAttribute('ondblclick', attributeCode); //NN 4; IE 4; DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondeactivate', attributeCode); //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('ondrag', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondragdrop', attributeCode); //NN 4 ONLY; IE n/a; DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('ondragend', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondragenter', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondragleave', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondragover', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondragstart', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('ondrop', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onerror', attributeCode); //NN 3; IE 4; DOM 2; Bubbles: No; Cancelable: Yes
		domElement.setAttribute('onerrorupdate', attributeCode); //NN n/a; IE 4(Win); DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('onfilterchange', attributeCode); //NN n/a; IE 4(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('onfinish', attributeCode); //NN n/a; IE 4; DOM n/a; Bubbles: No; Cancelable: Yes
		domElement.setAttribute('onfocus', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.setAttribute('onfocusin', attributeCode); //NN n/a; IE 6; DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('onfocusout', attributeCode); //NN n/a; IE 6; DOM n/a; Bubbles: Yes; Cancelable; No
		domElement.setAttribute('onhelp', attributeCode); //NN n/a; IE 4; DOM n/a; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('onkeydown', attributeCode); //NN 4; IE 4; DOM 3; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onkeypress', attributeCode); //NN 4; IE 4; DOM 3; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onkeyup', attributeCode); //NN 4; IE 4; DOM 3; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onlayoutcomplete', attributeCode); //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: Cancelable: Yes
//		domElement.setAttribute('onload', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.setAttribute('onlosecapture', attributeCode); //NN n/a; IE 5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('onmousedown', attributeCode); //NN 4, IE 4; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onmouseup', attributeCode); //NN 4, IE 4; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onmouseenter', attributeCode); //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('onmouseleave', attributeCode); //NN n/a; IE 5.5(Win); DOM n/a; Bubbles: No; Cancelable: No
		domElement.setAttribute('onmousemove', attributeCode); //NN 4; IE 4; DOM 2; Bubbles: Yes; Cancelable: No
		domElement.setAttribute('onmouseout', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: Yes; Cancelable: Yes
		domElement.setAttribute('onmouseover', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: Yes; Cancelable: Yes		
		domElement.setAttribute('onpaste', attributeCode); //NN n/a; IE 5(Win); DOM: n/a; Bubbles: Yes; Cancelable: Yes
//		domElement.setAttribute('onunload', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No
		domElement.setAttribute('onscroll', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No		
		domElement.setAttribute('onsubmit', attributeCode); //NN 2; IE 3; DOM 2; Bubbles: No; Cancelable: No		
	}


	if(isIE()){
		this.loadIEListeners();
	}else{
		this.loadListeners();
	}
}
/*************************************************************************/
/* Observer Class ( void ) */
function Observer(){
	//private functions
	this.notify = function(evt){ 
		switch(evt.type){
			case'abort': this.onabort(evt); break;
			case'activate': this.onactivate(evt); break;
			case'afterprint': this.onafterprint(evt); break;
			case'afterupdate': this.onafterupdate(evt); break;
			case'beforactivate': this.onbeforactivate(evt); break;
			case'beforecopy': this.onbeforecopy(evt); break;
			case'beforecut': this.onbeforecut(evt); break;
			case'beforedeactivate': this.onbeforedeactivate(evt); break;
			case'beforeeditfocus': this.onbeforeeditfocus(evt); break;
			case'beforepaste': this.onbeforepaste(evt); break;
			case'beforeprint': this.onbeforeprint(evt); break;
			case'afterupdate': this.onafterupdate(evt); break;
			case'beforeactivate': this.onbeforeactivate(evt); break;
			case'beforecopy': this.onbeforecopy(evt); break;
			case'beforecut': this.onbeforecut(evt); break;
			case'beforedeactivate': this.onbeforedeactivate(evt); break;
			case'blur': this.onblur(evt); break;
			case'bounce': this.onbounce(evt); break;
			case'cellchange': this.oncellchange(evt); break;
			case'change': this.onchange(evt); break;
			case'click': this.onclick(evt); break;
			case'contextmenu': this.oncontextmenu(evt); break;
			case'controlselect': this.oncontrolselect(evt); break;
			case'copy': this.oncopy(evt); break;
			case'cut': this.oncut(evt); break;
			case'dataavaiable': this.ondataavaiable(evt); break;
			case'datasetchanged': this.ondatasetchanged(evt); break;
			case'datasetcomplete': this.ondatasetcomplete(evt); break;
			case'dblclick': this.ondblclick(evt); break;
			case'deactivate': this.ondeactivate(evt); break;
			case'drag': this.ondrag(evt); break;
			case'dragdrop': this.ondragdrop(evt); break;
			case'dragend': this.ondragend(evt); break;
			case'dragenter': this.ondragenter(evt); break;
			case'dragleave': this.ondragleave(evt); break;
			case'dragover': this.ondragover(evt); break;
			case'dragstart': this.ondragstart(evt); break;
			case'drop': this.ondrop(evt); break;
			case'error': this.onerror(evt); break;
			case'errorupdate': this.onerrorupdate(evt); break;
			case'filterchange': this.onfilterchange(evt); break;
			case'finish': this.onfinish(evt); break;
			case'focus': this.onfocus(evt); break;
			case'focusin': this.onfocusin(evt); break;
			case'focusout': this.onfocusout(evt); break;
			case'help': this.onhelp(evt); break;
			case'keydown': this.onkeydown(evt); break;
			case'keypress': this.onkeypress(evt); break;
			case'keyup': this.onkeyup(evt); break;
			case'layoutcomplete': this.onlayoutcomplete(evt); break;
//			case'load': this.onload(evt); break;
			case'losecapture': this.onlosecapture(evt); break;
			case'mousedown': this.onmousedown(evt); break;
			case'mouseup': this.onmouseup(evt); break;
			case'mouseenter': this.onmouseenter(evt); break;
			case'mouseleave': this.onmouseleave(evt); break;
			case'mousemove': this.onmousemove(evt); break;
			case'mouseout': this.onmouseout(evt); break;
			case'mouseover': this.onmouseover(evt); break;
			case'paste': this.onpaste(evt); break;
//			case'unload': this.onunload(evt); break;
			case'scroll': this.onscroll(evt); break;
			case'submit': this.onsubmit(evt); break;
			default: break; 
		}//end switch statment
		//alert("case: "+evt.type); 		
	}//end notify function
			
	this.onabort = function(evt){};
	this.onactivate = function(evt){};
	this.onafterprint = function(evt){};
	this.onafterupdate = function(evt){};
	this.onbeforactivate = function(evt){};
	this.onbeforecopy = function(evt){};
	this.onbeforecut = function(evt){};
	this.onbeforedeactivate = function(evt){};
	this.onbeforeeditfocus = function(evt){};
	this.onbeforepaste = function(evt){};
	this.onbeforeprint = function(evt){};
	this.onafterupdate = function(evt){};
	this.onbeforeactivate = function(evt){};
	this.onbeforecopy = function(evt){};
	this.onbeforecut = function(evt){};
	this.onbeforedeactivate = function(evt){};
	this.onblur = function(evt){};
	this.onbounce = function(evt){};
	this.oncellchange = function(evt){};
	this.onchange = function(evt){};
	this.onclick = function(evt){ };
	this.oncontextmenu = function(evt){};
	this.oncontrolselect = function(evt){};
	this.oncopy = function(evt){};
	this.oncut = function(evt){};
	this.ondataavaiable = function(evt){};
	this.ondatasetchanged = function(evt){};
	this.ondatasetcomplete = function(evt){};
	this.ondblclick = function(evt){};
	this.ondeactivate = function(evt){};
	this.ondrag = function(evt){};
	this.ondragdrop = function(evt){};
	this.ondragend = function(evt){};
	this.ondragenter = function(evt){};
	this.ondragleave = function(evt){};
	this.ondragover = function(evt){};
	this.ondragstart = function(evt){};
	this.ondrop = function(evt){};
	this.onerror = function(evt){};
	this.onerrorupdate = function(evt){};
	this.onfilterchange = function(evt){};
	this.onfinish = function(evt){};
	this.onfocus = function(evt){};
	this.onfocusin = function(evt){};
	this.onfocusout = function(evt){};
	this.onhelp = function(evt){};
	this.onkeydown = function(evt){};
	this.onkeypress = function(evt){};
	this.onkeyup = function(evt){};
	this.onlayoutcomplete = function(evt){};
//	this.onload = function(evt){};
	this.onlosecapture = function(evt){};
	this.onmousedown = function(evt){};
	this.onmouseup = function(evt){};
	this.onmouseenter = function(evt){};
	this.onmouseleave = function(evt){};
	this.onmousemove = function(evt){};
	this.onmouseout = function(evt){};
	this.onmouseover = function(evt){};
	this.onpaste = function(evt){};
//	this.onunload = function(evt){};
	this.onscroll = function(evt){};
	this.onsubmit = function(evt){};			
}
