/*************************/
/**  GENERIC functions  **/
/*************************/

// global object by id
// returns object
function $(objId) {
	return document.getElementById(objId);
}

// open in a new window/tab without current page jump
// takes a url string
// returns hard false, empty href in link
function go(url) {
	window.open(url);
	return false;
}

// finds all elements based on class name
// returns an array of objects
function getElementsByClass(className,tag,node) {
	var arr_hasClass = new Array();
	if (tag == null) tag = '*';
	if (node == null) node = document;
	var elements = node.getElementsByTagName(tag);
	//  re = (^|\s)className(\s|$)
	var re = new RegExp('(^|\\s)' + className + '(\\s|$)');
	for (i = 0, j = 0; i < elements.length; i++) {
		if ( elements[i].className.match(re) ) {
			arr_hasClass[j] = elements[i];
			j++;
		}
	}
	return arr_hasClass;
}

// switch display states
function toggle(objId) {
	if($(objId).style.display != 'none') { hide(objId); } else { show(objId); }
	return;
}
function show(objId) { if($(objId)) $(objId).style.display = ''; return; }
function hide(objId) { if($(objId)) $(objId).style.display = 'none'; return; }

// set class attribute
// has an IE and ALL OTHERS condition
function setClass(objId,newClass) {
  objId.setAttribute((document.all ? "className" : "class"),newClass);
} // end setClass

/************************/
/**  STRING FUNCTIONS  **/
/************************/

// string trim() spaces
// returns string
function trim(str) {
	str = str.replace(/^\s+/, '');
	return str.replace(/\s+$/, '');
}

// string left() and right() functions
// returns string
function left(str, n) {
	var return_val = '';
	if (n <= 0) return_val = '';
	else if (n > String(str).length) return_val = str;
	else return_val = String(str).substring(0,n);
	return return_val;
}
function right(str, n) {
	var return_val = '';
	if (n <= 0) return_val = '';
	else if (n > String(str).length) return_val = str;
  else return_val = String(str).substring(String(str).length, String(str).length - n);
	return return_val;
}

// string toupper() and tolower() functions
// returns string
function toUpper(str) {
	return str.toUpperCase();
}
function toLower(str) {
	return str.toLowerCase();
}

/**************************/
/**  VALIDATE functions  **/
/**************************/

// tests for numeric
// returns true if only digits are found
function isNumeric(num) {
	return num.match(/^\d+$/);
}

// tests for number
// slightly more robust than isNumeric()
// returns true for 123.34, -54.32, $987.54, .123, 4.321e+01
function isNumber(num) {
	return num.match(/^(?:(?:[+\-]?\$?)|(?:\$?[+\-]?))?(?:(?:\d{1,3}(?:(?:,\d{3})|(?:\d))*(?:\.(?:\d*|\d+[eE][+\-]\d+))?)|(?:\.\d+(?:[eE][+\-]\d+)?))$/);
}

// validate email address format, includes plus-sign
// returns bool
function validateEmail(str) {
	var return_val = true;
	var re = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if( !str.match(re) ) return_val = false;
	return return_val;
}

// textareaCount() and textareaCap() functions
// returns bool if textarea has too many chars
// textareaCap() will also truncate the textarea.value to max allowed
function textareaCount(objId,max) { 
	var return_val = true;
	var len = objId.value.replace(/[\u0391-\uffe5]/gi,"kk").length;
	if (len > max) return_val = false;
	return return_val;
}
function textareaCap(objId,max) {
	var return_val = textCount(objId,max);
	if (return_val) objId.value = objId.value.substr(0,max);
	return return_val;
}