/**
 * (C) Jakub Roztocil <jakub@webkitchen.cz>
 * $Id: listener.js 151 2006-12-05 16:43:08Z jakub $
 */

var Listener;

if (document.addEventListener)

	Listener = function(where, when, what, callOn) {
		callOn = callOn || where;
		this._isListening = false;
		this.listen = function() {
			if (!this._isListening) {
				this._isListening = true;
				where.addEventListener(when, handler, false);
			}
		}
		this.stopListen = function() {
			if (this._isListening) {
				this._isListening = false;
				where.removeEventListener(when, handler, false);
			}
		}
		this.isListening = function() {
			return this._isListening;
		}
		function handler(e) {
			what.call(callOn, e)
		}
	}

else

	Listener = function (where, when, what, callOn) {

		callOn = callOn || where;

		this._isListening = false;

		this.listen = function() {
			if (!this._isListening) {
				this._isListening = true;
				where.attachEvent('on' + when, handler);
			}
		}
		this.stopListen = function() {
			this._isListening = false;
			where.detachEvent('on' + when, handler);
		}
		this.isListening = function() {
			return this._isListening;
		}
		function handler() {
			var e = window.event;
			e.currentTarget = where;
			e.target = e.srcElement;
			e.preventDefault = function() {e.returnValue = false;}
			e.stopPropagation = function() {e.cancelBubble = true;}
			what(e);
		}
	}




var ClassName = {
	add: function(ele, className) {
		var re = new RegExp('\\b' + className + '\\b');
		if (!re.test(ele.className)) {
			ele.className += ' ' + className;
			return true;
		}
		return false;
	},
	remove: function(ele, className) {
		var re = new RegExp('\\b' + className + '\\b');
		if (re.test(ele.className)) {
			ele.className = ele.className.replace(re, '');
			return true;
		}
		return false;
	},
	replace: function(ele, oldCName, newCName) {
		var re = new RegExp('\\b' + oldCName + '\\b');
		if (re.test(ele.className)) {
			ele.className = ele.className.replace(re, newCName);
		} else {
			ele.className += ' ' + newCName;
		}
	},
	toggle: function(ele, className1, className2) {
		if (ClassName.has(ele, className1)) {
			ClassName.replace(ele, className1, className2);
		} else {
			ClassName.replace(ele, className2, className1);
		}
	},
	has: function(ele, className) {
		var re = new RegExp('\\b' + className + '\\b');
		return re.test(ele.className);
	}
}
