/* © Ильюша Абельчаков. http://www.ilyuha.ru/ */
if (!window._MC)
	var _MC = {};
_MC = {
	/* BROWSERS */
	/* IE or not IE :) */
	isIe : function() {
		if( document.all && !self.opera )
			return true;
		else
			return false;
	},
	isFF : function() {
		if( navigator.appVersion.indexOf('Chrome')<0 && navigator.appVersion.indexOf('Safari')<0 && navigator.appName.toLowerCase() == 'netscape' )
			return true;
		else
			return false;
	},
	isOpera : function() {
		if( self.opera )
			return true;
		else
			return false;
	},
	isSafari : function() {
		if( navigator.appVersion.indexOf('Chrome')<0 && navigator.appVersion.indexOf('Safari')>0 && navigator.appName.toLowerCase() == 'netscape' )
			return true;
		else
			return false;
	},
	isChrome : function() {
		if( navigator.appVersion.indexOf('Chrome')>0 && navigator.appName.toLowerCase() == 'netscape' )
			return true;
		else
			return false;
	},
	
	/* CLASSES */
	MatchClass : function( oElem, sClass ) {
		/*
		oElem - ссылка на объект
		sClass - имя класса
		*/
		/* Проверяем наличие класса у объекта */
		var oRegExp = oElem.className.match( (new RegExp("(^|\\s+)("+sClass+")($|\\s+)")) );
		var bClass = ( sClass && oElem.className && oElem.className.length && oRegExp );
		return bClass;
	},
	SetClass : function( oElem, sClass, sInstead ) {
		/*
		oElem - ссылка на объект
		sClass - имя класса, на которое меняется текущий класс
		sInstead - имя класса, который меняем
		в случае, например, убирания класса, sClass = ' ';
		*/
		/* Проводим замену класса объекта */
		if( oElem ){
			sClass = (sClass.length) ? sClass.replace(/(^\s+|\s+$)/, '') : '';
			if( oElem.className.length ){
				var sOld = sClass;
				if( sInstead && sInstead.length ){
					sInstead = sInstead.replace( /\s+(\S)/g, "|$1" );
					if( sOld ){
						sOld += "|";
					}
					sOld += sInstead;
				}
				var oRegExp = new RegExp("(^|\\s+)(" + sOld +")($|\\s+)", "g");
				oElem.className = oElem.className.replace( oRegExp, "$1" );
			}
			oElem.className += ( oElem.className.length && sClass ? " " : "" ) + sClass;
		}
	},
	
	/* Strings */
	Trim : function( sStr ) {
		/* Обрезание лишних пробелов по в начале и в конце строки - sStr */
		var sValue='';
		if( sStr != '' ) {
			sValue = sStr.replace(/^(\s)*/g, '');
			sValue = sStr.replace(/(\s)*$/g, '');
		}
		return sValue;
	},
	RandomStr : function() {
		var sStr = 'abcdefghiklmnopqrstvxyzABCDEFGHIKLMNOPQRSTVXYZ0123456789';
		var iStrLen = sStr.length-1;
		var sRandom = '';
		for(var q=0; q<12; q++) {
			var iRand=Math.floor(Math.random()*iStrLen);
			sRandom += sStr[iRand];
		}
		return sRandom;
	},
	
	/* DOM */
	AddNode : function( oParent, sName, aParams, sContent ) {
		/*
		oParent - ссылка на родительский объект, возможна также передача id объекта
		sName - имя создаваемого тега
		aParams - массив с атрибутами (['id=elem_id','class=reducer'])
		sContent - текстовое содержимое елемента
		*/
		/* Добавление нового тега в DOM-дерево. Возвращает ссылку на новосозданный объект */
		var oParent = (typeof oParent == 'string') ? $(oParent) : ( (typeof oParent == 'object') ? oParent : null );
		sName = sName.toUpperCase();
		var oNode = document.createElement(sName);
		oParent.appendChild(oNode);
		
		var iLen = aParams.length;
		for(var a=0; a<iLen; a++) {
			var aAttr = aParams[a].split('=');
			var sAttrName = aAttr[0];
			var sAttrVal = (aAttr[1] == '') ? '' : aAttr[1];
			if(sAttrName=='class' && sAttrVal!='')
				oNode.className = sAttrVal;
			else
				oNode.setAttribute(sAttrName, sAttrVal);
		}
		
		if(sName.toLowerCase() != 'iframe' && sName.toLowerCase() != 'table') {
			oNode.innerHTML = sContent;
		}
		return oNode;
	},
	DeleteNode : function( oParent, oDelNode ) {
		/*
		oParent - ссылка на родительский объект, возможна также передача id объекта
		oDelNode - ссылка на удаляемый объект, возможна также передача id объекта
		*/
		/* Удаляет элемент из DOM-дерева */
		var oParent = (typeof oParent == 'string') ? $(oParent) : ( (typeof oParent == 'object') ? oParent : null );
		var oDelNode = (typeof oDelNode == 'string') ? $(oDelNode) : ( (typeof oDelNode == 'object') ? oDelNode : null );
		if(oParent && oDelNode)
			oParent.removeChild(oDelNode);
	},
	EvenOddElems : function( oParent ) {
		/*
		oParent - ссылка на родительский объект, возможна также передача id объекта
		*/
		/*
		Собирает ссылки на четные и нечетные вложенные элементы.
		Возвращает объект с 2-я массивами (odd и even).
		*/
		var oParent = (typeof oParent == 'string') ? $(oParent) : ( (typeof oParent == 'object') ? oParent : null );
		var oElems = {'even':[],'odd':[]};
		var aNodes = [];
		for( var j=0, iLen = oParent.childNodes.length; j<iLen; j++ ) {
			if ( oParent.childNodes[j].nodeType == 1 )
				aNodes.push(oParent.childNodes[j]);
		}
		for( var i=0, iLen = aNodes.length; i<iLen; i++ ) {
			if( i%2 == 0 )
				oElems['odd'].push(aNodes[i]);
			else
				oElems['even'].push(aNodes[i]);
		}
		return oElems;
	},
	ParentNode : function( oElem, sId, sClass, sName ) {
		/*
		oElem - ссылка на объект, у которого следует проверить наличие родителся с заданными параметрами
		sId - id элемента, который выше по дереву
		sClass - class элемента, который выше по дереву
		sName - имя тега элемента, который выше по дереву
		*/
		/* Поиск элемента выше текущего по дереву элементов по id, имени тега или классу */
		var bId = (sId) ? false : true;
		var bClass = (sClass) ? false : true;
		var bName = (sName) ? false : true;
		while(oElem) {
			oElem = oElem.parentNode;
			if(sId && sId == oElem.id)
				bId = true;
			if(sClass && this.MatchClass(oElem, sClass))
				bClass = true;
			if(sName) {
				if(sName.toUpperCase() == oElem.nodeName.toUpperCase())
					bName = true;
			}
			if(bId && bClass && bName)
				return oElem;
		}
		return oElem;
	},
	Coords : function( oElem ) {
		/*
		oElem - ссылка на объект, у которого следует проверить наличие родителся с заданными параметрами
		*/
		/* Координаты элемента на странице. Считаются от левого верхнего угла страницы. */
		var oCoords = {
			iTop  : 0,
			iLeft : 0
			};
		while(oElem) {
			oCoords.iTop += oElem.offsetTop;
			oCoords.iLeft += oElem.offsetLeft;
			oElem = oElem.offsetParent;
		}
		return oCoords;
	},
	/* table */
	/* row */
	AddRow : function( oTable, index, aAttributes, aTd, iLimit, bFollowLimit ) {
		/*
		oTable - ссылка на таблицу или id таблицы в которую добавляем строку
		index - индекс строки в таблице, возможны также индексы first и last, для установки строки первой или последней в таблице
		aAttributes - массив с атрибутами (['id=elem_id','class=reducer'])
		aTd - массив с объектом содержащим данные по атрибутам и содержимому ячеек таблицы ( {'attr':['class=td_class','id=td_id'],'content':содержимое} )
		iLimit - максимальное количество строк в таблице.
		bFollowLimit - использовать значение максимального количества строк в таблице. В случае bFollowLimit==true при добавлении новых строк в таблицу будут удаляться строки из начала или с конца таблицы (в зависимости от значения index, если строка вставляется не в конец таблицы - удаляется последняя).
		*/
		/* Добавляет строку (можно с ячейками) в таблицу */
		var oTbl = (typeof oTable == 'string') ? $(oTable) : ( (typeof oTable == 'object') ? oTable : null );
		if(!oTbl)
			return;
		var iIndex = (index == 'first') ? 0 : ( (index == 'last') ? oTbl.rows.length : index ) ;
		var oCurrRow = oTbl.insertRow(iIndex);
		var iLen = aAttributes.length;
		for(var a=0; a<iLen; a++) {
			var aAttr = aAttributes[a].split('=');
			var sAttrName = aAttr[0];
			var sAttrVal = (aAttr[1] == '') ? '' : aAttr[1];
			if(sAttrName=='class' && sAttrVal!='')
				oCurrRow.className = sAttrVal;
			else
				oCurrRow.setAttribute(sAttrName, sAttrVal);
		}
		for( var j=0, iLn=aTd.length;j<iLn; j++ ) {
			this.AddCell(oCurrRow, j, aTd[j]['attr'], aTd[j]['content']);
		}
		if(bFollowLimit) {
			if( oTbl.rows.length > iLimit ) {
				if( index == 'last' || iIndex>(oTbl.rows.length-1) )
					this.DelRow(oTbl, 0);
				else
					this.DelRow(oTbl, oTbl.rows.length-1);
			}
		}
	},
	DelRow : function( oTable, index ) {
		/*
		oTable - ссылка на таблицу или id таблицы в которой удаляем строку
		index - индекс строки в таблице
		*/
		/* Удаление строки из таблицы */
		var oTbl = (typeof oTable == 'string') ? $(oTable) : ( (typeof oTable == 'object') ? oTable : null );
		oTbl.deleteRow(index);
	},
	RowIndex : function( oRow ) {
		/*
		oRow - ссылка на строку или её id
		*/
		/* Возврат индекса строки в таблице */
		var oRow = (typeof oRow == 'string') ? $(oRow) : ( (typeof oRow == 'object') ? oRow : null );
		return oRow.rowIndex;
	},
	/* cell */
	AddCell : function( oTr, index, aAttributes, sContent ) {
		/*
		oTr - ссылка на строку таблицы или id строки таблицы в которую добавляем ячейку
		index - индекс ячейки в строке
		aAttributes - массив с атрибутами (['id=elem_id','class=reducer'])
		sContent - содержимое ячейки таблицы
		*/
		/* Добавляет ячейку в строку таблицы */
		var oTr = (typeof oTr == 'string') ? $(oTr) : ( (typeof oTr == 'object') ? oTr : null );
		if(!oTr || oTr==null)
			return;
		var oCurrCell = oTr.insertCell(index);
		oCurrCell.innerHTML = sContent;
		var iALen = aAttributes.length;
		for(var a=0; a<iALen; a++) {
			var aAttr = aAttributes[a].split('=');
			var sAttrName = aAttr[0];
			var sAttrVal = (aAttr[1]=='') ? '' : aAttr[1];
			if(sAttrName=='class' && sAttrVal!='')
				oCurrCell.className = sAttrVal;
			else
				oCurrCell.setAttribute(sAttrName, sAttrVal);
		}
	},
	DelCell : function( oTr, index ) {
		/*  */
		return false;
	},
	
	/* FORM */
	/* checkboxes */
	CheckGroup : function( sGroupName, oSwitcher ) {
		/*
		sGroupName - имя группы чекбоксов
		oSwitcher - ссылка на объект, который выступает в роли включателя и выключателя
		*/
		/* Отмечает или снимает отметку с группы чекбоксов с именем sGroupName из 
		переключателя oSwitcher в форме (<form/>) */
		var oForm = oSwitcher.form;
		var oElemsList = oForm[sGroupName];
		var bChecked = (oSwitcher.checked) ? true : false;
		for(var j=0, iLen = oElemsList.length; j<iLen; j++ ) {
			oElemsList[j].checked = bChecked;
		}
	},
	CheckChildGroup : function( sGroupName, oParent, oSwitcher ) {
		/*
		sGroupName - имя группы чекбоксов
		oParent - элемент, в котором находится група чекбоксов
		oSwitcher - ссылка на объект, который выступает в роли включателя и выключателя
		*/
		/*
		Отмечает или снимает отметку в пределах элемента oParent с
		группы чекбоксов с именем sGroupName из переключателя oSwitcher.
		например, если необходимо включить или выключить все дочерние чекбоксы в таблице
		*/
		var aList = oParent.getElementsByTagName('input');
		var _aList=[]; /* в этот массив записываются все чекбоксы с именем sGroupName */
		for(var i=0, iLn=aList.length; i<iLn; i++) {
			if(aList[i].type=='checkbox' && aList[i].name==sGroupName)
				_aList.push(aList[i]);
		}
		var bChecked = (oSwitcher.checked) ? true : false;
		for(var j=0, iLen = _aList.length; j<iLen; j++ ) {
			_aList[j].checked = bChecked;
			if(bChecked) {
				_aList[j].setAttribute('checked', 'checked');
			}
			else {
				_aList[j].removeAttribute('checked');
			}
		}
	},
	DisableGroup : function( sGroupName, oSwitcher ) {
		/*
		sGroupName - имя группы чекбоксов
		oSwitcher - ссылка на объект, который выступает в роли включателя и выключателя
		*/
		/* Дизаблит все чекбоксы с именем sGroupName из переключателя oSwitcher */
		var oForm = oSwitcher.form;
		var oElemsList = oForm[sGroupName];
		var bChecked = (oSwitcher.checked) ? true : false;
		for(var j=0, iLength = oElemsList.length; j<iLength; j++ ) {
			oElemsList[j].disabled = bChecked;
		}
	},
	/* select */
	SelectIndex : function( oSelect, iIndex ) {
		/*
		oSelect - ссылка на выпадающий список или его id
		iIndex - индекс элемента выпадающего списка
		*/
		/* Отмечает выбраным (selected="selected") элемент выпадающего списка oSelect по индексу iIndex */
		oSelect = (typeof oSelect == 'string') ? $(oSelect) : ( (typeof oSelect == 'object') ? oSelect : null );
		
		if(iIndex < oSelect.options.length)
			oSelect.options[iIndex].selected = true;
	},
	SelectPrev : function( oSelect ) {
		/*
		oSelect - ссылка на выпадающий список или его id
		*/
		/* Отмечает выбранным предыдущий элемент списка от текущего выбранного */
		oSelect = (typeof oSelect == 'string') ? $(oSelect) : ( (typeof oSelect == 'object') ? oSelect : null );
		
		var iIndex = oSelect.selectedIndex;
		if(iIndex > 0)
			this.CheckSelect(oSelect, iIndex-1);
		/* location.hash = 'page='+oSelect.selectedIndex; */
	},
	SelectNext : function( oSelect ) {
		/*
		oSelect - ссылка на выпадающий список или его id
		*/
		/* Отмечает выбранным следующий элемент списка от текущего выбранного */
		oSelect = (typeof oSelect == 'string') ? $(oSelect) : ( (typeof oSelect == 'object') ? oSelect : null );
		
		var iIndex = oSelect.selectedIndex;
		var iLimit = oSelect.options.length - 1;
		if(iIndex < iLimit)
			this.CheckSelect(oSelect, iIndex+1);
		/* location.hash = 'page='+oSelect.selectedIndex; */
	},
	
	/* URL */
	GET : function () {
		/* Сбор гет параметров из урла страницы. Возвращает хэш с данными */
		var sPrams = unescape(location.search);
		if(sPrams.substr(0, 1) == '?')
			sPrams = sPrams.substr(1);
		var aParts = sPrams.split('&');
		var oGet = {};
		for(var j=0, iLength = aParts.length; j<iLength; j++) {
			var aElems = aParts[j].split('=');
			oGet[aElems[0]] = aElems[1];
		}
		return oGet;
	},
	GetHash : function() {
		/* Получить значение хеша страницы */
		return location.hash.substr(1);
	},
	SetHash : function( sHash ) {
		/*
		sHash - новое значение хеша страницы
		*/
		/* Устанавливает новое значение хеша страницы */
		var sCurrHash = _MC.GetHash();
		if(sHash != sCurrHash)
			location.hash = sHash;
	},
	
	/* EVENTS */
	bDocumentReady : false,
	DocumentReady : function( aFns ) {
		if(_MC.bDocumentReady)
			return;
		_MC.bDocumentReady = true;
		if( _MC.isIe() ) {
			document.write("<script id=__ie_onload defer src=javascript:void(0)>");
			document.write("<\/script>");
			var script = document.getElementById("__ie_onload");
			script.onreadystatechange = function() {
				if (this.readyState == "complete") {
					for(var i=0, iLn=aFns.length; i<iLn; i++) {
						aFns[i]();
					}
				}
			}
		}
		if( _MC.isFF() || _MC.isOpera() ) {
			_MC.AddEvent(
				document,
				{'DOMContentLoaded': function() {
					document.removeEventListener( 'DOMContentLoaded', arguments.callee, false );
					for(var i=0, iLn=aFns.length; i<iLn; i++) {
						aFns[i]();
					}
				}},
				false
			);
		}
		if( _MC.isSafari() || _MC.isChrome() ) {
			var _timer = setInterval(function() {
				if (/loaded|complete/.test(document.readyState)) {
					clearInterval(_timer);
					delete _timer;
					for(var i=0, iLn=aFns.length; i<iLn; i++) {
						aFns[i]();
					}
				}
			}, 10);
		}
	}	,
	EventList : [] /* массив, в который записуются устанавливаемые обработчики событий */,
	AddEvent : function( oElem, oParams, bCapture ) {
		/*
		oElem - ссылка на элемент, на который вешается обработчик событий
		oParams - хеш, где ключем выступает событие, значением - функция
		bCapture - осанавливать или нет всплытие событий
		*/
		/* Добавление обработчика событий на элемент */
		for(var j in oParams) {
			var bIsType = _MC.AddEventList(oElem, j, oParams[j]);
			if( _MC.isIe()) {
				if(!bIsType) {
					oElem.attachEvent('on'+j, oParams[j]);
					window.event.cancelBubble = true;
					window.event.returnValue = false;
				}
			}
			else
				oElem.addEventListener(j, oParams[j], bCapture);
		}
	},
	DelEvent : function(oElem, oParams, bCapture) {
		/*
		oElem - ссылка на элемент, с которого удаляется обработчик событий
		oParams - хеш, где ключем выступает событие, значением - функция
		bCapture - осанавливать или нет всплытие событий
		*/
		/* Удаление обработчика событий с элемента */
		for(var j in oParams) {
			if( _MC.isIe())
				oElem.detachEvent('on'+j, oParams[j]);
			else
				oElem.removeEventListener(j, oParams[j], bCapture);
			_MC.DelEventList(oElem, j, oParams[j]);
		}
	},
	AddEventList : function( oElem, sType, sFunck ) {
		/*
		oElem - ссылка на элемент, на который вешается обработчик событий
		sType - событие
		sFunck - функция вызываемая в случае возникновения события
		*/
		/* Запись в массив добавляемого события */
		var aList = _MC.EventList;
		var iELen = aList.length;
		var bIsEvent = false;
		for(var i=0; i<iELen; i++) {
			if(aList[i].inArray(oElem) && aList[i].inArray(sType) && aList[i].inArray(sFunck))
			/* if(aList[i][0] == oElem && aList[i][1] == sType && aList[i][2] == sFunck) */
				bIsEvent = true;
		}
		if(!bIsEvent) {
			aList.push([oElem, sType, sFunck]);
		}
		return bIsEvent;
	},
	DelEventList : function( oElem, sType, sFunck ) {
		/*
		oElem - ссылка на элемент, с которого удаляется обработчик события
		sType - событие
		sFunck - функция вызываемая в случае возникновения события
		*/
		/* Удаления из массива события */
		var aList = _MC.EventList;
		var iELen = aList.length;
		for(var i=iELen-1; i>=0; i--) {
			if(aList[i].inArray(oElem) && aList[i].inArray(sType) && aList[i].inArray(sFunck))
			/* if(aList[i][0] == oElem && aList[i][1] == sType && aList[i][2] == sFunck) */
				aList.splice(i, 1);
		}
	}
};

Array.prototype.inArray = function( value ) {
	/* Проверяет содержится ли значение в массиве */
	for (var i=0, iLn=this.length; i<iLn; i++) {
		if (this[i] == value)
			return true;
	}
	return false;
}

function me(sId) {
	/* Шо-то делает */
	return (document.all) ? document.all(sId) : document.getElementById(sId);
}

/* AJAX */
var _AJAX = function( sUrl, sMethod, sFunction, sParams ) {
	/*
	sUrl - url на который посылается запрос
	sMethod - метод get или post
	sFunction - функция-обработчик выполняемая в слычае ответа 200 сервера
	sParams - параметры, необходимо для post запросов
	*/
	/* Посылка запроса на сервер */
	sMethod = (typeof sMethod == 'undefined') ? 'GET' : sMethod;
	sFunction = (typeof sFunction == 'undefined') ? false : sFunction;
	sParams = (typeof sParams == 'undefined') ? ( ( _MC.isIe() ) ? '' : null ) : sParams;
	
	var _this = this;
	
	 
	if( _MC.isIe() ) {
		try {
			this.oLoad = new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch (e) {
			try {
				this.oLoad = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (E) {
				this.oLoad = false;
			}
		}
	}
	else {
		this.oLoad = new XMLHttpRequest();
	}
	
	if (this.oLoad) {
		this.oLoad.open(sMethod, sUrl, true);
		if (sMethod.toLowerCase() == 'post') {
			this.oLoad.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			this.oLoad.setRequestHeader("Content-length", sParams.length);
			this.oLoad.setRequestHeader("Connection", "close");
		}
		this.oLoad.setRequestHeader("X-Requested-With", "XMLHttpRequest");
		if (sFunction) {
			this.AnswerFunc = sFunction;
			this.ReqTimer = null;
			this.oReqState = function() {
				/* Получаем состояние готовности сервера выдать ответ */
				if(_this.ReqTimer != null) {
					clearTimeout(_this.ReqTimer);
				}
				
				if(_this.oLoad.readyState == 4) {
					if (_this.oLoad.status == 200) {
						_this.AnswerFunc(_this.oLoad);
					}
					clearTimeout(_this.ReqTimer);
					_this.ReqTimer = null;
				}
				else {
					_this.ReqTimer = setTimeout(_this.oReqState, 10);
				}
			}
			this.oReqState();
		}
		this.oLoad.send( unescape(sParams) );
	}
	else
		return false;
}