function f_clientWidth() {
    return f_filterResults (
        window.innerWidth ? window.innerWidth : 0,
        document.documentElement ? document.documentElement.clientWidth : 0,
        document.body ? document.body.clientWidth : 0
    );
}
function f_clientHeight() {
    return f_filterResults (
        window.innerHeight ? window.innerHeight : 0,
        document.documentElement ? document.documentElement.clientHeight : 0,
        document.body ? document.body.clientHeight : 0
    );
}
function f_scrollLeft() {
    return f_filterResults (
        window.pageXOffset ? window.pageXOffset : 0,
        document.documentElement ? document.documentElement.scrollLeft : 0,
        document.body ? document.body.scrollLeft : 0
    );
}
function f_scrollTop() {
    return f_filterResults (
        window.pageYOffset ? window.pageYOffset : 0,
        document.documentElement ? document.documentElement.scrollTop : 0,
        document.body ? document.body.scrollTop : 0
    );
}
function f_filterResults(n_win, n_docel, n_body) {
    var n_result = n_win ? n_win : 0;
    if (n_docel && (!n_result || (n_result > n_docel)))
        n_result = n_docel;
    return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
var mouseX=mouseY=0;
function getMouseXY(e) {
    if(IE){
        try{
            mouseX=event.clientX+document.body.scrollLeft;
            mouseY=event.clientY+(document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
        }catch(err){}
    }else{
        mouseX=e.pageX;
        mouseY=e.pageY;
    }
    if(mouseX<0) mouseX=0;
    if(mouseY<0) mouseY=0;
}
addHandler(document, "mousemove", getMouseXY);

function getBounds(element){
    var left=element.offsetLeft;
    var top=element.offsetTop;
    for(var parent=element.offsetParent; parent; parent=parent.offsetParent){
        left+=parent.offsetLeft-parent.scrollLeft;
        top+=parent.offsetTop-parent.scrollTop;
    }
    if(IE){
        top+=(document.documentElement.scrollTop ? document.documentElement.scrollTop : 0);
        left+=(document.documentElement.scrollLeft ? document.documentElement.scrollLeft : 0);
    }
    if(!IE){
        tempobj=element;
        while(tempobj.tagName!='HTML' && tempobj.tagName!='BODY'){
            if(getElementComputedStyle(tempobj, 'overflow')=='hidden') left-=tempobj.scrollLeft;
            tempobj=(IE ? tempobj.parentElement : tempobj.parentNode);
        }
    }
    return {left: left, top: top, width: element.offsetWidth, height: element.offsetHeight};
}
function mouseUnder(target){
    if(typeof(target)=='string') target=document.getElementById(target);
    if(target){
        var elem_bounds=getBounds(target);
        return (mouseX>elem_bounds.left && mouseX<elem_bounds.width+elem_bounds.left && mouseY>elem_bounds.top && mouseY<elem_bounds.height+elem_bounds.top);
    }return false;
}

function place_elem(pelem,belem){
    elem_bounds=getBounds(belem);
    pelem.style.left=(elem_bounds.left)+'px';
    pelem.style.top=(elem_bounds.top)+'px';
    pelem.style.width=(elem_bounds.width+belem.scrollLeft)+'px';
    pelem.style.height=(elem_bounds.height+belem.scrollTop)+'px';
}

function setLabelFor(target){    if(!target) var target=document;
    if(typeof(target)=='string') target=$(target);    var labels=target.getElementsByTagName('label');
    for(i=0; i<labels.length; i++){        if(!labels[i].htmlFor){
            var inp=labels[i].getElementsByTagName('input')[0];
            if(inp){
                if(!inp.id) inp.id=uuid();
                labels[i].htmlFor=inp.id;
            }
        }    }}
function delAutocomplete(target){    if(!target) var target=document;    if(typeof(target)=='string') target=$(target);
    var inps=target.getElementsByTagName('input');
    for(i=0; i<inps.length; i++) inps[i].autocomplete='off';}

function attachParameters(obj,params,onlyFirstLevel){    for(var i in params){
        if(typeof(params[i])=='object' && obj[i] && !onlyFirstLevel) attachParameters(obj[i],params[i]);
        else obj[i]=params[i];
    }}
function newElement(type,params,target){    if(!target) var target=document.body;
    if(typeof(target)=='string') target=$(target);
    if(typeof(params)!='object') var params={};

    var elem;
    if(params.id && (elem=document.getElementById(params.id))) return elem;
    else{
        var elem=document.createElement(type);
        attachParameters(elem,params);
        target.appendChild(elem);
        return elem;
    }}
function attachOnload(elem,onload){    if(typeof(elem)=='string') elem=$(elem);
    if(typeof(onload)!='function') onload=function(){};
    attachParameters(elem,{
        onreadystatechange:function(){
            if(this.readyState=='loaded'){ onload(); }
        },
        onload:function(){ onload(); }
    });
}

function showAlphaBg(flag,bg_elem){
    var alphaBg=newElement('div',{id:'alpha_bg',style:{position:'absolute',background:'#000'}});
    if(bg_elem){
        if(typeof(bg_elem)=='string') bg_elem=document.getElementById(bg_elem);
    }else bg_elem=document.body;
    showHide(flag,alphaBg.id);
    if(flag){
        place_elem(alphaBg,bg_elem);
        opacity_fade(alphaBg.id,0,20,5);
    }
}
var showHideTimeouts=Array();
function showHide(flag,elem_id,fade,timeout){
    if(typeof(elem_id)=='object'){        if(elem_id.length){            for(var i in elem_id) showHide(flag,elem_id[i],fade,timeout);
        }else{
            if(!elem_id.id) elem_id.id=uuid();
            showHide(flag,elem_id.id,fade,timeout);        }
        return;
    }
    var elem=document.getElementById(elem_id);
    if(!fade) fade=false;
    else fade=(typeof(fade)=='number' ? fade : 7);

    clearTimeout(showHideTimeouts[elem_id]);
    showHideTimeouts[elem_id]=null;
    if(timeout) showHideTimeouts[elem_id]=setTimeout('showHide('+flag+',\''+elem_id+'\','+fade+')',timeout);
    else if(elem){
        if(flag==-1) flag=(elem.style.visibility=='hidden' || elem.style.display=='none' || (typeof(opac_fade_ids[elem_id])=='object' && opac_fade_ids[elem_id].interval && opac_fade_ids[elem_id].direction==-1));
        if(flag){
            elem.style.visibility='visible';
            elem.style.display='';
            if(fade) opacity_fade(elem_id,0,100,fade);
        }else{
            if(fade) opacity_fade(elem_id,100,0,fade);
            else{
                elem.style.visibility='hidden';
                elem.style.display='none';
            }
        }
    }
}
function getElementComputedStyle(elem, prop){
    if(typeof elem!="object") elem=document.getElementById(elem);
    if(document.defaultView && document.defaultView.getComputedStyle){
        if (prop.match(/[A-Z]/)) prop = prop.replace(/([A-Z])/g, "-$1").toLowerCase();
        return document.defaultView.getComputedStyle(elem, "").getPropertyValue(prop);
    }
    if(elem.currentStyle){
        var i;
        while ((i=prop.indexOf("-"))!=-1) prop = prop.substr(0, i) + prop.substr(i+1,1).toUpperCase() + prop.substr(i+2);
        return elem.currentStyle[prop];
    }
    return "";
}
function setOpacity(elem_id,val){
    var elem=document.getElementById(elem_id);
    val=Math.round(val);
    elem.style.opacity=val/100;
    elem.style.MozOpacity=val/100;
    elem.style.KhtmlOpacity=val/100;
    elem.style.filter='alpha(opacity="'+val+'")';
}
function getOpacity(elem_id){
    var elem=document.getElementById(elem_id);
    var opac=parseFloat(getElementComputedStyle(elem, 'opacity'))*100;
    if(isNaN(opac)) opac=100;
    return opac;
}

var opac_fade_ids=Array();
var opac_fade_interval=false;
function opacity_fade(elem_id,from_val,till_val,step,direction){
    if(typeof(from_val)!='number') from_val=getOpacity(elem_id);
    if(till_val!=undefined){
        if(typeof(opac_fade_ids[elem_id])!='object') opac_fade_ids[elem_id]={};
        if(opac_fade_ids[elem_id].interval) from_val=getOpacity(elem_id);
        opac_fade_ids[elem_id].till_val=till_val;
        opac_fade_ids[elem_id].step=(step ? step : 2);
        opac_fade_ids[elem_id].direction=(till_val>from_val ? 1 : -1);
    }

    var new_opac=from_val+opac_fade_ids[elem_id].step*opac_fade_ids[elem_id].direction;
    if(opac_fade_ids[elem_id].direction*(new_opac-opac_fade_ids[elem_id].till_val)>=0){
        setOpacity(elem_id,opac_fade_ids[elem_id].till_val);
        if(opac_fade_ids[elem_id].till_val==0) showHide(false,elem_id);
        clearInterval(opac_fade_ids[elem_id].interval);
        opac_fade_ids[elem_id].interval=false;
    }else{
        setOpacity(elem_id,new_opac);
        if(!opac_fade_ids[elem_id].interval){
            opac_fade_ids[elem_id].interval=setInterval('opacity_fade(\''+elem_id+'\')',30);
        }
    }
    var intres=false
    for(var i in opac_fade_ids) if(opac_fade_ids[i].interval) intres=true;
    opac_fade_interval=intres;
}