// Element class manipulation
// Copyright 2004/2005 Adam Bregenzer adam@bregenzer.net

// Add a class to an element
function addClass(elem, class_name) {
    if (elem.className.indexOf(class_name) == -1) {
        elem.className += ' ' + class_name;
    }

    return elem.className;
}

// Remove a class from an element
function removeClass(elem, class_name) {
    if (elem.className.indexOf('' + class_name) > 0) {
        elem.className = elem.className.replace(' ' + class_name, '');
    } else {
        elem.className = elem.className.replace(class_name, '');
    }

    return elem.className;
}

// Return a list of elements with the specified class in it
function getElementsByClass(class_name) {
    var all_elems;
    var body_elem;
    var elems;
    var i;

    body_elem = document.getElementsByTagName('body').item(0);
    all_elems = body_elem.getElementsByTagName('*');
    elems = new Array();

    for (i = 0; i < all_elems.length; i++) {
        if (all_elems[i].className.indexOf(class_name) != -1){
            elems[elems.length] = all_elems[i];
        }
    }

    return elems;
}

// Return a list of elements with the specified class in it, contained by the element specified by id
function getElementsByClassInId(class_name, id) {
    var all_elems;
    var body_elem;
    var elems;
    var i;

    container = document.getElementById(id);
    all_elems = container.getElementsByTagName('*');
    elems = new Array();

    for (i = 0; i < all_elems.length; i++) {
        if (all_elems[i].className.indexOf(class_name) != -1){
            elems[elems.length] = all_elems[i];
        }
    }

    return elems;
}

// Add specified to all elements that already have class find_class_name
function addClassByClass(find_class_name, class_name) {
    var elems = getElementsByClass(find_class_name);

    for (var i = 0; i < elems.length; i++) {
        addClass(elems[i], class_name);
    }
}

function removeClassByClass(find_class_name, class_name) {
    var elems = getElementsByClass(find_class_name);

    for (var i = 0; i < elems.length; i++) {
        removeClass(elems[i], class_name);
    }
}

// Add specified to all elements that already have class find_class_name
function replaceClass(find_class_name, class_name) {
    var elems = getElementsByClass(find_class_name);

    for (var i = 0; i < elems.length; i++) {
        removeClass(elems[i], find_class_name);
        addClass(elems[i], class_name);
    }
}

// Add specified to all elements that already have class find_class_name
function replaceClassInId(id, find_class_name, class_name) {
    var elems = getElementsByClassInId(find_class_name, id);

    for (var i = 0; i < elems.length; i++) {
        removeClass(elems[i], find_class_name);
        addClass(elems[i], class_name);
    }
}

// Check if an element has a class
function hasClass(elem, class_name) {
    if(elem.className.indexOf(class_name) != -1 ) {
        return true;
    }
    return false;
}

// Search for prefix + index, zero based, for the first element with or without a particular class
function findFirstByClass(prefix, class_name, need_class) {
    var elem;
    var idx = 0;

    while(elem = document.getElementById(prefix + idx)) {
        var has_class = hasClass(elem, class_name);

        if (!(has_class ^ need_class)) {
            return elem;
        }
        idx++;
    }

    return null;
}

// Search for prefix + index, zero based, for the first element with or without a particular class
function findLastByClass(prefix, class_name, need_class) {
    var elem;
    var idx = 0;

    while(elem = document.getElementById(prefix + idx)) {
        var has_class = hasClass(elem, class_name);
        if (!(has_class ^ need_class)) {
            if (elem_old) {
                return elem_old;
            } else {
                return elem;
            }
        }

        idx++;
        elem_old = elem;
    }

    if (elem_old) {
        return elem_old;
    } else if (elem) {
        return elem;
    } else {
        return null;
    }
}

function findIdList(prefix) {
    var elems;
    var elem;

    var idx = 0;
    while(elem = document.getElementById(prefix + idx)) {
        elems[elems.length] = elem;
        idx++;
    }
    return elems;
}

// Search for the next element without the class and add it
function setNextClass(prefix, class_name) {
    var elem;

    elem = findLastByClass(prefix, class_name, true);
    if (elem) {
        addClass(elem, class_name);
    }
}

// Search for the next element with the class and remove it
function removeNextClass(prefix, class_name) {
    var elem;

    elem = findFirstByClass(prefix, class_name, true);
    if (elem) {
        removeClass(elem, class_name);
    }
}

