var hasCSS;

// Fix IE ABBR bug
document.createElement('abbr');
//

addLoadEvent(init);

function init(){
	addListClassNames();
}

// protect the onload event
function addLoadEvent(func) {
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
		window.onload = func;
		} else {
		window.onload = function() {
		  oldonload();
		  func();
		}
	}
}

// cross browser event binding
// csAddEvent(obj,'mouseup',myFunctionName)
function csAttachEvent(obj,ev,fct){
	extEv='on'+ev;
	if(window.addEventListener){
		obj.addEventListener(ev, fct, false);
	}else if (window.attachEvent){
		obj.attachEvent(extEv, fct);
	}
}


// Add some classnames to list items
function addListClassNames() {
	if (document.getElementsByTagName) {
		var lists = document.getElementsByTagName('ul');
		for(i=0;i < lists.length;++i){
			sel = lists[i].getElementsByTagName('li');
			addClassName(sel[0],'first');
			addClassName(sel[sel.length-1],'last');
		}

		// implements zebra pattern for results-list;
		if (document.getElementById('result-list')) 
		{
			if (document.getElementById('result-list').getElementsByTagName('ol').length > 0) 
			{
				lists = document.getElementById('result-list').getElementsByTagName('ol')[0].getElementsByTagName('li');
				for (i=0;i < lists.length;++i) 
				{
					if (i % 2 == 0)
						addClassName(lists[i],'odd');
				}
			}
		}
	}
}

// Return next sibling element
// -- this may have some bugs to do with non-elmenentNode siblings
function getNextElementSibling(obj) {
	var	obj = obj.nextSibling;
	while (obj.nodeType != 1 && obj.nextSibling != 'null')
	{
		obj = obj.nextSibling;
	}
	var state = (obj.parentNode) ? obj.parentNode : false;
	return state;
}

// Find ancestor with specific className
function getAncestorWithClass(obj,targetClassName) {
	while (!containsClassName(obj.parentNode,targetClassName))
	{
		obj = obj.parentNode;
	}
	var state = (obj.parentNode) ? obj.parentNode : false;
	return state;
}

// Find ancestor with specific className
function getAncestorElement(obj,targetTagName) {
	while (obj.parentNode.tagName.toLowerCase() != targetTagName)
	{
		obj = obj.parentNode;
	}
	var state = (obj.parentNode) ? obj.parentNode : false;
	return state;
}

// Handle adding & removing classNames cleanly
function addClassName(obj,newClassName){
	if (containsClassName(obj,newClassName)==true)
		return;
	var CLname = (obj.className == '') ? newClassName : obj.className+' '+newClassName;
	obj.className = CLname;
}

function removeClassName(obj,ClassName){
	var vRegX=new RegExp('\s*' +ClassName+ '*\\b');
	obj.className = obj.className.replace(vRegX, '');
}

function containsClassName(obj,ClassName){
	var vRegX=new RegExp('\s*' +ClassName+ '*\\b');
	var state = (obj.className.search(vRegX) >= 0) ? true : false;
	return state;
}
