
if(typeof HTMLElement!="undefined" && !
    HTMLElement.prototype.insertAdjacentElement){
    HTMLElement.prototype.insertAdjacentElement = function
    (where,parsedNode) {
        switch (where){
            case 'beforeBegin':
            this.parentNode.insertBefore(parsedNode,this)
            break;
            case 'afterBegin':
            this.insertBefore(parsedNode,this.firstChild);
            break;
            case 'beforeEnd':
            this.appendChild(parsedNode);
            break;
            case 'afterEnd':
            if (this.nextSibling) 
                this.parentNode.insertBefore(parsedNode,this.nextSibling);
            else this.parentNode.appendChild(parsedNode);
            break;
        }
    }

    HTMLElement.prototype.insertAdjacentHTML = function
    (where,htmlStr) {
        var r = this.ownerDocument.createRange();
        r.setStartBefore(this);
        var parsedHTML = r.createContextualFragment(htmlStr);
        this.insertAdjacentElement(where,parsedHTML)
    }


    HTMLElement.prototype.insertAdjacentText = function
    (where,txtStr) {
        var parsedText = document.createTextNode(txtStr)
        this.insertAdjacentElement(where,parsedText)
    }
}

function repl(text, oldt, newt){   
    var pointer = text.indexOf(oldt);
    while(pointer != -1) {			
        text = text.substring(0, pointer) + newt + text.substring(pointer+oldt.length, text.length);	
        pointer = text.indexOf(oldt);
    }
    return text;
}

function reverseSort(a, b){
    if(a > b){
        return -1;
    }
    if(a < b){
        return 1
    }
    return 0
} 
function numOrdA(a, b){ return (a-b); }
function numOrdD(a, b){ return (b-a); }
function dataOrdA(a, b){ return (a.getTime()-b.getTime()); }
function dataOrdD(a, b){ return (b.getTime()-a.getTime()); }
function idOrdA(a, b){ return (a.id-b.id); }
function idOrdD(a, b){ return (b.id-a.id); }

function sortMap(map){
    var sortedTemp=new Array();
    for(var i in map){
        sortedTemp[sortedTemp.length]=map[i]+"***"+i;
    }
    sortedTemp.sort(reverseSort);
    map=new Array();
    for (var i = 0; i < sortedTemp.length; i++) {
        var key = sortedTemp[i].substring(sortedTemp[i].indexOf("***") + 3);
        var value = sortedTemp[i].substring(0, sortedTemp[i].indexOf("***"));
        map[key]=value;	
    }
    return map;
}

function ExtractNumber(value) { 
    var n = parseFloat(value); 
    return n == null || isNaN(n) ? 0 : n; 
} 

function $(id) { 
    return document.getElementById(id); 
}
function $$(tagname) { 
    return  document.getElementsByTagName(tagname); 
}

/*function findPos(oElement) {
if(document.all){
var rect= oElement.getBoundingClientRect();
return [ rect.left, rect.top ];
}else{
if( typeof( oElement.offsetParent ) != 'undefined' ) {
for( var posX = 0, posY = 0; oElement; oElement = oElement.offsetParent ) {
posX += oElement.offsetLeft;
posY += oElement.offsetTop;
}
return [ posX, posY ];
} else {
return [ oElement.x, oElement.y ];
}
}
}*/
function findPos (element) {
    var _x=0;
    var _y=0
    while (element) {
        _x += element.offsetLeft;
        _y += element.offsetTop;
        element = element.offsetParent;
    }
    return [ _x, _y ];
}
var xb =
    {
    evtHash: [],
    
    ieGetUniqueID: function(_elem)
    {
        if (_elem === window) { return 'theWindow'; }
        else if (_elem === document) { return 'theDocument'; }
        else { return _elem.uniqueID; }
    },
    
    addEvent: function(_elem, _evtName, _fn, _useCapture)
    {
        if (typeof _elem.addEventListener != 'undefined')
        { _elem.addEventListener(_evtName, _fn, _useCapture); }
        else if (typeof _elem.attachEvent != 'undefined')
        {
            var key = '{FNKEY::obj_' + xb.ieGetUniqueID(_elem) +
                '::evt_' + _evtName + '::fn_' + _fn + '}';
            var f = xb.evtHash[key];
            if (typeof f != 'undefined')
            { return; }
                
            f = function()
            {
                _fn.call(_elem);
            };
                
            xb.evtHash[key] = f;
            _elem.attachEvent('on' + _evtName, f);
                
            // attach unload event to the window to clean up possibly IE memory leaks
            window.attachEvent('onunload', function()
            {
                _elem.detachEvent('on' + _evtName, f);
            });
                    
            key = null;
            //f = null;   /* DON'T null this out, or we won't be able to detach it */
        }
        else
        { _elem['on' + _evtName] = _fn; }
    },
            
    removeEvent: function(_elem, _evtName, _fn, _useCapture)
    {
        if (typeof _elem.removeEventListener != 'undefined')
        { _elem.removeEventListener(_evtName, _fn, _useCapture); }
        else if (typeof _elem.detachEvent != 'undefined')
        {
            var key = '{FNKEY::obj_' + xb.ieGetUniqueID(_elem) +
                '::evt' + _evtName + '::fn_' + _fn + '}';
            var f = xb.evtHash[key];
            if (typeof f != 'undefined')
            {
                _elem.detachEvent('on' + _evtName, f);
                delete xb.evtHash[key];
            }
                            
            key = null;
            //f = null;   /* DON'T null this out, or we won't be able to detach it */
        }
    }
};
function getViewportHeight() {
    if (window.innerHeight!=window.undefined) return window.innerHeight;
    if (document.compatMode=='CSS1Compat') return document.documentElement.clientHeight;
    if (document.body) return document.body.clientHeight; 
                    
    return window.undefined; 
}
function getViewportWidth() {
    var offset = 17;
    var width = null;
    if (window.innerWidth!=window.undefined) return window.innerWidth; 
    if (document.compatMode=='CSS1Compat') return document.documentElement.clientWidth; 
    if (document.body) return document.body.clientWidth; 
}
function getViewport(){
    var viewportsize = [];
    viewportsize[0] = getViewportWidth();
    viewportsize[1] = getViewportHeight();
    return viewportsize;
}
/**
 * Gets the real scroll top
 */
function getScrollTop() {
    if (self.pageYOffset) // all except Explorer
    {
        return self.pageYOffset;
    }
    else if (document.documentElement && document.documentElement.scrollTop)
    // Explorer 6 Strict
    {
        return document.documentElement.scrollTop;
    }
    else if (document.body) // all other Explorers
    {
        return document.body.scrollTop;
    }
}
function getScrollLeft() {
    if (self.pageXOffset) // all except Explorer
    {
        return self.pageXOffset;
    }
    else if (document.documentElement && document.documentElement.scrollLeft)
    // Explorer 6 Strict
    {
        return document.documentElement.scrollLeft;
    }
    else if (document.body) // all other Explorers
    {
        return document.body.scrollLeft;
    }
}
                                
var gTabIndexes = new Array();
// Pre-defined list of tags we want to disable/enable tabbing into
var gTabbableTags = new Array("A","BUTTON","TEXTAREA","INPUT","IFRAME");
// For IE.  Go through predefined tags and disable tabbing into them.
function disableTabIndexes() {
    if (document.all) {
        var i = 0;
        for (var j = 0; j < gTabbableTags.length; j++) {
            var tagElements = $$(gTabbableTags[j]);
            for (var k = 0 ; k < tagElements.length; k++) {
                gTabIndexes[i] = tagElements[k].tabIndex;
                tagElements[k].tabIndex="-1";
                i++;
            }
        }
    }
}
                                
// For IE. Restore tab-indexes.
function restoreTabIndexes() {
    if (document.all) {
        var i = 0;
        for (var j = 0; j < gTabbableTags.length; j++) {
            var tagElements = $$(gTabbableTags[j]);
            for (var k = 0 ; k < tagElements.length; k++) {
                tagElements[k].tabIndex = gTabIndexes[i];
                tagElements[k].tabEnabled = true;
                i++;
            }
        }
    }
}
                                
                                
/**
 * Hides all drop down form select boxes on the screen so they do not appear above the mask layer.
 * IE has a problem with wanted select form tags to always be the topmost z-index or layer
 *
 * Thanks for the code Scott!
 */
function hideSelectBoxes() {
    for(var i = 0; i < document.forms.length; i++) {
        for(var e = 0; e < document.forms[i].length; e++){
            if(document.forms[i].elements[e].tagName == "SELECT") {
                document.forms[i].elements[e].style.visibility="hidden";
            }
        }
    }
}
                                
/**
 * Makes all drop down form select boxes on the screen visible so they do not reappear after the dialog is closed.
 * IE has a problem with wanted select form tags to always be the topmost z-index or layer
 */
function displaySelectBoxes() {
    for(var i = 0; i < document.forms.length; i++) {
        for(var e = 0; e < document.forms[i].length; e++){
            if(document.forms[i].elements[e].tagName == "SELECT") {
                document.forms[i].elements[e].style.visibility="visible";
            }
        }
    }
}
                                
                                
                                
                                
function setObjSize(obj, _width, _height, rel) {
    if(rel==null){
        rel=4/3;
    }
    var width=_width;
    var height=_height;
                                    
    if(_width>_height){
        width=_height*rel;
        if(width>_width){
            width=_width;
            height=width/rel;
        }
    }else{
        height=width/rel;
        if(height>_height){
            height=_height;
            width=_height*rel;
        }
    }
    log.debug("let's set size for object with id="+obj.id+" to  w="+width+" h="+height);
    obj.style.height = height + "px";
    obj.style.width = width + "px";
}
function synchSize(srcObj,tgObj){
    tgObj.style.height = srcObj.style.height;
    tgObj.style.width = srcObj.style.width;
}
function correctDate(_d){
    return _d;//new Date(_d.getTime()+date_correction);
}
                            