// Based on
// <http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247>
var DOM_ELEMENT_NODE = 1;
var DOM_ATTRIBUTE_NODE = 2;
var DOM_TEXT_NODE = 3;
var DOM_CDATA_SECTION_NODE = 4;
var DOM_ENTITY_REFERENCE_NODE = 5;
var DOM_ENTITY_NODE = 6;
var DOM_PROCESSING_INSTRUCTION_NODE = 7;
var DOM_COMMENT_NODE = 8;
var DOM_DOCUMENT_NODE = 9;
var DOM_DOCUMENT_TYPE_NODE = 10;
var DOM_DOCUMENT_FRAGMENT_NODE = 11;
var DOM_NOTATION_NODE = 12;

var ajaxServletPath = false;
var opera=false;    
var gecko=false;
var ie=false;
var safari=false;
var browser=navigator.userAgent.toLowerCase();

if(browser.indexOf('msie')!=-1) {
  ie=true;
  if(browser.indexOf('msie 5.5')!=-1)ver=5.5;
  else if(browser.indexOf('msie 5')!=-1)ver=5;
}
if(browser.indexOf('opera')!=-1) opera=true;
if(browser.indexOf('gecko')!=-1) gecko=true;
if(browser.indexOf('safari')!=-1) safari=true;



Function.prototype.bind = function() {  
    if (arguments.length < 1 && typeof arguments[0] != "undefined") return this;  
    var __method = this, args = [];  
    for(var i=0;i<arguments.length;i++){ args.push(arguments[i]);}  
      
    var object = args.shift();  
    return function() {  
      var args_to_apply = []  
        
      for(var i=0;i<args.length;i++){ args_to_apply.push(args[i]);}  
      for(var i=0;i<arguments.length;i++){ args_to_apply.push(arguments[i]);}  
      return __method.apply(object, args_to_apply);  
   }  
};


// on DOM ready
// usage:  document.ready( function(){ alert('DOM ready'); } );
(function () {
    var ie  = !!(window.attachEvent && !window.opera);
    var wk  = /webkit\/(\d+)/i.test(navigator.userAgent) && (RegExp.$1 < 525);
    var fn  = [];
    var run = function () { for (var i = 0; i < fn.length; i++) fn[i](); };
    var d   = document;
    d.ready = function (f) {
        if (!ie && !wk && d.addEventListener)
            return d.addEventListener('DOMContentLoaded', f, false);
        if (fn.push(f) > 1) return;
        if (ie)
            (function () {
                var ok = false;
                try { d.documentElement.doScroll('left'); ok = true;}
                catch (err) { setTimeout(arguments.callee, 0); }
                if(ok) run();
            })();
        else if (wk)
            var t = setInterval(function () {
                if (/^(loaded|complete)$/.test(d.readyState))
                    clearInterval(t), run();
            }, 0);
    };
})();


function empty(s) {
    return /^\s*$/.test(s);
}

function trim(s) {
    if(s)
        return s.replace(/(^\s+)|(\s+$)/g, '');
    return '';
}


function stopEvent(event) {
    if(event.stopPropagation)
        event.stopPropagation();
    else
        event.cancelBubble = true;
    
    if(event.preventDefault) 
        event.preventDefault();
    else 
        event.returnValue = false;        
}

var Trigub = {
    addEvent: function (name, func, capture) {
        if(name.indexOf('on') == 0)
            name = name.substring(2);

        if(this.attachEvent)
            this.attachEvent('on' + name, func, capture);
        else
            this.addEventListener(name, func, capture);
    },
    
    show : function() {
        this.style.display = '';
    },
    
    hide : function() {
        this.style.display = 'none';
    },
    
    toggle : function(t) {
        this.style.display = t ? '' : 'none';
    },
    
    up : function(param) {
        var t = this;
        while(t) {
            if(Trigub._checkNode(t, param))
                return $(t);
            t = t.parentNode;
        }
        return null; 
    },
    
    down: function(param) {
        var t = Trigub._down(this, param);
        return $(t);
    },
    
    next: function(param) {
        var t = this.nextSibling;
        while(t) {
            if(Trigub._checkNode(t, param))
                return $(t);
            t = t.nextSibling;
        }
        return null; 
    },
    
    offset: function() {
        /* read more - http://javascript.ru/ui/offset */
        if(this.getBoundingClientRect) {
            var box = this.getBoundingClientRect();
            var body = document.body;
            var docElem = document.documentElement;
         
            var clientTop = docElem.clientTop || body.clientTop || 0;
            var clientLeft = docElem.clientLeft || body.clientLeft || 0;
         
            var top  = box.top +  Trigub._scrollTop() - clientTop;
            var left = box.left + Trigub._scrollLeft() - clientLeft;
            return { top: Math.round(top), left: Math.round(left) };
        }
        else {
            var top=0, left=0
            var elem = this;
            while(elem) {
                top = top + parseInt(elem.offsetTop);
                left = left + parseInt(elem.offsetLeft);
                elem = elem.offsetParent;
            }
            return {top: top, left: left};
        }        
    },
    
    appendSibling: function(x) {

        if(this.nextSibling)
            this.parentNode.insertBefore($html(x), this.nextSibling);
        else
            this.parentNode.appendChild($html(x));
        return this.nextSibling;
    },
    
    prependSibling: function(x) {
        this.parentNode.insertBefore($html(x), this);
        return this.previousSibling;
    },
    
    insertFirst: function(x) {
        if(this.firstChild)
            this.insertBefore($html(x), this.firstChild);
        else
            this.appendChild($html(x));
        return this.firstChild;
    },
    
    remove: function() {
        this.parentNode.removeChild(this);
    },
    
    fillTemplate: function(param) {
        return Trigub._fillTemplate(this.innerHTML, param);
    },
    
    /** выполнить JS после изменения innerHTML (для обработки аяксовой HTML-подмены) */
    executeJS: function() {
        var list = this.getElementsByTagName('SCRIPT');
        var hash = {};
        for(var i = 0; i < list.length; i++)
            hash[i] = list.item(i);
            
        var origReady = document.ready;
        var funcs = [];
        document.ready = function(f) {funcs.push(f);}
        try {
            for(var i in hash) {
                var sc = document.createElement("script");
                sc.id = hash[i].id;
                sc.type = hash[i].type;
                sc.text = hash[i].text;
                this.appendChild(sc);
            }
        }
        finally {
            document.ready = origReady;
        }
        for(var i = 0; i < funcs.length; i++)
            funcs[i]();        
    },
    
    _scrollLeft: function() {
        return window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;
    },

    _scrollTop: function() {
        return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
    },
    
    
    _down: function(x, param) {
        if(Trigub._checkNode(x, param))
            return x;
        if(x.childNodes) {
            for(var i = 0; i < x.childNodes.length; i++) {
                var t = Trigub._down(x.childNodes[i], param);
                if(t)
                    return t;
            }
        }
        return null;
    },
    
    _checkNode : function(node, param) {
        if(node && node.nodeType == DOM_ELEMENT_NODE) {
            if(param.charAt(0) == '.')
                return (' ' + node.className + ' ').indexOf(' ' + param.substring(1) + ' ') >= 0;
            else
                return node.tagName == param.toUpperCase();
        }
        return false;
    },

    
    _fillTemplate: function(str, params) {
        for(var p in params)
            str = str.replace(new RegExp(p, 'g'), params[p]);
        return str;
    }
};


function $html(x) {
    if(typeof x == 'string') {
        var div = document.createElement("div")
        div.innerHTML = trim(x);
        return div.childNodes.length > 1 ? div : div.firstChild; 
    }
    else
        return x;
}

function S(x) {
    return $(x);
}

function $(x) {
    if(!x)
        return null;
    if(typeof x == 'function') {
        document.ready(x);
        return x;
    }
    
    if(x && x.TRIGUB)
        return x;
    
    if(typeof x == 'string')
        x = document.getElementById(x);

    if(!x)
        return null;

    x.TRIGUB = true;
    for(var t in Trigub) {
        if(t.indexOf('_') != 0)
            x[t] = Trigub[t];
    }

    return x;
}


Popup = {
    open: function(id, params) {
        var div = $(id);
        if(!Trigub._checkNode(div, '.p-out')) {
            div.className = div.className + ' p-out';
            div.style.position = 'absolute';
            div.style.zIndex = '10';
            div.innerHTML = 
            '<div class="ct"></div><h2><div style="float:right;"><a href="#" '+
            'onclick="' + (params && params.onClose ? params.onClose : '') + 'return Popup.close(this);">×</a></div><span>title</span></h2>'+
            '<div class="p-in">' + div.innerHTML + '</div>';
        }
        
        if(params) {
            if(params.title) 
                div.down('span').innerHTML = params.title;
            if(params.width)
                div.style.width =  params.width + 'px';
            if(params.height)
                div.style.height =  params.height + 'px';
        }
        div.show();
        var W = document.documentElement;
        div.style.top = (parseInt(W.scrollTop) + (parseInt(W.clientHeight) - parseInt(div.clientHeight)) / 2) + 'px';
        div.style.left = (parseInt(W.scrollLeft) + (parseInt(W.clientWidth) - parseInt(div.clientWidth)) / 2) + 'px';
        return false;
    },
    
    close: function(x) {
        $(x).up('.p-out').hide();
        return false;
    }
};
