
/*
function xDisplay(e, s) {
e = $(e);
e.css('display', s);
}

function xHide(e) {
e = $(e);
e.hide();
}

function xShow(e) {
e = $(e);
e.show();
}

function xHeight(e, h) {
e = $(e);
if (h)
e.height(h);
return e.height();
}

function xWidth(e, w) {
e = $(e);
if (w)
e.width(w);
return e.width();
}

function xTop(e, t) {
e = $(e);
if (t)
e.style.top = t;
return e.style.top;
}

function xLeft(e, l) {
e = $(e);
if (l)
e.style.left = l;
return e.style.left;
}

function xPageX(e) {
e = $(e);
return e.offset().left;
}

function xPageY(e) {
e = $(e);
return e.offset().top;
}
*/

// xDisplay r3, Copyright 2003-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

// This was alternative 1:

function xDisplay(e, s) {
    if ((e = xGetElementById(e)) && e.style && xDef(e.style.display)) {
        if (xStr(s)) {
            try { e.style.display = s; }
            catch (ex) { e.style.display = ''; } // Will this make IE use a default value
        }                                      // appropriate for the element?
        return e.style.display;
    }
    return null;
}

// xVisibility r1, Copyright 2003-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xVisibility(e, bShow) {
    if (!(e = xGetElementById(e))) return null;
    if (e.style && xDef(e.style.visibility)) {
        if (xDef(bShow)) e.style.visibility = bShow ? 'visible' : 'hidden';
        return e.style.visibility;
    }
    return null;
}

function xShow(e) { return xVisibility(e, 1); }
function xHide(e) { return xVisibility(e, 0); }

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 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 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 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); } 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); } 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; }

// xInnerHtml r1, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
}


// xGetElementById r2, Copyright 2001-2007 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') {
        if (document.getElementById) e = document.getElementById(e);
        else if (document.all) e = document.all[e];
        else e = null;
    }
    return e;
}

function xMoveTo(e, x, y) {
    xTop(e, y);
    xLeft(e, x);
}

// xResizeTo r1, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xResizeTo(e, w, h) {
    xWidth(e, w);
    xHeight(e, h);
}


// xZIndex r1, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xZIndex(e, uZ) {
    if (!(e = xGetElementById(e))) return 0;
    if (e.style && xDef(e.style.zIndex)) {
        if (xNum(uZ)) e.style.zIndex = uZ;
        uZ = parseInt(e.style.zIndex);
    }
    return uZ;
}


// xStyle r1, Copyright 2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xStyle(sProp, sVal) {
    var i, e;
    for (i = 2; i < arguments.length; ++i) {
        e = xGetElementById(arguments[i]);
        if (e.style) {
            try { e.style[sProp] = sVal; }
            catch (err) { e.style[sProp] = ''; } // ???
        }
    }
}

// xGetComputedStyle r7, Copyright 2002-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
}

// xCamelize r1, Copyright 2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
}


// xScrollTop r3, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
}

// xScrollLeft r3, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
}

// xClientWidth r5, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xClientWidth() {
    var v = 0, d = document, w = window;
    if ((!d.compatMode || d.compatMode == 'CSS1Compat') && !w.opera && d.documentElement && d.documentElement.clientWidth)
    { v = d.documentElement.clientWidth; }
    else if (d.body && d.body.clientWidth)
    { v = d.body.clientWidth; }
    else if (xDef(w.innerWidth, w.innerHeight, d.height)) {
        v = w.innerWidth;
        if (d.height > w.innerHeight) v -= 16;
    }
    return v;
}

// xClientHeight r5, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xClientHeight() {
    var v = 0, d = document, w = window;
    if ((!d.compatMode || d.compatMode == 'CSS1Compat') && !w.opera && d.documentElement && d.documentElement.clientHeight)
    { v = d.documentElement.clientHeight; }
    else if (d.body && d.body.clientHeight)
    { v = d.body.clientHeight; }
    else if (xDef(w.innerWidth, w.innerHeight, d.width)) {
        v = w.innerHeight;
        if (d.width > w.innerWidth) v -= 16;
    }
    return v;
}

var xChildWindow = null;
function xWinOpen(sUrl) {
    var features = "left=0,top=0,width=600,height=500,location=0,menubar=0," +
    "resizable=1,scrollbars=1,status=0,toolbar=0";
    if (xChildWindow && !xChildWindow.closed) { xChildWindow.location.href = sUrl; }
    else { xChildWindow = window.open(sUrl, "myWinName", features); }
    xChildWindow.focus();
    return false;
}


function xAddLoadEvent(func) {
    if (window.loaded) {
        func();
        return;
    }

    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = function() {
            window.loaded = true;
            func();
        }
    }
    else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }

    }
}


// xOpacity r1, Copyright 2006-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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?
}


// xAddEventListener r8, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
    }
}


// xRemoveEventListener r6, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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;
}


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; }

// xAnimation r3, Copyright 2006-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

function xAnimation(r) {
    this.res = r || 10;
}
xAnimation.prototype.init = function(e, t, or, ot, oe, a, b) {
    var i = this;
    i.e = xGetElementById(e);
    i.t = t;
    i.or = or; i.ot = ot; i.oe = oe;
    i.a = a || 0;
    i.v = xAnimation.vf[i.a];
    i.qc = 1 + (b || 0);
    i.fq = 1 / i.t;
    if (i.a) {
        i.fq *= i.qc * Math.PI;
        if (i.a == 1 || i.a == 2) { i.fq /= 2; }
    }
    else { i.qc = 1; }
    i.xd = i.x2 - i.x1; i.yd = i.y2 - i.y1; i.zd = i.z2 - i.z1;
};
xAnimation.prototype.run = function(r) {
    var i = this;
    if (!r) i.t1 = new Date().getTime();
    if (!i.tmr) i.tmr = setInterval(
    function() {
        i.et = new Date().getTime() - i.t1;
        if (i.et < i.t) {
            i.f = i.v(i.et * i.fq);
            i.x = i.xd * i.f + i.x1; i.y = i.yd * i.f + i.y1; i.z = i.zd * i.f + i.z1;
            i.or(i);
        }
        else {
            clearInterval(i.tmr); i.tmr = null;
            if (i.qc % 2) { i.x = i.x2; i.y = i.y2; i.z = i.z2; }
            else { i.x = i.x1; i.y = i.y1; i.z = i.z1; }
            i.ot(i);
            var rep = false;
            if (typeof i.oe == 'function') rep = i.oe(i);
            else if (typeof i.oe == 'string') rep = eval(i.oe);
            if (rep) i.resume(1);
        }
    }, i.res
  );
};
xAnimation.vf = [
  function(r) { return r; },
  function(r) { return Math.abs(Math.sin(r)); },
  function(r) { return 1 - Math.abs(Math.cos(r)); },
  function(r) { return (1 - Math.cos(r)) / 2; }
];
xAnimation.prototype.pause = function() {
    clearInterval(this.tmr);
    this.tmr = null;
};
xAnimation.prototype.resume = function(fs) {
    if (typeof this.tmr != 'undefined' && !this.tmr) {
        this.t1 = new Date().getTime();
        if (!fs) { this.t1 -= this.et; }
        this.run(!fs);
    }
};


// xEvent r11, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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_onif (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_onif (e.button & 1) this.button = 0;
            else if (e.button & 4) this.button = 1;
            else if (e.button & 2) this.button = 2; @*/
        }
    }
}


// xHasPoint r2, Copyright 2001-2007 Michael Foster (Cross-Browser.com)
// Part of X, a Cross-Browser Javascript Library, Distributed under the terms of the GNU LGPL

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);
    return (x >= eX + l && x <= eX + xWidth(e) - r &&
          y >= eY + t && y <= eY + xHeight(e) - b);
}
