String.prototype.trim =  function() { return this.replace(/^\s+|\s+$/g, ''); }
String.prototype.ltrim = function() { return this.replace(/^\s+/, ''); }
String.prototype.rtrim = function() { return this.replace(/\s+$/, ''); }

// getElementById
function getObjectById(id) {
	if (document.getElementById) getObjectById = function(id) { return (typeof(id) != 'string') ? id : document.getElementById(id); };
		else if (document.all) getObjectById = function(id) { return (typeof(id) != 'string') ? id : document.all[id]; };
		else if (document.layers) getObjectById = function(id) { return (typeof(id) != 'string') ? id : document.layers[id]; };
		else getObjectById = function(id) { throw new Error('Browser does not support \"getObjectById()\" function.') };
	return getObjectById(id);
}

function getElementsByClassName(oElement, strTagName, oClassNames){
	var arrElements = (strTagName == "*" && oElement.all) ? oElement.all : oElement.getElementsByTagName(strTagName);
	var arrReturnElements = new Array();
	var arrRegExpClassNames = new Array();
	var oElement;
	var bMatchesAll;

	if(typeof oClassNames == 'object'){
		for(var i = 0; i < oClassNames.length; i++) { arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames[i].replace(/\-/g, "\\-") + "(\\s|$)")); }
	} else{
		arrRegExpClassNames.push(new RegExp("(^|\\s)" + oClassNames.replace(/\-/g, "\\-") + "(\\s|$)"));
	}

	for(var j = 0; j < arrElements.length; j++){
		oElement = arrElements[j];
		bMatchesAll = true;
		for(var k = 0; k < arrRegExpClassNames.length; k++){
			if(!arrRegExpClassNames[k].test(oElement.className)){
				bMatchesAll = false;
				break;
			}
		}
		if(bMatchesAll) { arrReturnElements.push(oElement); }
	}

	return arrReturnElements
}

function checkCssClass(oElement, className) {
	oElement = getObjectById(oElement);
    return (oElement == null) ? false : new RegExp('\\b' + className + '\\b').test(oElement.className);
}

function insertCssClass(oElement, className) {
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	if (!checkCssClass(oElement, className)) { oElement.className += (oElement.className) ? ' ' + className : className; return true; }
	return false;
}

function removeCssClass(oElement, className) {
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	var classLength = oElement.className.length;
	oElement.className = oElement.className.replace(new RegExp('\\b' + className + '\\b', 'g'), '').trim();
	oElement.className = oElement.className.replace(/\s{2,}/g, ' ');
	return (classLength > oElement.className.length) ? true : false;
}

function swapCssClass(oElement, sourceClassName, destinationClassName) {
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	if (checkCssClass(oElement, sourceClassName)) {
		var classLength = oElement.className.length;
		oElement.className = oElement.className.replace(new RegExp('\\b' + sourceClassName + '\\b', 'g'), destinationClassName).trim();
		oElement.className = oElement.className.replace(/\s{2,}/g, ' ');
		return (classLength > oElement.className.length) ? true : false;
	} else {
		return insertCssClass(oElement, destinationClassName);
	}
}

function getInnerText(oElement) {
	oElement = getObjectById(oElement);
	return (oElement.innerText) ? oElement.innerText : oElement.textContent;
}

function setInnerText(oElement, text) {
	oElement = getObjectById(oElement);
	return (oElement.innerText) ? oElement.innerText = text : oElement.textContent = text;
}

function getVisibility(oElement) { 
	oElement = getObjectById(oElement);
	return (oElement.style.display != 'none') ? true : false;
}

function setVisibility(oElement, visibility) { 
	oElement = getObjectById(oElement);
	if (oElement == null) return false;
	oElement.style.display = (visibility) ? '' : 'none';
}

function addHandler(oElement, eventName, eventHandler) {
	oElement = getObjectById(oElement);
	if (oElement.addEventListener) oElement.addEventListener(eventName, eventHandler, false);
		else oElement.attachEvent('on' + eventName, eventHandler);
}

function removeChildNodes(oElement) {
	oElement = getObjectById(oElement);
	while (oElement.hasChildNodes()) oElement.removeChild(oElement.firstChild);
}