    var doomready = new Object();
    
    doomready = {
        add: function(fn) {
            if (doomready.loaded) return fn();
            var observers = doomready.observers;
            if (!observers) observers = doomready.observers = [];
            observers[observers.length] = fn; // Arraypush is not supported by Mac IE 5
            if (doomready.callback) return;
            doomready.callback = function() {
                if (doomready.loaded) return;
                doomready.loaded = true;
                if (doomready.timer) {
                    clearInterval(doomready.timer);
                    doomready.timer = null;
                }
                var observers = doomready.observers;
                for (var i = 0, length = observers.length; i < length; i++) {
                    var fn = observers[i];
                    observers[i] = null;
                    fn(); // make 'this' as window
                }
                doomready.callback = doomready.observers = null;
            };
    
            var ie = !!(window.attachEvent && !window.opera);
            var webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;
            if (document.readyState && webkit) { // Apple WebKit (Safari, OmniWeb, ...)
                doomready.timer = setInterval(function() {
                    var state = document.readyState;
                    if (state == 'loaded' || state == 'complete') {
                        doomready.callback();
                    }
                }, 50);
            }
            else if (document.readyState && ie) { // Windows IE
                var src = (window.location.protocol == 'https:') ? '://0' : 'javascript:void(0)';
                document.write(
                    '<script type="text/javascript" defer="defer" src="' + src + '" ' +
                    'onreadystatechange="if (this.readyState == \'complete\') doomready.callback();"' +
                    '><\/script>');
            }
            else {
                if (window.addEventListener) { // for Mozilla browsers, Opera 9
                    document.addEventListener("DOMContentLoaded", doomready.callback, false);
                    window.addEventListener("load", doomready.callback, false); // Fail safe
                }
                else if (window.attachEvent) {
                window.attachEvent('onload', doomready.callback);
                }
                else { // Legacy browsers (e.g. Mac IE 5)
                    var fn = window.onload;
                    window.onload = function() {
                        doomready.callback();
                        if (fn) fn();
                    }
                }
            }
        }
    }


/*-- 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>');
    }


/*-- swap image --*/

    function swapImage(element, newimage) {
        var oldsrc = element.src;
        element.src = newimage;
        if (!element.onmouseout) {
            element.onmouseout = function () {
                swapImage(this, oldsrc);
            }
        }
    }


/*-- font-size changer --*/

    var defaultSize = 12;
    var maxSizeSteps = 3; // + or - of defaultSize
    var previousStep = 2;

    function getCurrentFontSize() {
        if (document.body.currentStyle)
            var fontsize = document.body.currentStyle['fontSize'];
        else if (window.getComputedStyle)
            var fontsize = document.defaultView.getComputedStyle(document.body, null).getPropertyValue('font-size');

        fontsize = /(\d+)(.+)/.exec(fontsize);
        fontsize = (parseInt(fontsize[1]));
        return(fontsize);
    }

    /* change the font-size of the body-tag*/
    function init_fontsize() {
        var nameEQ = "fontsize=";
        var ca = document.cookie.split(';');
       for(var i=0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) {
                    document.getElementsByTagName('body')[0].style.fontSize = c.substring(nameEQ.length, c.length);
                }
        }
        var fontsize = getCurrentFontSize();
        previousStep = (fontsize - 10);
    }
    
    function changeFontSize(factor) {
        var fontsize = getCurrentFontSize();
        var newsize = fontsize + factor;
    if(newsize > defaultSize + maxSizeSteps || newsize < defaultSize - maxSizeSteps) {
        newsize = fontsize;
    }
        document.getElementsByTagName('body')[0].style.fontSize = newsize + 'px';
        document.cookie = "fontsize=" + newsize + "px; path=/";
        setTimeout("document.getElementById('content').innerHTML = document.getElementById('content').innerHTML;", 10);
    }
    
    function resetFontSize() {
        document.getElementsByTagName('body')[0].style.fontSize = defaultSize + 'px';
        document.cookie = "fontsize=" + defaultSize + "px; path=/";
        setTimeout("document.getElementById('content').innerHTML = document.getElementById('content').innerHTML;", 10);
    }

    doomready.add(function() {
        init_fontsize();
    });

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

    function addClass(obj, newclass) {
        if(obj.className.indexOf(newclass) == -1)
            obj.className += " " + newclass;
    }
    
    function removeClass(obj, oldclass) {
        var classes = obj.className.split(' ');
        for(i=0; i<classes.length; i++) {
            if(classes[i].indexOf(oldclass) > -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;
        var inputs = document.getElementsByTagName('*');
        for(i=0; i < inputs.length; i++) {
            if(inputs[i].name) {
                if(inputs[i].name == 'email_empfaenger') {
                    email_empfaenger = inputs[i];
                }
            }
        }
        if(email_empfaenger) {
            if(email_empfaenger.tagName.toLowerCase() == 'select') {
                var options = email_empfaenger.getElementsByTagName('option');
                for(o=0; o<options.length; o++) {
                    options[o].value = options[o].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].oldformonblur = required[i].onblur;
            required[i].onblur = function() {
                validate(this);
                if(this.oldformonblur)
                    this.oldformonblur();
            }
        }
        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 title="' + label_valid_error + '">' + label_valid_error + '</h2>' + errorlist;
        document.location.href = '#validationMessage';
    }

    doomready.add(function() {
        init_forms();
    });


/* Events Form */

    doomready.add(function() {
        if(document.getElementById('form_event_signin')) {
            var loc = document.location.href;
            if(loc.indexOf('?') > -1) {
                var params = loc.split('?')[1].split('&');
                var paramsobj = new Object();
                for(i=0; i<params.length; i++) {
                    var splitparams = params[i].split('=');
                    splitparams[1] = decodeURI(splitparams[1]);
                    paramsobj[splitparams[0]] = splitparams[1];
                }
                
                paramsobj['email'] = paramsobj['email'].split('+at+').join('@');
                var form = document.getElementById('form_event_signin');
                var title = document.getElementById('event_title');
                var idate  = document.getElementById('event_date_info');
                form['event_titel'].value = paramsobj['title'];
                title.innerHTML = paramsobj['title'];
                form['event_date'].value = paramsobj['date'];
                idate.innerHTML = paramsobj['date'];
                if(paramsobj['time']) {
                    form['event_time'].value = paramsobj['time'];
                    idate.innerHTML += ', ' + paramsobj['time'];
                }
                form['email_empfaenger'].value = paramsobj['email'];
            }
        }
    });

/* Application Form */
    doomready.add(function() {
        var form_application = document.getElementById('form_application');
        if(form_application) {
            var loc = document.location.href;
            if(loc.indexOf('?') > -1) {
                var params = loc.split('?')[1].split('&');
                var paramsobj = new Object();
                for(i=0; i<params.length; i++) {
                    var splitparams = params[i].split('=');
                    splitparams[1] = decodeURI(splitparams[1]);
                    paramsobj[splitparams[0]] = splitparams[1];
                }
                if(paramsobj['email']) {
                    paramsobj['email'] = paramsobj['email'].split('+at+').join('@');
                    form_application['email_empfaenger'].value = paramsobj['email'];
                }
                form_application['job'].value = paramsobj['title'] + ( paramsobj['locality'] ? (' - ' + paramsobj['locality']) : '' );
            }
        }
    });


/* Select onchange */
    doomready.add(function() {
        function initForm_selections(){
            var form_selections = getElementsByClassName('form_selections')[0];
            if(form_selections) {
                var select_items = form_selections.getElementsByTagName('select');
                for(i=0; i<select_items.length; i++) {
                    select_items[i].onchange = function() {
                    var parameter = '?';
                    for(o=0; o<select_items.length; o++) {
                        parameter +=  select_items[o].id + '=' + select_items[o].value + "&";
                    }
                    location.href = parameter;
                    }
                }
                if(form_selections.getElementsByTagName('button').length) {
                    form_selections.getElementsByTagName('button')[0].style.display = "none";
                }
            }
        }
        initForm_selections();
    });



/* Details */

doomready.add(function() {
    // Veranstaltungen
    // http://hpmb-steuerberatung.de/content/services/veranstaltungen/index_ger.html
    $('.events .hlbspecial_item h2.title a, .events .hlbspecial_item .item_content a.more').click(function(event) {
        event.preventDefault();
        $(this).parents('.hlbspecial_item').find('.item_content').load(this.href + ' .item_content', function(e) {
            $(this).html($(e).find('.item_content'));
            //$(this).html($(this).find('.item_content').html());
        });
    });

    // Ausklappbare Publikationen dsp-koblenz.de
    // http://dsp-koblenz.de/content/services/aktuelles___veroeffentlichungen/index_ger.html
    $('.dspkoblenz_publications .hlbspecial_item div.header').each(function() {
        $(this).parents('.hlbspecial_item').find('.item_content').hide();
        $(this).click(function(event) {
            $(this).parents('.hlbspecial_item').find('.item_content').toggle();
        });
    });

    // Jobs
    // http://www.hpmb-steuerberatung.de/content/services/karriere/offene_stellen/index_ger.html
    $('.jobs .hlbspecial_item h2 a.title').click(function(event) {
        event.preventDefault();
        if($(this).hasClass('opened')) {
            $(this).parents('.hlbspecial_item').find('div.item_content').remove();
            $(this).removeClass('opened');
        }
        else {
                    var clicker = this;
                    $.ajax({
                        dataType: "html", 
            url: this.href,
            success: function(data) {
                            var html = $(data).find('.item_content')[0].innerHTML;
                            var reg =  /getAdr\((.*),(.*)\)/.exec(html);
                            if(reg) {
                                var details = reg[1].split('"').join('');
                            details = details.split(', ');
                                html = html.split('<script').join('<a href="mailto:' + details[0] + '@' + details[1] + '">' + details[0] + '@' + details[1] + '</a><script')
                                html = html.split('<SCRIPT').join('<a href="mailto:' + details[0] + '@' + details[1] + '">' + details[0] + '@' + details[1] + '</a><SCRIPT')

                                html = html.split('getAdr').join('void');
                        }

                $(clicker).parents('div.header').after($('<div class="item_content"></div>').html(html));
                        }
                    });

/*            $(this).parents('div.header').after($('<div class="item_content"></div>').load(this.href + ' .item_content', function() {
                $(this).html($(this).find('.item_content').html());
            }));
*/
            $(this).addClass('opened');
        }
    });
});
