//%d >>> API >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

function have(s){return (navigator.userAgent.indexOf(s) != -1);}
var gsVer = navigator.appVersion.substring(0,3);
var bIE = have("MSIE");
var bNetscape = have("Netscape");
var bOpera = have("Opera");
var bMozilla = have("Mozilla");
var bCompatible = have("compatible");
var bFirefox = have("Firefox");
var bGecko = have("Gecko");
var bSpoofer = have("spoofer");
var bhotjava = have("hotjava");
var bwebtv = have("webtv");


var gs_ua = navigator.userAgent.toLowerCase();
var gbIE = (bIE && bMozilla && bCompatible && !bOpera && !bNetscape); //  && gsVer == "4.0"
var gbOP = bOpera;
var gbFF = (bMozilla && bFirefox && gsVer == "5.0"  && !bCompatible && !bNetscape); // Firefox
var gbMOZ = (bMozilla && !bFirefox && gsVer == "5.0" && !bCompatible && !bNetscape ); //Browser = "Mozilla";{
var gbNN = ((bMozilla && gsVer == "4.8") || bNetscape); //  	Browser = "Netscape";
var gbCSS1Compat = ("undefined" == typeof document.compatMode) ? false : ("CSS1Compat" == document.compatMode);

var gbIEOP = gbIE || gbOP;
var gbIEOPFF = gbIE || gbOP || gbFF;

function getEL(sID) { return document.getElementById(sID); }

function getObj(sID) {
	if (document.getElementById) {
		this.obj = document.getElementById(sID);
		if (!this.obj) return;
		this.style = this.obj.style;
		this.runtimeStyle = gbIE ? this.obj.runtimeStyle : this.obj.style;
		this.currentStyle = gbIE ? this.obj.currentStyle : this.obj.style;
	} else if (document.all) {
		this.obj = document.all[sID];
		if (!this.obj) return;
		this.style = this.obj.style;
		this.runtimeStyle = gbIE ? this.obj.runtimeStyle : this.obj.style;
		this.currentStyle = gbIE ? this.obj.currentStyle : this.obj.style;
	}
}

function getCollection(sName) {
	if (document.getElementById) return document.getElementsByName(sName);
	else if (document.all) return document.all[sName];
}

function setValueById(sID, vVal) {
	var obj = document.getElementById(sID);
	if (!obj) return false;
	try {
		obj.value = vVal;
		return true;
	} catch (e) {
		return false;
	}
}

function getValueById(sID) {
	var obj = document.getElementById(sID);
	if (!obj || obj.value == null) return null;
	return obj.value;
}

function getIntValueById(sID) { return strToInt(getValueById(sID)) }


/** findPrecedingElementById
 * Поиск элемента с заданным ID по оси предков
 * @argument obj: element
			Элемент, начиная с которого осуществляется поиск
 * @argument sSearchId: string
			ID искомого элемента.
 * @argument iMaxLevels: optional integer default 5
			Максимальное количество уровней поиска вверх по оси предков.
 * @return type element | null
 */
function findPrecedingElementById(obj, sSearchId, iMaxLevels) {
	var i = 0;
	if (!iMaxLevels) iMaxLevels = 5;
	while ((obj.id != sSearchId) && (obj.tagName != 'BODY') && i < iMaxLevels) {
		obj = obj.parentNode;
		i++;
	}
	return ((obj.id == sSearchId) ? obj : null);
}
//%d ----  COOKIES ---------------------------------------------------
function Get_Cookie(name) {
	if (!navigator.cookieEnabled) return null;

	var arrCookies = document.cookie.split("; ");
	for (var i in arrCookies) {
		var sCookie = arrCookies[i];
		if (sCookie.split("=")[0] == name) {
			sCVal = sCookie.split("=")[1];
			if (!sCVal) return null;
			return unescape(sCVal);
	 }
	}
	return null;
}

function Set_Cookie(name,value,expires,path,domain,secure) {
  	if (!navigator.cookieEnabled) return;
		if (value == null || value == '' )return;
		var cookieString = name + "=" +escape(value) +
       ( (expires) ? ";expires=" + expires.toGMTString() : "") +
       ( (path) ? ";path=" + path : "") +
       ( (domain) ? ";domain=" + domain : "") +
       ( (secure) ? ";secure" : "");
		//alert("Set_Cookie()\n" + cookieString);
		document.cookie = cookieString;
		//Get_Cookie(name);
		//alert("Get_Cookie('" + name + "')\n" + Get_Cookie(name));
}

function Delete_Cookie(name,path,domain) {
   if (!navigator.cookieEnabled) return;
   if (Get_Cookie(name)) document.cookie = name + "=" +
      ( (path) ? ";path=" + path : "") +
      ( (domain) ? ";domain=" + domain : "") +
      ";expires=Thu, 01-Jan-70 00:00:01 GMT";
}

/** setCookieByArray
 * Сохраняет в Cookie данные из двумерного массива
 * @argument arr: array
		  arr[i][0] - Cookie name, arr[i][1] - Cookie value
 */
function setCookieByArray(arr){
	var cookie_expire_date = new Date((new Date()).getTime() + (3 * 365 * 86400000)); // + 3 years
  for(var i = 0; i < arr.length; i++)  Set_Cookie(arr[i][0],arr[i][1],cookie_expire_date);
}
//%d ----  EVENTS ---------------------------------------------------
/** cancelEvent
 * Кроссбраузерная отмена событи
 * @argument optional e: event
		 событие, которое нужно отменить
 * @return boolean
		 всегда возвращает false
 */
function cancelEvent(e) {
	e = e ? e : (window.event ? event : null);
	if (e.stopPropagation) e.stopPropagation();
	e.cancelBubble = true;
	if (e.preventDefault) e.preventDefault();
	e.returnValue = false;
	return false;
}
/** getEventTarget
 * Кроссбраузерное получение элемента, в котром произошло событие
 * @argument optional e: event
		 событие
 * @return type element
		 элемент, в котром произошло событие
 */
function getEventTarget(e) {
	e = e ? e : (window.event ? event : null);
	if (!e) return null;
	var targ = (e.target) ? e.target : (e.srcElement ? e.srcElement : null);
	if (targ && targ.nodeType == 3) targ = targ.parentNode; // defeat Safari bug
	return targ;
}
/** APIattachEvent
 * Кроссбраузерное подключение обработчика к событию
 * @argument obj: element
		 элемент, к событию которого подключается обработчик
 * @argument sEvent: string
		 низвание подключаемого события без приставки "on". Например: <i>keypress</i>
 * @argument fpNotify: function
		 ссылка на функцию - обработчик события. Функция может получать аргумент - event
 * @argument optional bSetCapture: boolean = false
		 флаг запрета всплывания события. Если true, то всплывание события запрещается.
 */
function APIattachEvent(obj, sEvent, fpNotify, bSetCapture) {
	if (obj.addEventListener) { // Mozilla, Netscape, Firefox
		obj.addEventListener(sEvent, fpNotify, bSetCapture);
	} else if (obj.attachEvent) { // IE
		obj.attachEvent('on' + sEvent, fpNotify);
		if (bSetCapture) obj.setCapture();
	}
}
/** APIdetachEvent
 * Кроссбраузерное отключение обработчика от события.
 * @argument obj: element
		 элемент, от события которого отключается обработчик
 * @argument sEvent: string
		 низвание события без приставки "on". Например: <i>keypress</i>
 * @argument fpNotify: function
		 ссылка на отключаемую функцию - обработчик события.
 * @argument optional bReleaseCapture: boolean = false
		 флаг отключения запрета всплывания события. Если true, то зпрет на всплывание события отключается.
 */
function APIdetachEvent(obj, sEvent, fpNotify, bReleaseCapture) {
	if (window.removeEventListener) { // Mozilla, Netscape, Firefox
		obj.removeEventListener(sEvent, fpNotify, bReleaseCapture);
	} else if (obj.detachEvent) { // IE
		obj.detachEvent('on' + sEvent, fpNotify);
		if (bReleaseCapture) obj.releaseCapture();
	}
}
/** AddCodeToHandler
 * Добавляет код sCode к событиям sEventName элемента el.
 * Новый код добавляется после существующего.
 * (Повторное добавление уже существующего кода в этой реализации не исключается)
 * @argument el: element
		 Элемент, к которому добавляется событие
 * @argument sEventName: string
		 Имя события (например: <i>onkeypress<i>)
 * @argument sCode: string
		 Код JavaScript, который будет добавлен в конец существующего кода обработчика
 */
function AddCodeToHandler(el, sEventName, sCode) {
	if (el.id == 'dateddCarRegDate') auxadd("sEventName = " + sEventName + ' sCode = ' + sCode);
	var s = '';
	var args = '';
	var functionBody = '';
	eval("if (el." + sEventName + ") s = el." + sEventName + ".toString();");
	if ('' != s) {
		s = Trim(s.replace(/\s+/g, " "));
		re = /function ([^\(]*)\(([^\)]*)\) \{(.+)\}\s*$/;
		if (null != re.exec(s)) {

			// RegExp.$1 - function name; RegExp.$2 - argument(s); RegExp.$3 - function body
			args = RegExp.$2;
			functionBody = (Trim(RegExp.$3) + ";").replace(/;;/g, ";"); // добавляем замыкающую точку с запятой; (если нужно)
		}
	}
	functionBody += sCode;
	var reSlash = /\\/g;
	functionBody = functionBody.replace(reSlash, "\\u005C").replace(/"/g, "\\u0022").replace(/[\r|\n]/g, "\\n");
	eval('el.' + sEventName + ' = new Function(' + (('' == args) ? '' : '"' + args + '",') + '"' + functionBody + '");');
}

/** preservPageSelection
 * Кроссбраузерная подвязка обработчиков, предотвращающих выделение на странице
 */
function preservPageSelection() {
	document.onselectstart = function() { // для IE
		var et = event.srcElement.tagName;
		return ("INPUT" == et || "TEXTAREA" == et);
	}
	document.onmousedown = function(e) { // для FF и  OPERA
		var et = getEventTarget(e).tagName;
		return ("INPUT" == et || "TEXTAREA" == et || "SELECT" == et) ? true : cancelEvent(e);
	}
}

// функция - пустышка
function returnTrue() { return true; }
function returnEmptyString() { return ''; }

//%d ----  Select & Move Range --------------------------------------

/** setSelectedRange
 * Кроссбраузерное выделение фрагмента текста в поле ввода.
 * @argument oEL: element
			Элемент Input type text или textarea
 * @argument iStart: integer
			Позиция начала выделения.
 * @argument iEnd: integer
			Позиция конца выделения.
 */
function setSelectedRange(oEL, iStart, iEnd) {
	if (!iEnd) iEnd = oEL.value.length;

	// NOTE: Strange - should be able to put caret at start of text?
	// Mozilla
	// parts borrowed from http://www.faqts.com/knowledge_base/view.phtml/aid/13562/fid/130
	if (oEL.setSelectionRange) {
		oEL.focus();
		oEL.setSelectionRange(iStart, iEnd);

	//auxadd("oEL.setSelectionRang --- eiStart = " + iStart + " iEnd = " + iEnd);
	} else if (oEL.createTextRange) { // IE
		//auxadd("oEL.createTextRange --- eiStart = " + iStart + " iEnd = " + iEnd);
		var range = oEL.createTextRange();
		with (range) {
			collapse(true);
			moveEnd('character', iEnd);
			moveStart('character', iStart);
			select();
		}
	} else {//otherwise try the event-creation hack (our own invention)
		// do we need these?
		//oEL.value = oEL.value;
		//oEL.blur();
		//oEL.focus();
		// figure out how far back to go
		var dist = parseInt(oEL.value.length) - iEnd;
		var tchar = String.fromCharCode(37);
		var tcc = tchar.charCodeAt(0);
		for (var x = 0; x < dist; x++) {
			var te = document.createEvent("KeyEvents");
			te.initKeyEvent("keypress", true, true, null, false, false, false, false, tcc, tcc);
			oEL.dispatchEvent(te);
		}
	}
}
/** setCaretPos
 * Кроссбраузерное перемещение курсора в указаную позицию в тексте в поле ввода.
 * @argument oEL: element
			Элемент Input type text или textarea
 * @argument iPos: integer
			Позиция, в которую следует переместить курсор. 0 - начало строки.
 */
function setCaretPos(oEL, iPos) { setSelectedRange(oEL, iPos, iPos); }

/** MoveCursorToTheEndOfText
 * Кроссбраузерное перемещение курсора в конец текста в поле ввода.
 * @argument oEL: element
			Элемент Input type text или textarea
 */
function MoveCursorToTheEndOfText(oEL) { setCaretPos(oEL, oEL.value.length); }

/** getSelectionStart
 * Кроссбраузерное получение позиции курсора в тексте поля ввода.
 * @argument oEL: element
			Элемент Input type text или textarea
 * @return integer
			позиция курсора от начала текста
 */
function getSelectionStart(oEL) {
	var iCaretPos = 0;
	if (document.selection) { // IE
		oEL.focus();
		var oSel = document.selection.createRange();
		oSel.moveStart('character', -oEL.value.length);
		iCaretPos = oSel.text.length;
	}
	// Firefox support
	else if (oEL.selectionStart || oEL.selectionStart == '0') iCaretPos = oEL.selectionStart;
	return (iCaretPos);
}
//%d ----  Work With Simple Types -----------------------------------
/** strToInt
 * Преобразует string в integer
 * @argument sValue string | variant
 * @return integer
 * Если строка пустая, равна null, начинается не с цифры или равна "0", то вернет 0. Иначе - число.
 * Лидирующие нули, типа 0999 - игнорируются.
*/
function strToInt(sValue) {
	var iVal = parseInt(parseFloat(sValue));
	return (isNaN(iVal) ? 0 : iVal)
}

function Trim(sStr) {
	 var re = /(^\s*)|(\s*$)/g;
	 //sStr = sStr.replace(re, "");
	 return  sStr;
}

/** dateToStr
 * Возвращает дату в формате dd/mm/yyyy.
 * @argument dDate: date
 * @return type string
 */
function dateToStr(dDate) {
	if (dDate == null) return '';
	var dd = dDate.getDate();
	if ( dd < 10 ) dd = '0' + dd;
	var mm = dDate.getMonth() + 1;
	if ( mm < 10 ) mm = '0' + mm;
	return (dd + '/' + mm + '/' + dDate.getFullYear());
}
/** strToDate
 * Парсит строку формата dd/mm/yyyy и возвращает об`ект Date
 * Если строку распарсить не удалось, то возвращает null
 * @argument sDate: string
   дата в формате dd/mm/yyyy.
 * @return type date | null
 */
function strToDate(sDate) {
	var reDDMMYYYY = /^([0-3]\d)\/([0-1]\d)\/([1-2]\d\d\d)$/;
	if(!sDate || !reDDMMYYYY.exec(sDate)) return null;
	var d = new Date(RegExp.$3,RegExp.$2,RegExp.$1,0,0,0,0);
	return d;
}

//%d ----  Вспомогательные функции ----------------------------------
/** fullYearsAge
 * Возвращает количество полных лет со дня рождения до сегодняшней даты.
 * @argument dBirthDate: date
	   дата рождени
 * @return type integer | null
 */
function fullYearsAge(dBirthDate){
	try{
		var dCurr = new Date();
		dCurr.setHours(0, 0, 0, 0);
		return iAge = dCurr.getFullYear() - dBirthDate.getFullYear() -
		 ( (dCurr.getMonth() < dBirthDate.getMonth()
		  || (dCurr.getMonth() == dBirthDate.getMonth() && dCurr.getDate() < dBirthDate.getDate()) ) ? 1 : 0 );
	}catch(e){ return null;}
}  // fullYearsAge
/** getWordYear
 * Возвращает грамматически правильно сформированное количество лет.
 * @argument iYear: integer
		 количество лет
 * @return type string
 */
function getWordYear(iYear){
		switch(iYear){
		  case 1:
				return iYear + ' год';
		  case 2:; case 3:;  case 4:;
				return  iYear + ' года';
		  default:
				return  iYear + ' лет';
		}
}  // getWordYear()
function GetScriptEngineInfo(){  // Только для IE
    var s;
    s = ""; // Build string with necessary info.
    s += ScriptEngine() + " Version ";
    s += ScriptEngineMajorVersion() + ".";
    s += ScriptEngineMinorVersion() + ".";
    s += ScriptEngineBuildVersion();
    return(s);
}
//%d ----  AUX ------------------------------------------------------
function getAUX(){
	 var oAux = document.getElementById('AUX');
	 if (oAux) return oAux;
	 var oBody = document.getElementsByTagName('body')[0];
	 oAux = oBody.appendChild(document.createElement("div"));
	 oAux.id = 'AUX';
	 oAux.className = 'AUX';
	 return oAux;
}

function aux_core(s,iMode,bDrowNumber){
	s += '';
	if ( typeof window.auxMesageCount == 'undefined') window.auxMesageCount = 0;
	var oAux = getAUX();
	var sMsgHTML = '<span class="resultMessage">' + s + '</span>';
	if (!iMode){  // замена
		if (Trim(s) == ''){
		  oAux.className = "Result";
			oAux.innerHTML = '';
	    window.auxMesageCount = 0;
		}
		else {
		  oAux.className = "ResultActive";
      oAux.innerHTML = sMsgHTML;
	    window.auxMesageCount = 1;
		}
		return;
	}

	else{
		if (Trim(s) == ''){
			if (Trim(oAux.innerHTML) == ''){
		  	oAux.className = "Result";
				oAux.innerHTML = '';
	    	window.auxMesageCount = 0;
			}
			return;
		}
		else {
			if ( bDrowNumber ) sMsgHTML = '<span class="messageNumber">' + window.auxMesageCount + '</span>' + sMsgHTML;
			switch(iMode){
			  case 2: // сверху
    	    sMsgHTML = sMsgHTML + '<br />' + oAux.innerHTML;
			    break;
			  case 1: // снизу '<br />' +
			  default:
    	    sMsgHTML = oAux.innerHTML + '<br />' + sMsgHTML;
			    break;
			}
			oAux.className = "ResultActive";
	  	window.auxMesageCount ++;
			oAux.innerHTML = sMsgHTML;
		}
	}
}  // aux_core

function aux(s) { aux_core(s,0,true); }
function auxadd(s) { aux_core(s,1,true); }
function auxtop(s) { aux_core(s,2,true); }

//<<<<<<<<<<<< Eof API <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

function newImage(arg) {
	if (document.images) {
		rslt = new Image();
		rslt.src = arg;
		return rslt;
	}
}

var arrGlobImgSrc = new Array();
var arrGlobImg = new Array();

function processHLImg() {
	var oCol = getCollection("mo");
	var src, srcHL, el;
	for (var i = 0; i < oCol.length; i++) {
		el = oCol[i];
		src = el.src;
		srcHL = src.replace(/^(.+)(\..{3})$/, "$1_hl$2");
		el.onmouseover = new Function("this.src='" + srcHL + "'");
		el.onmouseout = new Function("this.src='" + src + "'");
		el.parentNode.onmouseover = new Function("this.firstChild.src='" + srcHL + "'");
		el.parentNode.onmouseout = new Function("this.firstChild.src='" + src + "'");
		arrGlobImgSrc[arrGlobImg.length] = srcHL;
	}
	if (document.images) {
		for (var i = 0; i < oCol.arrGlobImgSrc; i++) {
			arrGlobImg[i] = newImage(oCol.arrGlobImgSrc[i]);
		}
	}
}

function stupidIE(){getEL('footer').className = 'footer';}

// флаг загрузки модуля.
var gb_api_js = true;
