// cross browser event registration
// object 		=  	the element the event is registered on
// eventName 	= 	is the event eg: click, mouseup
// funcName 	= 	the fucntion to be clalled on the event
// eventOrder	=  	True the event handler is set for the capturing phase,
//				   	False the event handler is set for the bubbling phase.
//					By default IE implements bubbling

function addEvent(object, eventName, funcName, eventOrder){
	eventOrder = (!eventOrder)?true:eventOrder;
	if(window.attachEvent){ object.attachEvent('on'+eventName, funcName); } // IE
	else if(window.addEventListener){ object.addEventListener(eventName, funcName, eventOrder); } // W3C
}

// Cross browser event de-registration
function removeEvent(object, eventName, funcName, eventOrder){
	eventOrder = (!eventOrder)?true:eventOrder;
	if(window.detachEvent){ object.detachEvent('on'+eventName, funcName); } // IE
	else if(window.removeEventListener){ object.removeEventListener(eventName, funcName, eventOrder); } // W3C
}

// This stops all propagation of the event in the bubbling phase.
// Stopping event propagation in the capturing phase is impossible.
function cancelEventBubble(e){
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}

// Cross browser event target registration
// Returns an element object that event was registered on
// Include cancel bubble as an optional variable :: default = true
function getEventTarget(e, cancelBubble){
	cancelBubble = (!cancelBubble)?true:cancelBubble;
	if(cancelBubble){
		cancelEventBubble(e);
	}
	var targ;
	if (!e) var e = window.event; 
	if (e.target) targ = e.target; // W3C
	else if (e.srcElement) targ = e.srcElement; // IE
	if (targ.nodeType == 3) // defeat Safari bug
		targ = targ.parentNode;
	return targ;
}

// get mouse position on event
function getMousePos(e){	
	var posx = 0;
	var posy = 0;
	if (!e) var e = window.event;
	if (e.pageX || e.pageY){
		posx = e.pageX;
		posy = e.pageY;
	}
	else if (e.clientX || e.clientY){
		if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)){
			//IE6 standards compliant mode
			scrOfX = document.documentElement.scrollLeft;
			scrOfY = document.documentElement.scrollTop;
  		} else {
			scrOfX = document.body.scrollLeft;
			scrOfY = document.body.scrollTop;
		}
		pos[0] = e.clientX + scrOfX; // left
		pos[1] = e.clientY + scrOfY; // top
	}
	return pos;
}

// Toggle Elements class
function toggle(target, ref, targetVisibileClass, targetHiddenClass, refActiveClass, refInActiveClass){
	
	// check if the elements are passed to the function	
	if(!document.getElementById(target)){alert('no target'); return;} else {var target = document.getElementById(target);}
	if(!document.getElementById(ref)){alert('no referer'); return;} else {var ref = document.getElementById(ref);}

	// if no classes are provided to function
	// make the target visible class visible
	targetVisibileClass = (!targetVisibileClass)?'visible':targetVisibileClass;
	// make the target hidden class hidden
	targetHiddenClass = (!targetHiddenClass)?'hidden':targetHiddenClass;
	// make the target refer active class active
	refActiveClass = (!refActiveClass)?'active':refActiveClass;
	// make the target refer inactive class inactive
	refInActiveClass = (!refInActiveClass)?'inactive':refInActiveClass;
	
	// if the object doesnt have the active or inactive it has no been initialised.
	// give the object the class of active by default
	if(!ref.checkClass(refActiveClass) && !ref.checkClass(refInActiveClass)){
		ref.addClass(refActiveClass);
	}
	// toggle parent and active deteriming state
	ref.swapClass(refActiveClass,refInActiveClass);

	// if the object doesnt have the visible or hidden it has no been initialised.
	// give the object the class of open as default
	if(!target.checkClass(targetVisibileClass) && !target.checkClass(targetHiddenClass)){
		target.addClass(targetVisibileClass);
	} 
	// toggle visible and hidden deteriming state
	target.swapClass(targetVisibileClass,targetHiddenClass);
}

/* -- BASIC CLASS MANIPULATION AND TESTING METHODS -- */

// add class to the element
function addClass(obj, c){
	if(!checkClass(obj, c)){
		obj.className+=obj.className==''?c:' '+c;
	}
}

// remove class to the element
function removeClass(obj, c) {
		var oldClass = obj.className;
		var regExp = new RegExp('\\s?'+c+'\\b');
		if (oldClass.indexOf(c) != -1) {
			obj.className = obj.replace(regExp,'');
		} 
}

// swap classes
function swapClass(obj, c1, c2){
	var cn = obj.className;
	if (cn != c1 && cn != c2){
		addClass(obj, c1);
	} else {
		obj.className=!checkClass(obj, c1)?cn.replace(c2,c1):cn.replace(c1,c2);
	}
}

// check if an element has the defined class
function checkClass(obj, c){
	return new RegExp('\\b'+c+'\\b').test(obj.className);
}

/* -- BASIC COOKIE MANIPULATION METHODS -- */
function createCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	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;
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}

