function filter(arr, f) {
    var out = new Array();
    for(var i = 0; i<arr.length; ++i)
        if(f(arr[i]))
            out.push(arr[i]);
    return out;
}
function map(arr, f) {
	var out = new Array();
	for(var i = 0; i<arr.length; ++i) {
		out.push(f(arr[i]));
	}
	return out;
}

var EventCache = function(){
    var listEvents = [];

    return {
        listEvents : listEvents,

        add : function(node, sEventName, fHandler, bCapture){
            listEvents.push(arguments);
        },

        flush : function(){
            var i, item;
            for(i = listEvents.length - 1; i >= 0; i = i - 1){
                item = listEvents[i];

                if(item[0].removeEventListener){
                    item[0].removeEventListener(item[1], item[2], item[3]);
                };

                /* From this point on we need the event names to be prefixed with 'on" */
                if(item[1].substring(0, 2) != "on"){
                    item[1] = "on" + item[1];
                };

                if(item[0].detachEvent){
                    item[0].detachEvent(item[1], item[2]);
                };

                item[0][item[1]] = null;
            };
        }
    };
}();
function addEvent(obj, evType, fn, useCapture){
    var result;
    if (obj.addEventListener){
        obj.addEventListener(evType, fn, useCapture);
        result = true;
    } else if (obj.attachEvent){
        var r = obj.attachEvent("on"+evType, fn);
        result = r;
    } else {
        return false;
    }

    EventCache.add(obj, evType, fn, useCapture);
    return result;
}

function getFirstElementChildNode(node) {
    var out = node.firstChild;
    while(out.nodeType != 1)
        out = out.nextSibling;
    return out;
}
function getFirstElementSiblingNode(node) {
    var out = node.nextSibling;
    while(out && out.nodeType != 1)
        out = out.nextSibling;
    return out;
}

function addTab(tabs, label, select, index) {
    var counterLength = ['first','second','third','fourth','fifth','sixth','seventh','eights','ninth','tenth','eleventh','twelvth'];
    var link = document.createElement('A');
    link.href="#";
    link.appendChild(document.createTextNode(label));
    var classes = new Array();
    if(select) classes.push("selected");
    if(typeof index != "undefined") classes.push(counterLength[index]);
    link.className = classes.join(" ");
    tabs.appendChild(link);
    return link;
}
function deselect(tab, element) {
    if(tab)
        tab.className = tab.className.replace(/\bselected\b/g,"");
    if(element)
        element.className = element.className.replace(/\bselected\b/g,"");
}
function select(root, tab, element) {
    if(root.selected_tab || root.selected_element)
        deselect(root.selected_tab, root.selected_element);
    root.selected_tab = tab;
    root.selected_element = element;
    tab.className += " selected";
    element.className += " selected";
}

function processTabs(root, selected_index) {
    var child = getFirstElementChildNode(root);
    var tabs = document.createElement('div');



    var tabIndex = 0;
    var link = null;
    while(child) {
        if(child.nodeType == 1) {
            if(child.nodeName.toUpperCase() == 'H3') {
                link = addTab(tabs, child.firstChild.nodeValue, ++tabIndex == selected_index, tabIndex-1);
            }
            if(child.nodeName.toUpperCase() == 'H4') {
                link = addTab(tabs, child.firstChild.nodeValue, ++tabIndex == selected_index, tabIndex-1);
				//document.getElementById('h4').style.background='#993300';
				//alert(link.className);
				link.className='avis';
            }
            if(child.nodeName.toUpperCase() == 'DIV'){
                // If the corresponding li is selected
                if(link.className.match(/\bselected\b/)) {
                    deselect(link);
                    select(root, link, child);
                }

                addEvent(link, "click", function (divElement, linkelement) {
                    return function () {
                        select(root, linkelement, divElement);
                        return false;
                    }
                }(child, link));
            }
        }
        child = getFirstElementSiblingNode(child);
    }
    root.insertBefore(tabs, root.firstChild);
    tabs.className="dynamic_tabs";
}

function do_tabs() {
    var divs = document.getElementsByTagName('div');
    var tabbed_contents = filter(divs, function (node) {
        return (node.className.search(/\btabbed_content\b/) != -1);
    });

    for(var i=0; i<tabbed_contents.length; ++i) {
        var tabbed_content = tabbed_contents[i];
        tabbed_content.className += " tabs";

        var selected_tab_result = tabbed_content.className.match(/\bselected_tab_(\d+)\b/);
        var to_select = 1;
        if(selected_tab_result)
            to_select = parseInt(selected_tab_result[1]);

        processTabs(tabbed_content, to_select);
    }
    addEvent(window, "unload", function (e) {
        EventCache.flush();
        for(var i=0; i<tabbed_contents.length; ++i) {
            var tabbed_content = tabbed_contents[i];
            tabbed_content.selected_tab = null;
            tabbed_content.selected_element = null;
        }
    });
}
