/* http://ejohn.org/projects/flexible-javascript-events/ */

// attach/detach event for Internet Explorer
// add/remove eventlistener for the others
/*
function addEvent( obj, type, fn ) {
	if ( obj.attachEvent ) {
		obj['e' + type + fn] = fn;
		obj[type + fn] = function(){obj['e' + type + fn]( window.event );}
		obj.attachEvent( 'on' + type, obj[type + fn] );
	} else
		obj.addEventListener( type, fn, false );
}
function removeEvent( obj, type, fn ) {
	if ( obj.detachEvent ) {
		obj.detachEvent( 'on' + type, obj[type + fn] );
		obj[type + fn] = null;
	} else
		obj.removeEventListener( type, fn, false );
}

function addClass(element, newClass) {
    if (!element.className.match(newClass)) {
        element.className += (element.className ? ' ' + newClass : newClass);
	}
}
function removeClass(element, oldClass) {
    if (element.className) {
        // strip out the leading space if there is one before the class name, else just the class name
        var rep = element.className.match(' ' + oldClass) ?  ' ' + oldClass : oldClass;
        element.className = element.className.replace(rep, '');
    }
}
function hasClass(element, className) {
	if (element.className.match(className)) {
		return true;
	}
	return false;
}
function getElementsByClassName(element, tagName, className) {
	var elements = element.getElementsByTagName(tagName);
	var elementsWithClass = new Array();
	
	for (var i = 0; i < elements.length; i++) {
		if (hasClass(elements[i], className)) {
			elementsWithClass.push(elements[i]);
		}
	}
	return elementsWithClass;
}
if(typeof Array.prototype.push != "function"){
	Array.prototype.push = ArrayPush;
	function ArrayPush(value){
		this[this.length] = value;
	}
}
*/
// avoid overwriting existing systems with same name; if exists, extend, else create
if (!JsLib) var JsLib = {};
if (!JsLib.Events) JsLib.Events = {};
if (!JsLib.Css) JsLib.Css = {};
if (!JsLib.Dom) JsLib.Dom = {};
if (!JsLib.Util) JsLib.Util = {};

JsLib.Events = {
	/* http://ejohn.org/projects/flexible-javascript-events/ */
	// attach/detach event for Internet Explorer
	// add/remove eventlistener for the others
	addEvent: function( obj, type, fn ) {
		if ( obj.attachEvent ) {
			obj['e' + type + fn] = fn;
			obj[type + fn] = function(){ obj['e' + type + fn]( window.event ); };
			obj.attachEvent( 'on' + type, obj[type + fn] );
		} else
			obj.addEventListener( type, fn, false );
	},
	removeEvent: function( obj, type, fn ) {
		if ( obj.detachEvent ) {
			obj.detachEvent( 'on' + type, obj[type + fn] );
			obj[type + fn] = null;
		} else
			obj.removeEventListener( type, fn, false );
	}
};
JsLib.Css = {
	addClass: function(element, newClass) {
		// no need to add the class if it is there already
		//if (!element.className.match(newClass)) {
		if (!JsLib.Css.hasClass(element, newClass)) {
			element.className += (element.className ? ' ' + newClass : newClass);
		}
	},
	removeClass: function(element, oldClass) {
		if (element.className) {
			// strip out the leading space if there is one before the class name, else just the class name
			var rep = element.className.match(' ' + oldClass) ?  ' ' + oldClass : oldClass;
			element.className = element.className.replace(rep, '');
		}
	},
	replaceClass: function(element, oldClass, newClass) {
		JsLib.Css.removeClass(element, oldClass);
		JsLib.Css.addClass(element, newClass);
	},
	hasClass: function(element, className) {
		return element.className.match(className);
		//if (element.className.match(className)) {
			//return true;
		//}
		//return false;
		
	}
};
JsLib.Dom = {
	getElementsByClassName: function(element, tagName, className) {
		var elements = element.getElementsByTagName(tagName);
		var elementsWithClass = new Array();
		
		for (var i = 0; i < elements.length; i++) {
			if (JsLib.Css.hasClass(elements[i], className)) {
				elementsWithClass.push(elements[i]);
			}
		}
		return elementsWithClass;
	},
	// inspired by
	// http://www.robertnyman.com/2006/01/23/monday-code-giveaway-getelementsbyattribute/
	hasAttribute: function(element, attributeName, attributeValue) {
		if (element.getAttribute && (element.getAttribute(attributeName) != null) && (element.getAttribute(attributeName).length > 0)) {
			return element.getAttribute(attributeName).match(attributeValue);
		}
		return false;
	},
	getElementsByAttribute: function(element, tagName, attributeName, attrbiuteValue) {
		var elements = element.getElementsByTagName(tagName);
		var elementsWithAttribute = new Array();
		
		for (var i = 0; i < elements.length; i++) {
			var currentElement = elements[i];
			if (hasAttribute(currentElement, attributeName, attributeValue)) {
				elementsWithAttribute.push(currentElement);
			}
		}
		return elementsWithAttribute;
	}
};
JsLib.Util = {
	getIndexOfItem: function(itemToIndex, listOfItems) {
		var index;
		for (index = 0; index < listOfItems.length; index++) {
			if (listOfItems[index] === itemToIndex) {
				break;
			}
		}
		return index;
	}
};
JsLib.start = function(runnable) {
	JsLib.Events.addEvent(window, "load", runnable.init);
}
// needed for IE5
if(typeof Array.prototype.push != "function"){
	Array.prototype.push = ArrayPush;
	function ArrayPush(value){
		this[this.length] = value;
	}
}

