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

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


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

        function xGetElementById(e)
        {
            if(typeof(e)=='string') 
            {
                if(document.getElementById) e=document.getElementById(e);
                else if(document.all) e=document.all[e];
                else e=null;
            }
        
            return e;
        }

        function xGetElementsByTagName(t,p)
        {
            var list = null;
            t = t || '*';
            p = p || document;

            if (typeof p.getElementsByTagName != 'undefined') 
            { // DOM1
                list = p.getElementsByTagName(t);
                if (t=='*' && (!list || !list.length)) list = p.all; // IE5 '*' bug
            }
            else 
            { // IE4 object model
                if (t=='*') list = p.all;
                else if (p.all && p.all.tags) list = p.all.tags(t);
            }
            return list || new Array();
        }

        function xCamelize(cssPropStr)
        {
            var i, c, a = cssPropStr.split('-');
            var s = a[0];
            for (i=1; i<a.length; ++i) 
            {
                c = a[i].charAt(0);
                s += a[i].replace(c, c.toUpperCase());
            }
            return s;
        }

        function xGetComputedStyle(e, p, i)
        {
            if(!(e=xGetElementById(e))) return null;

            var s, v = 'undefined', dv = document.defaultView;
            if(dv && dv.getComputedStyle)
            {
                s = dv.getComputedStyle(e,'');
                if (s) v = s.getPropertyValue(p);
            }
            else if(e.currentStyle) 
            {
                v = e.currentStyle[xCamelize(p)];
            }
            else return null;

            return i ? (parseInt(v) || 0) : v;
        }

        function xOffsetLeft(e)
        {
            if (!(e=xGetElementById(e))) return 0;
            if (xDef(e.offsetLeft)) return e.offsetLeft;
            else return 0;
        }

        function xOffsetTop(e)
        {
            if (!(e=xGetElementById(e))) return 0;
            if (xDef(e.offsetTop)) return e.offsetTop;
            else return 0;
        }

        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=xGetComputedStyle(e,'left',1);
                    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;
        }

        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=xGetComputedStyle(e,'top',1);
                    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;
        }

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

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

        function xPageX(e)
        {
            var x = 0;
            e = xGetElementById(e);
            
            while (e)
            {
                if (xDef(e.offsetLeft)) x += e.offsetLeft;
                e = xDef(e.offsetParent) ? e.offsetParent : null;
            }
            
            return x;
        }

        function xPageY(e)
        {
            var y = 0;
            e = xGetElementById(e);
            while (e) 
            {
                if (xDef(e.offsetTop)) y += e.offsetTop;
                e = xDef(e.offsetParent) ? e.offsetParent : null;
            }
            
            return y;
        }

        function xHasPoint(e,x,y,t,r,b,l)
        {
            if (!xNum(t)){t=r=b=l=0;}
            else if (!xNum(r)){r=b=l=t;}
            else if (!xNum(b)){l=r; b=t;}

            var eX = xPageX(e), eY = xPageY(e);
/*            
            alert("Left: " + x + " >= (" + eX + " + " + l + ") = " + (x >= (eX + l) ? "True" : "False"));
            alert("Right: " + x + " <= (" + eX + " + " + xWidth(e) + " - " + r + ") = " + (x <= (eX + xWidth(e) - r) ? "True" : "False"));
            alert("Top: " + y + " >= (" + eY + " + " + t + ") = " + (y >= (eY + t) ? "True" : "False"));
            alert("Botton: " + y + " <= (" + eY + " + " + xHeight(e) + " - " + b + ") = " + (y <= (eY + xHeight(e) - b) ? "True" : "False"));
*/
            return (x >= (eX + l) && x <= (eX + xWidth(e) - r) &&
            y >= (eY + t) && y <= (eY + xHeight(e) - b) );
        }
        
        function xInnerText(e, t)
        {
            e = xGetElementById(e);
            if(!e)
               return;
            
            if(xDef(e.innerText)) e.innerText = t;
            else if(xDef(e.textContent)) e.textContent = t;
        }
        
        function xInnerHtml(e,h)
        {
            if(!(e=xGetElementById(e)) || !xStr(e.innerHTML)) return null;

            var s = e.innerHTML;
            if (xStr(h)) {e.innerHTML = h;}

            return s;
        }
        
        function xScrollLeft(e, bWin)
        {
            var offset=0;
            if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') 
            {
                var w = window;
                if (bWin && e) w = e;
                if(w.document.documentElement && w.document.documentElement.scrollLeft) offset=w.document.documentElement.scrollLeft;
                else if(w.document.body && xDef(w.document.body.scrollLeft)) offset=w.document.body.scrollLeft;
            } 
            else 
            {
                e = xGetElementById(e);
                if (e && xNum(e.scrollLeft)) offset = e.scrollLeft;
            }
            return offset;
        }

        function xScrollTop(e, bWin)
        {
            var offset=0;
            if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') 
            {
                var w = window;
                if (bWin && e) w = e;
                if(w.document.documentElement && w.document.documentElement.scrollTop) offset=w.document.documentElement.scrollTop;
                else if(w.document.body && xDef(w.document.body.scrollTop)) offset=w.document.body.scrollTop;
            }
            else 
            {
                e = xGetElementById(e);
                if (e && xNum(e.scrollTop)) offset = e.scrollTop;
            }

            return offset;
        }

        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();
            }  
        }

function xMoveTo(e,x,y)
{
  xLeft(e,x);
  xTop(e,y);
}

function xOpacity(e, o)
{
  var set = xDef(o);
  //  if (set && o == 1) o = .9999; // FF1.0.2 but not needed in 1.5
  if(!(e=xGetElementById(e))) return 2; // error
  if (xStr(e.style.opacity)) { // CSS3
    if (set) e.style.opacity = o + '';
    else o = parseFloat(e.style.opacity);
  }
  else if (xStr(e.style.filter)) { // IE5.5+
    if (set) e.style.filter = 'alpha(opacity=' + (100 * o) + ')';
    else if (e.filters && e.filters.alpha) { o = e.filters.alpha.opacity / 100; }
  }
  else if (xStr(e.style.MozOpacity)) { // Gecko before CSS3 support
    if (set) e.style.MozOpacity = o + '';
    else o = parseFloat(e.style.MozOpacity);
  }
  else if (xStr(e.style.KhtmlOpacity)) { // Konquerer and Safari
    if (set) e.style.KhtmlOpacity = o + '';
    else o = parseFloat(e.style.KhtmlOpacity);
  }
  return isNaN(o) ? 1 : o; // if NaN, should this return an error instead of 1?
}

        function xEvent(evt) // object prototype
        {
            var e = evt || window.event;
            if (!e) return;
        
            this.type = e.type;
            this.target = e.target || e.srcElement;
            this.relatedTarget = e.relatedTarget;
        
            /*@cc_on if (e.type == 'mouseover') this.relatedTarget = e.fromElement;
            else if (e.type == 'mouseout') this.relatedTarget = e.toElement; @*/
            if (xDef(e.pageX)) { this.pageX = e.pageX; this.pageY = e.pageY; }
            else if (xDef(e.clientX)) { this.pageX = e.clientX + xScrollLeft(); this.pageY = e.clientY + xScrollTop(); }
        
            if (xDef(e.offsetX)) { this.offsetX = e.offsetX; this.offsetY = e.offsetY; }
            else if (xDef(e.layerX)) { this.offsetX = e.layerX; this.offsetY = e.layerY; }
            else { this.offsetX = this.pageX - xPageX(this.target); this.offsetY = this.pageY - xPageY(this.target); }
            
            this.keyCode = e.keyCode || e.which || 0;
            this.shiftKey = e.shiftKey; this.ctrlKey = e.ctrlKey; this.altKey = e.altKey;
            
            if (typeof e.type == 'string') 
            {
                if (e.type.indexOf('click') != -1) {this.button = 0;}
                else if (e.type.indexOf('mouse') != -1) 
                {
                    this.button = e.button;
                    /*@cc_on if (e.button & 1) this.button = 0;
                    else if (e.button & 4) this.button = 1;
                    else if (e.button & 2) this.button = 2; @*/
                }
            }
        }
        
        function xAddEventListener(e,eT,eL,cap)
        {
            if(!(e=xGetElementById(e)))return;
            
            eT=eT.toLowerCase();
            
            if(e.addEventListener)e.addEventListener(eT,eL,cap||false);
            else if(e.attachEvent)e.attachEvent('on'+eT,eL);
            else 
            {
                var o=e['on'+eT];
                e['on'+eT]=typeof o=='function' ? function(v){o(v);eL(v);} : eL;
            }
        }
        
        function xRemoveEventListener(e,eT,eL,cap)
        {
            if(!(e=xGetElementById(e)))return;
            
            eT=eT.toLowerCase();
            if(e.removeEventListener)e.removeEventListener(eT,eL,cap||false);
            else if(e.detachEvent)e.detachEvent('on'+eT,eL);
            else e['on'+eT]=null;
        }
