var domready = new Object();
domready = {
    add: function(fn) {
        if (domready.loaded) return fn();
        var observers = domready.observers;
        if (!observers) observers = domready.observers = [];
        observers[observers.length] = fn; // Arraypush is not supported by Mac IE 5
        if (domready.callback) return;
        domready.callback = function() {
            if (domready.loaded) return;
            domready.loaded = true;
            if (domready.timer) {
                clearInterval(domready.timer);
                domready.timer = null;
            }
            var observers = domready.observers;
            for (var i = 0, length = observers.length; i < length; i++) {
                var fn = observers[i];
                observers[i] = null;
                fn(); // make 'this' as window
            }
            domready.callback = domready.observers = null;
        };

        var webkit = navigator.userAgent.indexOf('AppleWebKit/') > -1;
        if (document.readyState && webkit) { // Apple WebKit (Safari, OmniWeb, ...)
            domready.timer = setInterval(function() {
                var state = document.readyState;
                if (state == 'loaded' || state == 'complete') {
                    domready.callback();
                }
            }, 50);
        }
        else {
            if (window.addEventListener) { // for Mozilla browsers, Opera 9
                document.addEventListener("DOMContentLoaded", domready.callback, false);
                window.addEventListener("load", domready.callback, false); // Fail safe
            }
            else if (window.attachEvent) {
            window.attachEvent('onload', domready.callback);
            }
            else { // Legacy browsers (e.g. Mac IE 5)
                var fn = window.onload;
                window.onload = function() {
                    domready.callback();
                    if (fn) fn();
                }
            }
        }
    }
}

// add all functions to be started at domready here
domready.add(function() {
    init_help_links();
    init_tabindex();
});

var ajax_ignore_type = new Array('hidden','image','submit','button');
var ajax_ignore_ids = new Array('75');
var main_form;
var req;

// Copyright (c) 2004 Michael Foster, Licensed LGPL (gnu.org)
function xAddEventListener(e,eventType,eventListener) {
    if (!e) {return 'Fehler kein Objekt �bergeben';}
    eventType=eventType.toLowerCase();
    var eh='e.on'+eventType+'=eventListener';
    if(e.addEventListener) e.addEventListener(eventType,eventListener,null);
    else if(e.attachEvent) e.attachEvent('on'+eventType,eventListener);
    else eval(eh);
}

function getNewHttpRequest() {
    var req;
    if (window.XMLHttpRequest) {
        req = new XMLHttpRequest;
    } else if (window.ActiveXObject) { // ... ob er das Objekt per ActiveX implementiert
        try {
            req = new ActiveXObject("Microsoft.XMLHTTP");
        } catch (e) {
        }
    }
    return req;
}

function init_ajax(individualTypes) {
    var show = true;

    if (show) {
        if (!getNewHttpRequest()) {
            alert ("no ajax");
            show = false;
        }
    }
    if (show) {
        var berechnen = document.getElementById('submit');
        if (berechnen)
            berechnen.style.display = 'none';

        main_form = document.getElementsByTagName('form')[0].elements;
        main_form[0].form.onsubmit = function() { return false; } // deactivate normal form submit (enter key), AJAX rul0rz!

        var types;
        if(individualTypes)
            types = individualTypes;
        else
            types = {'select-one': 'Change', 'checkbox': 'Click', 'radio': 'Click', 'text': 'KeyUp'};

        for (i = 0; i < main_form.length; i++) {
            if (!in_array(main_form[i].type, ajax_ignore_type) && types[main_form[i].type])
                xAddEventListener(main_form[i], types[main_form[i].type], ajaxCalc);
        }
    }
}

var ajax_wait_id = -1;
var ajax_go = false;

function ajax_wait(e, additionalParams) {
    ajax_go = true;
    ajax_wait_id = -1;
    ajaxCalc(e, additionalParams);
}

function ajaxCalc(e, additionalParams) {

    if (main_form.onsubmit && ((e && e.which) || window.event) && ((e && e.which) ? e.which : window.event.keyCode) == 13)
        main_form.onsubmit()

    if (!ajax_go) {
        if (ajax_wait_id >= 0) {
            clearTimeout(ajax_wait_id);
        }
        ajax_wait_id = setTimeout(function() { ajax_wait(e, additionalParams); }, 500); // anonymus function to pass objects through setTimeout
        return;
    }

    var f = main_form;

    var requeststring = 'ajax=1';
    for (var i = 0; i < f.length; i++)
        if (f[i].tagName.toLowerCase() != 'fieldset' && (f[i].type != 'checkbox' && f[i].type != 'radio' || f[i].checked) && f[i].name)
            requeststring += '&' + f[i].name + '=' + encodeURIComponent(f[i].value);

    for (var param in additionalParams)
        requeststring += '&' + param + '=' + additionalParams[param];

    req = getNewHttpRequest();
    req.onreadystatechange = processReqChange;
    req.open("POST", f[0].form.action, true);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    /*req.overrideMimeType('text/xml');*/
    req.send(requeststring);

    ajax_go = false;

    display_loading();
}

function computedStyle(element) {
    return typeof element.currentStyle != 'undefined' ? element.currentStyle : document.defaultView.getComputedStyle(element, null);
}

function isVisible(element) {
    while (element && element.nodeType == 1) {
        if (computedStyle(element)['display'] == 'none')
            return false;
        element = element.parentNode;
    }

    return true;
}

function find_label(field, error_collector) {
    var label = document.getElementById(field); // Fucked up IE may find the input element by it's name
    var label_tag = label ? label.tagName.toLowerCase() : '';
    if (!label || label_tag == 'input' || label_tag == 'textarea' || label_tag == 'select') {
        var input = document.getElementsByTagName('form')[0][field];
        if (!input)
            return;
        if (input.parentNode.tagName.toLowerCase() == 'label' || input.parentNode.tagName.toLowerCase() == 'td')
            label = input.parentNode;
    }

    if (!label)
        return;

    var spans = label.getElementsByTagName('span');
    if (spans.length > 0) {
        label = spans[0];
    }

    return label;
}

function processReqChange() {
    if (!req)
        return;
    if (req.readyState == 4 && req.status == 200) {
        if (!req.responseXML)
            alert('Fehler in AJAX Rueckgabe: ' + req.responseText);
        // alert(req.responseText);

        return process_results();
    }
}

function process_results() {
    //var res = req.responseXML.getElementById('resultscontent');
    for (var tag = 0; tag < 2; tag++) {
        var spans = document.getElementsByTagName(['span', 'li'][tag]);
        for (var i = spans.length - 1; i >= 0; i--) { // reversed, because removing the child removes it from the collection as well
            if (spans[i].className == 'error')
                spans[i].parentNode.removeChild(spans[i]);
        }
    }

    var target = document.getElementById('results');
    if (target)
        target.innerHTML = '';

    var errors = req.responseXML.getElementsByTagName('errors').item(0);

    if (errors) {
        errors = errors.getElementsByTagName('error');

        var error_collector = document.getElementById('error_collector');
        if (error_collector && ! isVisible(error_collector))
            error_collector = undefined; // if it's not visible, we won't use it
        else
            error_collector.className = 'haserror';

        for (var i = 0; i < errors.length; i++) {
            var field = errors[i].getAttribute('field');
            var message = errors[i].firstChild.data;

            var label = find_label(field, error_collector);

            if (!label)
                continue;

            var messagefield = document.createElement(error_collector ? 'li' : 'span');
            messagefield.className = 'error';
            messagefield.innerHTML = message;

            if (error_collector) {
                if (label.firstChild)
                    label = label.firstChild.data;
                if(label)
                    label = label.replace(/(:\s*)?$/, ': ');
                else
                    label = '';
                messagefield.innerHTML = label + messagefield.innerHTML;
                error_collector.appendChild(messagefield);
            }
            else
                label.appendChild(messagefield);
        }
    } else {
        if (target) {
            var res = req.responseXML.getElementsByTagName('div').item(0);
            if (res.xml) // IE
                target.innerHTML = res.xml;
            else // real XML capable engines
                target.innerHTML = res.innerHTML; // well, not so much XML after all :(
                //target.appendChild(res.cloneNode(true));

            init_help_links(); // we need to initialize help links again
        }
    }

    hide_loading();

    return errors;
}

function in_array(s, arr) {
    if (typeof(arr) != 'object') {
        alert('fehler in der funktion in_array, parameter arr kein Objekt');
        return false;
    }
    for(var i = 0; i < arr.length; i++) {
        if (arr[i] == s)
            return true;
    }
    return false;
}

function init_tabindex(reInit) {
    // search for all input fields and apply tabindex
    var filter = new Array('input', 'select', 'textarea');
    var form = document.getElementsByTagName('form')[0];
    if(form) {
        var els = form.getElementsByTagName('*');
        var tabcount = 1;
        for(i = 0; i < els.length; i++)
            for(b = 0; b < filter.length; b++)
                if(els[i].tagName.toLowerCase() == filter[b])
                    if (els[i].tabIndex && reInit == undefined) return; // Some elements already have a tabindex (chancen), bail out!
        for(i = 0; i < els.length; i++)
            for(b = 0; b < filter.length; b++)
                if(els[i].tagName.toLowerCase() == filter[b])
                    els[i].tabIndex = tabcount++;
    }
}

function init_help_links() {
    // search for help links and apply onclick event
    var links = document.getElementsByTagName('a');
    for(i=0; i<links.length; i++) {
        if(links[i].className.indexOf('help') > -1) {
            links[i].onclick = set_help_focus;
        }
    }
}

function set_help_focus() {
    var helpClass = "help_focus";
    // clear all previously focused topics
    var allelements = document.getElementsByTagName('*');
    for(b=0; b<allelements.length; b++) {
        if(allelements[b].className.indexOf(helpClass) > -1) {
            allelements[b].className = allelements[b].className.split('help_focus').join('');
        }
    }
    // attach helpClass to target topic
    var targetid = this.href.split('#')[1];
    var targetheader = document.getElementById(targetid);
    if(targetheader) {
        if(targetheader.className.indexOf(helpClass) == -1) {
            targetheader.className += " " + helpClass;
            if ((typeof targetheader.currentStyle != 'undefined' ? targetheader.currentStyle : document.defaultView.getComputedStyle(targetheader, null))['position'] == 'absolute') {
                var parent = this;
                var x = 0, y = 0;
                while (parent) {
                    y += parent.offsetTop;
                    x += parent.offsetLeft;
                    parent = parent.offsetParent;
                }
                targetheader.style.top = y + 'px';
                targetheader.style.left = x + 'px';

                var close_link = document.createElement('a');
                close_link.onclick = function() {
                    targetheader.className = targetheader.className.split('help_focus').join('');
                    targetheader.removeChild(close_link);
                };
                close_link.className = 'close_link';
                close_link.innerHTML = '<span>[x]</span>';
                targetheader.appendChild(close_link);

                return false;
            }
        }
    }
}

function to_int(n) {
    var i = parseInt(n);
    return isNaN(i) ? 0 : i;
}

function page_y (e) {
    var y = 0;

    do {
        y += e.offsetTop;
    } while (e = e.offsetParent);

    return y + to_int(computedStyle(document.documentElement).marginTop) + to_int(computedStyle(document.documentElement).paddingTop) + to_int(computedStyle(document.body).marginTop) + to_int(computedStyle(document.body).paddingTop);
}

function display_loading() {
    var results_pointer = document.getElementById('results_pointer');
    if(!results_pointer) {
        results_pointer = document.createElement('div');
        results_pointer.id = 'results_pointer';
        document.body.appendChild(results_pointer);

        results_pointer.innerHTML = '<div id="loading">Wird berechnet ...</div>';
    }
    results_pointer.style.display = 'block';
    document.getElementById('loading').style.height = 'auto';
}

function is_IE6() {
    var rv = -1;

    if (navigator.appName == 'Microsoft Internet Explorer') {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }

    return rv == 6;
}

function hide_loading() {
    var results_pointer = document.getElementById('results_pointer');
    var loading = document.getElementById('loading');
    var results_link = document.getElementById('results_link');

    if (loading)
        loading.style.height = '0';

    var results = document.getElementById('results');
    var window_height = typeof( window.innerHeight ) == 'number' ? window.innerHeight : document.documentElement.clientHeight;

    if (!is_IE6() && ! /\blayout_compat\b/.test(document.body.className) && page_y(results) + results.offsetHeight > window_height) {
        if (! results_link) {
            results_link = document.createElement('a');
            results_link.id = 'results_link';

            function init_results_link() {
                results_link.innerHTML = 'Zum Ergebnis';
                results_link.href = '#results';
                results_link.onclick = function () { window.setTimeout(init_content_link, 1) };
            }

            function init_content_link() {
                results_link.innerHTML = 'Zur Eingabe';
                results_link.href = '#content';
                results_link.onclick = function () { window.setTimeout(init_results_link, 1) };
            }

            init_results_link();

            results_pointer.appendChild(results_link);
        }
    }
    else {
        results_pointer.style.display = 'none';
        if (results_link)
            results_pointer.removeChild(results_link);
    }
}
