/* Event Functions */

// Add an event to the objx given
// event_name refers to the event trigger, without the "on", like click or mouseover
// func_name refers to the function callback when event is triggered
function addEvent(objx,event_name,func_name){
	if (objx.attachEvent){
		objx.attachEvent("on"+event_name, func_name);
	}else if(objx.addEventListener){
		objx.addEventListener(event_name,func_name,true);
	}else{
		objx["on"+event_name] = func_name;
	}
}

// Removes an event from the objxect
function removeEvent(objx,event_name,func_name){
	if (objx.detachEvent){
		objx.detachEvent("on"+event_name,func_name);
	}else if(objx.removeEventListener){
		objx.removeEventListener(event_name,func_name,true);
	}else{
		objx["on"+event_name] = null;
	}
}

// Stop an event from bubbling up the event DOM
function stopEvent(evt){
	evt || window.event;
	if (evt.stopPropagation){
		evt.stopPropagation();
		evt.preventDefault();
	}else if(typeof evt.cancelBubble != "undefined"){
		evt.cancelBubble = true;
		evt.returnValue = false;
	}
	return false;
}

// Get the objx that starts the event
function getElement(evt){
	if (window.event){
		return window.event.srcElement;
	}else{
		return evt.currentTarget;
	}
}
// Get the objx that triggers off the event
function getTargetElement(evt){
	if (window.event){
		return window.event.srcElement;
	}else{
		return evt.target;
	}
}
// For IE only, stops the objx from being selected
function stopSelect(objx){
	if (typeof objx.onselectstart != 'undefined'){
		addEvent(objx,"selectstart",function(){ return false;});
	}
}

/*    Caret Functions     */

// Get the end position of the caret in the objxect. Note that the objx needs to be in focus first
function getCaretEnd(objx){
	if(typeof objx.selectionEnd != "undefined"){
		return objx.selectionEnd;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		try{
			var Lp = M.duplicate();
			Lp.moveToElementText(objx);
		}catch(e){
			var Lp=objx.createTextRange();
		}
		Lp.setEndPoint("EndToEnd",M);
		var rb=Lp.text.length;
		if(rb>objx.value.length){
			return -1;
		}
		return rb;
	}
}
// Get the start position of the caret in the objxect
function getCaretStart(objx){
	if(typeof objx.selectionStart != "undefined"){
		return objx.selectionStart;
	}else if(document.selection&&document.selection.createRange){
		var M=document.selection.createRange();
		try{
			var Lp = M.duplicate();
			Lp.moveToElementText(objx);
		}catch(e){
			var Lp=objx.createTextRange();
		}
		Lp.setEndPoint("EndToStart",M);
		var rb=Lp.text.length;
		if(rb>objx.value.length){
			return -1;
		}
		return rb;
	}
}
// sets the caret position to l in the objxect
function setCaret(objx,l){
	objx.focus();
	if (objx.setSelectionRange){
		objx.setSelectionRange(l,l);
	}else if(objx.createTextRange){
		m = objx.createTextRange();		
		m.moveStart('character',l);
		m.collapse();
		m.select();
	}
}
// sets the caret selection from s to e in the objxect
function setSelection(objx,s,e){
	objx.focus();
	if (objx.setSelectionRange){
		objx.setSelectionRange(s,e);
	}else if(objx.createTextRange){
		m = objx.createTextRange();		
		m.moveStart('character',s);
		m.moveEnd('character',e);
		m.select();
	}
}

/*    Escape function   */
String.prototype.addslashes = function(){
	return this.replace(/(["\\\.\|\[\]\^\*\+\?\$\(\)])/g, '\\$1');
}
String.prototype.trim = function () {
    return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};
/* --- Escape --- */

/* Offset position from top of the screen */
function curTop(objx){
	toreturn = 0;
	while(objx){
		toreturn += objx.offsetTop;
		objx = objx.offsetParent;
	}
	return toreturn;
}
function curLeft(objx){
	toreturn = 0;
	while(objx){
		toreturn += objx.offsetLeft;
		objx = objx.offsetParent;
	}
	return toreturn;
}
/* ------ End of Offset function ------- */

/* Types Function */

// is a given input a number?
function isNumber(a) {
    return typeof a == 'number' && isFinite(a);
}

/* objxect Functions */

function replaceHTML(objx,text){
	while(el = objx.childNodes[0]){
		objx.removeChild(el);
	};
	objx.appendChild(document.createTextNode(text));
}
