var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1;
var isIE56=(/MSIE (5\.5|6).+Win/.test(navigator.userAgent));
var isMoz = document.implementation && document.implementation.createDocument;

//Получение элементов по ID, с опциональным кэшированием
var ElementsCache = {};
function add_to_el_cache(v) {return ElementsCache[v]=document.getElementById(v)}
function $(v) {return ElementsCache[v] || add_to_el_cache(v)}
function $S(v) {return $(v).style;}
function $n(v) {return document.getElementById(v);}

//Просмотр массива
function print_r(arr,type) {
    var str='';
    for (var i in arr) {
    	if(arr[i]!=undefined) str+=i+' => '+arr[i]+'; \n';
    }
    if(type==1) return str;
    alert(str);
}

function cFalse() {return false;}
function noFocus() {this.blur();}
 
//Получение абсолютных координат элемента
function getElementPosition(elemId) {    var elem = typeof(elemId)=="string" ? $n(elemId) : elemId;
    var w = elem.offsetWidth, h = elem.offsetHeight, l = 0, t = 0;

    while (elem) {
        l += elem.offsetLeft;
        t += elem.offsetTop;
    	elem = elem.offsetParent;
    }

    return {"left":l, "top":t, "width":w, "height":h};
}

//Получает координаты мыши из переданного события
function GetMouse(e) {
	var ev = e || window.event;
	return {
		x: parseInt((ev.pageX || ev.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft) || 0, 10),
		y: parseInt((ev.pageY || ev.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop) || 0, 10)
	}	
}

//Определяет нажатую кнопку мыши из переданного события
function GetButton(e) {
	var ev = e || window.event;
	if (ev.type=='contextmenu') return "RIGHT";
	if (ev.which == null) button= (ev.button < 2) ? "LEFT" : ((ev.button == 4) ? "MIDDLE" : "RIGHT");
	else button= (ev.which < 2) ? "LEFT" : ((ev.which == 2) ? "MIDDLE" : "RIGHT");
	return button;
}

//Получение размеров видимой части экрана
function GetScreenSize() {
	return {
		width: (document.compatMode=='CSS1Compat'&&!window.opera)?document.documentElement.clientWidth:document.body.clientWidth,
		height: (document.compatMode=='CSS1Compat'&&!window.opera)?document.documentElement.clientHeight:document.body.clientHeight
	}	
}

//Получение позиции скролла документа
function GetScreenScroll() {
	return {
		x: (self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft)),
		y: (self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop))
	}
}

//Добавление элемента через DOM
function AddElement(parent,tag,params) {
	var params=params || {}, elem=document.createElement(tag);
	SetAttributs(elem,params);
	parent.appendChild(elem);
	return elem;
}

//Выставление атрибутов (рекурсивное)
function SetAttributs(elem,params) {	for (var i in params) {
		if(typeof(params[i])!="object") {elem[i]=params[i];}
		else SetAttributs(elem[i],params[i]);
	}}

//Добавление таблицы вместе с TBODY (обертка)
function AddTB(parent,params) {	return AddElement(AddElement(parent,'TABLE',params||{}),'TBODY');}

//Добавление пункта в селект
function AddOpt(sel,value,text,selected) {
	var oOption = document.createElement("OPTION");
	sel.options.add(oOption);
	SetAttributs(oOption,{value: value, selected: selected, innerHTML: text});
}

//Функция показывает, найдено ли значение в массиве
function FindInArray(arr,value) {
	return (('|'+arr.join('|')+'|').indexOf('|'+value+'|')>-1) ? true : false;
}

//Устанавливает указанное значение в селекте как выбранное
function SetSelIndex(sel,val) {
	for(var i=0, opts=sel.options, l=opts.length; i<l; i++) {if(opts.item(i).value==val) sel.selectedIndex=i;}
}

//Задание обработчика для события (ООП)
function OOP_Event(instance, method, context, type) {	return function() {		var l = arguments.length, args = [];
		for (var i = 0; i < l; i++) {args[i] = arguments[i];}
		if(type!='callback' && args.length==0) args.push(false);
		if(context) args.push(context);
		return (typeof(method)==='string') ? instance[method].apply(instance, args) : method.apply(instance, args);
	}
}
function OOP_CallBack(instance, method, context) {	return OOP_Event(instance, method, context, 'callback');}

// добавление события
function addEvent(obj, type, fn){
	if (obj.addEventListener) obj.addEventListener(type, fn, false);
	else if(obj.attachEvent) obj.attachEvent("on"+type, fn);
	else obj["on"+type] = fn;
}

// удаление события
function removeEvent(obj, type, fn){
	if (obj.removeEventListener) obj.removeEventListener(type, fn, false);
	else if (obj.detachEvent) obj.detachEvent("on"+type, obj[type+fn]);
	else obj["on"+type] = null;
}

//Проверяет, находится ли containee в container
function containsDOM (container, containee) {
	var isParent = false;
	do { if ((isParent = container == containee)) break; containee = containee.parentNode; }
	while (containee != null); 
	return isParent; 
} 

//Сортировка чисел
function CN(a, b) {return a - b;}

//Случайное целое число от n до m
function rand(n,m) {return n+parseInt(Math.random()*(m-n));}

//Выставление прозрачности
function RollOpacity(id,value) {
	var elem=$n(id), op=(isIE)?parseInt(value*100):value, shag=(isIE)?10:0.1;
	RollOpacity.clear(id);
	if(elem) {
	    var cur_op=(isIE)?elem.filters["DXImageTransform.Microsoft.alpha"]:elem.style, cof=parseFloat(cur_op.opacity);
		if(cof==op) return false;
		if(cof<op) cur_op.opacity=cof+shag;
		if(cof>op) cur_op.opacity=cof-shag;

		RollOpacity.rop[id]=setTimeout("RollOpacity('"+id+"',"+value+")",30);
	}
}
RollOpacity.rop={};
RollOpacity.clear=function(id) {if(RollOpacity.rop[id]) clearTimeout(RollOpacity.rop[id]);}
RollOpacity.clear_all=function(block) {
	var bl=block.length;
	for(var i in RollOpacity.rop) {if(i.substring(0,bl)==block) RollOpacity.clear(i);}
}