﻿// Ermöglicht das "this" Objekt an eine Funktion zu hängen
if (!Function.prototype.bind)
{
    Function.prototype.bind = function (that)
    {
        var self = this,
        args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
        F = function () { };

        var bound = function ()
        {
            var context = that,
          length = arguments.length;

            if (this instanceof bound)
            {
                F.prototype = self.prototype;
                context = new F;
            }

            var result = (!args && !length) ?
        self.call(context) :
        self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);

            return context == that ? result : context;
        };

        return bound;
    };
}

// Klasse für Erweitern Funktionalität
function openCloseZeug(params)
{
    // Elternelement in dem der Link eingesetzt wird
    this.jDomParent = params.jDomParent;

    // Durchnummerierung der Elemente von 0 bis ...
    this.initialOpen = params.initialOpen;

    // Element soll als erstes Kindelement angelegt werden?
    this.appendAsFirst = params.appendAsFirst;

    // auf/zu Element welches sichtbar / unsichtbar wird
    this.jDomToggleContainer = params.jDomToggleContainer;

    // auf/zu Text neben Linksymbol
    this.textOpen = params.textOpen || "";
    this.textClose = params.textClose || "";

    // CSS Klasse für auf/zu Link
    this.cssClass = params.cssClass;

    // Daten für auf/zu Bild
    this.imgAltOpen = params.imgAltOpen || "";
    this.imgAltClose = params.imgAltClose || "";
    this.imgSrcOpen = params.imgSrcOpen;
    this.imgSrcClose = params.imgSrcClose;

    // Information für bestimmtes Elternelement

    // Elternelement als jQuery Objekt
    this.jDomParentForClass = params.jDomParentForClass || params.jDomParent;

    // Elternelement löst durch klick ebenfalls klappmechanismus aus
    this.jDomParentIsClickable = params.jDomParentIsClickable || false;

    // CSS-Klasse für bestimmtes Elternelement
    this.parentOpenClass = params.parentOpenClass || "";
    this.parentCloseClass = params.parentCloseClass || "";

    // Aktuell auf/zu
    this.currentIsOpen = false;

    // Der Auf/zu Link als jQuery Object
    this.jDomObject = null;

    // Wird ausgeführt bevor das Element geöffnet wird
    this.beforeOpenFunction = params.beforeOpenFunction || function () { };

    // Wird ausgeführt bevor das Element geschlossen wird
    this.beforeCloseFunction = params.beforeCloseFunction || function () { };

    // Funktion zum Initialisieren der auf/zu Links inkl. Funktionen
    this.init();

    // Klickfunktion für auf/zu
    this[this.jDomParentIsClickable ? 'jDomParent' : 'jDomObject'].click(this.toggleEntry.bind(this));


    

}
// Initialisierung
openCloseZeug.prototype.init = function ()
{

    this.jDomParentForClass.addClass(this.parentCloseClass);

    var strCssClass = this.cssClass ? " class=\"" + this.cssClass + "\"" : "";
    var strAufZuLink = "<a href=\"javascript: void(0);\"" + strCssClass + "><img src=\"" + this.imgSrcOpen + "\" alt=\"" + this.imgAltOpen + "\" />" + this.textOpen + "</a>";

    // Auf/zu Link an erste Position oder letzte
    if (this.appendAsFirst) { this.jDomObject = $(strAufZuLink).prependTo(this.jDomParent); }
    else { this.jDomObject = $(strAufZuLink).appendTo(this.jDomParent); }


    // Alle außer "initialOpen Element" schließen
    (this.initialOpen) ? this.openEntry() : this.closeEntry();

};
// Eintrag öffnen
openCloseZeug.prototype.openEntry = function ()
{
    this.beforeOpenFunction();

    this.currentIsOpen = true;
    if (this.jDomToggleContainer)
    {
        this.jDomToggleContainer.show();
    }

    this.jDomParentForClass.removeClass(this.parentCloseClass);
    this.jDomParentForClass.addClass(this.parentOpenClass);

    var img = "<img src=\"" + this.imgSrcClose + "\" alt=\"" + this.imgAltClose + "\" />";
    this.jDomObject.html(img + this.textClose);
};
// Eintrag schließen
openCloseZeug.prototype.closeEntry = function ()
{
    this.beforeCloseFunction();

    this.currentIsOpen = false;
    if (this.jDomToggleContainer)
    {
        this.jDomToggleContainer.hide();
    }

    this.jDomParentForClass.removeClass(this.parentOpenClass);
    this.jDomParentForClass.addClass(this.parentCloseClass);

    var img = "<img src=\"" + this.imgSrcOpen + "\" alt=\"" + this.imgAltOpen + "\" />";
    this.jDomObject.html(img + this.textOpen);
};

openCloseZeug.prototype.isOpen = function () { return this.currentIsOpen; };
openCloseZeug.prototype.toggleEntry = function ()
{
    this.currentIsOpen ? this.closeEntry() : this.openEntry()
};
