/**
 * Allgemeine JavaScript-Funktionen
 * @author ag
 */
function ly_functions()
{
    var app = this;

    /* Quelle für addEvent und removeEvent: http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html */
    app.addEvent = function(obj, type, fn)
    {
        if (obj.addEventListener)
        {
            obj.addEventListener(type, fn, false);
        }
        else if (obj.attachEvent)
        {
            obj["e"+type+fn] = fn;
            obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
            obj.attachEvent("on"+type, obj[type+fn]);
        }
    }

    app.removeEvent = function(obj, type, fn)
    {
        if (obj.removeEventListener)
        {
            obj.removeEventListener(type, fn, false);
        }
        else if (obj.detachEvent)
        {
            obj.detachEvent("on"+type, obj[type+fn]);
            obj[type+fn] = null;
            obj["e"+type+fn] = null;
        }
    }

    app.removeClass = function(old, remove)
    {
        var classes;
        var i;
        var f = null;

        if (!old) old = '';
        classes = old.split(' ');
        for (i = 0; i < classes.length; i++)
        {
            if (classes[i] == remove) f = i;
        }
        if (f != null) classes.splice(f, 1);
        return(classes.join(' '));
    }

    app.replaceClass = function(old, toreplace, newclass)
    {
        old = app.removeClass(old, toreplace);
        old = app.addClass(old, newclass);
        return(old);
    }

    app.addClass = function(old, toadd)
    {
        var classes;
        var i;
        var f = null;

        if (!old) old = '';
        classes = old.split(' ');
        for (i = 0; i < classes.length; i++)
        {
            if (classes[i] == toadd) f = i;
        }
        if (f == null) classes.push(toadd);
        return(classes.join(' '));
    }

    app.hasClass = function(classname, classes)
    {
        var class_strings;
        var i;

        if (!classes) classes = '';
        class_strings = classes.split(' ');
        for (i = 0; i < class_strings.length; i++)
        {
            if (class_strings[i] == classname) return(true);
        }
        return(false);
    }

    app.replaceImage = function(elem_id, img_src)
    {
        if (document.getElementById)
        {
            var elem = document.getElementById(elem_id);
            if (elem)
            {
                elem.src = img_src;
            }
        }
    }

    app.toggleElemsByClassName = function(elemName, className, displayMode)
    {
        if (!elemName) return(false);
        if (!displayMode) displayMode = 'block';

        var rootNode = document.getElementsByTagName('BODY')[0];
        var childNodes;
        var e;
        var display = 'none';

        if (rootNode)
        {
            childNodes = app.filterChildNodesRecursive(rootNode, elemName, className);
            if (childNodes)
            {
                if (childNodes.length > 0)
                {
                    //if (childNodes[0].style['display'] != displayMode) display = displayMode;
                    if (!childNodes[0].style['display'] || childNodes[0].style['display'] == 'none') display = displayMode;
                    for (var i = 0; i < childNodes.length; i++)
                    {
                        if (display == 'none')
                        {
                            childNodes[i].style['display'] = 'none';
                        }
                        else
                        {
                            try
                            {
                                childNodes[i].style['display'] = display;
                            }
                            catch (e)
                            {
                                childNodes[i].style['display'] = 'block';
                            }
                        }
                    }
                }
            }
        }
        return(display != 'none');
    }

    app.hideElemsByClassName = function(elemName, className, mode)
    {
        if (!elemName) return(false);
        if (!mode) mode = false;

        var rootNode = document.getElementsByTagName('BODY')[0];
        var childNodes;
        var e;

        if (rootNode)
        {
            childNodes = app.filterChildNodesRecursive(rootNode, elemName, className);
            if (childNodes)
            {
                for (var i = 0; i < childNodes.length; i++)
                {
                    if (mode == false)
                    {
                        childNodes[i].style['display'] = 'none';
                    }
                    else
                    {
                        try
                        {
                            childNodes[i].style['display'] = mode;
                        }
                        catch (e)
                        {
                            childNodes[i].style['display'] = 'block';
                        }
                    }
                }
            }
        }
        return(mode != false);
    }

    app.showElemsByClassName = function(elemName, className, mode)
    {
        if (!elemName) return(false);
        if (!mode) mode = 'block';

        return(app.hideElemsByClassName(elemName, className, mode));
    }

    app.hideElem = function(elemName)
    {
        var elem;
        if (document.getElementById)
        {
            elem = document.getElementById(elemName);
            if (elem) elem.style['display'] = 'none';
        }
    }

    app.showElem = function(elemName)
    {
        var elem;
        if (document.getElementById) {
            elem = document.getElementById(elemName);
            if (elem && elem.nodeName == 'TR') {
                try {
                    elem.style.display = 'table-row';
                } catch (e) {
                    elem.style.display = 'block';
                }
            } else {
                if (elem) elem.style['display'] = 'block';
            }
        }
    }

    app.disable_element = function(name, mode)
    {
        var elem;
        if (mode == null) mode = true;
        elem = document.getElementById(name);

        if (elem) {
            elem.disabled = mode;

            if (mode == true && app.hasClass('text', elem.className))
                elem.className = app.addClass(elem.className, 'disabled');
            else
                elem.className = app.removeClass(elem.className, 'disabled');
        }
    }

    app.str_replace = function (QuellText, SuchText, ErsatzText)
    {
        if ((QuellText == null) || (SuchText == null)) { return null; }
        if ((QuellText.length == 0) || (SuchText.length == 0)) { return QuellText; }

        if ((ErsatzText == null) || (ErsatzText.length == 0)) { ErsatzText = ""; }

        var LaengeSuchText = SuchText.length;
        var LaengeErsatzText = ErsatzText.length;
        var Pos = String(QuellText).indexOf(SuchText, 0);

        while (Pos >= 0)
        {
            QuellText = QuellText.substring(0, Pos) + ErsatzText + QuellText.substring(Pos + LaengeSuchText);
            Pos = QuellText.indexOf(SuchText, Pos + LaengeErsatzText);
        }

        return QuellText;
    }

    app.parseFloat = function(value)
    {
        if (value)
        {
            value = app.str_replace(value, '.', '');
            value = app.str_replace(value, ',', '.');
            value = parseFloat(value);
        }
        return(value);
    }

    app.parseInt = function(value)
    {
        if (value)
        {
            value = app.str_replace(value, '.', '');
            value = app.str_replace(value, ',', '.');
            value = parseInt(value);
        }
        return(value);
    }

    app.intval = function(value)
    {
        if (!value) value = '';
        value = String(value);
        value.replace(/\./gi, '');
        value.replace(/\,/gi, '.');
        value = parseInt(value);
        if (isNaN(value)) value = 0;
        return(value);
    }

    // Number Format
    app.number_format = function (number, laenge, sep, th_sep)
    {
        var pre = "";

        if(number < 0)
        {
            pre = "-";
            number *= (-1)
        }

        number = Math.round( number * Math.pow(10, laenge) ) / Math.pow(10, laenge);
        var str_number = number+"";
        var arr_int = str_number.split(".");

        if(!arr_int[0]) arr_int[0] = "0";
        if(!arr_int[1]) arr_int[1] = "";
        if(arr_int[1].length < laenge)
        {
            nachkomma = arr_int[1];
            for(i=arr_int[1].length+1; i <= laenge; i++){   nachkomma += "0";   }
            arr_int[1] = nachkomma;
        }

        if(th_sep != "" && arr_int[0].length > 3)
        {
            var Begriff = arr_int[0];
            arr_int[0] = "";

            for(var j = 3; j < Begriff.length ; j+=3)
            {
                var Extrakt = Begriff.slice(Begriff.length - j, Begriff.length - j + 3);
                arr_int[0] = th_sep + Extrakt +  arr_int[0] + "";
            }

            var str_first = Begriff.substr(0, (Begriff.length % 3 == 0)?3:(Begriff.length % 3));
            arr_int[0] = str_first + arr_int[0];
        }

        return pre+arr_int[0]+sep+arr_int[1];
    }

    app.getOffsetTop = function(elem)
    {
        if (elem == null) return(null);
        if (elem.offsetParent == null)
            return(elem.offsetTop);
        else
            return(elem.offsetTop +app.getOffsetTop(elem.offsetParent));
    }

    app.getOffsetLeft = function(elem)
    {
        if (elem == null) return(null);
        if (elem.offsetParent == null)
            return(elem.offsetLeft);
        else
            return(elem.offsetLeft +app.getOffsetLeft(elem.offsetParent));
    }

    /**
     * Filtert aus den übergebenen Nodes diejenigen heraus, dessen Tagnamen nodeName entspricht
     * @param Array nodes
     * @param String nodeName
     * @return Array
     */
    app.filterChildNodes = function(nodes, nodeName)
    {
        var treeNodes = new Array();
        var i;

        if (nodes && nodeName)
        {
            for (i = 0; i < nodes.length; i++)
            {
                if (nodes[i].nodeType == 1 && nodes[i].nodeName == nodeName) treeNodes.push(nodes[i]);
            }
        }

        return(treeNodes);
    }

    app.filterChildNodesRecursive = function(parentNode, nodeName, cName)
    {
        var nodes = new Array();
        var i;
        var dummy;

        if (parentNode && nodeName)
        {
            if (parentNode.hasChildNodes())
            {
                for (i = 0; i < parentNode.childNodes.length; i++)
                {
                    if (parentNode.childNodes[i].nodeType == 1)
                    //if (true)
                    {
                        if (parentNode.childNodes[i].nodeName == nodeName)
                        {
                            if (!cName || app.hasClass(cName, parentNode.childNodes[i].className))
                            {
                                nodes.push(parentNode.childNodes[i]);
                            }
                                if (parentNode.childNodes[i].hasChildNodes())
                                {
                                    dummy = app.filterChildNodesRecursive(parentNode.childNodes[i], nodeName, cName);
                                    nodes = nodes.concat(dummy);
                                }
                        }
                        else
                        {
                            if (parentNode.childNodes[i].hasChildNodes())
                            {
                                dummy = app.filterChildNodesRecursive(parentNode.childNodes[i], nodeName, cName);
                                nodes = nodes.concat(dummy);
                            }
                        }
                    }
                }
            }
        }
        return(nodes);
    }

    app.filterParentNode = function(childNode, nodeName)
    {
        var parent = null;
        var currentNode = childNode;

        while (parent == null && currentNode.parentNode != null)
        {
            currentNode = currentNode.parentNode;
            if (currentNode.nodeType == 1 && currentNode.nodeName == nodeName) parent = currentNode;
        }

        return(parent);
    }

    app.createCookie = function(name, value, days)
    {
        if (days)
        {
            var date = new Date();
            date.setTime(date.getTime() +(days *24 *60 *60 *1000));
            var expires = "; expires=" + date.toGMTString();
        }
        else
        {
            expires = "";
        }
        document.cookie = name + "=" + value + expires + "; path=/";
    }

    app.readCookie = function(name)
    {
        var nameEQ = name + "=";
        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) return(c.substring(nameEQ.length, c.length));
        }
        return(null);
    }
}