/*
         _          __________                              _,
     _.-(_)._     ."          ".      .--""--.          _.-{__}-._
   .'________'.   | .--------. |    .'        '.      .:-'`____`'-:.
  [____________] /` |________| `\  /   .'``'.   \    /_.-"`_  _`"-._\
  /  / .\/. \  \|  / / .\/. \ \  ||  .'/.\/.\'.  |  /`   / .\/. \   `\
  |  \__/\__/  |\_/  \__/\__/  \_/|  : |_/\_| ;  |  |    \__/\__/    |
  \            /  \            /   \ '.\    /.' / .-\                >/-.
  /'._  --  _.'\  /'._  --  _.'\   /'. `'--'` .'\/   '._-.__--__.-_.'
\/_   `""""`   _\/_   `""""`   _\ /_  `-./\.-'  _\'.    `""""""""`'`\
(__/    '|    \ _)_|           |_)_/            \__)|        '
  |_____'|_____|   \__________/|;                  `_________'________`;-'
   '----------'    '----------'   '--------------'`--------------------`
       KSC              PL               MH                 FD
*/

/*-- spam protection --*/

    function getAdr(prefix, postfix, text) {
        document.write('<a href="mailto:' + prefix + '@' + postfix + '">' + (text ? text.replace(/&quot;/g, '"').replace(/%EMAIL%/, prefix + '@' + postfix) : prefix + '@' + postfix) + '</a>');
    }

/*-- search --*/

    function init_search() {
        if (document.getElementById('search')) {
            var search_string = label_form_value;
            var searchinput = document.getElementById('fld_search');
            searchinput.search_string = search_string;
            var searchform = document.getElementById('search');
            searchinput.onfocus = function(e) {
                if (this.value == this.search_string) {
                    this.value = '';
                }
            }
            searchinput.onblur = function(e) {
                if (this.value == '') {
                    this.value = this.search_string;
                }
            }
        }
    }

/*-- list fix --*/

    function init_listfix() {
        var uls = document.getElementById('content').getElementsByTagName('ul');
        var browserName = navigator.appName; 
        for(i=0; i<uls.length; i++) {
            if(uls[i].parentNode.tagName == 'LI') {
                splithtml = uls[i].parentNode.innerHTML.toLowerCase().split('<ul');
                if(splithtml[0].split(' ').join('').length <= 1) {
                    uls[i].parentNode.style.background='none';
                    if(browserName == "Microsoft Internet Explorer") {
                        uls[i].parentNode.style.borderTop='1px solid #fff';
                        uls[i].parentNode.style.borderBottom='1px solid #fff';
                    }
                }
            }
        }
    }

/*-- title fix --*/

    function init_titlefix() {
        var tags = new Array('h1','h2','h3','h4','h5','h6');
        for(t=0; t<tags.length; t++) {
            var eles = document.getElementsByTagName(tags[t]);
            for(var i = 0; i < eles.length; i++) {
                eles[i].removeAttribute('title');
            }
        }
    }

/*-- hover --*/

    function init_hover() {
        var tags = new Array('tr','button');
        for(t=0; t<tags.length; t++) {
            var eles = document.getElementsByTagName(tags[t]);
            for(var i = 0; i < eles.length; i++) {
                eles[i].onmouseover = function() { addClass(this, 'hover'); }
                eles[i].onmouseout = function() { removeClass(this, 'hover'); }            
            }
        }
    }

/*-- focus --*/

    function init_focus() {
        var tags = new Array('input','button','textarea');
        for(t=0; t<tags.length; t++) {
            var eles = document.getElementsByTagName(tags[t]);
            for(i=0; i<eles.length; i++) {
                eles[i].oldonfocus = eles[i].onfocus;
                eles[i].oldonblur = eles[i].onblur;
                eles[i].onfocus = function() { addClass(this, 'focus'); if(this.oldonfocus) this.oldonfocus(); }
                eles[i].onblur = function() { removeClass(this, 'focus'); if(this.oldonblur) this.oldonblur(); }
            }
        }
    }

/*-- add/remove class --*/

    function addClass(obj, newclass) {
        if(obj.className.indexOf(newclass) == -1)
            obj.className += " " + newclass;
    }
    
    function removeClass(obj, newclass) {
        var classes = obj.className.split(' ');
        for(i=0; i<classes.length; i++) {
            if(classes[i].indexOf(newclass) > -1)
                classes[i] = "";
        }
        obj.className = classes.join(' ');
    }

/*-- getElementsByClassName --*/

    function getElementsByClassName(strClass, strTag, objContElm) {
        strTag = strTag || "*";
        objContElm = objContElm || document;
        var objColl = objContElm.getElementsByTagName(strTag);
        if (!objColl.length &&  strTag == "*" &&  objContElm.all) objColl = objContElm.all;
        var arr = new Array();
        var delim = strClass.indexOf('|') != -1  ? '|' : ' ';
        var arrClass = strClass.split(delim);
        for (var i = 0, j = objColl.length; i < j; i++) {
            var arrObjClass = objColl[i].className.split(' ');
            if (delim == ' ' && arrClass.length > arrObjClass.length) continue;
            var c = 0;
            comparisonLoop:
            for (var k = 0, l = arrObjClass.length; k < l; k++) {
                for (var m = 0, n = arrClass.length; m < n; m++) {
                    if (arrClass[m] == arrObjClass[k]) c++;
                    if (( delim == '|' && c == 1) || (delim == ' ' && c == arrClass.length)) {
                        arr.push(objColl[i]);
                        break comparisonLoop;
                    }
                }
            }
        }
        return arr;
    }

/*-- validform --*/

    var custom_required_text = new Object();
    function init_forms() {
        var content = document.getElementById('content');
        if(content) {
            var forms = content.getElementsByTagName('form');
            for(f=0; f<forms.length; f++) {
                init_form(forms[f]);
            }
        }
        var email_empfaenger = document.getElementById('email_empfaenger');
        if(email_empfaenger) {
            if(email_empfaenger.tagName.toLowerCase() == 'select') {
                var options = email_empfaenger.getElementsByTagName('option');
                for(i=0; i<options.length; i++) {
                    options[i].value = options[i].value.replace('+at+', '@');
                }
            }
            else {
                email_empfaenger.value = email_empfaenger.value.replace('+at+', '@');
            }
        }
    }

    function init_form(form) {
        var required = getElementsByClassName('required', '*', form);
        for(i=0; i<required.length; i++) {
            required[i].onblur = function() {
                validate(this);
            }
        }
        form.onsubmit = function() {
            var doSubmit = true;
            var list = new Array();
            var required = getElementsByClassName('required', '*', this);
            for(v=0; v<required.length; v++) {
                if(! validate(required[v])) {
                    doSubmit = false;
                    list.push(required[v]);
                }
            }
            var checkboxeles = getElementsByClassName('required_checkbox', '*', this);
            for(i=0; i<checkboxeles.length; i++) {
                valid = false;
                checkboxes = checkboxeles[i].getElementsByTagName('input');
                for(c=0; c<checkboxes.length; c++) {
                    if(checkboxes[c].type == 'checkbox') {
                        checkboxeles[i].name = checkboxes[c].name; // we need the name to check for custom_required_texts
                        if(checkboxes[c].checked)
                            valid = true;
                    }
                }
    
                if(valid == false) {
                    doSubmit = false;
                    set_msg(checkboxeles[i], label_valid_checkbox);
                    list.push(checkboxeles[i]);
                } 
                else {
                    clear_msg(checkboxeles[i]);
                }
            }
            var radioeles = getElementsByClassName('required_radio', '*', this);
            for(i=0; i<radioeles.length; i++) {
                valid = false;
                radios = radioeles[i].getElementsByTagName('input');
                for(c=0; c<radios.length; c++) {
                    if(radios[c].type == 'radio') {
                        radioeles[i].name = radios[c].name; // we need the name to check for custom_required_texts
                        if(radios[c].checked)
                            valid = true;
                    }
                }
    
                if(valid == false) {
                    doSubmit = false;
                    set_msg(radioeles[i], label_valid_radio);
                    list.push(radioeles[i]);
                } 
                else {
                    clear_msg(radioeles[i]);
                }
            }

        if(doSubmit == false)
            show_error(list);
            return doSubmit;
        }
    }

    function validate(el) {
        var valid = true;
        clear_msg(el);
        switch(el.type) {
            case 'text':
            case 'textarea':
            case 'select-one':
                if(el.value != '') {
                    if(el.className.indexOf('email') > -1) {
                        var regEmail = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/;
                        if(el.value.toUpperCase().match(regEmail)){
                            valid = true;
                        }
                        else {
                            valid = false;
                            set_msg(el, label_valid_email);
                        }
                    }
                    if(el.className.indexOf('number') > -1) {
                        if(el.value == Math.round(el.value)) {
                            valid = true;
                        }
                        else {
                            valid = false;
                            set_msg(el, label_valid_postal_code);
                        }
                    }
                }
                else {
                    valid = false;
                    set_msg(el);
                }
                break;
        }
    
        return valid;
    }

    function set_msg(el, msg) {
        if(msg == undefined) {
            msg = el.parentNode.getElementsByTagName('span')[0].innerHTML.replace(' *', '') + ' ' + label_valid_required;
        }

        if(custom_required_text[el.name])
            msg = custom_required_text[el.name];

        el.errorMessage = msg;
        if(el.parentNode.className.indexOf('error') == -1)
            el.parentNode.className += ' error';
    }

    function clear_msg(el) {
        var classes = el.parentNode.className.split(' ');
        for(i=0; i<classes.length; i++) {
            if(classes[i].indexOf('error') > -1)
                classes[i] = "";
        }
        el.parentNode.className = classes.join(' ');
        el.errorMessage = "";
    }

    function show_error(list) {
        errorlist = '<ul>';
        for(i=0; i<list.length; i++) {
            el = list[i];
            if(el.errorMessage != undefined)
                errorMessage = el.errorMessage;
            else
                var errorMessage = el.parentNode.getElementsByTagName('span')[0].innerHTML.replace(' *', '') + ' ' + label_valid_required;
    
            errorlist += '<li>' + errorMessage + '</li>';
        };
        errorlist += '</ul>';
    
        var validationMessage = document.getElementById('validationMessage');
        validationMessage.innerHTML = '<h2>' + label_valid_error + '</h2>' + errorlist;
        document.location.href = '#validationMessage';
    }

/*-- filter/sort selection --*/

    function init_selection() {
        var form_selections_obj = document.getElementById('form_selections');
        if (form_selections_obj) {
            form_selections_obj.getElementsByTagName('button')[0].style.display = 'none';
            selects = form_selections_obj.getElementsByTagName('select');
            for(i=0; i<selects.length; i++) {
                selects[i].onchange = form_selections_change;
            }
        }
    }
    
    function form_selections_change() {
        urlparm = '?';
        selects = document.getElementById('form_selections').getElementsByTagName('select');
        for(i=0; i<selects.length; i++) {
            urlparm += selects[i].name + '=' + selects[i].value;
            if (i!=selects.length-1) {
                urlparm += '&';
            }
        };
        location.href=urlparm;
    }

/*-- navigation (mootools) --*/

    function init_nav() {
        var ie6 = navigator.appVersion.indexOf('IE 6') > -1;
        if(ie6) {
            var navs = new Array('nav_main', 'nav_service');
            for (n=0; n<navs.length; n++) {
                if (document.getElementById(navs[n])) {
                    var navlis = document.getElementById(navs[n]).getElementsByTagName("li");
                    for (var i=0; i<navlis.length; i++) {
                        navlis[i].onmouseenter=function() {
                            this.className+=" lihover"; 
                        }
                        navlis[i].onmouseleave=function() {
                            this.className=this.className.replace(new RegExp("lihover\\b"), ""); 
                        }
                    }
                }
            }
        }
    }

/*-- accordion (mootools) --*/

    function init_accordion() {
        if(document.getElementById('accordion_overview')) {
            //var cookiename = "akkord_" + document.location.href.split('/').join('');
            var cookiename = "thingswedon'tneed";
            var togglers = $$('.toggler');
            togglers.each(function(el, i) {
                el.id = 'toggler' + i;
            });
            var start = Cookie.read(cookiename);
            if(start == "" || start == undefined)
                start = 0;
            else
                start = start.replace('toggler', '');
            var accordion = new Accordion('.toggler', '.element', {opacity: false,
                display: -1,
                alwaysHide: true,
                onActive: function(toggler, element){
                    toggler.setStyle('background','#124570 url(../common/datev/images/pfeil_top.gif) right no-repeat');
                    toggler.setStyle('color','#fff');
                    //Cookie.write(cookiename, toggler.id, {duration: 0});
                },
                onBackground: function(toggler, element){
                    toggler.setStyle('background','#eff0f0 url(../common/datev/images/pfeil_bottom.gif) right no-repeat');
                    toggler.setStyle('color','#124570');
                }
            }, $('accordion_overview'));        
        }
    }

/*-- display: none --*/

//     function check_resolution() {
//         if (document.getElementById('subnav')) {
//             var subnav = document.getElementById('subnav');
//             if (document.body.offsetHeight < 720 && subnav) subnav.style.display='none';
//             else subnav.style.display='block';
//         }
//     }
// 
// window.onresize = check_resolution;

/*-- start locations --*/

    var locations;
    function init_start_locations() {
        /*var urls = document.location.href.split('/content/');
        urls.pop();
        var url = urls[0] + "/content/locations.html";*/

        var urls = document.location.href.split('/');
        urls.pop();
        var url = urls.join('/') + "/locations.html";

        if(document.getElementById('location_map') || getElementsByClassName('location_map', '*').length > 0) {
            locations = new Hash();
            var xml = new Request.HTML({
                onComplete: function(tree, eles, html, js) {
                    if(eles) {
                        eles.each(function(el, i) {
                            if(el.tagName.toLowerCase() == 'location') {
                                var details = new Object();
                                var settings = el.getChildren();
                                settings.each(function(setting, b) {
                                    details[setting.tagName.toLowerCase()] = setting.innerHTML;
                                });

                                var locality = el.getElement('locality').innerHTML.toLowerCase();
                                if(!locations[locality])
                                    locations[locality] = new Hash();

                                var category = el.getElement('category').innerHTML;

                                if(!locations[locality][category])
                                    locations[locality][category] = new Array();

                                locations[locality][category].push(details);
                            }
                        });
                        format_start_locations();
                    }
                }
            }).get(url);
        }
        else if(getElementsByClassName('staff_header', '*').length > 0) {
            /*urls = locations_url.split('/');
            urls.pop();
            url = urls.join('/') + "/locations.html";*/
            var urls = document.location.href.split('/content/');
            urls.pop();
            var url = urls[0] + "/content/locations.html";
            locations = new Hash();
            var xml = new Request.HTML({
                onComplete: function(tree, eles, html, js) {
                    if(eles) {
                        eles.each(function(el, i) {
                            if(el.tagName.toLowerCase() == 'location') {
                                var details = new Object();
                                var settings = el.getChildren();
                                settings.each(function(setting, b) {
                                    details[setting.tagName.toLowerCase()] = setting.innerHTML;
                                });

                                var company = el.getElement('company_name').innerHTML;
                                if(!locations[company])
                                    locations[company] = new Hash();

                                var locality = el.getElement('locality').innerHTML.toLowerCase();
                                locations[company][locality] = new Hash(details);
                            }
                        });
                        format_team_locations();
                    }
                }
            }).get(url);
        }
    }

    function format_team_locations() {
        $$('.staff_header').each(function(head, i) {
            head.index = i;
            var link = head.getElement('a');
            link.addEvent('click', function(e) {
                var event = new Event(e).stop();
                var parentindex = this.getParent().index;
                //this.getParent().setStyle('position', 'relative');
                var parentcompanyname = this.getParent().getElement('h2').innerHTML;
                var newhtml = '<a class="closer" href="#"><span>X</span></a>';

                locations.each(function(company, i) {
                    company.each(function(locality, l) {
                        //alert(parentcompanyname + ' ' + locality.company_name);
                        if(parentcompanyname == locality.company_name) {

                            newhtml += '<div class="place">';
                            newhtml += '<a href="' + locality.url + '">';
                            newhtml += '<span class="company_name">' + locality.locality + '</span>';
                            newhtml += '</a>';
                            newhtml += '</div>';
                        }
                    });
                });

                var div = $('location_' + parentindex);
                if(!div) {
                    div = new Element('div');
                    div.id = 'location_' + parentindex;
                    div.addClass('location_detail');
                    div.inject(this.getParent(), 'bottom');
                    div.expanded = false;
                    div.setStyle('opacity', 0);
                }
                div.innerHTML = newhtml;

                var duration = 300;
                if(Browser.Engine.trident)
                    duration = 0;

                var closer = div.getElement('.closer');
                closer.addEvent('click', function(e) {
                    var event = new Event(e).stop();
                    var parentobj = this.getParent();
                    var fx = new Fx.Morph(parentobj, { duration: duration }).start({
                        opacity: 0
                    });
                    parentobj.expanded = false;
                });

                div.setStyles({
                    position: 'absolute',
                    top: this.getParent().getHeight()+2,
                    right: 0,
                    width: 200,
                    zIndex: parentindex+10000
                });

                if(div.expanded == false) {
                    var fx = new Fx.Morph(div, { duration: duration }).start({
                        opacity: 0.95
                    });
                    div.expanded = true;
                }
                else {
                    var fx = new Fx.Morph(div, { duration: duration }).start({
                        opacity: 0
                    });
                    div.expanded = false;
                }
            });
        });
    }

    var lastDetail = "";
    function format_start_locations() {
        var loader = $$('.location_map_preload')[0];
        if(loader) {
            var fxloader = new Fx.Morph(loader, {
                onComplete: function() {
                    $$('.location_map_preload')[0].setStyle('display', 'none');
                }
            }).start({ opacity: 0 });
        }

        var duplicates = new Object();
        $$('#location_map li, .location_map li').each(function(li, i) {
            // filter duplicates
            if(!duplicates[li.getElement('a').innerHTML])
                duplicates[li.getElement('a').innerHTML] = 1;
            else
                li.dispose();
        });        
        
        $$('#location_map li, .location_map li').each(function(li, i) {
            var link = li.getElement('a');
            link.number = i;
            var location = link.innerHTML;

            var div = new Element('div');
            div.id = 'location_' + i;

            var newhtml = '<div class="location">' + location + '</div><a class="closer" href="javascript:close_start_location_detail()"><span>X</span></a>';

            var totalcount = 0;
            var lasthref = "";
            locations[location.toLowerCase()].each(function(cat, ring) {
                if($('location_map')) // startpage
                    newhtml += '<div class="category">' + ring + '</div>';

                cat.each(function(place, count) {
                    totalcount++;
                    lasthref = place['url'];
                    newhtml += '<div class="place">';
                    newhtml += '<a href="' + place['url'] + '">';
                    newhtml += '<span class="company_name">' + place['company_name'] + '</span>';
                    if(place['company_ext'])
                        newhtml += '<br /> <span>' + place['company_ext'] + '</span>';
                    newhtml += '</a>';
                    newhtml += '</div>';
                });
            });

            div.innerHTML = newhtml;
            div.addClass('location_detail');
            div.inject(document.body, 'bottom');

            div.setStyles({
                position: 'absolute',
                top: li.getTop(),
                left: 0,
                zIndex: i+10000,
                opacity: 0
            });

            if(!$('location_map') && totalcount <= 1) { // if startpage and count of places of current location <= 1
                link.href = lasthref;
            }
            else {
                link.href = '#';
                link.addEvent('click', function(e) {
                    var event = new Event(e);
                    event.stop();
                    if(lastDetail != this.number || lastDetail == "") {
                        var detail = $('location_'+this.number);
                        var newleft = this.getLeft()-detail.getWidth()-3;
                        if(!$('location_map')) {
                            newleft = this.getLeft()+this.getWidth()+3;
                        }
                        var newtop = this.getTop();
                        if(detail.getHeight() + newtop > document.body.offsetHeight)
                            newtop = document.body.offsetHeight - detail.getHeight() - 10;

                        detail.setStyles({
                            top: newtop,
                            left: newleft
                        });

                        close_start_location_detail();
                        lastDetail = this.number;
                        var fx = new Fx.Morph(detail, {}).start({
                            opacity: 0.95
                        });
                    }
                });
            }
        });

        var locationmap = $$('.location_map, #location_map')[0];

        locationmap.setStyles({
            display: 'block',
            opacity: 0
        });

        var fx = new Fx.Morph(locationmap).start({
            opacity: 1
        });
    }

    function close_start_location_detail() {
        if($('location_'+lastDetail) && lastDetail != this.number) {
            $('location_'+lastDetail).fx = new Fx.Morph($('location_'+lastDetail)).start({
                opacity: 0
            });
        }

        lastDetail = "";
    }

    if(document.getElementById('location_map') || getElementsByClassName('location_map', '*').length > 0)
    window.addEvent('resize', function() {
        if(lastDetail != "") {
            if($('location_'+lastDetail)) {
                $$('#location_map li a, .location_map li a').each(function(link, i) {
                    if(link.number == lastDetail) {
                        var detail = $('location_'+link.number);
                        var newleft = link.getLeft()-detail.getWidth()-3;
                        if(!$('location_map')) {
                            newleft = link.getLeft()+link.getWidth()+3;
                        }
                        var newtop = link.getTop();
                        if(detail.getHeight() + newtop > document.body.offsetHeight)
                            newtop = document.body.offsetHeight - detail.getHeight() - 10;

                        detail.setStyles({
                            top: newtop,
                            left: newleft
                        });
                    }
                });
            }
        }
    });

/*
             \|/
            .-*-
           / /|\
          _L_
        ,"   ".
    (\ /  O O  \ /)
     \|    _    |/
       \  (_)  /
       _/.___,\_
     (_/ doom  \_)
         ready, the end is near
*/

    var doomreadywaiter = window.setInterval(function() {
        if (document.body) {
            window.clearInterval(doomreadywaiter);
            doomready();
        }
    }, 100);
    function doomready() {
        init_search();
        init_focus();
        init_hover();
        init_listfix();
        init_titlefix();
        init_selection();
        init_forms();
        init_nav();
        init_accordion();
        init_start_locations();
        // check_resolution();
    }

