/**
* This script is for control events every DOM objects.
* ex: NDEvent.add(DOM, EventName(Ex "click","load"), Function)
* @since	2007/07/10
* @version	1.0.0
* @auther	yoshida@netdreamers.co.jp
* @history
* @indispensable	$NDClient(Client.class.js)
* 2007/07/10	New create.
**/
(function(){
	var EV = {
		observers : [],
		add: function(element, name, observer, useCapture){
			var element = $(element);
			useCapture = useCapture || false;
			if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.attachEvent)){
				name = 'keydown';
			}
			var hundler = function(e){
				if(!e){
					e=window.event;
				}
				if(e&&!e.target){
					e.target=e.srcElement;
				}
				observer.call(element,e);
			};
			this._observeAndCache(element, name, hundler, useCapture);
		},
		
		_observeAndCache: function(element, name, observer, useCapture) {
			if (!this.observers){
				this.observers = [];
			}
			if (element.addEventListener) {
				this.observers.push([element, name, observer, useCapture]);
				element.addEventListener(name, observer, useCapture);
			} else if (element.attachEvent) {
				this.observers.push([element, name, observer, useCapture]);
				element.attachEvent('on' + name, observer);
			}
		},
		
		unloadCache: function() {
			if (!this.observers){
				return;
			}
			for (var i = 0; i < this.observers.length; i++){
				this.stopObserving.apply(this, this.observers[i]);
				this.observers[i][0] = null;
			}
			this.observers = false;
		},
		
		remove: function(element, name){
			if (!this.observers){
				return;
			}
			var newObservers = [];
			for (var i = 0; i < this.observers.length; i++){
				if(this.observers[i][0] == element && (!name || (name && this.observers[i][1] == name))){
					this.stopObserving.apply(this, this.observers[i]);
					this.observers[i][0] = null;
				}else{
					newObservers[newObservers.length] = this.observers[i];
				}
			}
			this.observers = newObservers;
		},
		
		stopObserving: function(element, name, observer, useCapture) {
			var element = $(element);
			useCapture = useCapture || false;
			if (name == 'keypress' && (navigator.appVersion.match(/Konqueror|Safari|KHTML/) || element.detachEvent)){
				name = 'keydown';
			}
			if (element.removeEventListener) {
				element.removeEventListener(name, observer, useCapture);
			} else if (element.detachEvent) {
				element.detachEvent('on' + name, observer);
			}
		},
		/**
		* Cancel runnning event.
		* @param	e event
		* @return	NONE
		*
		**/
		cancel: function(e){
			if($NDClient.agent.type==1){
				window.event.cancelBubble=true;
				window.event.returnValue=false;
			}else{
				e.cancelBubble=true;
				if(e.preventDefault){
					e.preventDefault();
				}
				if(e.stopPropagation){
					e.stopPropagation();
				}
			}
		}

	}
	
	EV.add(window, 'unload', EV.unloadCache);
	window["$NDEvent"] = EV;
})();
