/** 
 * Функция реобразует аргументы функции в массив
 *
 * @param arguments arguments		Аргументы
 * @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
*/
Function.prototype.bindWithEvent = function( object ) {

	var _method = this, argv = Arguments2Array( arguments );
	argv.shift();

	return function( event ) {
		return _method.apply( object, [event || window.event].concat(argv) );
	}

}

/** 
 * Bind без event
 *
 * @param arguments object		Аргументы
 * @return function
*/
Function.prototype.bindAjax = function( object ) {

	var _method = this, argv = Arguments2Array( arguments );
	argv.shift();

	return function( event ) {
		return _method.apply( object, argv );
	}

}

/** 
 * Кроссбраузерный attachEvent
 *
 * @param object objectTarget		Объект к которому делается attachEvent
 * @param string eventType			Вид события
 * @param object funcionHandler		Функция обработчик события
*/
AttachEvent = 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;
	}

}

/** 
 * Кроссбраузерный detachEvent
 *
 * @param object objectTarget		Объект к которому делается attachEvent
 * @param string eventType			Вид события
 * @param object funcionHandler		Функция обработчик события
*/
DetachEvent = 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] = '';
	}

}

/** 
 * Проверка на Gecko-браузер
 *
 * @return boolean
*/
IsGecko = function ( ) {

	return !document.attachEvent && document.addEventListener;

}


IsIE = function ( ) {
	return (navigator.appName.indexOf("Microsoft") != -1) && !window["opera"];
}

/** 
 * Остановка всплытия события к родительским объектам
 *
 * @param event event		Событие
*/
CancelEventBubble = function ( event ) {

	if ( !IsGecko( ) ) {
		window.event.cancelBubble = true;
		window.event.returnValue = false;
	}
	else {
		event.preventDefault( );
		event.stopPropagation( );
	}

}

/** 
 * Вычисление реальной высоты и ширины объекта
 *
 * @param object object		Объект
*/
GetRealObjectSize = function ( object ) {

	var objFloat = 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
	}

}

/** 
 * Координаты получаемые из события
 *
 * @param event event		Event - событие
 * @return {x,y} - координаты
*/
GetCoordsFromEvent = function ( event ) {

	if ( !IsGecko( ) ) {
		var positionMouseX = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
		var positionMouseY = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
	}
	else {
		var positionMouseX = event.clientX + window.scrollX;
		var positionMouseY = event.clientY + window.scrollY;
	}

	return {
		x: positionMouseX,
		y: positionMouseY
	};

}
