/**
 * @fileoverview Pozwala na dodanie zdarzenia do określonego elementu strony.
 *
 * @used IE, FF, Opera
 *
 * @example
 *		var ce = new CreatorEvents(window);
 *		ce.add('load', function(){ alert('blah blah'); });
 *
 * @version: 1.2 2006/03/06
 */

Import('myLib/util/Browser.js');

/**
 * @constructor
 */
CreatorEvents = function(element){
	this.element = element;
	this.delay = 0;
};
/*
CreatorEvents = System.subClass(function(element){
	this.element = element;
	this.delay = 0;
});
*/

/**
 * Sprawdza rodzaj zdarzenia i przypisuje odpowiedni element do pola this.element.
 * @private
 * @param	String	Nazwa zdarzenia bez przedrostka 'on'.
 * @return	void
 */
CreatorEvents.prototype.checkElement = function(evname){
	if(typeof(this.element.parentNode) == 'undefined'){ //if this.element == window
		if((Browser.type & 2) && (evname != 'load' && evname != 'resize') && (typeof(this.element.document) == 'object')){ //for IE (click, keyEvents)
			this.element = this.element.document.body;
		}
	}
};

/**
 * Zwraca zdarzenie.
 * @public
 * @param	Event
 * @return	Object
 */
CreatorEvents.getEvent = function(e){
	return (e) ? e : window.event;
};

/**
 * Zwraca element wywołujący zdarzenie.
 * @public
 * @param	Event
 * @return	Object
 */
CreatorEvents.getTarget = function(e){
	return (e.target) ? e.target : e.srcElement;
};

/**
 * Zwraca kod klawisza wywołującego zdarzenie.
 * @public
 * @param	Event
 * @return	Number
 */
CreatorEvents.getKey = function(e){
	return (window.event) ? window.event.keyCode : e.which;
};

/**
 * Dodaje funkcję obsługi zdarzenia.
 * @param	String		Nazwa zdarzenia bez przedrostka 'on'.
 * @param	Function
 * @param	Boolean
 * @return	void
 */
CreatorEvents.prototype.add = function(evname, func, capture){
	var capture = System.getValue(capture, false);
	this.checkElement(evname);

	if(this.element.attachEvent){ // IE
		this.element.attachEvent('on' + evname, func);
	}
	else if(this.element.addEventListener) { // Gecko / W3C
		this.element.addEventListener(evname, func, capture);
	}
	else{
		this.element['on' + evname] = func;
	}
};

/**
 * Usuwa określoną funkcję dla podanego zdarzenia.
 * @public
 * @param	String		Nazwa zdarzenia bez przedrostka 'on'.
 * @param	Function
 * @param	Boolean
 * @return	void
 */
CreatorEvents.prototype.remove = function(evname, func, capture){
	var capture = System.getValue(capture, false);
	this.checkElement(evname);

	if(this.element.detachEvent){ // IE
		this.element.detachEvent('on' + evname, func);
	}
	else if(this.element.removeEventListener){ // Gecko / W3C
		this.element.removeEventListener(evname, func, capture);
		//ostani parametr okresla sposob przeplywu zdarzenia
		//przez kolejne elementy false = IE (od elementu nadrzednego az do body)
	}
	else{
		this.element['on' + evname] = null;
	}
};

/**
 * Sprawdza czy podane zdarzenie ma przypisaną funkcję obsługi.
 * @public
 * @param	String	Nazwa zdarzenia bez przedrostka 'on'.
 * @return	Boolean
 */
CreatorEvents.prototype.isEmpty = function(evname){
	this.checkElement(evname);
	return (this.element['on' + evname] == null);
};

/**
 * Zatrzymuje propagacje zdarzenia na kolejne elementy strony.
 * @public
 * @param	Event
 * @return	void
 */
CreatorEvents.stopPropagation = function(e) {
	if(window.event){ // for IE
		var e = window.event;
		e.cancelBubble = true;
	}
	if(e.stopPropagation){ //for W3C
		e.stopPropagation();
	}
};

/**
 * Pozwala na przypisanie funkcji do określonego zdarzenia, za pomocą starej składni.
 * @public
 * @param	String	Nazwa zdarzenia bez przedrostka 'on'.
 * @param	Mixed	Function or String.
 * @return	void
 */
CreatorEvents.prototype.append = function(evname, newFunc){
	if(typeof(this.element['on' + evname]) == 'function')
		var oldFunc = this.element['on' + evname];
	else
		var oldFunc = function(){};
	this.element['on' + evname] = function(){
		oldFunc();
		if(typeof(newFunc) == 'string')
			eval(newFunc);
		else if(typeof(newFunc) == 'function')
			newFunc();
	};
};

/*
//this.element['on' + evname] = new Function(newFunc + CreatorEvents.getBodyFunction(this.element['on' + evname]));
CreatorEvents.getBodyFunction = function(fun){
	var body = '';

	//if(bodyFun != null){
	if(typeof(fun) == 'function'){
		body = fun.toString();

		var index1 = body.indexOf("{");
		var index2 = body.lastIndexOf("}");

		body = '\n' + body.substring(index1 + 1, index2);
	}

	//alert(body);

	return body;
}
*/
