/*jslint adsafe: false, bitwise: true, browser: true, cap: false, debug: true, eqeqeq: true, evil: false, forin: false, fragment: true, glovar: true, laxbreak: false, nomen: true, on: true, passfail: false, plusplus: false, regexp: false, rhino: false, safe: false, sidebar: false, sub: false, undef: true, white: true, widget: false */

// JSLint Options
// adsafe: true if ADsafe.org rules widget pattern should be enforced.
// bitwise: true if bitwise operators should not be allowed
// browser: true if the standard browser globals should be predefined
// cap: true if upper case HTML should be allowed
// debug: true if debugger statements should be allowed
// eqeqeq: true if === should be required
// evil: true if eval should be allowed
// forin: true if unfiltered for in statements should be allowed
// fragment: true if HTML fragments should be allowed
// glovar: true if var should not be allowed to declare global variables
// indent the number of spaces used for indentation (default is 4)
// laxbreak: true if statement breaks should not be checked
// nomen: true if names should be checked for initial underbars
// on: true if HTML event handlers should be allowed
// passfail: true if the scan should stop on first error
// plusplus: true if ++ and -- should not be allowed
// predef an array of strings, the names of predefined global variables
// regexp: true if . should not be allowed in RegExp literals
// rhino: true if the Rhino environment globals should be predefined
// safe: true if the safe subset rules are enforced.
// sidebar: true if the Windows Sidebar Gadgets globals should be predefined
// sub: true if subscript notation may be used for expressions better expressed in dot notation
// undef: true if undefined global variables are errors
// white: true if strict whitespace rules apply
// widget: true if the Yahoo Widgets globals should be predefined

/*global de*/
de = this.de || {};
de.datev = de.datev || {};
de.datev.events = function () {
    var thisNamespace = de.datev.events || {};

    var addEvent = function (node, evType, fn) {
        if (node.addEventListener) {
            node.addEventListener(evType, fn, false);
        } else if (node.attachEvent) {
            var r = node.attachEvent("on" + evType, fn);
        }
    };

    var removeEvent = function (node, evType, fn) {
        if (node.removeEventListener) {
            node.removeEventListener(evType, fn, false);
        } else if (node.detachEvent) {
            var r = node.detachEvent("on" + evType, fn);
        }
    };

    // Unterdrueckt Browser-Default-Aktion (z.B. Abschicken eines Forms, Folgen eines Links, etc).
    var preventDefault = function (e) {
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
    };
    
    var getSrcElement = function(evt) {
        if (evt.explicitOriginalTarget) {
        	// Firefox
        	return evt.explicitOriginalTarget;
        } else if (evt.srcElement) {
        	// IE
        	return evt.srcElement;
        }
		return null;
    };
    
    // Unterbricht Event-Abarbeitung (von vorderstem zum hintersten Element).
    // Verhindert, dass Event an Parent-DOM-Objekte weitergereicht wird.
    var stopHandling = function (e) {
        if (e.stopPropagation) {
            e.stopPropagation();
        } else {
            e.cancelBubble = true;
        }
    };

    var handlerToShowElement = function (elem) {
        return function (evt) {
            if (elem && elem.firstChild) {
                elem.style.display = "block";
            }
        };
    };

    var handlerToHideElement = function (elem) {
        return function (evt) {
            if (elem) {
                elem.style.display = "none";
            }
        };
    };

    var handlerToShowElementById = function (elemId) {
        return function (evt) {
            var elem = document.getElementById(elemId);
            if (elem) {
                elem.style.display = "block";
            }
        };
    };

    var handlerToHideElementById = function (elemId) {
        return function (evt) {
            var elem = document.getElementById(elemId);
            if (elem) {
                elem.style.display = "none";
            }
        };
    };

    // Funktionen veroeffentlichen
    thisNamespace.addEvent = addEvent;
    thisNamespace.removeEvent = removeEvent;
    thisNamespace.preventDefault = preventDefault;
    thisNamespace.getSrcElement = getSrcElement;
    thisNamespace.stopHandling = stopHandling;
    thisNamespace.handlerToShowElement = handlerToShowElement;
    thisNamespace.handlerToHideElement = handlerToHideElement;
    thisNamespace.handlerToShowElementById = handlerToShowElementById;
    thisNamespace.handlerToHideElementById = handlerToHideElementById;
    return thisNamespace;
}(); /* de.datev.events */