// JavaScript Document

// globals, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



var xOp7Up,xOp6Dn,xIE4Up,xIE4,xIE5,xNN4,xUA=navigator.userAgent.toLowerCase();

if(window.opera){

  var i=xUA.indexOf('opera');

  if(i!=-1){

    var v=parseInt(xUA.charAt(i+6));

    xOp7Up=v>=7;

    xOp6Dn=v<7;

  }

}

else if(navigator.vendor!='KDE' && document.all && xUA.indexOf('msie')!=-1){

  xIE4Up=parseFloat(navigator.appVersion)>=4;

  xIE4=xUA.indexOf('msie 4')!=-1;

  xIE5=xUA.indexOf('msie 5')!=-1;

}

else if(document.layers){xNN4=true;}

xMac=xUA.indexOf('mac')!=-1;



// xClip, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xClip(e,t,r,b,l)

{

  if(!(e=xGetElementById(e))) return;

  if(e.style) {

    if (xNum(l)) e.style.clip='rect('+t+'px '+r+'px '+b+'px '+l+'px)';

    else e.style.clip='rect(0 '+parseInt(e.style.width)+'px '+parseInt(e.style.height)+'px 0)';

  }

}



// xSlideTo, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xSlideTo(e, x, y, uTime)

{

  if (!(e=xGetElementById(e))) return;

  if (!e.timeout) e.timeout = 25;

  e.xTarget = x; e.yTarget = y; e.slideTime = uTime; e.stop = false;

  e.yA = e.yTarget - xTop(e); e.xA = e.xTarget - xLeft(e); // A = distance

  if (e.slideLinear) e.B = 1/e.slideTime;

  else e.B = Math.PI / (2 * e.slideTime); // B = period

  e.yD = xTop(e); e.xD = xLeft(e); // D = initial position

  var d = new Date(); e.C = d.getTime();

  if (!e.moving) _xSlideTo(e);

}

function _xSlideTo(e)

{

  if (!(e=xGetElementById(e))) return;

  var now, s, t, newY, newX;

  now = new Date();

  t = now.getTime() - e.C;

  if (e.stop) { e.moving = false; }

  else if (t < e.slideTime) {

    setTimeout("_xSlideTo('"+e.id+"')", e.timeout);



    s = e.B * t;

    if (!e.slideLinear) s = Math.sin(s);

//    if (e.slideLinear) s = e.B * t;

//    else s = Math.sin(e.B * t);



    newX = Math.round(e.xA * s + e.xD);

    newY = Math.round(e.yA * s + e.yD);

    xMoveTo(e, newX, newY);

    e.moving = true;

  }  

  else {

    xMoveTo(e, e.xTarget, e.yTarget);

    e.moving = false;

    if (e.onslideend) e.onslideend();

  }  

}



// xGetElementById, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xGetElementById(e)

{

  if(typeof(e)!='string') return e;

  if(document.getElementById) e=document.getElementById(e);

  else if(document.all) e=document.all[e];

  else e=null;

  return e;

}



// xTop, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xTop(e, iY)

{

  if(!(e=xGetElementById(e))) return 0;

  var css=xDef(e.style);

  if(css && xStr(e.style.top)) {

    if(xNum(iY)) e.style.top=iY+'px';

    else {

      iY=parseInt(e.style.top);

      if(isNaN(iY)) iY=0;

    }

  }

  else if(css && xDef(e.style.pixelTop)) {

    if(xNum(iY)) e.style.pixelTop=iY;

    else iY=e.style.pixelTop;

  }

  return iY;

}



// xLeft, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xLeft(e, iX)

{

  if(!(e=xGetElementById(e))) return 0;

  var css=xDef(e.style);

  if (css && xStr(e.style.left)) {

    if(xNum(iX)) e.style.left=iX+'px';

    else {

      iX=parseInt(e.style.left);

      if(isNaN(iX)) iX=0;

    }

  }

  else if(css && xDef(e.style.pixelLeft)) {

    if(xNum(iX)) e.style.pixelLeft=iX;

    else iX=e.style.pixelLeft;

  }

  return iX;

}



// xMoveTo, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xMoveTo(e,x,y)

{

  xLeft(e,x);

  xTop(e,y);

}



// xDef, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xDef()

{

  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}

  return true;

}



// xStr, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xStr(s)

{

  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') return false;}

  return true;

}



// xNum, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xNum()

{

  for(var i=0; i<arguments.length; ++i){if(isNaN(arguments[i]) || typeof(arguments[i])!='number') return false;}

  return true;

}



// xWidth, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xWidth(e,w)

{

  if(!(e=xGetElementById(e))) return 0;

  if (xNum(w)) {

    if (w<0) w = 0;

    else w=Math.round(w);

  }

  else w=-1;

  var css=xDef(e.style);

  if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {

    w = xClientWidth();

  }

  else if(css && xDef(e.offsetWidth) && xStr(e.style.width)) {

    if(w>=0) {

      var pl=0,pr=0,bl=0,br=0;

      if (document.compatMode=='CSS1Compat') {

        var gcs = xGetComputedStyle;

        pl=gcs(e,'padding-left',1);

        if (pl !== null) {

          pr=gcs(e,'padding-right',1);

          bl=gcs(e,'border-left-width',1);

          br=gcs(e,'border-right-width',1);

        }

        // Should we try this as a last resort?

        // At this point getComputedStyle and currentStyle do not exist.

        else if(xDef(e.offsetWidth,e.style.width)){

          e.style.width=w+'px';

          pl=e.offsetWidth-w;

        }

      }

      w-=(pl+pr+bl+br);

      if(isNaN(w)||w<0) return;

      else e.style.width=w+'px';

    }

    w=e.offsetWidth;

  }

  else if(css && xDef(e.style.pixelWidth)) {

    if(w>=0) e.style.pixelWidth=w;

    w=e.style.pixelWidth;

  }

  return w;

}



// xHeight, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xHeight(e,h)

{

  if(!(e=xGetElementById(e))) return 0;

  if (xNum(h)) {

    if (h<0) h = 0;

    else h=Math.round(h);

  }

  else h=-1;

  var css=xDef(e.style);

  if (e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {

    h = xClientHeight();

  }

  else if(css && xDef(e.offsetHeight) && xStr(e.style.height)) {

    if(h>=0) {

      var pt=0,pb=0,bt=0,bb=0;

      if (document.compatMode=='CSS1Compat') {

        var gcs = xGetComputedStyle;

        pt=gcs(e,'padding-top',1);

        if (pt !== null) {

          pb=gcs(e,'padding-bottom',1);

          bt=gcs(e,'border-top-width',1);

          bb=gcs(e,'border-bottom-width',1);

        }

        // Should we try this as a last resort?

        // At this point getComputedStyle and currentStyle do not exist.

        else if(xDef(e.offsetHeight,e.style.height)){

          e.style.height=h+'px';

          pt=e.offsetHeight-h;

        }

      }

      h-=(pt+pb+bt+bb);

      if(isNaN(h)||h<0) return;

      else e.style.height=h+'px';

    }

    h=e.offsetHeight;

  }

  else if(css && xDef(e.style.pixelHeight)) {

    if(h>=0) e.style.pixelHeight=h;

    h=e.style.pixelHeight;

  }

  return h;

}



// xClientWidth, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xClientWidth()

{

  var w=0;

  if(xOp6Dn) w=window.innerWidth;

  else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientWidth)

    w=document.documentElement.clientWidth;

  else if(document.body && document.body.clientWidth)

    w=document.body.clientWidth;

  else if(xDef(window.innerWidth,window.innerHeight,document.height)) {

    w=window.innerWidth;

    if(document.height>window.innerHeight) w-=16;

  }

  return w;

}



// xClientHeight, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xClientHeight()

{

  var h=0;

  if(xOp6Dn) h=window.innerHeight;

  else if(document.compatMode == 'CSS1Compat' && !window.opera && document.documentElement && document.documentElement.clientHeight)

    h=document.documentElement.clientHeight;

  else if(document.body && document.body.clientHeight)

    h=document.body.clientHeight;

  else if(xDef(window.innerWidth,window.innerHeight,document.width)) {

    h=window.innerHeight;

    if(document.width>window.innerWidth) h-=16;

  }

  return h;

}



// xDef, Copyright 2001-2005 Michael Foster (Cross-Browser.com)

// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL



function xDef()

{

  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}

  return true;

}
