function WebKit() { this._construct() }
(function() { // to create local-scope variables
	
	var EVENT_GUID = 0;
	var ERRORS = new Array();
	
	WebKit.prototype = {
		
        _construct: function() {
			this.elements = new Array(0);
			this.obj = null;
			this.n = navigator.userAgent.toLowerCase();
			this.db = (document.compatMode && document.compatMode.toLowerCase() != "backcompat")?
				document.documentElement
				: (document.body || null);
			this.op = !!(window.opera && document.getElementById);
			if(this.op) document.onmousedown = new Function('e',
				'if(((e = e || window.event).target || e.srcElement).tagName == "IMAGE") return false;');
			this.ie = !!(this.n.indexOf("msie") >= 0 && document.all && this.db && !this.op);
			this.iemac = !!(this.ie && this.n.indexOf("mac") >= 0);
			this.ie4 = !!(this.ie && !document.getElementById);
			this.n4 = !!(document.layers && typeof document.classes != "undefined");
			this.n6 = !!(typeof window.getComputedStyle != "undefined" && typeof document.createRange != "undefined");
			this.w3c = !!(!this.op && !this.ie && !this.n6 && document.getElementById);
			this.ce = !!(document.captureEvents && document.releaseEvents);
			this.px = this.n4? '' : 'px';
			this.tiv = this.w3c? 40 : 10;
			this.mAll = !!(document.all);
			this.mLayers = !!(document.layers);
			this.mElements = !!(document.getElementById);
		},
				
		triggerError: function(err)
		{
			ERRORS[ERRORS.length] = err;
		},
		
		getCssProp: function(obj, p_n6, p_style, p_n4)
		{
			if(obj && this.n6) return ''+window.getComputedStyle(obj, null).getPropertyValue(p_n6);
			if(obj && obj.currentStyle) return ''+eval('obj.currentStyle.'+p_style);
			if(obj && obj.style) return ''+eval('obj.style.'+p_style);
			if(obj && this.n4) return ''+eval('obj.'+p_n4);
			return '';
		},
		
		getDiv: function(id, d)
		{
			d = d || document;
		
			if(this.n4)
			{
				if(d.layers[id]) return d.layers[id];
				for(var i = d.layers.length; i--;)
				{
					var y = this.getDiv(id, d.layers[i].document);
					if(y) return y;
				}
			}
			if(this.ie) return d.all[id] || null;
			if(d.getElementById) return d.getElementById(id) || null;
			return null;
		},
		
		getElementClass:  function(e)
		{
			r = e.getAttribute("class"); 
			if(!r) r = e.getAttribute("className"); 	
			return String(r);
		},
				
		setElementClass:  function(e, ClassName)
		{
			r = e.setAttribute("class", ClassName); 
			if(!r) r = e.setAttribute("className", ClassName); 	
			return r;
		},
					
		// written by Dean Edwards, 2005
		// with input from Tino Zijdel, Matthias Miller, Diego Perini
		// http://dean.edwards.name/weblog/2005/10/add-event/
		addEvent: function(element, type, handler) {
			// Modification by Tanny O'Haley, http://tanny.ica.com to add the
			// DOMContentLoaded for all browsers.
			if (type == "DOMContentLoaded" || type == "domload") {
				this.addLoadEvent(handler);
				return;
			}
			
			if (element.addEventListener) {
				element.addEventListener(type, handler, false);
			} else {
				// assign each event handler a unique ID
				if (!handler.$$guid) handler.$$guid = EVENT_GUID++;
				// create a hash table of event types for the element
				if (!element.events) element.events = {};
				// create a hash table of event handlers for each element/event pair
				var handlers = element.events[type];
				if (!handlers) {
					handlers = element.events[type] = {};
					// store the existing event handler (if there is one)
					if (element["on" + type]) {
						handlers[0] = element["on" + type];
					}
				}
				// store the event handler in the hash table
				handlers[handler.$$guid] = handler;
				// assign a global event handler to do all the work
				element["on" + type] = this.handleEvent;
			}
		},
		// a counter used to create unique IDs
		//addEvent.guid = 1;		
		
		removeEvent: function(element, type, handler) {
			if (element.removeEventListener) {
				element.removeEventListener(type, handler, false);
			} else {
				// delete the event handler from the hash table
				if (element.events && element.events[type]) {
					delete element.events[type][handler.$$guid];
				}
			}
		},
		
		handleEvent: function(event) {
			var returnValue = true;

			// grab the event object (IE uses a global event object)
			event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event);
		
			// get a reference to the hash table of event handlers
			var handlers = this.events[event.type];
			// execute each event handler
			for (var i in handlers) {
				this.$$handleEvent = handlers[i];
				if (this.$$handleEvent(event) === false) {
					returnValue = false;
				}
			}
			return returnValue;
		},			
		
		fixEvent: function(event) {
			// add W3C standard event methods
			event.preventDefault = this.preventDefault;
			event.stopPropagation = this.stopPropagation;
			return event;
		},
		
		preventDefault: function() {
			this.returnValue = false;
		},
		
		stopPropagation: function() {
			this.cancelBubble = true;
		},
		
		// Function that adds DOMContentLoaded listeners to the array.
		addLoadEvent: function(listener) {
			window.onDOMLoadEvents[window.onDOMLoadEvents.length]=listener;
		},
			
		// Function to process the DOMContentLoaded events array.
		ContentLoadedInit: function() {
			// quit if this function has already been called
			if (window.DOMContentLoadedInitDone) return;
		
			// flag this function so we don't do the same thing twice
			window.DOMContentLoadedInitDone = true;
		
			// iterates through array of registered functions 
			for (var i=0; i<window.onDOMLoadEvents.length; i++) {
				var func = window.onDOMLoadEvents[i];
				func();
			}
		},	
		
		ContentLoadedScheduler: function() {
			// quit if the init function has already been called
			if (window.DOMContentLoadedInitDone) return true;
			
			// First, check for Safari or KHTML.
			// Second, check for IE.
			//if DOM methods are supported, and the body element exists
			//(using a double-check including document.body, for the benefit of older moz builds [eg ns7.1] 
			//in which getElementsByTagName('body')[0] is undefined, unless this script is in the body section)
			if(/KHTML|WebKit/i.test(navigator.userAgent)) {
				if(/loaded|complete/.test(document.readyState)) {
					_.wk.ContentLoadedInit();
				} else {
					// Not ready yet, wait a little more.
					setTimeout("_.wk.ContentLoadedScheduler()", 250);
				}
			} else if(document.getElementById("__ie_onload")) {
				return true;
			} else if(typeof document.getElementsByTagName != 'undefined' && (document.getElementsByTagName('body')[0] != null || document.body != null)) {
				_.wk.ContentLoadedInit();
			} else {
				// Not ready yet, wait a little more.
				setTimeout("_.wk.ContentLoadedScheduler()", 250);
			}
			
			return true;
		}		
	}
})();

function fixEvent(event) {
	// add W3C standard event methods
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
};
fixEvent.preventDefault = function() {
	this.returnValue = false;
};
fixEvent.stopPropagation = function() {
	this.cancelBubble = true;
};


// Array of DOMContentLoaded event handlers.
window.onDOMLoadEvents = new Array();
window.DOMContentLoadedInitDone = false;

_.wk = new WebKit();

// Tino Zijdel - crisp@xs4all.nl This little snippet fixes the problem that the onload attribute on 
// the body-element will overwrite previous attached events on the window object for the onload event.
if (!window.addEventListener) {
	document.onreadystatechange = function(){
		if (window.onload && window.onload != _.wk.handleEvent) {
			_.wk.addEvent(window, 'load', window.onload);
			window.onload = _.wk.handleEvent;
		}
	}
}

// Here are my functions for adding the DOMContentLoaded event to browsers other
// than Mozilla.

// Schedule to run the init function.
setTimeout("_.wk.ContentLoadedScheduler()", 250);

// Just in case window.onload happens first, add it there too.
_.wk.addEvent(window, "load", _.wk.ContentLoadedInit);

// If addEventListener supports the DOMContentLoaded event.
if(document.addEventListener)
	document.addEventListener("DOMContentLoaded", _.wk.ContentLoadedInit, false);

/* for Internet Explorer */
/*@cc_on @*/
/*@if (@_win32)
	document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
	var script = document.getElementById("__ie_onload");
	script.onreadystatechange = function() {
		if (this.readyState == "complete") {
			//DOMContentLoadedInit(); // call the onload handler
			_.wk.ContentLoadedInit();
		}
	};
/*@end @*/

function printObj(obj, r)
{
	r = (r) ? true : false;	
	var s = "obj{";
	for (var i in obj){
		s += "\n" + i + "=" + obj[i] + "\n";
	}
	s += "}";
	if(r)
		return s;
	else alert(s);
}
