// Dom
// version 2.2
// written by fczbkk
// revised by RSe 16.7.2004

var evt = {
	// event manager
	// methods:
	//    add(obj, evType, fn, useCapture)
	//    remove(obj, evType, fn, useCapture)
	//    fix(e)

	add : function(obj, evType, fn, useCapture) {
	// attach event
		if (window.opera && (obj == window)) obj = document;	// Opera hack
		if (obj.addEventListener){
			obj.addEventListener(evType, fn, useCapture);
			return true;
		} else if (obj.attachEvent){
			var r = obj.attachEvent("on"+evType, fn);
			return(r);
		} else {
			return(false);
		}
	},

	remove : function(obj, evType, fn, useCapture) {
	// remove event
		if (window.opera && (obj == window)) obj = document;	// Opera hack
		if (obj.removeEventListener) {
			obj.removeEventListener(evType, fn, useCapture);
			return(true);
		} else if (obj.detachEvent) {
			var r = obj.detachEvent("on"+evType, fn);
			return(r);
		} else {
			return(false);
		}
	},

	fix : function(e) {
	// fix for IE event model
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.target == 'undefined') e.target = e.srcElement;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		if (!e.preventDefault) e.preventDefault = function() {e.returnValue = false;}	// thanx to KKL2401 for preventDefault hack
		return(e);
	}

}	// end evt object definition



var cls = {
	// class manager
	// methods:
	//    get(elm)
	//    has(elm, cl)
	//    add(elm, cl)
	//    remove(elm, cl)
	//    replace(elm, oldCl, newCl)

	get : function(obj) {
	// returns array of all classes of element elm
		if (obj && obj.tagName) {
			var cl = obj.className.replace(/\s+/g, " ");
			return(cl.split(" "));
		}
		return(false);
	},

	has : function(obj, cl) {
	// returns true if element contains the class
		if ((typeof(cl) == "string") && (actCl = this.get(obj))) {
			for (var i = 0; i < actCl.length; i++) {
				if (actCl[i] == cl) {
					return(true);
				}
			}
		}
		return(false);
	},

	add : function(obj, cl) {
	// adds class to element
		if ((typeof(cl) != "undefined") && (actCl = this.get(obj))) {
			if (!this.has(obj, cl)) {
				obj.className += (actCl.length > 0) ? " " + cl : cl;
			}
			return(true);
		}
		return(false);
	},

	remove : function(obj, cl) {
	// removes class from element
		if ((typeof(cl) == "string") && (actCl = this.get(obj))) {
			tempCl = "";
			for (var i = 0; i < actCl.length; i++) {
				if (actCl[i] != cl) {
					if (tempCl != "") {tempCl += " ";}
					tempCl += actCl[i];
				}
				obj.className = tempCl;
			}
			return(true);
		}
		return(false);
	},

	replace : function(obj, oldCl, newCl) {
	// replaces old class by new one, if there is no old class adds new class
		if ((typeof(oldCl) == "string") && (typeof(newCl) == "string") && (actCl = this.get(obj))) {
			tempCl = "";
			if (this.has(obj, newCl)) {
				this.remove(obj, oldCl);
			} else if (this.has(obj, oldCl)) {
				for (var i = 0; i < actCl.length; i++) {
					if (tempCl != "") {tempCl += " ";}
					tempCl += (actCl[i] == oldCl) ? newCl : actCl[i];
				}
				obj.className = tempCl;
			} else {
				this.add(obj, newCl);
			}
			return(true);
		}
		return(false);
	}

}	// end cls object definition



var cook = {
	// cookie manager
	// functions for managing cookies were extracted from DynAPI library (http://dynapi.sourceforge.net/dynapi/)
	// Does not work in Opera
	// methods:
	//     set(name,value,days)
	//     get(name)
	//     remove(name)

	set : function(name,value,days) {
	// sets cookie
		if (days) {
			var date=new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires="; expires="+date.toGMTString();
		} else expires="";
		document.cookie=name+"="+value+expires+"; path=/";
		return(true);
	},

	get : function(name) {
	// reads cookie
		var nameEQ=name+"=";
		var ca=document.cookie.split(';');
		for(var i=0;i<ca.length;i++) {
			var c=ca[i];
			while (c.charAt(0)==' ') c=c.substring(1,c.length);
			if (c.indexOf(nameEQ)==0) return(c.substring(nameEQ.length,c.length));
		}
		return(null);
	},

	remove : function(name) {
		saveCookie(name,"",-1)
	}

}	// end cook object definition


var obj = {
	// elements collector
	// methods:
	//    getByTag(tag, obj)

	getNodes : function(filter, srcElm) {
		// Written by Dave Lindquist (http://www.gazingus.org)
		if(typeof srcElm == "undefined") srcElm = document;
		if(srcElm.nodeType == null) return false;   // source element is not a node
		if (typeof filter != "function") filter = function() { return true; };

		var nodes = new Array();
		var context = srcElm;
		var next;

		while (context != null) {
			if (context.hasChildNodes())
				context = context.firstChild;
			else if (context != srcElm && null != (next = context.nextSibling))
				context = next;
			else {
				next = null;
				for( ; context != srcElm; context = context.parentNode) {
					next = context.nextSibling;
					if (next != null) break;
				}
			context = next;
			}
			if(context != null && filter(context))
				nodes[nodes.length] = context;
		}
	return(nodes);
	},

	getByTag : function(tag, srcElm) {
		srcElm = (srcElm) ? srcElm : document;
		if(srcElm.all && (tag == "*"))	// MSIE hack
			return(srcElm.all);
		if(srcElm.getElementsByTagName) {	// standard way
		    tag = tag.toUpperCase();
			return(srcElm.getElementsByTagName(tag));
		}
		return(false);
	}

}	// end elm object definition

