/*
долго работает, если много ссылок на странице
function wlSetup() {
	if (document.all && document.all.item) { // MSIE
		//var i,l=document.links;
		var i,l=document.getElementsByTagName('a');
		//alert('l= '+l+', l.length= '+l.length);
		for(i=0;i<l.length;i++) {
			if (l[i].parentNode.className=='moreall') l[i].onclick=function() {this.blur();}
			else l[i].onfocus=function() {this.blur();}
		}
	}
}
addLoadEvent(wlSetup);*/

function $() {
	//var isDOMTmp = (isDOM==undefined) ? false : true ;
	var isDOMTmp = (document.getElementById) ? true : false ;
	var elements = new Array();
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string') {
			//element = document.getElementById(element);
			element = (isDOMTmp) ? document.getElementById(element) : document.all[element] ;
		}
		if (arguments.length == 1) return element;
		elements.push(element);
	}
	return elements;
}



/*
Расширенный вариант document.createElement 
Обновление до 2.1
Теперь прототипированные свойства пропускаются только если они не были перегружены
*  Creates element all-at-once
*
*  @param string tag name
*  @param hash tag element properties { 'class' : 'className',
*                                       'style' : { 'property' : value, ... },
*                                       'event' : { 'eventType' : handler, ... },
*                                       'child' : [ child1, child2, ...],
*                                       'param' : { 'property' : value, ... },
*  @return DOMObject created element or false
*  @access public
*/
document.createElementExt = function (tag,p) {
  var L, i, k, el = document.createElement(tag);
  if (!el) return false;
  for (i in p) {
    if (p.constructor.prototype[i] && p[i] === p.constructor.prototype[i]) continue;
    switch (i) {
      case "class" : el.setAttribute('className',p[i]); el.setAttribute('class',p[i]); break;
      case "style" : for (k in p[i]) { if (p[i].constructor.prototype[k] && p[i][k] === p[i].constructor.prototype[k]) continue; el.style[k] = p[i][k]; } break;
      case "event" : for (k in p[i]) { if (p[i].constructor.prototype[k] && p[i][k] === p[i].constructor.prototype[k]) continue; el.attachEvent(k,p[i][k]); } break;
      case "child" : L = p[i].length; for (k = 0; k<L; k++) el.appendChild(p[i][k]); break;
      case "param" : for (k in p[i]) { if (p[i].constructor.prototype[k] && p[i][k] === p[i].constructor.prototype[k]) continue; try { el[k] = p[i][k] } catch(e) {} } break;
    }
  }
  return el;
}



/*
Функция getElementsByClass выбирает элементы по имени класса, и к удивлению разработчиков, она не является настоящим методом DOM, 
как они могли бы подумать. в конце концов, есть getElementById, getElementsByName(), getElementsByTagName, куда, к чертям, делась getElementsByClass?
*/
function getElementsByClass (searchClass, tag, node) {
	//alert('searchClass= '+searchClass);
	//alert('searchClass= '+searchClass+', node= '+node+', tag= '+tag);
	var classElements = new Array();
	if (node==undefined || node==null || node=='') node = document;
	if (tag==undefined || tag==null || tag=='') tag = '*';
	var els = node.getElementsByTagName(tag);
	var elsLen = els.length;
	/*var pattern = new RegExp(\"(^|\\s)\"+searchClass+\"(\\s|$)\");*/
	var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
	for (i = 0, j = 0; i < elsLen; i++) {
		if ( pattern.test(els[i].className) ) {
			classElements[j] = els[i];
			j++;
		}
	}
	return classElements;
}


/*
Конечно же, скрепка для прикрепления события! Плюс несколько незначительных синтаксических правок. 
вот оригинал, с которого всё началось: http://www.dustindiaz.com/rock-solid-addevent/
Пример:
addEvent(window,’load’,func1,false);
addEvent(window,’load’,func2,false);
*/
function addEvent (elm, evType, fn, useCapture) {
	if (elm.addEventListener) {
		elm.addEventListener(evType, fn, useCapture);
		return true;
	} else if (elm.attachEvent) {
		var r = elm.attachEvent('on' + evType, fn);
		return r;
	} else {
		elm['on' + evType] = fn;
	}
}


/*
Изначально написанная Саймоном Виллисоном (Simon Willison: http://simon.incutio.com/archive/2004/05/26/addLoadEvent)
Простой способ добавить события, запускающиеся после загрузки страницы.
Функция прикрепляет все ваши события к обработчику события onload.
Пример:
addLoadEvent(func1);
addLoadEvent(func2);
*/
function addLoadEvent (func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() {
			oldonload();
			func();
		}
	}
}


/*Вычисляем значение свойства элемента, заданое в CSS свойстве через тэг <STYLE></STYLE> или внешние листы стилей, а не инициализировано через скрипт*/
function getElementComputedStyle (elem, prop) {
  if (typeof elem!="object") elem = $(elem);
  // external stylesheet for Mozilla, Opera 7+ and Safari 1.3+
  if (document.defaultView && document.defaultView.getComputedStyle)
  {
    if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
    return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
  }
  // external stylesheet for Explorer and Opera 9
  if (elem.currentStyle)
  {
    var i;
    while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
    return elem.currentStyle[prop];
  }
  return "";
}

// сдвигает скроллинг к нужному объекты по вертикали
function scrollToObj (obj) {
	//alert('typeof(objId)= '+typeof(objId));
	if (typeof obj!='object') obj = $(obj);
	if (obj!=undefined && obj.offsetTop!=undefined) {
		var currentYPos = 0;
		var step = 10;
		if (document.body && document.body.scrollTop) currentYPos = document.body.scrollTop;
		else if (document.documentElement && document.documentElement.scrollTop) currentYPos = document.documentElement.scrollTop;
		else if (window.pageYOffset) currentYPos = window.pageYOffset;
		//alert('currentYPos= '+currentYPos);
		objYPos = obj.offsetTop;
		//alert('objYPos= '+objYPos);
		if (objYPos>currentYPos) {
			if ((objYPos-currentYPos)>400) step = 30;
			for(i=currentYPos;i<=objYPos;i+=step) {
				window.scrollTo(0,i);
				if ((objYPos-i)<=200) step = 10;
				if ((objYPos-i)<=70) step = 3;
				if ((objYPos-i)<=20) step = 1;
			}
		} else if (objYPos<currentYPos) {
			if ((currentYPos-objYPos)>400) step = 30;
			for(i=currentYPos;i>=objYPos;i-=step) {
				window.scrollTo(0,i);
				if ((i-objYPos)<=200) step = 10;
				if ((i-objYPos)<=70) step = 3;
				if ((i-objYPos)<=20) step = 1;
			}
		}
	}
}

// изменяет нужное свойство объекта на новое, старое при этом сохраняет в виде `pName+Original` атрибута тега
function chObjPart (obj, pName, pNew) {
	//var obj = $(objId);
	if (typeof obj!='object') var obj = $(obj);
	if (obj!=undefined) {
		var objAttrOrig = obj.getAttribute(pName+'Original');
		var objAttrStyleOrig = getElementComputedStyle(obj,pName);
		if (objAttrOrig==undefined || objAttrOrig==null) {
			obj.setAttribute(pName+'Original',objAttrStyleOrig);
			objAttrOrig = obj.getAttribute(pName+'Original');
		}
		obj.style[pName] = (objAttrOrig==objAttrStyleOrig) ? pNew : objAttrOrig ;
	}
}

// Вкл./Выкл. информационной панели в админке
function adm_infoBlock (obj,v) {
	if (v==undefined) v='5px';
	chObjPart('infoBlock','width',v);
	chObjPart('infoBlock','visibility','hidden');
	//chObjPart('infoBlock','display','none');
	if (obj!=undefined) {
		($('infoBlock').style.visibility=='hidden') ? obj.className = 'hidden' : obj.className = '' ;
	}
	return false;
}


/*
выключаем все элементы формы
disable: function(form) {
    form = $(form);
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.blur();
      element.disabled = 'true';
    }
    return form;
  },

  enable: function(form) {
    form = $(form);
    var elements = Form.getElements(form);
    for (var i = 0; i < elements.length; i++) {
      var element = elements[i];
      element.disabled = '';
    }
    return form;
  },
*/


function trim(str) {
    return str.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, '');
}


function fixPNG (ob) {
	// Если браузер IE версии 5.5-6
	if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)) {
		var src;
		//var sizingMethod = 'scale';
		var bgImg = ob.currentStyle.backgroundImage || style.backgroundImage;
		if (ob.tagName=='IMG') { // Если текущий элемент картинка (тэг IMG)
			if (/\.png$/.test(ob.src)) { // Если файл картинки имеет расширение PNG
				src = ob.src;
				ob.src = "/themes/.public/images/s.gif"; //заменяем изображение прозрачным gif-ом
				//ob.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='"+sizingMethod+"')";
				ob.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='scale')";
			}
		} else if (bgImg!=undefined && bgImg!='none') { // иначе, если это не картинка а другой элемент
			// если у элемента задана фоновая картинка, то присваеваем значение свойства background-шmage переменной src
			src = bgImg.match(/url\("(.+\.png)"\)/i);
			if (src!=undefined && src.length!=undefined) {
				//alert('bgPosX= '+bgPosX+', bgPosY= '+bgPosY);
				src = src[1]; //берем из значения свойства background-шmage только адрес картинки
				ob.runtimeStyle.backgroundImage="none"; //убираем фоновое изображение
				//sizingMethod = 'crop';
				//ob.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='"+sizingMethod+"')";
				ob.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "',sizingMethod='crop')";
			}
		}
	}
	return false;
}


function inArray (value) {
	var i;
	for (i=0; i < this.length; i++) {
		if (this[i] === value) {
			return true;
		}
	}
	return false;
}


// для замены бакграундного изображения на другое
function mnPctRpl (pictName, skinName, objName, pos) { // v, pict_name
	var pictName = (pictName!=undefined) ? pictName : '' ;
	var objName = (objName!=undefined && objName!='') ? objName : 'menubasicf3' ;
	var position = (pos!=undefined && pos!='') ? pos : 'left top' ;
	var obj = $(objName);
	var path = (skinName!=undefined && skinName!='') ? '/themes/'+skinName+'/images/bonus_pict/' : '/themes/.default/images/bonus_pict/' ;
	//alert('path+pictName= '+path+pictName);
	obj.style.backgroundImage = (pictName!=undefined && pictName!='') ? 'url('+path+pictName+')' : obj.style.backgroundImage = 'none' ; //убираем фоновое изображение
	obj.style.backgroundRepeat = 'no-repeat';
	obj.style.backgroundPosition = position;
	//alert('obj.style.backgroundImage= '+obj.style.backgroundImage);
}


/*
// Вызов: javascript: void(addBookmark())
function addBookmark (url, title) {
	if (!url) url = location.href;
	if (!title) title = "Lagam.net - Русский сервер Lineage2";
	if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function")) window.sidebar.addPanel (title, url, "");
	else if (typeof window.external == "object") window.external.AddFavorite(url, title);
	else if (window.opera && document.createElement) {
		var a = document.createElement('A');
		if (!a) return false; //IF Opera 6
		a.setAttribute('rel','sidebar');
		a.setAttribute('href',url);
		a.setAttribute('title',title);
		a.click();
	} else return false;
	return true;
}
*/
// Вызов: javascript: void(addfav('http://kino.br.by/','Kino.br.by - Смотрите, что идет!')) или javascript: void(addfav())
function addfav (url, title) {
	if (!url) url = location.href;
	if (!title) title = "";
	if (document.all) window.external.AddFavorite(url,title);
	else if (window.sidebar) window.sidebar.addPanel(title,url,"");
	else return false;
	return true;
}


function printit() {
	var browser_name = navigator.appName;
	if (browser_name == "Netscape") {
		window.print();
		//window.close();
	} else {
		var WebBrowser = '<object id="WebBrowser1" width=0 height=0 classid="clsid:8856F961-340A-11D0-A96B-00C04FD705A2"></object>';
		document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
		WebBrowser1.ExecWB(6,2);
		//window.close();
	}
}


/*
 * Displays an confirmation box beforme to submit a "DROP/DELETE/ALTER" query.
 * This function is called while clicking links
 * @param   object   the link
 * @param   object   the sql query to submit
 * @return  boolean  whether to run the query or not
 */
function confirmLink (thisis, question, query, id) {
	if (thisis!=undefined && question!=undefined && question!='') {
		//if (question == '' || typeof(window.opera) != 'undefined') {
			//return true;
		//}
		//var is_confirmed = confirm(question + ':\n`' + query + '`');
		if (query!=undefined && query!='') question += ':\n`'+query+'`';
		if (id!=undefined && id!='' && id!=0) question += '\n(id:'+id+')';
		var is_confirmed = window.confirm(question);
		if (is_confirmed) {
			thisis.href += '&confirm=1';
		}
		return is_confirmed;
	} else return true;
}


// передаем обект поля для ввода и текст. Ф-ия срабатывает по событиям "onfocus()" и "onblur()". Возвращает текст или ничего.
function inputReplace (obj, v) {
	if (obj.value=='') obj.value = v;
	else if (obj.value==v) obj.value = '';
}


// вкл./выкл. слоя
function layerDysplay (layerName, flag) {
	var currElement = $(layerName);
	if (currElement) {
		if (flag != undefined) {
			if (flag == 'block') currElement.style.display = 'block';
			//else if (flag == 'table') currElement.style.display = 'table';
			else currElement.style.display = 'none';
		} else {
			if (currElement.style.display == 'block') currElement.style.display = 'none';
			//if (currElement.style.display == 'table') currElement.style.display = 'none';
			else currElement.style.display = 'block';
			//else currElement.style.display = 'table';
		}
	}
}
// вкл./выкл. слоя, версия layerDysplay, только компактнее...
function toggle (obj) {
	var el = $(obj);
	if ( el.style.display != 'none' ) {
		el.style.display = 'none';
	} else {
		el.style.display = '';
	}
}


/**
 * Checks/unchecks all tables
 * @param   string   the form name
 * @param   boolean  whether to check or to uncheck the element
 * @return  boolean  always true
 */
function setCheckboxes (the_form, the_select, do_check) {
	//alert('the_form= '+the_form+', the_select= '+the_select+', do_check= '+do_check);
	//var elts = document.forms[the_form].elements[the_select]; // 'selected_tbl[]'
	var elts = document.forms[the_form].elements[the_select];
	//alert('elts= '+elts);
	//alert('typeof(elts)= '+typeof(elts));
	//alert('typeof(document.forms['+the_form+'].elements['+the_select+'2])= '+typeof(document.forms[the_form].elements[the_select2]));
	//if (typeof(elts)!=undefined) {
	if (elts!=undefined) {
		//var elts_cnt  = elts.length;
		//alert('elts.length= '+elts.length);
		for (var i=0; i<elts.length; i++) {
			//alert('i= '+i);
			if (do_check!=undefined) {
				elts[i].checked = do_check;
			} else {
				//alert('elts['+i+'].checked= '+elts[i].checked);
				elts[i].checked = (elts[i].checked==true) ? false : true ;
			}
		} // end for
	}
	return true;
} // end of the 'setCheckboxes()' function


/**
  * Checks/unchecks all options of a <select> element
  * @param   string   the form name
  * @param   string   the element name
  * @param   boolean  whether to check or to uncheck the element
  * @return  boolean  always true
  */
function setSelectOptions(the_form, the_select, do_check) {
    var selectObject = document.forms[the_form].elements[the_select];
    var selectCount  = selectObject.length;
    for (var i=0; i<selectCount; i++) {
        selectObject.options[i].selected = do_check;
    } // end for
    return true;
} // end of the 'setSelectOptions()' function