var isOpera = (navigator.userAgent.indexOf('Opera') != -1);
var isIE = (!isOpera && navigator.userAgent.indexOf('MSIE') != -1);

////////////////////////////////////////////////////////////////////////////

function getIntegerFromString(sId)
{
	return sId.replace(/[^\d]/g, '');		
}

////////////////////////////////////////////////////////////////////////////

function getElementsByClassName(oElm, sTagName, oClassNames)
{
	var aElements = (sTagName == '*' && oElm.all) ? oElm.all : oElm.getElementsByTagName(sTagName);
	var aReturnElements = new Array();
	var aRegExpClassNames = new Array();
	var oElement;
	var bMatchesAll;
	if (typeof oClassNames == 'object') {
		for (var i = 0; i < oClassNames.length; i++) {
			aRegExpClassNames[aRegExpClassNames.length] = new RegExp('(^|\\s)' + oClassNames[i].replace(/\-/g, '\\-') + '(\\s|$)');
		}
	} else {
		aRegExpClassNames[aRegExpClassNames.length] = new RegExp('(^|\\s)' + oClassNames.replace(/\-/g, '\\-') + '(\\s|$)');
	}
	for (var j = 0; j < aElements.length; j++) {
		oElement = aElements[j];
		bMatchesAll = true;
		for (var k = 0; k < aRegExpClassNames.length; k++) {
			if (!aRegExpClassNames[k].test(oElement.className)) {
				bMatchesAll = false;
				break;
			}
		}
		if (bMatchesAll) {
			aReturnElements[aReturnElements.length] = oElement;
		}
	}
	return (aReturnElements);
}

////////////////////////////////////////////////////////////////////////////

function $$(id)
{
	return document.getElementById(id);
}

////////////////////////////////////////////////////////////////////////////

function getWindowWidth()
{
	return document.documentElement.clientWidth > 0 ? document.documentElement.clientWidth : document.body.clientWidth;
}

////////////////////////////////////////////////////////////////////////////

function removeEvent(element, event, callback, capture)
{
	var capture = capture ? true : false;
	if (element.detachEvent) {
		element.detachEvent('on' + event, callback);
	} else if (element.removeEventListener) {
		element.removeEventListener(event, callback, capture);
	} else {
		element['on' + event] = null;
	}
	
	return element;
}

////////////////////////////////////////////////////////////////////////////

function addEvent(element, event, callback, capture)
{
	var capture = capture ? true : false;
	if (element.attachEvent) {
		element.detachEvent('on' + event, callback);
		element.attachEvent('on' + event, callback);
	} else if (element.addEventListener) {
		element.addEventListener(event, callback, capture);
	} else {
		element['on' + event] = callback;
	}
	
	return element;
}

////////////////////////////////////////////////////////////////////////////

function getEvent(oEvent)
{
	return oEvent || window.event;
}

////////////////////////////////////////////////////////////////////////////

function getEventElement(oEvent)
{
	var oEvent = getEvent(oEvent);
	var oElement = oEvent.srcElement || oEvent.target;
	
	if (oElement.nodeType == 3) {
		oElement = oEvent.oElement.parentNode;
	}
	
	return oElement;
}


////////////////////////////////////////////////////////////////////////////

function getEventKeyCode(oEvent)
{
	var oEvent = getEvent(oEvent);
	return oEvent.keyCode || oEvent.which || '';	
}

////////////////////////////////////////////////////////////////////////////

function stopEvent(oEvent)
{
	var oEvent = getEvent(oEvent);
	var oElement = getEventElement(oEvent);

	oEvent.returnValue = false;
	if (oEvent.preventDefault) {
		oEvent.preventDefault();
	}
	
	oEvent.cancelBubble = true;
	if (oEvent.stopPropagation) {
		oEvent.stopPropagation();
	}
}



