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;
var isOpera = window.opera && opera.buildNumber;

//Получение элементов по 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 Serialize(obj) {
	var rezult='';
	if(typeof(obj)!='object') rezult+=obj;
	else {
		rezult+='{';
		for(var i in obj) rezult+=i+':'+Serialize(obj[i])+';';
		rezult+='}';
	}
	return rezult;
}

function cFalse() {return false;}
function noFocus() {this.blur();}
 
function $u(id,cache) {return typeof(id)=="string" ? window[(cache?'$':'$n')](id) : id;} 

function round(num,dig) {return parseFloat(parseFloat(num).toFixed(dig||2))}

 
//Получение абсолютных координат элемента
function getElementPosition(elemId) {
    var elem = $u(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 GetCurStyle(obj,doc) {
	var doc=doc || document;
	return obj.currentStyle || doc.defaultView.getComputedStyle(obj, null);
}

//Получает координаты мыши из переданного события
function GetMouse(e) {
	var ev = e || window.event || window.frames[0].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 ControlEvent(ev,p) {
	if(p=='db') p='bd';
	if(p=='bd' || p=='b') {
		if(ev.stopPropagation) ev.stopPropagation();
		else ev.cancelBubble = true;
	}
	if(p=='bd' || p=='d') {
		if(ev.preventDefault) ev.preventDefault();
		else ev.returnValue=false;
	}
}

//Определяет нажатую кнопку мыши из переданного события
function GetButton(e) {
	var ev = e || window.event || window.frames[0].event;
	if (ev.type=='contextmenu' || (isOpera && ev.altKey)) 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) {
	var params=params || {}, table=AddElement(parent,'TABLE',params);
	return AddElement(table,'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() {
		for (var i = 0, l = arguments.length, args = []; 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');
}

//Добавление/удаление css класса
function doClass(el, name, type) {
	el.className = el.className.replace(new RegExp(name, 'g'), ' ').replace(/\s+/, ' ');
	if(type=='add') el.className += ' ' + name;
}


// добавление события
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 SetOpacity(elem,value) {
	var s=elem.style;
	if(isIE) {
		if(value<1) s.filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+value*100+")";
		else s.filter="";
	}
	else s.opacity=value;
}

/*

//Выставление прозрачности
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);
	}
}

//Плавное перемещение к координатам
function SmoothRoll(x,y,p,count) {
	var s=10, dx=x-p.scrollLeft, dy=y-p.scrollTop;
	count--;
	if(count==0) {clearTimeout(p.tm); return true;}

	if(dx!=0) p.scrollLeft+=(Math.abs(dx)>s)?(dx<0?-s:s):dx;
	if(dy!=0) p.scrollTop+=(Math.abs(dy)>s)?(dy<0?-s:s):dy;

	p.tm=setTimeout(function(){return function(){SmoothRoll(x,y,p,count)}}(x,y,p,count),10);
}

//Прокрутка к элементу или к координатам
function RollTo(x,y,mod,parent,speed) {
	var p=parent || document.documentElement, mod=mod || 'a', dx=p.scrollLeft, dy=p.scrollTop;

	if(p.tm) clearTimeout(p.tm);

	if(mod=='a') {
		if(x!==false) dx=x;
		if(y!==false) dy=y;
	}
	else if(mod=='r') {
		if(x!==false) dx=x+p.scrollLeft;
		if(y!==false) dy=y+p.scrollTop;
	}
	else {
		var node_params=getElementPosition(mod);
        if(x!==false) dx=x+node_params['left'];
        if(y!==false) dy=y+node_params['top'];
	}

	dx=(dx>0)?dx:0;
	dy=(dy>0)?dy:0;

	var count=Math.ceil(Math.max(Math.abs(p.scrollLeft-dx),Math.abs(p.scrollTop-dy))/10);
	SmoothRoll(dx,dy,p,count);
}
*/

//Окраска формы
function ColorizeForm(id) {
	var form=$u(id);

	ColorizeForm.add_events(form.getElementsByTagName('INPUT'));
	ColorizeForm.add_events(form.getElementsByTagName('TEXTAREA'));

	form.onmouseover=function(e) {
		var input=ColorizeForm.check_field(e);
		if(input && !input.infocus) {input.style.borderColor='#11a3ea';}
	}
	form.onmouseout=function(e) {
		var input=ColorizeForm.check_field(e);
		if(input && !input.infocus) {input.style.borderColor='#aaaaaa';}
	}
}
ColorizeForm.check_field=function(e) {
	var ev = e || window.event, target = ev.target || ev.srcElement;

	while (target && target.nodeName!='FORM') {
		if(target.className=='textinput' && target.type!='submit' && target.type!='reset') return target;
		target = target.parentNode;
	}
	return false;
}
ColorizeForm.add_events=function(nodes) {
	for(var i=nodes.length-1; i>=0; i--) {
		input=nodes.item(i);
		if(input && input.className=='textinput' && input.type!='submit' && input.type!='reset') {
			input.onfocus=function() {this.infocus=true; this.style.borderColor='#11a3ea'; this.style.color='#3366CC';}
			input.onblur=function() {this.infocus=false; this.style.borderColor='#aaaaaa'; this.style.color='#333333';}
		}
	}
}

//Обработка выпадающего меню для IE
function FixDropMenu(menu) {
	if(!isIE56) return true;
	
	var fix=function(e) {
		var ev = e || window.event || window.frames[0].event, target = ev.target || ev.srcElement;
		while(target.id!=menu.id) {
			if(target.nodeName=='LI') target.className=(ev.type=='mouseover')?'jsh':'';			
			target=target.parentNode;
		}
	}
	addEvent(menu,'mouseover',fix);
	addEvent(menu,'mouseout',fix);
}

//Склонение числительных
function pluralForm(n, form1, form2, form3) {
	n = Math.abs(n) % 100;
	var n1 = n % 10;
	if (n > 10 && n < 20) return form3;
	if (n1 > 1 && n1 < 5) return form2;
	if (n1 == 1) return form1;
	return form3;
}

function open_big(e) {
	var ev = e || window.event, target = ev.target || ev.srcElement; 
	window.open('/photo_big.php?src='+target.src, 'photo_big_win', 'scrollbars=no,toolbar=no,location=no,directories=no,menubar=no,status=yes,width=1,height=1,top=0,left=0');
	return false;
}

function clone(object) {
    if (typeof(object) != "object") return object;
    var newObject = object.constructor();
    for (objectItem in object) {
        newObject[objectItem] = clone(object[objectItem]);
    }
    return newObject;
}

//Обработка произвольных событий
var Events={
	list: {},
	fire: function(name, params) {
		if(this.list[name]) {
			for(var i in this.list[name]) this.list[name][i](params);
		}
	},
	add: function(name, func_name, callback) {
		if(!this.list[name]) this.list[name]={};
		this.list[name][func_name]=callback;
	},
	del: function(name, func_name) {
		if(func_name) delete this.list[name][func_name];
		else delete this.list[name];
	}
}
