//
// Copyright (c) Art. Lebedev Studio | http://www.artlebedev.ru/
// Author - Leechy | leechy@design.ru
// Last modified 01.10.2006
// Hans | hans@design.ru
//

/*****************************
**   Misc functions
******************************/

function fnIsNaN(iStr){
	return (isNaN(iStr) || iStr == Number.NaN || iStr=='NaN');
}

function CreateNodeWithText(sNodeName, sText){
	var oNode=document.createElement(sNodeName);
	var oText=document.createTextNode(sText);
	oNode.appendChild(oText);
	return oNode;
}

function getAttribute(oNode, sAttr){
	//return (oNode.attributes) ? oNode.attributes[sAttr].nodeValue : oNode.getAttribute(sAttr);
	return (oNode.attributes) ? getAttributeIE(oNode, sAttr) : oNode.getAttribute(sAttr);
}

function getAttributeIE(oNode, sAttr){
	for(var i=0; i<oNode.attributes.length; i++){
		if(oNode.attributes[i].nodeName == sAttr)
			return oNode.attributes[i].nodeValue;
	}
}

/* функция возвращает правильное слово для числа, пример использования: GetCorrectWord(10, ['осел','осла','ослов']) */
function GetCorrectWord(iNum, aWords, bSkipNum){
	var iLast=Number(String(iNum).substr(-1));
	var sResult;
	
	if(iNum.between(5,20))
		sResult=aWords[2];
	else{
		switch(iLast){
			case 1:  sResult=aWords[0]; break;
			case 2:
			case 3:
			case 4:  sResult=aWords[1]; break;
			default: sResult=aWords[2]; break;
		}
	}
	
	return (bSkipNum) ? sResult : iNum+' '+sResult;
}

/*****************************
**   Prototypes
******************************/

Array.prototype.push=function(){
	for(var i=0; i<arguments.length; i++){
		this[this.length]=arguments[i];
	}
}

Array.prototype.remove=function(sData){
	for(var i=0; i < this.length; i++){
		if(this[i] == sData){
			this.splice(i,1);
			break;
		}
	}
}

Array.prototype.contains=function(sData){
	var iFound=-1;
	for(var i=0; i<this.length; i++){
		if(this[i] == sData){
			iFound=i;
			break;
		}
	}
	return iFound;
}

Array.prototype.last=function(){
	return this[this.length];
}

Number.prototype.between=function(iStart, iEnd, bNoInclude){
	var iVal=this.valueOf();
	if(bNoInclude)
		return ( iVal > iStart && iVal < iEnd );
	else
		return ( iVal >= iStart && iVal <= iEnd );
}

Number.prototype.nice=function(iRoundBase){
	var re=/^(\d+)([\.,](\d+))?$/
	var iNum=Number(this);
	var sNum=String(iNum);
	var aMatches;
	var sDecPart='';
	var sTSeparator=' ';
	if((aMatches = sNum.match(re))){
		var sIntPart=aMatches[1];
		var iDecPart=(aMatches[3]) ? Number('0.'+aMatches[3]) : 0;
		if(iDecPart){
			var iRF=Math.pow(10, (iRoundBase) ? iRoundBase : 2);
			iDecPart=Math.round(iDecPart*iRF);
			sDecPart=(iDecPart) ? ','+iDecPart : '';
		}
		if(Number(sIntPart) < 10000)
			return sIntPart+sDecPart;
		else{
			var sNewNum='';
			var i;
			for(i=1; i*3<sIntPart.length; i++)
				sNewNum=sTSeparator+sIntPart.substring(sIntPart.length - i*3, sIntPart.length - (i-1)*3)+sNewNum;
			return sIntPart.substr(0, 3 - i*3 + sIntPart.length)+sNewNum+sDecPart;
		}
	}
	else{    //нам что-то не то подсунули
		return sNum;
	}
}

String.prototype.toNumber=function(){
	return Number(this.replace(/[^\d\.]/g,''));
}

/*****************************
**   Event listeners
******************************/

function checkEvent(oEvt){
	oEvt=(oEvt) ? oEvt : ( (window.event) ? window.event : null );
	if(oEvt && oEvt.srcElement && !window.opera)
		oEvt.target=oEvt.srcElement;
	return oEvt;
}

function addEvent(objElement, strEventType, ptrEventFunc) {
	if (objElement.addEventListener)
		objElement.addEventListener(strEventType, ptrEventFunc, false);
	else if (objElement.attachEvent)
		objElement.attachEvent('on' + strEventType, ptrEventFunc);
}

function removeEvent(objElement, strEventType, ptrEventFunc) {
	if (objElement.removeEventListener) objElement.removeEventListener(strEventType, ptrEventFunc, false);
		else if (objElement.detachEvent) objElement.detachEvent('on' + strEventType, ptrEventFunc);
}

/*****************************
**   Common cookie methods
******************************/

// Functions from Netscape's JavaScript Guide
// http://developer.netscape.com/docs/manuals/js/client/jsguide/

function setCookie(name, value, expire, path) {
	document.cookie = name + '=' + escape(value)
		+ ((expire == null)? '' : ('; expires=' + expire.toUTCString()))
		+ ((path == null)? '' : ('; path=' + path));
}

function getCookie(Name) {
	var search = Name + '='
	if (document.cookie.length > 0) { // if there are any cookies
		offset = document.cookie.indexOf(search) 
		if (offset != -1) { // if cookie exists 
			offset += search.length 
			// set index of beginning of value
			end = document.cookie.indexOf(';', offset) 
			// set index of end of cookie value
			if (end == -1) 
				end = document.cookie.length
			return unescape(document.cookie.substring(offset, end))
		}
	}
	return '';
}


/*****************************
**   Common class methods
******************************/

function switchClass( objNode, strCurrClass, strNewClass ) {
	if ( matchClass( objNode, strNewClass ) ) replaceClass( objNode, strCurrClass, strNewClass );
		else replaceClass( objNode, strNewClass, strCurrClass );
}

function removeClass( objNode, strCurrClass ) {
	replaceClass( objNode, '', strCurrClass );
}

function addClass( objNode, strNewClass ) {
	replaceClass( objNode, strNewClass, '' );
}

function replaceClass( objNode, strNewClass, strCurrClass ) {
	var strOldClass = strNewClass;
	if ( strCurrClass && strCurrClass.length ){
		strCurrClass = strCurrClass.replace( /\s+(\S)/g, '|$1' );
		if ( strOldClass.length ) strOldClass += '|';
		strOldClass += strCurrClass;
	}
	if (!objNode.className)
		objNode.className = '';
	objNode.className = objNode.className.replace( new RegExp('(^|\\s+)(' + strOldClass + ')($|\\s+)', 'g'), '$1' );
	objNode.className += ( (objNode.className.length)? ' ' : '' ) + strNewClass;
}


function matchClass( objNode, strCurrClass ) {
	return ( objNode && objNode.className && objNode.className.match( new RegExp('(^|\\s+)(' + strCurrClass + ')($|\\s+)') ) );
}

function getAncestorByClassName( oCurrentElement, sClassName, sTagName ) {
	var oCurrent = oCurrentElement.parentNode;
	while ( oCurrent.parentNode ) {
		if ( matchClass( oCurrent, sClassName ) && ( !sTagName || oCurrent.tagName.toLowerCase() == sTagName.toLowerCase() ) ) return oCurrent;
		oCurrent = oCurrent.parentNode;
	}
}

function getElementsByClassName(objParentNode, strNodeName, strClassName){
	var nodes = objParentNode.getElementsByTagName(strNodeName);
	if(!strClassName){
		return nodes;	
	}
	var nodesWithClassName = [];
	for(var i=0; i<nodes.length; i++){
		if(matchClass( nodes[i], strClassName )){
			nodesWithClassName.push(nodes[i]);
		}	
	}
	//alert(nodesWithClassName);
	return nodesWithClassName;
}

function getElementsByClassNameFirstLevel(objParentNode, strNodeName, strClassName){
	var nodes = objParentNode.getElementsByTagName(strNodeName);

	if(!strClassName){
		nodesFirstLevel = [];
		for(var i=0; i<nodes.length; i++){
			if(nodes[i].parentNode.parentNode == objParentNode){
				nodesFirstLevel.push(nodes[i]);
			}	
		}
		return nodesFirstLevel;	
	}
	var nodesWithClassNameFirstLevel = [];
	for(var i=0; i<nodes.length; i++){
		if(matchClass(nodes[i], strClassName) && nodes[i].parentNode.parentNode == objParentNode){
			nodesWithClassNameFirstLevel.push(nodes[i]);
		}	
	}
	//alert(nodesWithClassName);
	return nodesWithClassNameFirstLevel;
}

/*****************************
**   Some other methods
******************************/

function getTextValue( objNode ) {
	var strValue = new String();
	if ( objNode.childNodes.length ) {
		for ( var i = 0; i < objNode.childNodes.length; i++ ) {
			if ( objNode.childNodes[i].nodeType == 1 ) strValue += strValue? ' ' + getTextValue( objNode.childNodes[i] ) : getTextValue( objNode.childNodes[i] );
			if ( objNode.childNodes[i].nodeType == 3 ) strValue += objNode.childNodes[i].nodeValue;
		}
	}
	return strValue;
}

function getPageY( oElement ) {
	var iPosY = oElement.offsetTop;
	while ( oElement.offsetParent != null ) {
		oElement = oElement.offsetParent;
		iPosY += oElement.offsetTop;
		if (oElement.tagName == 'BODY') break;
	}
	return iPosY;
}

function getPageX( oElement ) {
	var iPosX = oElement.offsetLeft;
	while ( oElement.offsetParent != null ) {
		oElement = oElement.offsetParent;
		iPosX += oElement.offsetLeft;
		if (oElement.tagName == 'BODY') break;
	}
	return iPosX;
}

function getMousePosition(e) {
	if (e.pageX || e.pageY){
		var posX = e.pageX;
		var posY = e.pageY;
	}else if (e.clientX || e.clientY) 	{
		var posX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
		var posY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
	}
	return {x:posX, y:posY}	
}


/*****************************
** Browser detection
*****************************/
if (!userApp)
{

	var userApp=navigator.userAgent.toLowerCase();
	var isMSIE = true;
	var isOpera = false;
	var isGecko = false;
	var isSafari = false;


	if (userApp.search(/opera/i)!=-1)
	{
		isOpera=true;
		
	}
	if (userApp.search(/gecko/i)!=-1)
	{
		isGecko=true;
	}
	if (userApp.search(/apple/i)!=-1)
	{
		isSafari = true;
	}
	if (isGecko || isOpera || isSafari)
	{
		isMSIE=false;
		var tempVer = userApp.search(/\/([0-9\.]+)/);
		if (tempVer != -1)
		{
			tempVer += 1;
		}
	}
	else
	{
		var tempVer = userApp.search(/msie ([0-9\.]+)/);
		if (tempVer != -1)
		{
			tempVer += 'msie '.length;
		}
	}
	if (tempVer != -1)
	{
		var uaVersion = parseFloat(userApp.substr(tempVer));
	}
	
}



/****
get scroll
****/
function getScroll()
{
	var scrollLeft, scrollTop;
	if (window.pageYOffset){  
		scrollTop = window.pageYOffset 
	} else if(document.documentElement && document.documentElement.scrollTop){ 
		scrollTop = document.documentElement.scrollTop; 
	} else if(document.body){ 
		scrollTop = document.body.scrollTop; 
	} 
	
	if(window.pageXOffset){ 
		scrollLeft=window.pageXOffset 
	} else if(document.documentElement && document.documentElement.scrollLeft){ 
		scrollLeft=document.documentElement.scrollLeft; 
	} else if(document.body){ 
		scrollLeft=document.body.scrollLeft; 
	}
	
	return [scrollLeft,scrollTop];
}

/****
get window sizes
****/
function getWindowSize()
{
	var windowWidth,windowHeight;

	if(window.innerWidth){ 
		windowWidth=window.innerWidth; 
	} else if(document.documentElement && document.documentElement.clientWidth){ 
		windowWidth=document.documentElement.clientWidth; 
	} else if(document.body){ 
		windowWidth=document.body.offsetWidth; 
	} 
	
	if(window.innerHeight){ 
		windowHeight=window.innerHeight; 
	} else if(document.documentElement && document.documentElement.clientHeight){ 
		windowHeight=document.documentElement.clientHeight; 
	} else if(document.body){ 
		windowHeight=document.body.clientHeight; 
	}
	
	return [windowWidth,windowHeight];
}