// 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;
}

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 xGetElementsByAttribute(sTag, sAtt, sRE, fn)
{
	var a, list, found = new Array(), re = new RegExp(sRE, 'i');
	list = xGetElementsByTagName(sTag);
	for (var i = 0; i < list.length; ++i)
	{
		a = list[i].getAttribute(sAtt);
		if (!a) {a = list[i][sAtt];}
		if (typeof(a)=='string' && a.search(re) != -1)
		{
			found[found.length] = list[i];
			if (fn) fn(list[i]);
		}
	}
	return found;
}

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;
}

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 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;
	}
}

// get Computed style
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;
}


// trace UL object
function xWalkUL(pu,d,f,lv)
{
	var r,cu,li=xFirstChild(pu);
	if (!lv){lv=0;}
	while(li)
	{
		cu=xFirstChild(li,'ul');
		r=f(pu,li,cu,d,lv);
		if(cu){if(!r||!xWalkUL(cu,d,f,lv+1)){return 0;};}
		li=xNextSib(li);
	}
	return 1;
}

function xFirstChild(e,t)
{
	e = xGetElementById(e);
	var c = e ? e.firstChild : null;
	while (c)
	{
		if (c.nodeType == 1 && (!t || c.nodeName.toLowerCase() == t.toLowerCase())){break;}
		c = c.nextSibling;
	}
	return c;
}

// Collapsible Objects
function xCollapsible(outerEle, bShow) // object prototype
{
	// Constructor
	
	var container = xGetElementById(outerEle);
	if (!container) {return null;}
	var isUL = container.nodeName.toUpperCase() == 'UL';
	var i, trg, aTgt = xGetElementsByTagName(isUL ? 'UL':'DIV', container);
	for (i = 0; i < aTgt.length; ++i)
	{
		trg = xPrevSib(aTgt[i]);
		if (trg && (isUL || trg.nodeName.charAt(0).toUpperCase() == 'H'))
		{
			aTgt[i].xTrgPtr = trg;
			aTgt[i].style.display = bShow ? 'block' : 'none';
			trg.style.cursor = 'pointer';
			trg.xTgtPtr = aTgt[i];
			trg.onclick = trg_onClick;
		}  
	}
	
	// Private
	
	function trg_onClick()
	{
		var tgt = this.xTgtPtr.style;
		tgt.display = (tgt.display == 'none') ? "block" : "none";
	}
	
	// Public
	
	this.displayAll = function(bShow)
	{
		for (var i = 0; i < aTgt.length; ++i)
		{
			if (aTgt[i].xTrgPtr)
			{
				aTgt[i].style.display = bShow ? "block" : "none";
			}
		}
	};
	
	// The unload listener is for IE's circular reference memory leak bug.
	this.onUnload = function()
	{
		if (!container || !aTgt) {return;}
		for (i = 0; i < aTgt.length; ++i)
		{
			trg = aTgt[i].xTrgPtr;
			if (trg)
			{
				if (trg.xTgtPtr)
				{
					trg.xTgtPtr.TrgPtr = null;
					trg.xTgtPtr = null;
				}
				trg.onclick = null;
			}
		}
	};
}

function xPrevSib(e,t)
{
	e = xGetElementById(e);
	var s = e ? e.previousSibling : null;
	while (s)
	{
		if (s.nodeType == 1 && (!t || s.nodeName.toLowerCase() == t.toLowerCase())){break;}
		s = s.previousSibling;
	}
	return s;
}

function xNextSib(e,t)
{
	e = xGetElementById(e);
	var s = e ? e.nextSibling : null;
	while (s)
	{
		if (s.nodeType == 1 && (!t || s.nodeName.toLowerCase() == t.toLowerCase())){break;}
		s = s.nextSibling;
	}
	return s;
}

