
/** BEGIN REGISTER **/

function radioClick(obj, id1, id2)
{
    if (!obj) return;

    var sel = obj.value*1;

    var sf1 = xGetElementById('show_frm' + id1);
    var sf2 = xGetElementById('show_frm' + id2);

    if (sf1) sf1.style.display = sel ? 'none' : '';
    if (sf2) sf2.style.display = sel ? '' : 'none';
}

function checkClick(obj, id, reverse)
{
    if (!obj) return;

    var sel = obj.checked;
    if (reverse) sel = !sel;

    var sf = xGetElementById('show_frm' + id);

    if (sf) sf.style.display = sel ? '' : 'none';
}

function switchClick(obj, tag, class1, class2)
{
    if (!obj) return;

    var sel = obj.value*1;

    xGetElementsByClassName(class1, undefined, tag, function(e) { e.style.display = sel ? '' : 'none'; });
    xGetElementsByClassName(class2, undefined, tag, function(e) { e.style.display = sel ? 'none' : ''; });
}

var ajaxFrmRegiser;
var XHR;
function submitClick()
{
    if (!ajaxFrmRegiser) ajaxFrmRegiser = xGetElementById('ajaxFrmRegiser');
    if (!XHR) XHR = new xHttpRequest();

    if (XHR.busy) {
        alert('Formular in curs de procesare. Va rugam asteptati')
        return;
    }

    var reg = xGetElementById('reg0');
    var id = reg ? (reg.checked ? 1 : 2) : 1;

    var spin;
    if (spin = xGetElementById('loading' + id)) {
        spin.style.display = '';
    }

    var show_errors;
    if (show_errors = xGetElementById('show_errors')) {
        show_errors.style.display = 'none';
    }


    var toSend = new Array();
    xGetElementsByClassName('.*', ajaxFrmRegiser, 'input',
        function(e)
        {
            if (e.type == 'checkbox' || e.type == 'radio') {
                if (e.checked) {
                    toSend.push(encodeURIComponent(e.name) + '=' + encodeURIComponent(e.value));
                }
            } else {
                toSend.push(encodeURIComponent(e.name) + '=' + encodeURIComponent(e.value));
            }
            e.disabled = true;
        }
    );
    toSend = toSend.join('&');

    if (!XHR.send('POST', '/ajax_register.php', toSend, 0, 'r', false, id, onAjaxRegister)) {
        alert('Eroare la trimiterea formularului');
    }
}

function onAjaxRegister(req, status, data)
{
    if (!XHR) XHR = new xHttpRequest();

    if (data) {
        if (spin = xGetElementById('loading' + data)) {
            spin.style.display = 'none';
        }
    }

    if (status != XHR.OK) {
        if (status & XHR.NOXMLOBJ) {
            msg = ': browserul nu suporta AJAX';
        } else if (status & XHR.TIMEOUT) {
            msg = ': serverul nu raspunde suficient de rapid';
        } else if (status & XHR.RSPERR) {
            msg = ': serverul nu poate fi contactat';
        } else {
            msg = ' [' + status + ']';
        }
        alert('Eroare la procesarea formularului' + msg);
        return;
    }

    if (req.responseText == '1') {
        url = document.location.href;
        var p = url.indexOf('?logout');
        if (p > 0) {
            document.location.href = url.substr(0, p);
        } else {
            document.location.reload(true);
        }
    } else {
        xInnerHtml(ajaxFrmRegiser, req.responseText);
    }
}

var XHRuit;
function forgotClick(send)
{
    if (!ajaxFrmRegiser) ajaxFrmRegiser = xGetElementById('ajaxFrmRegiser');
    if (!XHRuit) XHRuit = new xHttpRequest();

    if (XHRuit.busy) {
        alert('In curs de incarcare. Va rugam asteptati')
        return;
    }

    var spin;
    if (spin = xGetElementById('loading1')) {
        spin.style.display = '';
    }

    var show_errors;
    if (show_errors = xGetElementById('show_errors')) {
        show_errors.style.display = 'none';
    }

    var toSend = new Array();
    if (send) {
        xGetElementsByClassName('.*', ajaxFrmRegiser, 'input',
            function(e)
            {
                toSend.push(encodeURIComponent(e.name) + '=' + encodeURIComponent(e.value));
                e.disabled = true;
            }
        );
    }
    toSend = toSend.join('&');

    if (!XHRuit.send('POST', '/ajax_forgot.php', toSend, 0, 'r', false, 1, onAjaxRegister)) {
        alert('Eroare contactare server');
    }
}

/** END REGISTER **/

/** BEGIN TOP INPUTS **/

function input_focus(obj)
{
    if (!obj) return;

    if (obj.value == obj.title) obj.value = '';
}

function input_blur(obj)
{
    if (!obj) return;

    if (obj.value.length < 1) obj.value = obj.title;
}

function insite_login()
{
    xGetElementById('insite_login').submit();
}

function do_insite_search()
{
    var o = xGetElementById('insite_search');
    if (!o) return;
    if (o.value == o.title) return;

    var s = o.value.replace(/^\s+|\s+$/g, ''); // trim
    o.value = s;
    o.onblur(o);

    if (s.length < 1) return;

    s = s.replace(/\s/g, '_');
    document.location.href = '/Rezultate-cautare-' + encodeSearchTerm(s) + '.html';
}

/** END TOP INPUTS **/

/** BEGIN SEARCH **/

function encodeSearchTerm(s)
{
    s = s.replace(/(\s-\s)|\s|[-&?*]/g, '_');
    s = s.replace(/-/g, '~');
    return encodeURIComponent(s);
}

function search_adv()
{
    var toSend = new Array();

    function addtosend(id)
    {
        var e = xGetElementById(id);
        if (e.type == 'checkbox') {
            if (!e.checked) return;
        }

        var s = e.value.replace(/^\s+|\s+$/g, ''); // trim
        toSend.push(encodeSearchTerm(s));

        if (e.options) {
            if (e.value*1 > 0) {
                toSend.push(encodeSearchTerm(e.options[e.selectedIndex].innerHTML.replace(',', '')));
            } else {
                toSend.push('');
            }
        }
    }

    addtosend('s_generic');
    addtosend('s_title');
    addtosend('s_car');
    addtosend('s_publisher');
    addtosend('s_id_categ');
    addtosend('s_id_publisher');
    addtosend('s_id_car');
    addtosend('s_in_stock');

    document.location.href = '/Rezultate-cautare-' + toSend.join('-') + '.html';
}

/** END SEARCH **/

/** BEGIN CART **/

var divMinicart;
var ajaxCart;
var XHRcart;
function minicart_update()
{
    if (!XHRcart) XHRcart = new xHttpRequest();

    if (XHRcart.busy) {
        alert('In curs de procesare. Va rugam asteptati')
        return;
    }

    if (!divMinicart) divMinicart = xGetElementById('divMinicart');
    if (!ajaxCart) ajaxCart = xGetElementById('ajaxCart');

    if (ajaxCart) {
        if (!XHRcart) XHRcart = new xHttpRequest();

        if (XHRcart.busy) {
            alert('In curs de procesare. Va rugam asteptati')
            return;
        }
    }

    var toSend = new Array();
    xGetElementsByClassName('.*', divMinicart, 'input',
        function(e)
        {
            var v = parseInt(e.value);
            if (!isNaN(v) || e.name == 'coupon')
                toSend.push(encodeURIComponent(e.name) + '=' + encodeURIComponent(v));
            e.disabled = true;
        }
    );
    toSend = toSend.join('&');

    var data = new Array();
    data[0] = true; // minicart
    data[1] = true; // also update main cart
    if (!XHRcart.send('POST', '/ajax_cart.php?shop_mod=mini', toSend, 0, 'r', false, data, onAjaxCart)) {
        alert('Eroare la trimiterea datelor');
    }
}

function cart_update()
{
    if (!XHRcart) XHRcart = new xHttpRequest();

    if (XHRcart.busy) {
        alert('In curs de procesare. Va rugam asteptati')
        return;
    }

    if (!ajaxCart) ajaxCart = xGetElementById('ajaxCart');
    if (!divMinicart) divMinicart = xGetElementById('divMinicart');

    if (divMinicart) {
        if (!XHRcart) XHRcart = new xHttpRequest();

        if (XHRcart.busy) {
            alert('In curs de procesare. Va rugam asteptati')
            return;
        }
    }

    var toSend = new Array();
    xGetElementsByClassName('.*', ajaxCart, 'input',
        function(e)
        {
            var v = (e.name == 'coupon') ? e.value : parseInt(e.value);
            if (!isNaN(v) || e.name == 'coupon')
                toSend.push(encodeURIComponent(e.name) + '=' + encodeURIComponent(v));
            e.disabled = true;
        }
    );
    toSend = toSend.join('&');

    var data = new Array();
    data[0] = false; // main cart
    data[1] = true; // also update minicart
    if (!XHRcart.send('POST', '/ajax_cart.php?shop_mod=1', toSend, 0, 'r', false, data, onAjaxCart)) {
        alert('Eroare la trimiterea datelor');
    }
}

var flying = false;
var divFlyer;
var refMinicart;
var refMinicartX;
var refMinicartY;
function cart_add(id)
{
    if (flying) {
        alert('In curs de procesare. Va rugam asteptati')
        return;
    }

    if (!XHRcart) XHRcart = new xHttpRequest();

    if (XHRcart.busy) {
        alert('In curs de procesare. Va rugam asteptati')
        return;
    }

    if (!divMinicart) divMinicart = xGetElementById('divMinicart');
    if (!ajaxCart) ajaxCart = xGetElementById('ajaxCart');

    if (ajaxCart) {
        if (!XHRcart) XHRcart = new xHttpRequest();

        if (XHRcart.busy) {
            alert('In curs de procesare. Va rugam asteptati')
            return;
        }
    }

    var oEnd = function() {
        var data = new Array();
        data[0] = true; // minicart
        data[1] = true; // also update main cart
        if (!XHRcart.send('GET', '/ajax_cart.php', 'shop_mod=mini&shop_add=' + id, 0, 'r', false, data, onAjaxCart)) {
            alert('Eroare la trimiterea datelor');
        }
        flying = false;
        if (divFlyer) divFlyer.style.display = 'none';
    }

    var big = true;
    var img = xGetElementById('shop_prod_img');
    var ref;
    if (img) {
        ref = xGetElementById('img_ref');
    } else {
        img = xGetElementById('img_' + id);
        ref = xGetElementById('img_r_' + id);
        big = false;
    }

    if (img) {
        if (!divFlyer) divFlyer = xGetElementById('divFlyer');
        if (!refMinicart) {
            refMinicart = xGetElementById('refMinicart');
            refMinicartX = getOffsetLeft(refMinicart);
            refMinicartY = getOffsetTop(refMinicart);
        }
        xLeft(divFlyer, getOffsetLeft(ref)+1);
        xTop(divFlyer, getOffsetTop(ref));
        divFlyer.src = img.src;
        divFlyer.width = img.width;
        divFlyer.height = img.height;
        xWidth(divFlyer, img.width);
        xHeight(divFlyer, img.height);
        var tW = big ? (img.width/2) : 0;
        var tH = big ? (img.height/2) : 0;
        divFlyer.style.display = '';

        xAniLine(divFlyer, refMinicartX, refMinicartY, tW, tH, 400, 1, oEnd);
    } else {
        oEnd();
    }
}

function cart_clear()
{
    if (!ajaxCart) ajaxCart = xGetElementById('ajaxCart');

    xGetElementsByClassName('.*', ajaxCart, 'input', function(e) { e.value = 0; });

    cart_update();
}

function cart_del(mini, id)
{
    xGetElementById(id).value = 0;

    mini ? minicart_update() : cart_update();
}

var wait_mini1 = true;
var wait_mini2 = true;
function cart_reload()
{
    wait_mini1 = false;
    if (wait_mini2) return;

    var u = '/magazin/Cart-shop_cart.html';
    if (document.location.href == u) {
        document.location.reload(true);
    } else {
        document.location.href = u;
    }
}

function onAjaxCart(req, status, data)
{
    if (status != XHRcart.OK) {
        if (status & XHRcart.NOXMLOBJ) {
            msg = ': browserul nu suporta AJAX';
        } else if (status & XHRcart.TIMEOUT) {
            msg = ': serverul nu raspunde suficient de rapid';
        } else if (status & XHRcart.RSPERR) {
            msg = ': serverul nu poate fi contactat';
        } else {
            msg = ' [' + status + ']';
        }
        alert('Eroare la procesarea formularului' + msg);
        return;
    }

    var mini = data[0];
    var reload = data[1];

    if (mini) {
        xInnerHtml(divMinicart, req.responseText);

        wait_mini2 = false;
        if (!wait_mini1) cart_reload();

        if (reload) {
            if (!ajaxCart) ajaxCart = xGetElementById('ajaxCart');
            if (ajaxCart) {
                var data = new Array();
                data[0] = false; // main cart
                data[1] = false; // no reload
                if (!XHRcart.send('GET', '/ajax_cart.php', 'shop_mod=1', 0, 'r', false, data, onAjaxCart)) {
                    alert('Eroare la trimiterea datelor');
                }
            }
        }
    } else {
        xInnerHtml(ajaxCart, req.responseText);
        if (req.responseText.indexOf('CART_RELOAD') > 0) {
            cart_reload();
        }

        if (reload) {
            if (!divMinicart) divMinicart = xGetElementById('divMinicart');
            if (divMinicart) {
                var data = new Array();
                data[0] = true;  // minicart
                data[1] = false; // no reload
                if (!XHRcart.send('GET', '/ajax_cart.php', 'shop_mod=mini', 0, 'r', false, data, onAjaxCart)) {
                    alert('Eroare la trimiterea datelor');
                }
            }
        }
    }
}

/** END CART **/

function submit_contact()
{
    xGetElementById('frmContact').submit();
}

function submit_review()
{
    var r = xGetElementById('review_msg');
    r.value = r.value.replace(/^\s+|\s+$/g, ''); // trim
    if (r.value.length < 1 || r.value == r.title) {
        alert('Scrieti intai un mesaj')
        r.focus();
        return false;
    }
    xGetElementById('frmShopReview').submit();
    return true;
}


function getOffsetLeft(e)
{
  if(!(e=xGetElementById(e))) return 0;
  if (xDef(e.offsetLeft)) {
    iX=parseInt(e.offsetLeft);
    if(isNaN(iX)) iX=xGetComputedStyle(e,'left',1);
    if(isNaN(iX)) iX=0;
  }
  else iX=0;
  return iX;
}

function getOffsetTop(e)
{
  if(!(e=xGetElementById(e))) return 0;
  if(xDef(e.offsetTop)) {
      iY=parseInt(e.offsetTop);
      if(isNaN(iY)) iY=xGetComputedStyle(e,'top',1);
      if(isNaN(iY)) iY=0;
  }
  else iY=0;
  return iY;
}

/** X Library starts here **/

// xAniLine 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
// -- modified to also animate size

function xAniLine(e, x, y, w, h, t, a, oe)
{
  if (!(e=xGetElementById(e))) return;
  var x0 = xLeft(e), y0 = xTop(e); // start positions
  x = Math.round(x); y = Math.round(y);
  var dx = x - x0, dy = y - y0; // displacements
  var w0, h0;
  if (w) { w0 = xWidth(e), h0 = xHeight(e); // start size
  w = Math.round(w); h = Math.round(h);
  var dw = w - w0, dh = h - h0;
  }
  var fq = 1 / t; // frequency
  if (a) fq *= (Math.PI / 2);
  var t0 = new Date().getTime(); // start time
  var tmr = setInterval(
    function() {
      var et = new Date().getTime() - t0; // elapsed time
      if (et < t) {
        var f = et * fq; // constant velocity
        if (a == 1) f = Math.sin(f); // sine acceleration
        else if (a == 2) f = 1 - Math.cos(f); // cosine acceleration
        f = Math.abs(f);
        e.style.left = Math.round(f * dx + x0) + 'px'; // instantaneous positions
        e.style.top = Math.round(f * dy + y0) + 'px';
        if (w) {
        e.style.width = Math.round(f * dw + w0) + 'px'; // instantaneous size
        e.style.height = Math.round(f * dh + h0) + 'px';
        }
      }
      else {
        clearInterval(tmr);
        e.style.left = x + 'px'; // target positions
        e.style.top = y + 'px';
        if (w) {
        e.style.width = w + 'px'; // target size
        e.style.height = h + 'px';
        }
        if (typeof oe == 'function') oe(); // 'onEnd' handler
        else if (typeof oe == 'string') eval(oe);
      }
    }, 10 // timer resolution
  );
}

// xHttpRequest r9, 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 xHttpRequest() // object prototype
{
  // Private Properties
  var _i = this; // instance object
  var _r = null; // XMLHttpRequest object
  var _t = null; // timer
  var _f = null; // callback function
  var _x = false; // XML response pending
  var _o = null; // user data object passed to _f
  var _c = false; // self-clean after send() completed?
  // Public Properties
  _i.OK = 0;
  _i.NOXMLOBJ = 1;
  _i.REQERR = 2;
  _i.TIMEOUT = 4;
  _i.RSPERR = 8;
  _i.NOXMLCT = 16;
  _i.ABORTED = 32;
  _i.status = _i.OK;
  _i.error = null;
  _i.busy = false;
  // Private Methods
  function _clean()
  {
    _i = null;
    _r = null;
    _t = null;
    _f = null;
    _x = false;
    _o = null;
    _c = false;
  }
  function _clrTimer()
  {
    if (_t) {
      clearTimeout(_t);
    }
    _t = null;
  }
  function _endCall()
  {
    if (_f) {
      _f(_r, _i.status, _o);
    }
    _f = null; _x = false; _o = null;
    _i.busy = false;
    if (_c) {
      _clean();
    }
  }
  function _abort(s)
  {
    _clrTimer();
    try {
      _r.onreadystatechange = function(){};
      _r.abort();
    }
    catch (e) {
      _i.status |= _i.RSPERR;
      _i.error = e;
    }
    _i.status |= s;
    _endCall();
  }
  function _newXHR()
  {
    try { _r = new XMLHttpRequest(); }
    catch (e) { try { _r = new ActiveXObject('Msxml2.XMLHTTP'); }
    catch (e) { try { _r = new ActiveXObject('Microsoft.XMLHTTP'); }
    catch (e) { _r = null; _i.error = e; }}}
    if (!_r) { _i.status |= _i.NOXMLOBJ; }
  }
  // Private Event Listeners
  function _oc() // onReadyStateChange
  {
    var ct;
    if (_r.readyState == 4) {
      _clrTimer();
      try {
        if (_r.status != 200) _i.status |= _i.RSPERR;
        if (_x) {
          ct = _r.getResponseHeader('Content-Type');
          if (ct && ct.indexOf('xml') == -1) { _i.status |= _i.NOXMLCT; }
        }
        delete _r['onreadystatechange']; // _r.onreadystatechange = null;
      }
      catch (e) {
        _i.status |= _i.RSPERR;
        _i.error = e;
      }
      _endCall();
    }
  }
  function _ot() // onTimeout
  {
    _t = null;
    _abort(_i.TIMEOUT);
  }
  // Public Methods
  this.send = function(m, u, d, t, r, x, o, f, c)
  {
    if (!_r || _i.busy) { return false; }
    _c = (c ? true : false);
    m = m.toUpperCase();
    if (m != 'POST') {
      if (d) {
        d = '?' + d;
        if (r) { d += '&' + r + '=' + Math.round(10000*Math.random()); }
      }
      else { d = ''; }
    }
    _x = (x ? true : false);
    _o = o;
    _f = f;
    _i.busy = true;
    _i.status = _i.OK;
    _i.error = null;
    if (t) { _t = setTimeout(_ot, t); }
    try {
      if (m == 'GET') {
        _r.open(m, u + d, true);
        d = null;
        _r.setRequestHeader('Cache-Control', 'no-cache');
        var ct = 'text/' + (_x ? 'xml':'plain');
        if (_r.overrideMimeType) {_r.overrideMimeType(ct);}
        _r.setRequestHeader('Content-Type', ct);
      }
      else if (m == 'POST') {
        _r.open(m, u, true);
        _r.setRequestHeader('Method', 'POST ' + u + ' HTTP/1.1');
        _r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      }
      else {
        _r.open(m, u + d, true);
        d = null;
      }
      _r.onreadystatechange = _oc;
      _r.send(d);
    }
    catch(e) {
      _clrTimer();
      _f = null; _x = false; _o = null;
      _i.busy = false;
      _i.status |= _i.REQERR;
      _i.error = e;
      if (_c) {
        _clean();
      }
      return false;
    }
    return true;
  };
  this.abort = function()
  {
    if (!_r || !_i.busy) { return false; }
    _abort(_i.ABORTED);
    return true;
  };
  this.reinit = function()
  {
    // Halt any HTTP request that may be in progress.
    this.abort();
    // Set all private vars to initial state.
    _clean();
    _i = this;
    // Set all (non-constant) public properties to initial state.
    _i.status = _i.OK;
    _i.error = null;
    _i.busy = false;
    // Create the private XMLHttpRequest object.
    _newXHR();
    return true;
  };
  // Constructor Code
  _newXHR();
}

// 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_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; @*/
    }
  }
}

// xGetElementsByClassName r5, 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 xGetElementsByClassName(c,p,t,f)
{
  var r = new Array();
  var re = new RegExp("(^|\\s)"+c+"(\\s|$)");
//  var e = p.getElementsByTagName(t);
  var e = xGetElementsByTagName(t,p); // See xml comments.
  for (var i = 0; i < e.length; ++i) {
    if (re.test(e[i].className)) {
      r[r.length] = e[i];
      if (f) f(e[i]);
    }
  }
  return r;
}

// xGetElementsByTagName r5, 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 xGetElementsByTagName(t,p)
{
  var list = null;
  t = t || '*';
  p = xGetElementById(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 || [];
}

// xWidth 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 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 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 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 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 r6, Copyright 2001-2008 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;
}

// xScrollTop r4, Copyright 2001-2009 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 w, offset=0;
  if (!xDef(e) || bWin || e == document || e.tagName.toLowerCase() == 'html' || e.tagName.toLowerCase() == 'body') {
    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;
}

// xLeft 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 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;
}

// xTop 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 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;
}

// 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;
}

// 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;
}

// 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;
}

// xPageX 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 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;
}

// xPageY r4, 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 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;
}

// 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;
}

// 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;
}

// xStr 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 xStr(s)
{
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') return false;}
  return true;
}

// xNum 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 xNum()
{
  for(var i=0; i<arguments.length; ++i){if(isNaN(arguments[i]) || typeof(arguments[i])!='number') return false;}
  return true;
}

// xDef 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 xDef()
{
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])=='undefined') return false;}
  return true;
}

// 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;
}

// 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;
  }
}

