// 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;
}

// Evaluates right or left mouse button click
function evalClick(e){
	
	cancelLeftClick = false; // Global variable
	var rightclick;
	
	if (!e) var e = window.event;
	if (e.which) rightclick = (e.which == 3); // Everything Else
	else if (e.button) rightclick = (e.button == 2); // W3C
	
	if(rightclick){
		// Right Click
		rightClick(e);
	} else {
		// Left Click
		// Set timeout for double click
		setTimeout("leftClick(e)", 300);
	}
} 

// left mouse click
function leftClick(e){
	if(cancelClick){return}; // if a double click
	alert('singleClick');
}

// double left mouse click
function dblclickNav(e){ 
	cancelLeftClick = true; // cancel left click
	alert('doubleClick');
}

// right mouse click
function rightClick(e){
	// disable context menu
	document.oncontextmenu = new Function("return false");
	// restore context menu after right click
	setTimeout("restoreDefaultContextMenu()", 500);
	// get mouse position for new context menu to appear
	var mousePos = getMousePosition(e);
}

function restoreDefaultContextMenu(){
	// restore context menu
	document.oncontextmenu = null;
}

// 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(!checkClass(ref,refActiveClass) && !checkClass(ref,refInActiveClass)){addClass(ref,refInActiveClass);}
	// toggle parent and active deteriming state
	swapClass(ref,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(!checkClass(target,targetVisibileClass) && !checkClass(target,targetHiddenClass)){addClass(target,targetHiddenClass);} 
	// toggle visible and hidden deteriming state
	swapClass(target,targetVisibileClass,targetHiddenClass);

}

/* -- BASIC CLASS MANIPULATION AND TESTING METHODS -- */

// add class to the element
function addClass(o,c){
	if(!checkClass(o,c)){o.className+=o.className==''?c:' '+c;}
}

// add class to the element
function removeClass(o,c){
	if(!checkClass(o,c)){o.className+=o.className==''?c:' '-c;}
}

// swap classes
function swapClass(o,c1,c2){
	var cn=o.className
	o.className=!checkClass(o,c1)?cn.replace(c2,c1):cn.replace(c1,c2);
}

// check if an element has the defined class
function checkClass(o,c){
	return new RegExp('\\b'+c+'\\b').test(o.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);
}

