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;
}
document.onmousemove=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);
  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+document.body.scrollLeft)+'px';
  pelem.style.top=(elem_bounds.top+document.body.scrollTop)+'px';
  pelem.style.width=(elem_bounds.width)+'px';
  pelem.style.height=(elem_bounds.height)+'px';
}
function show_or_hide(flag,elem_id,fade,timeout){
  var elem=document.getElementById(elem_id);
  if(!fade) fade=false;
  else fade=(typeof(fade)=='number' ? fade : 15);
  if(timeout) setTimeout('show_or_hide('+flag+',\''+elem_id+'\','+fade+')',timeout);
  else if(elem){
    if(flag==-1) flag=(elem.style.visibility=='hidden' || (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);
  elem.style.opacity=val/100;
  elem.style.filter='alpha(opacity='+val+')';
}
function getOpacity(elem_id){  var elem=document.getElementById(elem_id);  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){    opac_fade_intervals=true;    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) show_or_hide(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;
}