// Reduced Version of X, a Cross-Browser Javascript Library
// Copyright 2001-2006 Michael Foster (Cross-Browser.com) Distributed under the terms of the GNU LGPL

function xAddClass(e, c)
{
	if ((e=xGetElementById(e))!=null) {
		var s = '';
		if (e.className.length && e.className.charAt(e.className.length - 1) != ' ') {
			s = ' ';
		}
		if (!xHasClass(e, c)) {
			e.className += s + c;
			return true;
		}
	}
	return false;
}

function xRemoveClass(e, c)
{
	if(!(e=xGetElementById(e))) return false;
	e.className = e.className.replace(new RegExp("(^|\\s)"+c+"(\\s|$)",'g'),
		function(str, p1, p2) { return (p1 == ' ' && p2 == ' ') ? ' ' : ''; }
	);
	return true;
}

function xHasClass(e, c)
{
	e = xGetElementById(e);
	if (!e || e.className=='') return false;
	var re = new RegExp("(^|\\s)"+c+"(\\s|$)");
	return re.test(e.className);
}

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 xGetElementsByClassName(c,p,t,f)
{
	var r = new Array();
	var re = new RegExp("(^|\\s)"+c+"(\\s|$)");
	var e = xGetElementsByTagName(t,p);
	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;
}

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 e['on'+eT]=eL;
 	bom.events[bom.events.length] = [e, eT, eL, cap]; // addition to original
}

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 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 xClientHeight()
{
  var v=0,d=document,w=window;
  if(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;
}

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

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 xGetComputedStyle(oEle, sProp, bInt)
{
  var s, p = 'undefined';
  var dv = document.defaultView;
  if(dv && dv.getComputedStyle){
    s = dv.getComputedStyle(oEle,'');
    if (s) p = s.getPropertyValue(sProp);
  }
  else if(oEle.currentStyle) {
    // convert css property name to object property name for IE
    var i, c, a = sProp.split('-');
    sProp = a[0];
    for (i=1; i<a.length; ++i) {
      c = a[i].charAt(0);
      sProp += a[i].replace(c, c.toUpperCase());
    }
    p = oEle.currentStyle[sProp];
  }
  else return null;
  return bInt ? (parseInt(p) || 0) : p;
}

function xStr(s)
{
  for(var i=0; i<arguments.length; ++i){if(typeof(arguments[i])!='string') 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 xPageY(e)
{
  if (!(e=xGetElementById(e))) return 0;
  var y = 0;
  while (e) {
    if (xDef(e.offsetTop)) y += e.offsetTop;
    e = xDef(e.offsetParent) ? e.offsetParent : null;
  }
  return y;
}

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