// 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;}