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){
    try
    {
        //Run some code here

        if (containsClassName(obj,newClassName)==true)
            return;
	var CLname = (obj.className == '') ? newClassName : obj.className+' '+newClassName;
	obj.className = CLname;
    }
    catch(err)
    {
        //Handle errors here
    }
}

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;
}
