/**
 * Тип браузера
 *
*/
var browser = {
    isIE:     !!(window.attachEvent && !window.opera),
    isOpera:  !!window.opera,
    isWebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    isGecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
    isMobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
};

/** 
 * Делаем для всех объектов возможность расширения
 *
 * @param object object		Объект который будет прикреплен к базовому
*/
Object.prototype.Extend = function ( object, replaceOldProp ) {
	
	for ( var property in object ) {
	
		if ( replaceOldProp || !this[ property ] ) {
			this[ property ] = object[ property ];
		}

	}
	
}


Function.prototype.Extend (
	
	{
		/** 
		 * Конвертируем строку агрументов в массив
		 *
		 * @return array
		*/
		Arguments2Array : function( arguments ) {

			var results = new Array( );
		
			for ( var i = 0, length = arguments.length; i < length; i++ ) {
				results.push( arguments[i] );
			}
		
		    return results;
		
		},
		
		/** 
		 * Bind с event
		 *
		 * @param arguments object		Аргументы
		 * @return function
		*/
		bindWithEvent : function( object ) {

			var _method = this, argv = this.Arguments2Array( arguments );
			argv.shift();
		
			return function( event ) {
				return _method.apply( object, [event || window.event].concat(argv) );
			}
		
		},

		/** 
		 * Bind без event
		 *
		 * @param arguments object		Аргументы
		 * @return function
		*/
		Bbind : function( object ) {

			var _method = this, argv = this.Arguments2Array( arguments );
			argv.shift();
		
			return function( event ) {
				return _method.apply( object, argv );
			}
		
		},
		
		/** 
		 * Bind без event
		 *
		 * @param arguments object		Аргументы
		 * @return function
		*/
		bind : function( object ) {

			var _method = this;
		
			return function( ) {
				return _method.apply( object, arguments );
			}
		
		}

	}

);


var Events = { };

Events.Extend (

	{
		
		/** 
		 * Прикрепление обработчика события к объекту
		 *
		 * @param objectTarget		object		Объект к которому будет прикреплено событие
		 * @param eventType 		string		Тип события
		 * @param funcionHandler 	object		Функция обработчик
		*/
		Attach : function( objectTarget, eventType, funcionHandler ) {
			
			if ( objectTarget.addEventListener ) { //for DOM-compliant browsers
				objectTarget.addEventListener( eventType, funcionHandler, false );
			}
			else if ( objectTarget.attachEvent ) { //for IE
				objectTarget.attachEvent('on' + eventType, funcionHandler );
			}
			else { //for all others
				objectTarget['on' + eventType] = funcionHandler;
			}
			
		},
		
		/** 
		 * Открепление обработчика события от объекту
		 *
		 * @param objectTarget		object		Объект у которого будет откреплено событие
		 * @param eventType 		string		Тип события
		 * @param funcionHandler 	object		Функция обработчик
		*/
		Detach : function( objectTarget, eventType, funcionHandler ) {
		
			if ( objectTarget.addEventListener ) { //for DOM-compliant browsers
				objectTarget.removeEventListener( eventType, funcionHandler, false );
			}
			else if ( objectTarget.attachEvent ) { //for IE
				objectTarget.detachEvent('on' + eventType, funcionHandler );
			}
			else { //for all others
				objectTarget['on' + eventType] = '';
			}
		
		},

		/** 
		 * Запрет событию генерировать события вверх по цепочке DOM
		 *
		 * @param event	object	Объект события
		*/
		StopBubble : function ( event ) {

			if ( browser.isIE ) {
				window.event.cancelBubble = true;
				window.event.returnValue = false;
			}
			else {
				event.preventDefault( );
				event.stopPropagation( );
			}

		},

		/**
		 * Вычисление координаты x из события
		 * 
		 *
		 * @param event	object	Объект события
		*/
		x : function ( event ) {

			if ( !browser.isGecko && !browser.isWebKit ) {
				var positionMouseX = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
			}
			else {
				var positionMouseX = event.clientX + window.scrollX;
			}

			return positionMouseX;

		},

		/**
		 * Вычисление координаты y из события
		 * 
		 *
		 * @param event	object	Объект события
		*/
		y : function ( event ) {

			if ( !browser.isGecko && !browser.isWebKit ) {
				var positionMouseY = window.event.clientY + document.documentElement.scrollLeft + document.body.scrollLeft;
			}
			else {
				var positionMouseY = event.clientY + window.scrollY;
			}

			return positionMouseY;

		}
		
	}

);


var Style = { };

Style.Extend (

	{
		RealDimenstions : function ( object ) {
	
			var objFloat = browser.isIE ? object.style.styleFloat : object.style.cssFloat;
			var width = 0;
			var height = 0;
			var cssText = null;
	
			if ( !objFloat || objFloat == 'none' ) {
				cssText = object.style.cssText;
				object.style.styleFloat = 'left';
				object.style.cssFloat = 'left';
			}
		
			width = object.offsetWidth;
			height = object.offsetHeight;
		
			if ( cssText ) {
				object.style.cssText = cssText;
			}
		
			return {
				width : width,
				height : height
			}
	
		},
	
		RealWidth : function ( object ) {
			
			return this.RealDimenstions( object ).width;
			
		},
		
		RealHeight : function ( object ) {
			
			return this.RealDimenstions( object ).height;
			
		},
		
		OffsetTop : function ( object ) {
			
			return object.offsetTop;
			
		},

		OffsetLeft : function ( object ) {
			
			return object.offsetLeft;
			
		}
	
	}

);

Array.prototype.Extend(

	{
		Each : function ( handler ) {
			
			for( var i = 0, count = this.length; i < count; i++ ) {
				
				handler( this[i], i );

			}

		},
		
		EachHash : function ( handler ) {
			
			for ( var item in this ) {
			
				if ( typeof ( this[item] ) == "string" &&  typeof ( item ) == "string" ) {
					handler( this[item], item );
				}
					
			}

		}

	}

);

Timer = { };

Timer.Extend(

	{

		timers : new Array(),
		
		Start : function ( func, seconds, name ) {
			
			this.timers[name] = setInterval( func, seconds * 1000 );
			
		},
		
		Stop : function ( name ) {

			clearInterval( this.timers[name] );
			this.timers[name] = null;

		}
		
	}

);





/** 
 * Сокращённый document.getElementById( id )
 *
 * @param	id	text	id блока
 * @return HTMLElement
*/
$ = function ( id ) {
	return document.getElementById( id );
}

/** 
 * Сокращённый document.getElementsByName( name )
 *
 * @param	name	text	имя блока
 * @return array of HTMLElement
*/
$n = function ( name ) {
	return document.getElementsByName( name );
}

/** 
 * Сокращённый getElementsByTagName( tagName );
 *
 * @param	tagName			text		тег блока
 * @param	[parentObject]	HTMLElement	объект родитель
 * @return array of HTMLElement
*/
$t = function ( tagName, parentObject ) {
	return ( parentObject || document ).getElementsByTagName( tagName );
}

/** 
 * Получение объектов по классу
 *
 * @param	partClass		text		название класса ( поддерживает RegExp )
 * @param	[parentObject]	HTMLElement	объект родитель
 * @return array of HTMLElement
*/
$c = function ( partClass, parentObject, toArray ) {

	
	var ret = $c_arr(partClass, parentObject, toArray);
	
	return ( ret.length  == 1 && !toArray ) ? ret[0] : ret;

}


$c_arr = function ( partClass, parentObject, toArray ) {

	var objects = $t( '*', parentObject );
	var ret = new Array( );
	
	var reg = new RegExp(partClass);
	
	for( var i = 0, count = objects.length; i < count; i++ ) {
		
		if (objects[i].className.match( reg ) ) {
			
			ret.push( objects[i] );

		}
	
	}
	
	return ret;

}

function setCookie(sName, sValue, oExpires, sPath, sDomain, bSecure) {
	var sCookie = sName + "=" + encodeURIComponent(sValue);
	if (oExpires) {
		sCookie += "; expires=" + oExpires.toGMTString();
	}
	if (sPath) {
		sCookie += "; path=" + sPath;
	}
	if (sDomain) {
		sCookie += "; domain=" + sDomain;
	}
	if (bSecure) {
		sCookie += "; secure";
	}
	document.cookie = sCookie;
	
}

function getCookie(sName) {
	
	var sRE = "(?:; )?" + sName + "=([^;]*);?";
	var oRE = new RegExp(sRE);
	if (oRE.test(document.cookie)) {
		return decodeURIComponent(RegExp["$1"]);
	}
	else {
		return null;
	}

}