String.prototype.startsWith = function(str) 
{return (this.match("^"+str)==str)}

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, ''); }

function checkUncheckAll( el, chkStart ) {
	var p = el.parentNode;
	while (p && p.tagName.toUpperCase() != 'FORM') {
		p = p.parentNode;
	}
	if (p) {
		var inputs = p.getElementsByTagName('input');
		for (var i=0; i < inputs.length; i++) {
			var re = new RegExp('^'+chkStart);
			var m = re.exec( inputs[i].name );
			if (m != null) {
				inputs[i].checked = el.checked;
			}
		}	
	}
}

function escapeHtml(unsafe) {
  return unsafe
      .replace(/&/g, "&amp;")
      .replace(/</g, "&lt;")
      .replace(/>/g, "&gt;")
      .replace(/"/g, "&quot;")
      .replace(/'/g, "&#039;");
}

function clearIt( box ) {
  if(box.value==box.defaultValue) {
	  box.value = "";
	}
}


function makeAjaxRequest (url, callback) {
	var xmlHttp = false;
	if (!xmlHttp) {
		try {
		  xmlHttp = new XMLHttpRequest();
		} catch (trymicrosoft) {
		  try {
			xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
		  } catch (othermicrosoft) {
			try {
			  xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
			} catch (failed) {
			  xmlHttp = false;
			}
		  }
		}
	}

	if (!xmlHttp) alert("Error initializing XMLHttpRequest!\nPlease update your browser");
	if (xmlHttp) {
		xmlHttp.open("GET", url, true);
		if (callback) xmlHttp.onreadystatechange = function() {callback(xmlHttp) };
		xmlHttp.send(null);
	}
}

function removeTableLineSimple(el) {
	var p = el.parentNode;
	while (p && p.tagName.toUpperCase() != 'TR') {
		p = p.parentNode;
	}
	addClass(p, 'hidden');

	var nr = p.nextSibling;
	while (nr) {
		if (nr.nodeType == 1) {
			var cls = nr.className;
			cls = cls.replace('row0', 'row2');
			cls = cls.replace('row1', 'row0');
			cls = cls.replace('row2', 'row1');

			nr.className = cls;
		}
		nr = nr.nextSibling;
	}
}

function removeClass(el, appClass) {
	el.className = el.className.replace(new RegExp('\\s*'+appClass+'\\s*'),' ').trim();
}

function addClass(el, appClass) {
	var currClass = el.className;
	if(!(new RegExp('\\b'+appClass+'\\b').test(currClass)) ) {
		el.className += (currClass ? ' ' : '') + appClass;
	}
}

function toggleClass(el, appClass) {
	var currClass = el.className;
	if(!(new RegExp('\\b'+appClass+'\\b').test(currClass)) ) {
		el.className += (currClass ? ' ' : '') + appClass;
	} else {
		el.className = el.className.replace(new RegExp('\\s*'+appClass+'\\s*'),' ').trim();
	}
}


function getElementsByClassName(cl) { 
        var retnode = []; 
        var myclass = new RegExp('\\b'+cl+'\\b'); 
        var elem = document.getElementsByTagName('*'); 
        for (var i = 0; i < elem.length; i++) { 
                var classes = elem[i].className; 
                if (myclass.test(classes)) retnode.push(elem[i]); 
        } 
        return retnode; 
}; 
 
function toggleClassByClassname(target, toggle) { 
        var nodes = getElementsByClassName(target); 
        for (var i = 0; i < nodes.length; i++) { 
                toggleClass(nodes[i], toggle); 
        } 
} 



/* Doesn't append if className already present */
function appendClass(elm, appClass)
{
var currClass = elm.className;
	if(!(new RegExp('\\b'+appClass+'\\b').test(currClass)) )
		elm.className += (currClass? ' ':'') + appClass;
}

function removeClass(elm, remClass) {
	elm.className = elm.className.replace(new RegExp('\\s*'+remClass+'\\s*'),' ').trim();
}


function showSiblingExpander(el) {
	n = el;

	do n = n.nextSibling;
	while (n && n.nodeType != 1);

	if (n) {
		if (n.className == 'expander') {
			n.style.display = n.style.display == 'block' ? '' : 'block';
		} else {
			showSiblingExpander(n);
		}
	}	
}

function IsNumeric(input) {
	return (input - 0) == input && input.length > 0;
}


function updatePaymentStatus(el) {
	var setTheStatus = document.forms[0].setPaymentstatus.selectedIndex;
	if (setTheStatus > 0) {

		var inputs = document.getElementsByTagName('select');
		var re = new RegExp('^paymentstatus\\[');

		for (var i in inputs) {
			if(inputs[i].name && inputs[i].name.match(re)) {
				var chkName = inputs[i].name.replace("paymentstatus", "updateStatus");
				var chk = document.forms[0][chkName].checked;
				if (chk) inputs[i].selectedIndex = setTheStatus;
			}
		}
	}
}


function toggleStatusUpdates(el, fieldNames) {
	var setChecked = el.checked;
	//get all inputs where name starts with filedName following with [
	var inputs = document.getElementsByTagName('input');
	var re = new RegExp('^'+fieldNames+'\\[');

	for (var i in inputs) {
		if(inputs[i].name && inputs[i].name.match(re)) {
			inputs[i].checked = setChecked;
		}
	}
}


function formatNumber(num,dec,thou,pnt,curr1,curr2,n1,n2) {
	var x = Math.round(num * Math.pow(10,dec));
	if (x >= 0) n1=n2='';
	var y = (''+Math.abs(x)).split('');
	var z = y.length - dec;
	if (z<0) z--;
	for (var i = z; i < 0; i++) y.unshift('0');
	if (z<0) z = 1;
	y.splice(z, 0, pnt);
	if(y[0] == pnt) y.unshift('0');
	while (z > 3) {
		z-=3;
		y.splice(z,0,thou);
	}
	var r = curr1+n1+y.join('')+n2+curr2;
	return r;
}

function limitText(limitField, limitCount, limitNum) {
	if (limitField.value.length > limitNum) {
		limitField.value = limitField.value.substring(0, limitNum);
	} else {
		limitCount.value = limitNum - limitField.value.length;
	}
}

