Browser = {};

Browser.pingTimeout = window.setInterval("Browser.ping()", 5*60*1000);

/* TODO: update broswer detection! */
Browser.engine = '';
Browser.version = '';

Browser.findChildByName = function(node, name){
    if (node.name == name)
        return node;
    for (var i=0; i<node.childNodes.length; i++){
        var child = node.childNodes[i];
        var res = Browser.findChildByName(child, name);
        if (res != null)
            return res;
    }
    return null;
};

Browser.getFirstChild = function(node, tagName){
	for (var n = node.firstChild; ; n = n.nextSibling){
		if (n.tagName == tagName)
			return n;
	}
	return null;
};


Browser.findChildByTagName = function(node, name){
    if (node.tagName == name)
        return node;
    for (var i=0; i<node.childNodes.length; i++){
        var child = node.childNodes[i];
        var res = Browser.findChildByTagName(child, name);
        if (res != null)
            return res;
    }
    return null;
};

Browser.findChildByClassName = function(node, name){
    if (node.className && node.className.indexOf(name) >= 0)
        return node;
    for (var i=0; i<node.childNodes.length; i++){
        var child = node.childNodes[i];
        var res = Browser.findChildByClassName(child, name);
        if (res != null)
            return res;
    }
    return null;
};

Browser.getEngine = function(){
    if (Browser.engine != '')
        return Browser.engine;
    if ((Browser.engine == '') && (navigator.userAgent.indexOf('Opera') !=- 1)){
        Browser.engine = 'opera';
        var i = navigator.userAgent.indexOf("Version");
        if (i < 0)
        	i = navigator.userAgent.indexOf('Opera')+6;
        else
        	i += 8;
        Browser.version = parseFloat(navigator.userAgent.substr(i));
    }
    if ((Browser.engine == '') && (navigator.userAgent.indexOf('MSIE') != -1)){
        Browser.engine = 'ie';
        Browser.version = parseFloat(navigator.userAgent.substr(navigator.userAgent.indexOf('MSIE')+5));
    }
    if ((Browser.engine == '') && (navigator.userAgent.indexOf('KHTML') != -1)){
        Browser.engine = 'khtml';
        Browser.version = parseFloat(navigator.appVersion);
    }
    if ((Browser.engine=='') && (navigator.userAgent.indexOf('Gecko') != -1)){
        Browser.engine = 'gecko';
        Browser.version = parseFloat(navigator.appVersion);
    }
    if (Browser.engine == '')
        Browser.engine = 'other';


// TODO
/*    if (document.cookie == '')

        window.location= '/help/error/cookie.html';

        if((browser.engine=='ie')&&(browser.version>=6.0))return;
        if((browser.engine=='opera')&&(browser.version>=8.5))return;
        if((browser.engine=='gecko')&&(browser.version>=5.0))return;
        if((browser.engine=='khtml')&&(browser.version>=1.3))return;

        window.location='/help/error/browser.html';*/
    return Browser.engine;
};

Browser.getVersion = function(){
	Browser.getEngine();
	return Browser.version;
}


Browser.eventPosition = function (e, node) {
    var res = {x: 0, y: 0};
    if (e.pageX || e.pageY) {
        res.x = e.pageX;
        res.y = e.pageY;
    }
    else if (e.clientX || e.clientY) {
        res.x = e.clientX + document.body.scrollLeft
            + document.documentElement.scrollLeft;
        res.y = e.clientY + document.body.scrollTop
            + document.documentElement.scrollTop;
    }
    if(node) {
        var pos = Browser.getPosition(node);
        res.x -= pos.left;
        res.y -= pos.top;
    }
    return res;
};

Browser.getPosition = function(object){ // ~ getBoundingClientRect() in IE
    var valueT = 0, valueL = 0;
    do {
        valueT += object.offsetTop  || 0;
        valueL += object.offsetLeft || 0;
        object = object.offsetParent;
    } while (object);
    return {left: valueL, top: valueT};
};


Browser.addEvent = function(object, event, handler, capture){
    if(Browser.getEngine() == 'ie')
        object.attachEvent(event, handler);
    else
        object.addEventListener((event.indexOf('on') == 0) ? (event.replace('on','')) : (event), handler, capture);
};

Browser.removeEvent = function(object, event, handler, capture){
    if(Browser.getEngine() == 'ie')
        object.detachEvent(event, handler);
    else
        object.removeEventListener((event.indexOf('on') == 0) ? (event.replace('on','')) : (event),handler,capture);
};

/*
Browser.onLoad = function(){
	try{
		if (Comet){
			Comet.devvOnLoad();
		}
	} catch (e){}
	try{
		if (Login){
			Login.devvOnLoad();
		}
	} catch (e){}
	try{
		if (UI){
			UI.devvOnLoad();
		}
	} catch (e){}
    try{
		if (Reply){
			Reply.devvOnLoad();
		}
	} catch (e){}
	try{
		if (Editor){
			Editor.devvOnLoad();
		}
	} catch (e){}
	try{
		if (Tab){
			Tab.devvOnLoad();
		}
	} catch (e){}
	try{
		if (Activity){
			Activity.devvOnLoad();
		}
	} catch (e){}
	
	try{
		if (StaticSplitter){
			StaticSplitter.devvOnLoad();
		}
	} catch (e){}
	
	/*document.onresize = window.onresize = function(){
		Browser.mainPageOnresize();
		try{
			if (Blocks){
				Blocks.onResize();
			}
		} catch (e){}
		try{
			if (Frame){
				Frame.onResize();
			}
		} catch (e){}
		try{
			if (UI){
				UI.onResize();
			}
		} catch (e){}
		try{
			if (StaticSplitter){
				StaticSplitter.onResize();
			}
		} catch (e){}
		/*
		try{
			if (Tab){
				Tab.onResize();
			}
		} catch (e){}
		* /
	};
	Browser.mainPageOnload();
	document.onresize();
	Browser.alertIfBadBrowser();
    return true;
};
*/
/*
Browser.mainPageOnload = function(){
	$(".bottom-main").map(
			function(){ this.style.bottom = '0px'; }
			);
};*/

Browser.getCssValue = function(e, p){
	if(e.currentStyle) {
        var convertToCamelCase = p.replace(/\-(.)/g, function(m, l){return l.toUpperCase()});
        return e.currentStyle[convertToCamelCase];
    }
    else if (window.getComputedStyle) {
        var elementStyle = window.getComputedStyle(e, "");
        return elementStyle.getPropertyValue(p);
    }
};

/**
 * Это замена expression`ов для ie
 */
Browser.mainPageOnresize = function(){
	if (Browser.getEngine() == 'ie' && Browser.getVersion() < 8){
		var startLineHeight = $("div.bottom-main").attr("clientHeight");
		if (startLineHeight == null)
			startLineHeight = 0;
		
		var copyrightLineHeight = $("div.copyright").attr("clientHeight");
		if (copyrightLineHeight == null)
			copyrightLineHeight = 0;
		
		var windowLeftPanelWidth = $("div.left-panels").attr("clientWidth");
		if (windowLeftPanelWidth == null)
			windowLeftPanelWidth = 0;
		
		$("div.main").map(function(){
			if (Browser.getCssValue($(".all-container")[0], "height") == '100%') {
				this.style.height = (this.parentNode.clientHeight - startLineHeight - copyrightLineHeight) + 'px';
				this.style.width = (this.parentNode.clientWidth - windowLeftPanelWidth) + 'px';
			}
		});
		$("div.without-left-panels div.main").map(function(){
			this.style.width = this.parentNode.clientWidth + 'px';
		});
		
	}
};

/**
 * Если мы под этот браузер не оптимизированы, выдадим ошибку
 */
Browser.alertIfBadBrowser = function(){
	/*var b = Browser.getEngine();
	var dev = (document.location + '').indexOf('goim') < 0;
	if ((b != 'opera' && b != 'gecko') && !dev)
		alert('Вы используете браузер, под который сервис еще не оптимизирован.');*/
};

$(function(){
	//Browser.mainPageOnload();
	Browser.alertIfBadBrowser();
	$(window).bind("resize", Browser.mainPageOnresize);
	$(window).trigger("resize");
});


/*
 * Gets any from's successor node and goes back along the tree untill finds the FORM element. Then 
 * collects all elements and their values in a string of the following format:
 *
 *   "param1=val1&param_2=val2&..."
 *
 * Only <code>radio</code> and <code>checkbox</code> types are processed in a slightly different 
 * way.
 */
Browser.serializeForm = function( node ) {
	var form = node;
	for (; form.tagName != 'FORM'; form = form.parentNode);
  
	var res = "";
	for (var i = 0; i < form.elements.length; i++) {
		var el = form.elements[i];
		if (el.tagName == 'INPUT' && el.type == 'radio') {
			if (el.checked) {
				if (res.length > 0)
					res += '&';
				res += encodeURIComponent(el.name) + '=';
				res += encodeURIComponent(el.value);
			}
		} else {
			if (res.length > 0)
				res += '&';
			res += encodeURIComponent(el.name) + '=';
			if (el.tagName == 'INPUT' && el.type == 'checkbox')
				res += el.checked;
			else
				res += encodeURIComponent(el.value);
		}
	}
	return res;
};

Browser.modifyCSSClass = function(object, name, action){
    if(object && (object.className != null)){
        var str = object.className.replace(name, '');
        if (action)
            str += ' '+name;
        object.className = str;
    }
};

Browser.addEvent = function(object, event, handler, capture){
    if(Browser.getEngine() == 'ie')
        object.attachEvent(event, handler);
    else {
        object.addEventListener(
            (event.indexOf('on') == 0) ? (event.replace('on', '')) :
            (event), handler, capture);
    }
};

Browser.mousePosition = function(event){
    if (!event) event = window.event;
    return {x: event.clientX, y: event.clientY};
};

Browser.removeEvent = function(object, event, handler, capture){
    if (Browser.getEngine() == 'ie')
        object.detachEvent(event, handler);
    else
        object.removeEventListener((event.indexOf('on')==0) ? (event.replace('on','')) : (event), handler, capture);
};

Browser.ping = function(){
    Ajax.ajaxCall("ping", "", "");
};

function stopEvent(e) {
    if(!e) e = event;
    if(typeof(e.stopPropagation) == 'function') e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    if(typeof(e.cancelBubble) == 'boolean') e.cancelBubble = true;
    e.returnValue = false;
    return false;
};

function form(node){
	for (; node.tagName != 'FORM'; node = node.parentNode);
	return node;
}

Browser.png = function(element, resizing_method){
    // если браузер IE версии 5.5-6
    if (/MSIE (5\.5|6).+Win/.test(navigator.userAgent)){
        var src;
        if(element.tagName=='IMG'){ // если текущий элемент картинка (тэг IMG)
        	//if (/\.png$/.test(element.src)){ // если файл картинки имеет расширение PNG
                src = element.src;
                element.setAttribute('_src', src);
                element.src= "/img/1.gif"; // заменяем изображение прозрачным gif-ом
            //}
        }
        else{ // иначе, если это не картинка а другой элемент
        	element.runtimeStyle.backgroundImage="";
            // если у элемента задана фоновая картинка, то присваеваем значение свойства background-шmage переменной src
            src=element.currentStyle.backgroundImage.match(/url\("(.+\.png)"\)/i);
            if(src){
                src=src[1]; // берем из значения свойства background-image только адрес картинки
                element.runtimeStyle.backgroundImage="none"; // убираем фоновое изображение
            }
        }
        // если, src не пуст, то нужно загрузить изображение с помощью фильтра AlphaImageLoader
        if(src)
        	element.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+src+"',sizingMethod='"+resizing_method+"')";
        else
        	element.runtimeStyle.filter = "";
    }
    else if (/MSIE.+Win/.test(navigator.userAgent)){
    	element.runtimeStyle.filter = "";
    }
};

Browser.stopEvent = function(e){
    if(!e) e = event;
    if(typeof(e.stopPropagation) == 'function') e.stopPropagation();
    if(e.preventDefault) e.preventDefault();
    if(typeof(e.cancelBubble) == 'boolean') e.cancelBubble = true;
    e.returnValue = false;
    return false;
}

Browser.refreshPng = function(parent){
	$(".png-image", parent).map(function(){
		Browser.png(this,'image');
		return $(this);
	});
};

/**
 * Проблема в том, что установка z-index`а в опере сбивает положение вложенных скроллов.
 * По большому счету уперто отсюда:
 * http://dev.jqueryui.com/attachment/ticket/4575/ui.dialog-opera-scroll-and-overlay.patch
 */
Browser.setZIndex = function(node, newIndex){
	node = $(node);
	if (Browser.getEngine() == 'opera'){
		// Store the scroll positions before modifying the z-index.
	 	var saveScroll = [];
	 	node.find("*").each(function() { 
	 		var currentElement = $(this) 
	 		var scrollTop = currentElement.attr('scrollTop'); 
	 		var scrollLeft = currentElement.attr('scrollLeft'); 
	 		if (scrollTop || scrollLeft) { 
	 			saveScroll.push({  
	 				element: currentElement,  
	 				attr: { scrollTop: currentElement.attr('scrollTop'), 
	 				scrollLeft: currentElement.attr('scrollLeft') } 
	 			}); 
	 		}
	 	});
	 	
 		node.css('z-index', newIndex);
 		
 		for (var i = 0; i < saveScroll.length; i++) { 
 			var savedScroll = saveScroll[i]; 
 			savedScroll.element.attr(savedScroll.attr); 
 		}
	}
	else
		node.css('z-index', newIndex);
}


Browser.getExpireDate = function(days, hours, minutes) {
    var expDate = new Date();
    if (typeof days == "number" && typeof hours == "number" && typeof hours == "number") {
        expDate.setDate(expDate.getDate() + parseInt(days));
        expDate.setHours(expDate.getHours() + parseInt(hours));
        expDate.setMinutes(expDate.getMinutes() + parseInt(minutes));
        return expDate.toGMTString();
    }
}

Browser.setCookie = function(name, value, expires, path, domain, secure) {
	document.cookie = name + "=" + escape(value) +
        ((expires) ? "; expires=" + expires : "") +
        ((path) ? "; path=" + path : "") +
        ((domain) ? "; domain=" + domain : "") +
        ((secure) ? "; secure" : "");
}

Browser.getCookie = function(name) {
	var cookie = " " + document.cookie;
	var search = " " + name + "=";
	var setStr = null;
	var offset = 0;
	var end = 0;
	if (cookie.length > 0) {
		offset = cookie.indexOf(search);
		if (offset != -1) {
			offset += search.length;
			end = cookie.indexOf(";", offset)
			if (end == -1)
				end = cookie.length;
			setStr = unescape(cookie.substring(offset, end));
		}
	}
	return(setStr);
};