//
// utils function
//


//
// Stirng object extensions
//
String.prototype.substringBefore = function (substr,index) {
	var i = 0;
	index = index?index:1;
	while (index > 0) {
		i = this.indexOf(substr,i);
		if (i != -1) {
			i += substr.length;
		} else {
			break;
		}
		index--;
	}
	if (i != -1) {
		return this.substring(0,i);
	}
	return '';
}

String.prototype.substringAfter = function (substr,index) {
	var i = 0;
	index = index?index:1;
	while (index > 0) {
		i = this.indexOf(substr,i);
		if (i != -1) {
			i += substr.length;
		} else {
			break;
		}
		index--;
	}
	if (i != -1) {
		return this.substr(i+substr.length-1);
	}
	return '';
}

String.prototype.trimLeft = function () {
	return this.replace(/^\s+/,'');
}

String.prototype.trimRight = function () {
	return this.replace(/\s+$/,'');
}
    
String.prototype.trim = function () {
    return this.replace(/^\s+/,'').replace(/\s+$/,'');
}




//
// client rects
//
function getElementRect(e) {
	var top = 0; 
	var left = 0;
	var ce = e;
	var r;
	while (ce.offsetParent != null) {
		top += ce.offsetTop;
		left += ce.offsetLeft;
		ce = ce.offsetParent;
	}
	top += ce.offsetTop;
	left += ce.offsetLeft;
	r = new Object();
	r.height = e.offsetHeight;
	r.width = e.offsetWidth;
	r.top = top;
	r.bottom = top + r.height;
	r.left = left; 
	r.right = left + r.width; 
	return r;
}



//
// classes
// 
function hasClassName(e, className) {
  var aClass;
	if (e.className) {
		aClass = e.className.split(" ");
		for (var i = 0; i < aClass.length; i++) {
			if (aClass[i] == className) {
				return true;
			}
		}
	}
  return false;
}

function removeClassName(e, className) {
  if (!e.className) return;
  var aNewClass = new Array();
  var aClass = e.className.split(" ");
  for (var i = 0; i < aClass.length; i++) {
    if (aClass[i] != className) {
			aNewClass[aNewClass.length] = aClass[i];
		}
	}
  e.className = aNewClass.join(" ");
}

//
// traverse tree
//
function traverseChildNodes(e, traverseFunc) {
	if (!traverseFunc)
		throw "traverseFunc must be specified";
	if (e) {
		traverseFunc(e);
	} else {
		return;
	}
	for (var ce = e.firstChild; ce; ce = ce.nextSibling) {
		if (ce.firstChild) {
			traverseChildNodes(ce.firstChild, traverseFunc);
		}
	}
	
}

//
// events
//
function eventCancelBubble (event) {
  if (browser.isIE) {
		window.event.cancelBubble = true;
	} else {
		event.stopPropagation();
	}
}

function eventPreventDefault (event) {
  if (browser.isIE) {
		window.event.returnValue = false;
	} else {
		event.preventDefault();
	}
}
