/**

	@author RubaXa (RubaXa@inbox.ru)
	version: n/a
	description: Расширения для prototype и всякие разные полезности

*/

var IS_IE =  /MSIE/.test(navigator.userAgent) ? true : false;
var GLOBALS = {
	'_UNIQ_ID': 0 // глобальный уникальный id
}; // сюды ьудем кидать глобальные переменные

var getUniqID = function ()
{
	return ('_uId' + (++GLOBALS['_UNIQ_ID']));
}




// Создает div и в него добаляет трейсовую инфу.
var Debug = function ()
{
	
	if (!GLOBALS['debug'])
	{
		GLOBALS['debug'] = Element.create({
			tagName: 'div',
			style: {
				backgroundColor: '#fff',
				fontSize: '12px',
				textAlign: 'left',
				position: 'fixed',
				border:   '2px solid red',
				color: '#000',
				top: '10px',
				left: '10px',
				overflow: 'scroll',
				height: '600px',
				width: '300px'
			}
		});
		document.body.getElementsByTagName('div')[0].appendChild(GLOBALS['debug']);
		
		if (IS_IE)
		{
			GLOBALS['debug'].style.position = 'absolute';
			//GLOBALS['debug'].style.top = 'expression(eval(document.body.scrollTop) + "px");';
		}
	}
	
	
	var args = [];
	for (var i = 0; i < arguments.length; i++)
	{
		 args.push(typeof(arguments[i]) + ': ' + arguments[i]);
	}
	GLOBALS['debug'].innerHTML = args.join(', ') + '<br />' + GLOBALS['debug'].innerHTML;
} // Debug();

var DebugEach = function (obj, type)
{
	for (var a in obj)
	{
//		if (typeof(obj[a]) == type || !type)
			Debug(a, obj[a]);
	}
}

var DebugDiff = function (obj1, obj2)
{
	var diff = (length >= obj2.length) ? obj1 : obj2;
	
	for (var a in diff)
	{
		if (obj1[a] != obj2[a])
		{
			Debug(a, obj1[a], obj2[a]);
		}
	}
}


// Рсширения
String.prototype.repeat = function(multiplier)
{
	var newString = '';

	for (var i = 0; i < multiplier; i++) {
		newString += this;
	}

	return newString;
}  // String.repeat();


document.getElementsByInputName = function(name, parentElement, single)
{
	var children = ($(parentElement) || document.body).getElementsByTagName('input');
	var elements = [];
	
	for(var i = 0; i < children.length; i++)
	{
		if( children[i].name == name )
			elements.push(children[i]);
	}
	
	return single ? elements[0] : elements;
} // document.getElementsByInputName();


document.getElementsByInputType = function(type, parentElement, single)
{
	var children = ($(parentElement) || document.body).getElementsByTagName('input');
	var elements = [];
	
	for(var i = 0; i < children.length; i++)
	{
		if( children[i].type == type )
			elements.push(children[i]);
	}
	
	return single ? elements[0] : elements;
} // document.getElementsByInputType();


document.getParentByTagName = function(element, tagName)
{
	tagName = tagName.toUpperCase();
	if (element = element.parentNode)
	{
		do
		{
			if (element.tagName == tagName)
				return element;
		} while ((element = element.parentNode) && (element != document.body))
	}
	
	return null;
}

document.getParentByClassName = function(element, className)
{
	if (element)
		do
		{
			if (Element.hasClassName(element, className))
				return element;
		} while ((element = element.parentNode) && (element.parentNode != document.body))
	
	return null;
}


$C = function (className, node, single)
{
	var result = document.getElementsByClassName(className, node);

	if (result && single)
		return result[0];
	else
		return result;
}


/**
	синоним к getElementsByTagName
	@var rule
			может быть как название тега, так и правило, вида: #id TABLE TD.class1.class2 .class3 DIV
*/
var $T = function (rule, node, single)
{
	if (node)
	{
		var rule = rule.replace(/\s+/, ' ').split(' ');
		var Items = _$T(rule[0], node);
	
		if ((Items.length >= 1) && (rule.length == 1))
			return single ? Items[0] : Items;
		else {
			for (var i = 0, n = Items.length; i < n; i++)
			{
				_items = $T(rule.slice(1).join(' '), Items[i]);
				if (_items)
					return (single && _items.length >= 1) ? _items[0] : _items;
			}
		}
	}

	return false;
}
var _$T = function (rule, node)
{
	var css = rule.split('.');
	var result = [];
	css = (css.length == 1) ? false : css;
	

	if (rule.charAt(0) == '#') // ищем по ID
		result.push($(rule.substr(1)));
	else if (css) // ага, тут замечен CSS
	{
		css[0] = (css[0] == '') ? '*' : css[0];

		var Items = node.getElementsByTagName(css[0]);
		
		for (var i = 0, n = Items.length; i < n; i++)
		{
			found = true;
			for (var className = 1, cn = css.length; className < cn; className++)
			{
				if (!Element.hasClassName(Items[i], css[className]))
					found = false;
			}
			if (found) result.push(Items[i]);
		}
	}
	else {
		result = node.getElementsByTagName(rule);
	}
	
	return result;
}



// Element ... new Methods

Object.extend(Element, {
	
	visibility: function (elm, visible)
	{
		$(elm).style.visibility = visible ? 'visible' : 'hidden';
	},
	
			  
	removeChilds: function(node)
	{
	   if (node)
	   {
			while( node.childNodes.length != 0 ){
				node.removeChild(node.childNodes[0]);
			}
	   }
	},
	
	
	getWidth: function(element)
	{
		element = $(element);
		return element.offsetWidth;
	},
	
	
	endChild: function (element)
	{
		do {
			if (!element.firstChild)
			{
				if (element.nodeType == 3)
				{
					while (element = element.parentNode)
						if (element.nodeType != 3) return element;
				}
				return element;
			}
		} while (element = element.firstChild);
	},
	
	
	moveTo: function (element, left, top)
	{
		element = $(element);
		element.style.left = left + 'px';
		element.style.top = top + 'px';
	},
	
	
	parentNodeByClassName: function (element, className)
	{
		if (element.parentNode)
		{
			do
			{
				if (Element.hasClassName(element.parentNode, className))
					return element.parentNode;
			}
			while ((element = element.parentNode) && (element.parentNode != document.body))
		}
		
		return false;
	},
	
	
	replaceClassName: function (elm, search, replace)
	{
		elm = $(elm);
		var regExp = new RegExp('(^|\\s)('+search+'|'+replace+')(\\s|$)', 'ig');
		elm.className = elm.className.replace(regExp, ' ' + replace + ' ');
	}

});



var Insert = {
	
	
	before: function (node, insNode)
	{
		if (node && Element.isNode(insNode))
		{
			if (node.parentNode)
			{
				node.parentNode.insertBefore(insNode, node);
				return true;
			}
		}
		
		return false
	},
	
	
	into: function (node, insNode)
	{
		if (node && Element.isNode(insNode))
		{
			node.appendChild(insNode);
			return true;
		}
		
		return false;
	},
	
	
	after: function (node, insNode)
	{
		if (node && Element.isNode(insNode))
		{
			var parentNode = node.parentNode;
			
			if (parentNode)
			{
				if (parentNode.childNodes.length == 1)
				{
					parentNode.appendChild(insNode);
					return true;
				}
				else
				{
					node.__Insert_after = true;
					for (var i = 0, n = parentNode.childNodes.length; i < n; i++)
					{
						if (parentNode.childNodes[i].__Insert_after)
						{
							node.__Insert_after = false;
							if (parentNode.childNodes[i+1])
							{
								Insert.before(parentNode.childNodes[i+1], insNode);
							}
							else
							{
								parentNode.appendChild(insNode);
							}
							return true;
						}
					}
				}
			}
		}
		return false;
	}
	
}


var cloneNodeAttrs = ['className', 'innerHTML', 'width', 'height', 'align', 'alt', 'title', 'border'];

cloneNode = function (node)
{
	var cloneNode = false;
	
	if (node)
	{
		var cloneNode = document.createElement(node.tagName);
	
		for (var i = 0, n = cloneNodeAttrs.length; i < n; i++)
		{
			if (typeof(node[cloneNodeAttrs[i]]) != 'undefined')
				cloneNode[cloneNodeAttrs[i]] = node[cloneNodeAttrs[i]];
		}
	}
	
	return cloneNode;
}


Ajax.getNodes = function (nodeName, xml)
{
	var xml = xml.getElementsByTagName(nodeName);

	if (xml.length)
	{
		return xml;
	}
	
	return false;
}

Ajax.getNode = function (nodeName, xml)
{
	var xml = Ajax.getNodes(nodeName, xml);
	if (xml) return xml[0];
	
	return false;
}


Ajax.getNodeValue = function (nodeName, xml)
{
	var xml = Ajax.getNode(nodeName, xml);
	if (xml) return xml.firstChild.nodeValue;
	
	return false;
}



Element.setAttribute = function (elm, attr, value)
{
	if (attr == 'className')
	{
		Element.addClassName(elm, value);
	}
	else if ((attr == 'click') || (attr == 'change')) // TODO: По мере необходимости надо заполнять :]
	{
		Event.observe(elm, attr, value.bind(elm));
	}
	else if (attr == 'style')
	{
		Element.setStyle(elm, value);
	}
	else
	{
		elm.setAttribute(attr, value);
		elm[attr] = value;
	}
}



var is_array = function (ar)
{
	if ((typeof(ar) != 'string') && ar)
	{
		return ar[0]; // может что-то по умней надо придумать
	}
	else
		return false;
}

Element.isNode = function (elm)
{
	if (elm = $(elm))
	{
		return (elm.nodeName);
	}
	else
		return false;
}

/**
 *	Создает елемент(ы)
 *		@var Rule - правило по которому все и будет сделано (объект)
 *		@params Rule:
 *			.tagName - тег который надо создать
 *			.text - текст тега
 *			.childs - это может быть как массив Rule или сами объекты
 *			.textAfter - текст будет создан после создания Child'ов
 *			.click, и др. события - вешаются Event.observe
 *			.className - устанавливает селекторы (Element.addClassName)
 *			.style - устанавливает стили (Element.setStyle)
 *			.* - все остальное является атрибутом тега
 *		@var nodeText - тест тега, а так же может быть аналогом .childs
 *		@example:
 *			Element.create('div', 'MyText') => <div>MyText</div>
 *			Element.create({ tagName: 'div', id: 'divID', text: 'MyText}) => <div id="divID">MyText</div>
 *			
 */
 
// FIX: Тут будем фиксить все что найдем
var fixElements = []; // тут будем хранить элементы которые надо по фиксить
var fixElementCreateTimeOut = 0; // таймаут
var fixElementCreate = function (id, fix, end) // собственно функция
{
	if (!/MSIE/.test(navigator.userAgent)) return true;
	
	clearTimeout(fixElementCreateTimeOut);
	if (id)
	{	// Добавим элемент
		fixElements.push(id);
		fixElementCreateTimeOut = setTimeout("fixElementCreate(false, true);", 100); //запусим сам фикс
	}
	else if (fix)
	{	// собственно сам фикс
		for (var i = fixElements.length-1; i >= 0; i--)
		{
			if (fixElements[i])
			{
				elm = $(fixElements[i]);
				if (elm)
				{
					if (!elm.__fixElementCreate)
					{
						switch (elm.tagName)
						{
							case 'INPUT':
								if (elm.type == 'radio')
								{
									elm.onclick = function ()
									{
										var elms = $T('input', this.parentNode.parentNode.parentNode);
										for (var i = elms.length-1; i >= 0; i--)
										{
											if (elms[i].name == this.name)
												elms[i].checked = false;
										}
										this.checked = true;
										return true;
									}
								}
							break;
						}
						elm.__fixElementCreate = true;
						fixElements[i] = false;
					}
				}
			}
		}
	}
}

var ecDebug = false;
Element.create = function (Rule, nodeText)
{
	if (Element.isNode(Rule)) return Rule;
	
	var Node;
	
	if (typeof(Rule) == 'string') Rule = { tagName: Rule };
	if (typeof(nodeText) == 'string')
	{
		Rule.text = nodeText;
	}
	else if (nodeText) // походу дела это объект, а => аналог .childs
	{
		if (Rule.childs)
		{
			if (!is_array(nodeText)) nodeText = [nodeText];
			if (!is_array(Rule.childs)) Rule.childs = [Rule.childs];
			Rule.childs = Rule.childs.concat(nodeText);
		}
		else
			Rule.childs = nodeText;
	}
	
	// support OLD School
	if (!Rule.tagName)
	{
		Rule.tagName = Rule.name;
		delete Rule.name;
	}
	
	if (Rule.tagName == '#text')
	{
		Node = document.createTextNode(Rule.text); // это текстовый нод
	}
	else
	{
		Rule.tagName = Rule.tagName.toUpperCase();
		
		if (Rule.tagName == 'INPUT' && Rule.type == 'radio')
		{	// FIX (IE): Клонируем input
			//Node = $('fixIEradio').cloneNode(true);
			Node = document.createElement(Rule.tagName);
			//Node.id = '';
			//Node.style.display = '';
			//if (Rule.checked)
			fixElementCreate(Node);
		}
		else if (Rule.tagName == 'LABEL')
		{	// FIX (IE)
			Node = document.createElement(Rule.tagName);
			Node.onclick = function () { if (this['for']) $(this['for']).click(); }
		}
		else
			Node = document.createElement(Rule.tagName); // наш тег
		
		// установим атрибуты
		if (Rule.attrs) // support OLD School
		{
			for ( var attr in Rule.attrs)
			{
				Element.setAttribute(Node, attr, Rule.attrs[attr]);
			}
		}
		else // new School
		{
			for (var attr in Rule)
			{
				if ((attr != 'tagName') && (attr != 'text') && (attr != 'childs') && (attr != 'textAfter'))
				{
					//alert(attr)
					Element.setAttribute(Node, attr, Rule[attr]);
				}
			}
		}
			
		if (Rule.text && !Rule.textAfter) Node.appendChild(document.createTextNode(Rule.text));
		
		if (Rule.childs)
		{
			if (!is_array(Rule.childs)) Rule.childs = [Rule.childs];

			for (var i = 0, n = Rule.childs.length; i < n; i++)
			{
				Node.appendChild(Element.create(Rule.childs[i]));
			}
		}
		if (Rule.text && Rule.textAfter) Node.appendChild(document.createTextNode(Rule.text));
	}
	
	return Node;
}


Element.setOpacity = function (element, opacity)
{
	element = $(element);
	Element.setStyle(element, {
		opacity: opacity,
		filter: 'alpha(opacity: ' + opacity*100 + ')'
	});
}
	
Element.unselectable = function (element, offOn)
{
	if (element = $(element))
	{
		offOn = ((typeof(offOn) == 'undefined') || offOn ? 'On' : 'Off');
		element.unselectable = offOn;
		
		var elements = element.getElementsByTagName('*');
		for (var i = 0, n = elements.length; i < n; i++)
		{
			elements[i].unselectable = offOn;
		}
	}
}


/**
 * Объект для работы с цветом
 */
var oColor = {
	
	hexDigits: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'],
	
	
	dec2Hex: function(value)
	{
		hexStr = this.hexDigits[Math.floor(value / 16)] + this.hexDigits[value % 16];
		return hexStr;
	},
	
	
	toHex: function (rgb)
	{
		if( arguments.length > 1 ) rgb = arguments;
		return ['#', this.Dec2Hex(rgb[0]), this.Dec2Hex(rgb[1]), this.Dec2Hex(rgb[2])].join('');
	},
	
	
	toHEX: function ()
	{
		return this.toHex.apply(this, arguments);
	},
	
	
	toRGB: function (hex)
	{
		if (hex.substr(0, 3) == 'rgb') hex = hex.substring(4, hex.lastIndexOf(')')).split(',');
	
		if (typeof(hex) == 'string')	
		{
			if (hex.length <= 4)
			{
				if (hex.length == 4) hex = hex.substring(1, 4);
				hex = hex.split('');
				hex = [hex[0], hex[0], hex[1], hex[1], hex[2], hex[2]].join('');
			}
			if (hex.length > 6) hex = hex.substring(1, 7);
			
			dec = parseInt(hex, 16);
			R = Math.floor(dec / (256*256));
			G = Math.floor((dec - (R*256*256)) / 256);
			hex = [R, G, Math.floor(dec - (R*256*256+G*256))];
		}
		return [parseInt(hex[0]), parseInt(hex[1]), parseInt(hex[2])];
	}
	
};



Object.extend(window, {
	
	/**
	 * Вкыл/Выкл скролинга
	 * 
	 * @param bool enabled - включен?
	 */
	scrolling: function (enabled)
	{
		if (!IS_IE) this.document.body.style.overflow = enabled ? 'auto' : 'hidden';
		if (IS_IE) this.document.body.scroll = enabled ? 'yes' : 'no';
	},
	
	// ширина Body
	getBodyWidth: function()
	{
		return 	document.body.offsetWidth;
	},
	
	
	// высота Body
	getBodyHeight: function()
	{
		return 	document.body.offsetHeight;
	},
	
	
	// ширина видимой части окна
	getClientWidth: function ()
	{
		var Width = 0;
		if( typeof(window.innerWidth) == 'number' ) {
			//Non-IE
			Width = window.innerWidth;
		}
		else if( document.documentElement && document.documentElement.clientWidth ) {
			//IE 6+ in 'standards compliant mode'
			Width = document.documentElement.clientWidth;
		}
		else if( document.body && document.body.clientWidth ) {
			//IE 4 compatible
			Width = document.body.clientWidth;
		}
		return Width;
	},
	
	
	// высота видимой части окна
	getClientHeight: function ()
	{
		var Height = 0;
		if( typeof(window.innerHeight) == 'number' ) {
			//Non-IE
			Height = window.innerHeight;
		}
		else if( document.documentElement && (document.documentElement.clientHeight ) ) {
			//IE 6+ in 'standards compliant mode'
			Height = document.documentElement.clientHeight;
		}
		else if( document.body && (document.body.clientHeight) ) {
			//IE 4 compatible
			Height = document.body.clientHeight;
		}

		return Height;
	},
	
	
	// прокрутка по X
	getScrollX: function()
	{
		var scrollX = 0;
		if( typeof( window.pageXOffset ) == 'number' ) {
			//Netscape compliant
			scrollX = window.pageXOffset;
		}
		else if( document.body && ( document.body.scrollLeft ) ) {
			//DOM compliant
			scrollX = document.body.scrollLeft;
		}
		else if( document.documentElement && ( document.documentElement.scrollLeft ) ) {
			//IE6 standards compliant mode
			scrollX = document.documentElement.scrollLeft;
		}
		return scrollX;
	},
	
	
	// прокрутка по Y
	getScrollY: function()
	{
		var scrollY = 0;
		if( typeof( window.pageYOffset ) == 'number' ) {
			//Netscape compliant
			scrollY = window.pageYOffset;
		}
		else if( document.body && (document.body.scrollTop) ) {
			//DOM compliant
			scrollY = document.body.scrollTop;
		}
		else if( document.documentElement && (document.documentElement.scrollTop) ) {
			//IE6 standards compliant mode
			scrollY = document.documentElement.scrollTop;
		}
		return scrollY;
	}
	
});



// объект для регистрирующий функций, которые сработуют по загрузке страницы
var OnLoad = {
	
	functions: [],
	args: [],
	eventCallback: {},
	onLoadTO: 0,
	_offset: 0,
	
	
	onLoad: function (simple)
	{
		if (simple)
			this._onLoad();
		else
			Event.observe(window, 'load', this._onLoad.bind(this, 0));
	},
	start: function () { this.onLoad(true); },
	
	
	_onLoad: function (start)
	{
		if (!start) start = this._offset;
		
		clearTimeout(this.onLoadTO);
		for (var i = start, n = this.functions.length; i < n; i++)
		{
			if (this.functions[i])
			{
				if (this.args[i].length > 0)
					this.functions[i].bind(this.functions[i], this.args[i]);
				else
					this.functions[i]();
				this.functions[i] = false
			}
			
			this._offset = i;
			this.onLoadTO = setTimeout("OnLoad._onLoad("+(++start)+");", 100);
			
			return true;
		}
		
		this.functions = false;
		this.args = false;
		
		return true;
	},
	
	
	attach: function (Func, Args)
	{
		if (!Args) Args = [];
		
		this.functions.push(Func);
		this.args.push(Args);
	},
	
	
	attachObserve: function (name, callback)
	{
		if (!this.eventCallback[name])
		{
			switch (name)
			{
				case 'resize':
					Event.observe(window, name, this.eventObserve.bind(this, name));
				break;
				default:
					Event.observe(document, name, this.eventObserve.bind(this, name));
				break;
			}
			this.eventCallback[name] = [];
		}
		this.eventCallback[name].push(callback);
	},
	
	
	eventObserve: function (eventName, e)
	{
		callback = OnLoad.eventCallback[eventName];
		if (callback)
		{
			for (var i = 0, n = callback.length; i < n; i++)
			{
				callback[i](e);
			}
		}
		callback = null;
	}

	
}

OnLoad.onLoad();



/* ---------------------------- Разные эффекты -------------------------------- */
if (typeof(Effect) != 'undefined')
{
	/**
	 * Эффект перехода из одного цвета в другой
	 */
	Effect.Color = Class.create();
	Object.extend(Object.extend(Effect.Color.prototype, Effect.Base.prototype), {
		
		initialize: function(element, options)
		{
			this.element = $(element);
			
			options = Object.extend({
				what: 'backgroundColor'
			}, options || {})
			
			this.from = oColor.toRGB(this.element.style[options.what] || options.from);
			this.to = oColor.toRGB(options.to);

			options.from = 0;
			options.to = 1;
			
			this.RGB = [this.to[0] - this.from[0], this.to[1] - this.from[1], this.to[2] - this.from[2]];
			
			//throw('this.from: ' + this.from.join(', '));
			//throw('this.to: ' + this.to.join(', '));
			//throw('this.RGB: ' + this.RGB.join(', '));
			
			this.element.style[options.what] = oColor.toHex(this.from);
			this.start(options);
		},
		
		update: function(pos)
		{
			R = Math.round(this.from[0] + this.RGB[0]*pos);
			G = Math.round(this.from[1] + this.RGB[1]*pos);
			B = Math.round(this.from[2] + this.RGB[2]*pos);
			color = oColor.toHex(R, G, B);
			//throw((this.from[0] + this.RGB[0]*pos) + ', ' + G + ', ' + B + ' = ' + color);
			this.element.style[this.options.what] = color;
		},
		
		afterFinishInternal: function ()
		{
			this.element.style[this.options.what] = oColor.toHEX(this.to);
		}
		
	});
	
	
	Effect.Height = Class.create();
	Object.extend(Object.extend(Effect.Height.prototype, Effect.Base.prototype), {
										 
		initialize: function(element)
		{
			this.element = $(element);
			options = Object.extend({
				from: parseInt(Element.getHeight(this.element)),
				to: 0
			}, arguments[1] || {});
			this.start(options);
			Element.setStyle(this.element, { height: options.from + 'px', overflow: 'hidden' });
		},
		
		update: function(pos)
		{
			this.element.style.height = pos + 'px';
		},
		
		afterFinishInternal: function ()
		{
			if (to == 0) this.element.hide();
		}
	});
	
	
	Effect.Width = Class.create();
	Object.extend(Object.extend(Effect.Width.prototype, Effect.Base.prototype), {
		
		initialize: function(element)
		{
			this.element = $(element);
			options = Object.extend({
				from: parseInt(Element.getWidth(this.element)),
				to: 0
			}, arguments[1] || {});
			this.start(options);
		},
		
		update: function(pos)
		{
			this.element.style.width = pos + 'px';
		},
		
		afterFinishInternal: function ()
		{
			if (to == 0) this.element.hide();
		}
		
	});
	
	
	Effect.Resize = Class.create();
	Object.extend(Object.extend(Effect.Resize.prototype, Effect.Base.prototype), {
		
		initialize: function(element)
		{
			this.element = $(element);
			options = Object.extend({
				oWidth: parseInt(Element.getWidth(this.element)),
				oHeight: parseInt(Element.getHeight(this.element)),
				nWidth: 0,
				nHeight: 0,
				resizeFromCenter: true
			}, arguments[1] || {});
			
			this.oLeft   = (options.left || this.element.offsetLeft);
			this.oTop    = (options.top || this.element.offsetTop);
			
			this.dWidth = (options.nWidth - options.oWidth);
			this.dHeight = (options.nHeight - options.oHeight);
	
			this.start(options);
		},
		
		
		update: function(pos)
		{
			x = this.oLeft;
			y = this.oTop;
			if (this.options.resizeFromCenter)
			{
				x -= (this.dWidth * pos)/2;
				y -= (this.dHeight * pos)/2;
			}
			
			width = this.options.oWidth + (this.dWidth * pos);
			height = this.options.oHeight + (this.dHeight * pos);
			
			this.setPosAndDims(x, y, width, height);
		},
		
		
		setPosAndDims: function (x, y, width, height)
		{
			this.element.style.left = x + 'px';
			this.element.style.top = y + 'px';
			
			this.element.style.width = width + 'px';
			this.element.style.height = height + 'px';
		}
		
	});
}

/* ---------------------------- /Разные эффекты -------------------------------- */


Array.prototype.remove = function(Index)
{
	var res = this.slice(0, Index);
	return res.concat(this.slice(Index + 1));
}



/* ---------------- Хаки для IE ------------*/

var IEHack = {
	
	init: function ()
	{
		IEHack.LinkHover.init();
	}
	
}

IEHack.LinkHover = {
	
	init: function()
	{
		var Links = document.body.getElementsByTagName('a');
		if (n = Links.length)
		{
			for (var i = 0; i < n; i++)
			{
				Event.observe(Links[i], 'mouseover', this.onMouseOver.bind(Links[i]));
				Event.observe(Links[i], 'mouseout', this.onMouseOut.bind(Links[i]));
			}
		}
	},
	
	
	onMouseOver: function()
	{
		Element.addClassName(this, 'IEhover');
	},
	
	
	onMouseOut: function()
	{
		Element.removeClassName(this, 'IEhover');
	}
	
}

OnLoad.attach(IEHack.init);
/* ---------------- /Хаки для IE ------------*/



Object.extend(String.prototype, {


	getQueryString: function ()
	{
		return (this.indexOf('?') != -1) ? this.split('?')[1] : '';
	},

	
	queryStringToParams: function ()
	{
		var _params  = (this.indexOf('?') != -1) ? this.split('?')[1] : this;
		var arParams = false;
		
		if (_params.length > 0)
		{
			arParams = {};
			_params = _params.split('&');
			for (var i = 0, n = _params.length; i < n; i++)
			{
				tmp = _params[i].split('=');
				arParams[tmp[0]] = decodeURI(tmp[1]);
			}
			return arParams;
		}
	
		return arParams;
	}

});


Form.Element.getOption = function (form, Select, Index)
{
	if (form.tagName == 'FORM')
	{
		Select = form[Select];
		Index = Index ? parseInt(Index) : -1;
	}
	else {
		Index = Select ? parseInt(Select) : -1;
		Select = $(form);
	}
	
	if (Select)
	{
		if (Index == -1) Index = Select.selectedIndex;
		return Select.options[Index];
	}
	
}
	
Object.extend(Form, {
				  
	disableAllSubmit: function (form, value, enabled)
	{
		var Input = Form.getInputs(form, 'submit');
		for (var i = 0, n = Input.length; i < n; i++)
		{
			Input[i].disabled = !enabled;
			if (value)
			{
				Input[i].__value = Input[i].value;
				Input[i].value = value;
			}
			else if (Input[i].__value)
				Input[i].value = Input[i].__value;
		}
	},
	
	
	enableAllSubmit: function (form, value)
	{
		Form.disableAllSubmit(form, value, true);
	},
	
	
	toQueryString: function (form)
	{
		var query = [];
		for (var i = 0, n = form.elements.length; i < n; i++)
		{
			name = form.elements[i].name;
			value = form.elements[i].value;
			tag = form.elements[i].tagName.toLowerCase();
			if (tag == 'select')
				value = form.elements[i].options[form.elements[i].selectedIndex].value;
			if (tag.type == 'checkbox' && !form.elements[i].checked)
				name = false;
			else
				value = decodeURIComponent(form.elements[i].value);
				
			if (name)
			{
				query.push(name + '=' + value);
			}
		}
		
		return query.join('&');
	}
				  
});


Object.extend(document, {
	
	
	/**
	 * Установить cookie
	 * 
	 * @param string name - имя
	 * @param string value - значение
	 * @param int expires - жить
	 */
	setCookie: function (name, value, expires)
	{
		var expires = '';
		if (expires)
		{
			var date = new Date();
			date.setTime(date.getTime() + (days * 24 * seconds * 1000));
			var expires = "; expires="+date.toGMTString();
		}
		document.cookie = name+"="+value+expires+"; path=/";
	},
	
	
	/**
	 * Вернуть cookie
	 * 
	 * @param string name - имя
	 * @param string def - дефалт
	 * @return string
	 */
	getCookie: function(name, def)
	{
		var nameEQ = name + "=";
		var ca     = document.cookie.split(';');
		
		for (var i = 0;i < ca.length; i++)
		{
			var c = ca[i];
			while (c.charAt(0) == ' '){ c = c.substring(1, c.length); }
				
			if (c.indexOf(nameEQ) == 0)
				return c.substring(nameEQ.length, c.length);
		}
		return (def ? def : '');
	}
	
	
});


var CheckEmail = function (email)
{
	return email.toLowerCase().match(/^[a-z0-9]{1}(((\b\.|-|%)?[a-z0-9]+)*)?@[a-z0-9]{1}(((\b\.|-)?[a-z0-9]+)*)?\.[a-z]{2,4}$/i);
}
