/*
 *	ClassName module
 *	--------------------------
 * (c) Lost Boys - http://www.lostboys.nl
 */

var ClassName = {
	add:function(node, name) {
		if(!this.contains(node, name))
			node.className += node.className? (' ' + name) : name;
	},

	remove:function(node, name) {
		if(node.className)
			node.className = node.className.replace(new RegExp('(^|\\s)'+name+'(\\s|$)','g'), ' ');
	},

	contains:function(node, name) {
		return new RegExp('(^|\\s)'+name+'(\\s|$)').test(node.className);
	},

	swap:function(node, old, name) {
		node.className = this.contains(node, old)?
			node.className.replace(new RegExp('(^|\\s)'+old+'(\\s|$)','g'), '$1'+name+'$2') : 
			node.className.replace(new RegExp('(^|\\s)'+name+'(\\s|$)','g'), '$1'+old+'$2');
	},

	toggle:function(node, name) {
		if(!this.contains(node, name)) {
			this.add(node, name);
		} else {
			this.remove(node, name);
		}
	}
}


Selector = {
    REG_TOKENIZE:/([\s>+~.#:*]|[a-z_-]+)/g,
    REG_IMPLIEDALL:/(^|\s)([.#:])/g,
    REG_WHITESPACE:/\s+([>+~])\s+/g,
    
    filters:{},
    pseudos:{},
    find:function(select) {
        var token,tokens = this.tokenize(select);
        var result = [document];
        for(var i=0; (token = tokens[i++]);) {
            result = this.filters[token](result, tokens[i++]);
        }   return result;
    },

    tokenize:function(select) {
        var selector = ' '+select.replace(this.REG_IMPLIEDALL, '$1*$2');
        selector = selector.replace(this.REG_WHITESPACE, '$1');
        return selector.match(this.REG_TOKENIZE);
    },

    register:function(selector, filter) {
        this.filters[selector] = function(nodes, token) {
            var result = [];
            filter(result, nodes, token);
            return result;
        };
    },

    registerPseudo:function(pseudo, filter) {
        this.pseudos[pseudo] = filter;
    }
}

/**
 *  Simple selectors
 *  --------------------------
 */

Selector.register(' ', function(result, nodes, name){
    for(var base,i=0; (base = nodes[i++]);) {
        var j, node, set = base.getElementsByTagName(name);
        for(j=0; (node = set[j++]);) {
            result[result.length] = node;
        }
    }
});

Selector.register('#', function(result, nodes, id) {
    for(var node, i=0; (node = nodes[i++]);) {
        if(node.id && node.id == id) {
            result[result.length] = node;
        }
    }
});

Selector.register('.', function(result, nodes, className) {
    var classReg = new RegExp('\\b'+className+'\\b');
    for(var node, i=0; (node = nodes[i++]);) {
        if(node.className && classReg.test(node.className)) {
            result[result.length] = node;
        }
    }
});

Selector.register('>', function(result, nodes, name) {
    var nameReg = new RegExp('\\b'+name+'\\b', 'i');
    for(var node, i=0; (node = nodes[i++]);) {
        for(var child, j=0; (child = node.childNodes[j++]);) {
            if(child.nodeType == 1 && nameReg.test(child.nodeName)) {
                result[result.length] = child;
            }
        }
    }
});

Selector.register('+', function(result, nodes, name){
    var nameReg = new RegExp('\\b'+name+'\\b', 'i');
    for(var sib,node, i=0; (node = nodes[i++]);) {
        do {
            sib = node.nextSibling;
            if(sib.nodeType == 1) {
                if(nameReg.test(sib.nodeName)) {
                    result[result.length] = sib;
                }
                break;
            }
        } while(sib)
    }
});

Selector.register(':', function(result, nodes, pseudo){
    Selector.pseudos[pseudo](result, nodes);
});

/**
 *  Pseudoclasses
 *  --------------------------
 */

Selector.registerPseudo('first-child', function(result, nodes){
    for(var node, first, i=0; (node = nodes[i++]);){
        first = node.parentNode.firstChild;
        while(first && first.nodeType != 1) first = node.nextSibling;
        if(first && first == node) {
            result[result.length] = first;
        }
    }
});

Selector.registerPseudo('last-child', function(result, nodes){
    for(var node, last, i=0; (node = nodes[i++]);){
        last = node.parentNode.lastChild;
        while(last && last.nodeType != 1) last = last.previousSibling;
        if(last && last == node) {
            result[result.length] = last;
        }
    }
});

function initContentComponents(){
    //INITIALIZE SHOWHIDE
    //Note: Selector.find() does not function with tag H3
	var colcl = Selector.find('span.sh-close');
    var colh3 = document.getElementsByTagName("h3"); //all the "h3"-tags
    var colh3SH = new Array(); //array for all the "h3.showhide-item"-tags
    var colLen = colh3.length; 
    for(var i=0;i<colLen;i++){
        if(colh3[i].parentNode.className=="showhide-item"){ colh3SH.push(colh3[i]) }
    }
    EventListener.addEvents(colh3SH, 'click', openShowHide);
    EventListener.addEvents(colcl, 'click', closeShowHide);
    var colSHContainers = Selector.find('div.showhide-container');
    for(var i=0;i<colSHContainers.length;i++){
        if(colSHContainers[i].className=="showhide-container var2"){
            colSHContainers[i].multipleOpen = true;
        }
    }
    var checklist = document.getElementById("checklist");
    if (checklist) {
		var colh2 = checklist.getElementsByTagName("h2");
        checklist.multipleOpen = true;
        checklist.getElementsByTagName("div")[0].className = "showhide-item open";
		var colcheck = Selector.find("span.checkbox");
		for (var i = 0; i < colcheck.length; i++) {
			colcheck[i].className = "checkbox";
			colcheck[i].getElementsByTagName("input")[0].checked = false;
		}
		EventListener.addEvents(Selector.find('span.close'), 'click', closeShowHide);
		EventListener.addEvents(Selector.find('span.uncheck'), 'click', check);
		EventListener.addEvents(Selector.find('span.check'), 'click', check);
        EventListener.addEvents(colh2, 'click', openShowHide);
	}
    var summary = document.getElementById("summary");
    if (summary) {
        var colh2 = summary.getElementsByTagName("h2"); //all the "h2"-tags
        summary.multipleOpen = true;
        summary.getElementsByTagName("div")[0].className = "showhide-item open";
        for (var i = 0; i < colh2.length; i++) {
            var h2Height = colh2[i].offsetHeight ;
			colcl[i].style.height = h2Height + 'px';
        }
		EventListener.addEvents(colh2, 'click', openShowHide);
    }
    //INITIALIZE EXTERNAL APPLICATION AND TRIGGERS
    EventListener.addEvents(Selector.find('div.external-application'), 'click', openFirstUrlInBlock);
    EventListener.addEvents(Selector.find('div.trigger'), 'click', openFirstUrlInBlock);
}

EventListener.addEvent(window, 'load', initContentComponents);

function openShowHide() {
    //NOTE: By using the parentnodes as a kind of global variable it is possible to group showhide elements by putting a container tag around them
    if(this.parentNode.parentNode.currOpen!=null){ClassName.remove(this.parentNode.parentNode.currOpen, "open");}
    ClassName.add(this.parentNode, "open");
    if(!this.parentNode.parentNode.multipleOpen){this.parentNode.parentNode.currOpen = this.parentNode} 
}

function closeShowHide() {
    ClassName.remove(this.parentNode.parentNode, "open");
}

function check() {
    var in_textblock = this.parentNode.className=="textblock";
	if(!in_textblock){ 
	   var checkwrap = this; 
    }
    if(in_textblock){ 
	   var checkwrap = this.parentNode.parentNode.getElementsByTagName("span")[0]; 
    }
	var wrapper = checkwrap.parentNode;
    var checkbox = checkwrap.getElementsByTagName("input")[0];
	var checked = checkwrap.className=="uncheck";
	var colspan = wrapper.getElementsByTagName("span");
	for (var i = 0; i < colspan.length; i++) {
		var checkable = colspan[i].className=="check"|colspan[i].className=="uncheck";
		if(checkable){
		    if(checked){ 
		        colspan[i].className = "check";
				checkbox.checked = false;
		    }
		    if(!checked){
		        colspan[i].className = "uncheck";
		        checkbox.checked = true;
	        }
        }
	}
}

function checkList() {
    var checklist = document.getElementById("checklist");
    var colinput = checklist.getElementsByTagName("input");
    var complete = true
    for(var i=0;i<colinput.length;i++){
        if(colinput[i].checked==false){
            complete = false;
        }
    }
    if (complete) { ClassName.add(checklist, "complete"); }
    if (!complete && checklist.className=="complete") { ClassName.remove(checklist, "complete"); }
}

function openFirstUrlInBlock(e) {
    if (window.event) {var el = window.event.srcElement}
    else {var el = e.target}
    if(!el.tagName){el=el.parentNode}
    try{
        if(el.tagName!="A"){ //when te link is clicked by the visitor the link will direct the visitor otherwise two windows will be opened
            var objFirstLink = this.getElementsByTagName("A")[0];
            if(objFirstLink.target=="_blank") window.open(objFirstLink.href);
            else document.location.href = objFirstLink.href;
        }
    }catch(e){};
}

function addNode(parent, tag, name, before) {
    var addition = document.createElement(tag);
	addition.setAttribute("class", name);
    var text = document.createTextNode(" ");
    addition.appendChild(text);
	if (before) {
        parent.insertBefore(addition, parent.firstChild);
	}	
	else {
        parent.appendChild(addition);
	}
}                 



