// Eigenschaften im Hash speichern - sinnvoll zur Navigation auf der Seite.
// Jeder, der hieraus liest, sollte sich über Updates seiner Eigenschaft informieren
// Achtung: Pro Eigenschaft kann es nur einen Listener geben!
// Achtung: Listener dürfen niemals ihre eigene Eigenschaft erneut ändern (Endlosschleife), wohl aber einen gleichen neuen Wert eintragen
var hashProps = {
    get: function(key) {
        return this[key];
    },
    set: function(key, value) {
        if (this[key] == value)
            return;
        this[key] = value;
        this.didChange(key);
        var newHash = "#";
        for (var k in this) {
            if (this.hasOwnProperty(k) && typeof(this[k]) != "function" && k != "_listener") {
                newHash += k +":"+ this[k] +";";
            }
        }
        if (newHash != window.location.hash)
            window.location.hash = newHash;
    },
    didChange: function(what) {
        if (this.hasListener(what))
            this._listener[what].call(this, this[what]);
    },
    _listener: [],
    setListener: function(key, fn) {
        if (key && fn)
            this._listener[key] = fn;
    },
    hasListener: function(key) {
        return !(!this._listener[key]);
    }
};
reloadHash();

//function AOStorage() {
//}
//
//AOStorage.setVal = function(key, value) {
//	return window.localStorage.setItem(user +".ao@"+ name, value);
//}
//
//AOStorage.getVal = function(key) {
//	return window.localStorage.getItem(user +".ao@"+ name);
//}
//
//AOStorage.removeVal = function(key) {
//	return window.localStorage.removeItem(user +".ao@"+ name);
//}

(function($){
    $.getScript = function(url, callback, cache) {
        $.ajax({
            type: "GET",
            url: url,
            success: callback,
            dataType: "script",
            cache: cache
        });
    };
})(jQuery);

$(window).bind('hashchange', function() {
    reloadHash();
});

function reloadHash() {
    var hash = window.location.hash.substring(1);
    // Lade eine Liste von Eingenschaften, jeweils durch ; getrennt
    var props = hash.split(";");
    for (var i = 0; i < props.length; i++) {
        var posDelim = props[i].indexOf(":");
        if (posDelim != -1) {
            var key = props[i].substring(0, posDelim);
            var val = props[i].substring(posDelim + 1);
            hashProps.set(key, val);
        }
    }
}

var fotoalbum = false;

/**
 * Funktion, die nach dem Laden der Seite aufgerufen wird.
 */
$(function() {
    // Platzhalter auch bei HTML-Version < 5
    $("input[prompt]").add("textarea").prompt();
    
    // Auto-Resize von Textfeldern
    $("textarea").autoResize();
    
    // Suchfeld
    if ($('#search_text_field').length > 0 && $.fn.autocomplete) {
        $('#search_text_field').autocomplete({
            url: 'ajax.php?script=seite&action=list',
            onItemSelect: function(item) {
                if (item.data.search)
                    location.href = "suche.php?suche="+ item.data.search;
                else
                    location.href = "seite.php?id="+ item.data.id;
            },
            maxItemsToShow: 10,
            ulCallback: function($ul) {
                $ul.addClass('seitenListe');
            },
            getExtraItem: function(filter) {
                return {
                    value: "<div style='width: 100%'><div style='text-align: center'>Erweiterte Suche nach<br><a href='suche.php?suche="+
                        filter +"'><b>"+ filter +"</b></a></div></div>",
                    data: {
                        name: "Suche", 
                        search: filter
                    }
                };
            },
            sortFunction: function(a, b, filter) {
                a = String(a.data.name).toLowerCase();
                b = String(b.data.name).toLowerCase();
                if (a > b) {
                    return 1;
                }
                if (a < b) {
                    return -1;
                }
                return 0;
            },
            displayValue: function(value, data) {
                return data.name;
            }
        });
    }
		
    // Chooser finden
    if ($.fn.chooser)
        $("input[chooser]").chooser();
	
    // Kalender-Link mit Dropdown
    $("#kalender_link").click(function() {
        showKalenderDropdown();
        return false;
    });
		
    // Postfach-Link mit Dropdown
    $("#postfach_link").click(function() {
        showPostfachDropdown();
        return false;
    });
		
    // Netz-Link mit Dropdown
    $("#netz_link").click(function() {
        showNetzDropdown();
        return false;
    });
		
    // Skript-Links mit Hash als href ignorieren
    $("a[href=\"#\"]").click(function() {
        return false;
    });
	
    // Listen mit maximaler Anzahl behandeln
    $('*[aoMax]').each(function() {
        var _me = $(this);
        var count = _me.attr("aoMax");
        if (count == "false")
            return;
			
        var changed = false;
        var def = false;
        var length = _me.children().each(function(index, elem) {
            if (index >= count) {
                if (def === false)
                    def = $(elem).css("display");
                $(elem).css("display", "none");
                changed = true;
            }
        }).length;
        if (changed) {
            $("<a href=#>"+ (length - count) +" weitere anzeigen</a>").click(function() {
                _me.children().filter(function(index, elem) {
                    return index >= count;
                }).css({
                    "display": def,
                    "opacity": 0
                }).fadeIn2(300);
                $(this).parent().remove();
                return false;
            }).appendTo($("<li>&darr; </li>").appendTo(_me).css({
                "text-align": "center",
                "font-size": "10pt"
            }));
        }
    });
    
    // Möglichkeit, Posts öffentlich zu machen
    $(".pinnwand_item[data-postid]").mousedown(function(event) {
    	if (event.altKey) {
            var _me = $(this);
            showConfirmDialog(
            'Möchtest du diesen Post veröffentlichen?',
            'Er wird dann auf der öffentlichen Homepage angezeigt.'
                +'<p>Diese Nachricht wird immer dann angezeigt, wenn du auf die "alt"-Taste drückst '
                +'und auf einen Post klickst.',
            function(result) {
                if (result) {
                    var postID = _me.attr('data-postid');
                    jsonRequest('post', 'makePublic', {
                        postID: postID
                    });
                }
            }
        );
    	}
    });
    
    // Reload beim Scrollen bis ans Ende
    $(window).scroll(function() {
    	// Bis zum Ende gescrollt? Mehr Inhalt laden!
    	if (currentTab && $(window).scrollTop() >= $(document).height() - $(window).height()) {
            var $loadMoreLink = $("a.load_more", currentTab.getContentElement());
            if ($loadMoreLink.length == 1)
            	$loadMoreLink.click();
    	}
    });
});

/**
 * Gibt das Ergebnis eines Forms als JSON zurück. Parameter: Array von
 * input-Elementen. Achtung: Chooser-Elemente innerhalb des Formulars werden
 * automatisch einbezogen.
 */
(function($) {
    $.fn.serializeObject = function() {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name]) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        $.each($("input[chooser]", this.closest("form")), function() {
            o[this.name] = $(this).getChoosenOnes('id');
        });
        return o;
    };
})(jQuery);

// Autoresize von Textfeldern
(function($){
    $.fn.autoResize = function(options) {
    	this.filter('textarea').each(function() {
            var textarea = this;
            var $textarea = $(textarea);
            var updateSize = function() {
                var adjustedHeight = textarea.clientHeight;
                if (!maxHeight || maxHeight > adjustedHeight) {
                    adjustedHeight = Math.max(textarea.scrollHeight, adjustedHeight);
                    if (maxHeight)
                        adjustedHeight = Math.min(maxHeight, adjustedHeight);
                    if (adjustedHeight > textarea.clientHeight)
                        textarea.style.height = (adjustedHeight + 3) + "px";
                }
            }
            updateSize();
            $textarea.unbind('.dynSiz').bind('keyup.dynSiz', updateSize)
            .bind('keydown.dynSiz', updateSize)
            .bind('change.dynSiz', updateSize);
            var maxHeight = 1000;
    	})
        // Chain:
        return this;
    };
})(jQuery);

/**
 * Automatisches Schließen eines Dialogs, wenn Esc in
 * einem der ausgewählten Elemente gedrückt wird.
 */
(function($) {
    $.fn.closeOnEsc = function(dialog) {
        $.each(this, function() {
            $(this).keydown(function(event) {
                if (event.keyCode == 27)
                    $(dialog.closeElement).click();
            });
        });
        return this;
    };
})(jQuery);

// Animieren mit Webkit-Animationen
(function($) {
    $.fn.animate2 = function(css, speed, fn) {
    	if ($.isFunction(speed)) {
            fn = speed;
            speed = undefined;
    	}
        if (speed === undefined)
            speed = 300;
        if (speed === 0) { // differentiate 0 from null
            this.css(css);
            var _me = this;
            if (fn)
                window.setTimeout(function() {
                    fn.call(_me)
                }, 0);
        } else {
            if ($.browser.webkit) {
                var s = [];
                for (var i in css)
                    s.push(i);
				
                this.css({
                    webkitTransitionProperty: s.join(", "),
                    webkitTransitionDuration: speed+ "ms"
                });
			
                window.setTimeout(function(x,y) {
                    x.css(y)
                }, 0, this, css); // have to wait for the above CSS to get
                // applied
                var _me = this;
                if (fn)
                    window.setTimeout(function() {
                        fn.call(_me)
                    }, speed);
            } else {
                this.animate(css, speed, fn);
            }
        }
        return this;
    }
    $.fn.fadeOut2 = function(duration, callback) {
        if (!callback && $.isFunction(callback)) {
            callback = duration;
            duration = undefined;
        }
        var _me = this;
        _me.css({
            opacity: "1"
        });
        setTimeout(function() {
            _me.animate2({
                opacity: "0"
            }, duration, function() {
                _me.css({
                    display: "none"
                });
                if (callback)
                    callback.call(_me);
            });
        }, 0);
    }
    $.fn.fadeIn2 = function(duration, callback) {
        if (!callback && typeof(duration) == "function") {
            callback = duration;
            duration = undefined;
        }
        var _me = this;
        _me.css({
            opacity: "0",
            display: "inherit"
        });
        setTimeout(function() {
            _me.animate2({
                opacity: "1"
            }, duration, callback);
        }, 0);
    }
})(jQuery);

// Placeholder auch bei HTML < 5
(function($) {
    function supports_input_placeholder() {
        var i = document.createElement('input');
        return 'placeholder' in i;
    }
    $.fn.prompt = function(promptText) {
        var context = $(this).filter(":text,textarea");
        if (supports_input_placeholder()) {
            if (promptText)
                context.attr("placeholder", promptText);
            return this;
        }
			
        $.each(context, function(index) {
            var p = promptText;
            if (!p) {
                p = $(this).attr("placehholder");
            }
            if ($(this).val() == "") {
                $(this).val(p);
                $(this).addClass("prompted");
            }
            $(this).focus(function() {
                if ($(this).hasClass("prompted")) {
                    $(this).val("");
                    $(this).removeClass("prompted");
                }
            });
            $(this).blur(function() {
                if ($(this).val() == "") {
                    $(this).val(p);
                    $(this).addClass("prompted");
                }
            });
        });
        return this;
    }
})(jQuery);

// Funktion, ob ein Element ein Attribut besitzt
(function($) {
    $.fn.hasAttr = function (attr) {
        for (var i = 0; i < this[0].attributes.length; i++) {
            if (this[0].attributes[i].nodeName == attr) {
                return true;
            }
        }
        return false;
    };
})(jQuery);

// Validierung von Formularen
(function($) {
    $.fn.aoValid = function(oninvalid) {
        var gotOne = false;
        $.each(this, function(index) {
            function remark(title) {
                if (oninvalid)
                    oninvalid(_this[0], title, !gotOne);
                gotOne = true;
                return true;
            }
			
            var _this = $(this);
			
            // 1) Test, ob das Feld leer ist.
            var required = _this.hasAttr("required");
            var value = _this.val();
            if (_this.attr("chooser"))
                value = _this.getChoosenOnes('id');
            if (required && (!value || value.length == 0 || _this.hasClass("prompted")))
                return remark("Du musst dieses Feld ausfüllen.");
			
            // 2) Vordefinierte Tests
            var aovalid = _this.attr("aovalid");
            if (aovalid) {
                aovalid = aovalid.trim();
                if (aovalid.length > 0) {
                    // a) Zeitangabe prüfen
                    var regex = null;
                    var grund = "Die eingegebenen Daten sind falsch formattiert. ";
                    if (aovalid == "date") {
                        regex = /^([012]?[0-9]|3[01])\.([0]?[1-9]|1[012])\.2[0-9]{3}(\s+([01]?[0-9]|2[0-3]):([0-5][0-9]))?$/;
                        grund = "'"+ value +"' ist kein gültiges Datum.";
                    } else if (aovalid == "email") {
                        regex = /^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i;
                        grund = "'"+ value +"' ist keine gültige E-Mail-Adresse.";
                    } else if (aovalid == "number") {
                        regex = /^[0-9]+$/i;
                        grund = "'"+ value +"' ist keine Zahl.";
                    } else if (aovalid == "currency") {
                        regex = /^[0-9]+(?:,[0-9]{2})?$/i;
                        grund = "'"+ value +"' ist kein Betrag.";
                    } else if (aovalid.lastIndexOf("/") != aovalid.indexOf("/")) {
                    	// Eigene Reguläre Ausdrücke - in / eingebettet.
                        var regexPart = aovalid.substring(1, aovalid.lastIndexOf("/"));
                        var paramPart = aovalid.substring(aovalid.lastIndexOf("/") - 1);
                        regex = new RegExp(regexPart, paramPart);
                    }
					
                    if (regex && !regex.exec(value))
                        return remark(grund);
                }
            }
			
            return true;
        });
        return !gotOne;
    }
})(jQuery);

/**
 * Gibt true zurück, wenn die Webseite auf einem iPod/iPhone/iPad angezeigt
 * wird.
 */
function isIOS() {
    return navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/iPad/i);
}

// #### Tab-API ####
var currentTab = null;
function Tab(element) {
    var tab = this;
    var name = getTabName(element);
    var element = element;
    var contentElement = document.getElementById(name);
    var listener = [];
    this.show = function(noChange) {
        $.each(getTabList(), function(key, value) {
            value.hide();
        });
        $(element).removeClass('tab_inactive').addClass('tab_active');
        $(contentElement).removeClass('tab_invisible').addClass('tab_visible');
        currentTab = tab;
        if (!noChange)
            hashProps.set("tab", name);
        for (var i = 0; i < listener.length; i++) {
            listener[i].call(this);
        }
    };
    this.click = function(fn) {
        if (fn)
            listener.push(fn);
        else
            for (var i = 0; i < listener.length; i++)
                listener[i].call(this);
    }
    this.hide = function() {
        $(element).removeClass('tab_active').addClass('tab_inactive');
        $(contentElement).removeClass('tab_visible').addClass('tab_invisible');
    };
    this.getElement = function () {
        return element;
    }
    this.getContentElement = function () {
        return contentElement;
    }
    this.getName = function () {
        return name;
    }
    this.isVisible = function() {
        return $(element).hasClass('tab_active');
    }
    function getTabName(element) {
        if (element.id)
            return element.id.substring(0, element.id.lastIndexOf('_Tab'));
        else
            return $(element).text();
    }
}

/**
 * Gibt das Tab-Objekt für den Namen zurück.
 */
function getTab(name) {
    var list = getTabList();
    for (var i = 0; i < list.length; i++)
        if (list[i].getName() == name)
            return list[i];
    return null;
}

var tabList;
function getTabList(reload) {
    if (reload || !tabList) {
        // Tab-Leiste erstellen
        var tabContents = $('.tab_content');
        var tabHeader = $('#tabmenu');
        if (tabContents.length > 0 && tabHeader.length != 0) {
            var table = $('<table/>').appendTo(tabHeader)
            var tr = $('<tr/>').appendTo(table);
            $.each(tabContents, function(a, b) {
                var td = $('<td/>').appendTo(tr);
                var x = "javascript:getTab('"+ b.id +"').show()";
                $('<a><div class="tab" id="'+ b.id +'_Tab">'+ b.id +'</div></a>').attr("href", x).appendTo(td);
            });
        }
		
        var tabs = $('.tab');
        tabList = new Array();
        $.each(tabs, function(a, b) {
            if (b) {
                tabList[a] = new Tab(b);
            }
        });
    }
    return tabList;
}

$(function() {
    var list = getTabList();
    if (list && list.length > 0) {
        var tabName = unescape(hashProps.get("tab"));
        var tab = getTab(tabName);
        if (tab) {
            tab.show();
        } else {
            list[0].show(true);
        }
        if (!hashProps.hasListener("tab"))
            hashProps.setListener("tab", arguments.callee);
    }
});

// #### Post-Aktionen ####

// Post-Typ Text
var TEXT = 1;

function jsonRequestWithOptions(options) {
    var x = $.extend({
        script: null,
        action: null,
        data: null,
        callback: null,
        errorCallback: null,
        progressCallback: null
    }, options);
    return jsonRequest(x.script, x.action, x.data, x.callback, x.errorCallback, x.progressCallback);
}

var block = false;
function jsonRequest(script, action, data, callback, errorCallback, progressCallback) {
    var get = "ajax.php"+ ((script) ? "?script="+ script : "?") + ((action) ? "&action="+ action : "");
    var xhr = $.post(get, data,
    function (returnData) {
        if (block)
            return;
        var json = null;
        try {
            json = $.parseJSON(returnData);
        } catch(e) {
            if (errorCallback)
                if (!errorCallback(returnData))
                    return;
            showMessageDialog("Ein Fehler ist aufgetreten.", e +"<p>"+ returnData);
            return;
        }
        try {
            if (json.ausgabe)
                console.log(json.ausgabe);
        } catch(e) {}
            
        // Wenn es einen Fehler gab:
        if (json.fehler) {
            if (json.nachricht == "login") {
                if (block)
                    return;
                block = true;
                showMessageDialog("Du bist nicht eingeloggt.",
                "Eine Aktion konnte daher nicht durchgeführt werden. " +
                    "Bitte melde dich erneut an, indem du die Seite neu lädst." +
                    "<p><a href='#' onclick='location.reload()'>Seite jetzt neu laden.</a>");
                return;
            }
            	
            if (errorCallback)
                if (!errorCallback(json))
                    return;
            showMessageDialog("Ein Fehler ist aufgetreten.", json.nachricht);
        }
        // Bei erfolgreichem Abschluss Callback aufrufen
        else {
            if (callback)
                callback(json);
            else if (json.reload)
                location.reload();
        }
    });
    if (progressCallback) {
        addEventListener("progress", function(event) {
            var done = e.position || e.loaded, total = e.totalSize || e.total;
            progressCallback(done / total);
        }, false);
    }
}

/**
 * Sendet einen Post ab per ajax.php?script=post&action=send.
 */
function sendPost(form) {
    submitForm(form, {
        reload: false,
        disable: true,
        success: function(data) {
            if (data.content.HTML) {
                // Alle Pinnwände laden
                var pinnwand = $('.pinnwand');
				
                // Keine Pinnwand gefunden
                if (pinnwand.length == 0)
                    return;
				
                // Trennlinie einfügen
                pinnwand.prepend("<div class='divider'/>");
				
                // Einfügen
                pinnwand.each(function() {
                    $(data.content.HTML).hide().prependTo(this).show("fast");
                });
				
                // Beitragsfeld leeren
                form.beitrag.value = "";
				
                // Wieder auf normale Posts umschalten
                if (form.publicPost)
                    form.publicPost.checked = false;
            }
        }
    });
}

/**
 * Löscht einen Post per ajax.php?script=post&action=remove.
 */
function removePost(id, fotoalbum) {
    if (!confirm('Möchtest du diesen Beitrag wirklich löschen?'))
        return false;
    jsonRequest(
    "post", "remove", {
        "postID" : id
    }, function (data) {
        $("*[data-postid=\""+ id +"\"]").hide("fast", function() {
            $(this).remove();
        }).next(".divider").hide("fast", function() {
            $(this).remove();
        });
    }
);
}

/**
 * Einen Post liken.
 */
function likePost(id) {
    // Bei Kommentaren: RefreshID ist die ID des Posts
    var _me = $("*[data-postid=\""+ id +"\"]");
    jsonRequest(
    "like", "likeIt", {
        "target" : id
    }, function (data) {
        if (data.content) {
            _me.children('.item_actions').children('.like_content').html(data.content);
        } else
            window.location.reload();
    }
);
    _me.children('.item_actions').children('.like_action').hide("fast");
}

/**
 * Kommentiert einen Post.
 */
function commentPost(id) {
    // Textare unten bei Kommentaren anzeigen, dann nach Klick auf ok senden
    var _me = $("*[data-postid=\""+ id +"\"]");
    var _relevant = _me.filter(":visible");
    if (_relevant.length > 1) {
        // Tja, da haben wir ein Problem - auf welchen Post sollen wir gehen?
        showAjaxDialog("Ein Fehler ist aufgetreten", "Bitte wende dich an einen Administrator (Seite Fehler und Bugs)!");
    }
	
	
    // Kommentarbereich suchen
    var commentSection = $(".item_comments", _relevant);
    // Nur die Posts aktivieren, die noch nicht kommentiert werden
    if (commentSection.has(".kommentar_create").length > 0)
        return;
    // Eingabefeld erzeugen
    var textarea = $("<textarea/>").autoResize().attr("placeholder", "Gib hier dein Kommentar ein.");
    // Eingabeformular zusammensetzen und animiert zusammensetzen
    var createArea = $("<div/>").addClass("kommentar kommentar_create").append(
    // Textfeld
    textarea,
    // Senden-Button
    $("<button/>").text("Senden").click(function() {
        createArea.find(":input").attr("disabled", "disabled");
				
        // AJAX-Request senden
        jsonRequest(
        "kommentar", "comment", {
            target: id,
            comment: textarea.val()
        }, function(data) {
            // Kommentar anzeigen, wenn mitgeschickt.
            // Ansonsten neu laden
            if (data.content) {
                createArea.hide("fast", function() {
                    createArea.remove();
                });
                $(".item_comments", _me).each(function() {
                    $(data.content).hide().appendTo(this).show("fast");
                });
            } else
                window.location.reload();
        }
    );
    }),
    // Platzhalter
    "<span style='width: 1cm; display: inline-block'/>",
    // Abbrechen-Knopf
    $("<button/>").text("Abbrechen").click(function() {
        createArea.hide("fast", function() {
            createArea.remove();
        });
    })
).hide().appendTo(commentSection).show("fast");
    // Eingabefeld fokussieren
    textarea.focus();
}

/**
 * Löscht einen Post.
 */
function removeComment(id) {
    var safety = confirm('Diesen Beitrag wirklich löschen?');
    if (!safety)
        return false;
    jsonRequest(
    "post", "remove", {
        "postID" : id
    }, function (data) {
        $("*[data-postid=\""+ id +"\"").fadeOut2(300, function() {
            var newElement = $("<center><i>Der Kommentar wurde gel&ouml;scht.</i></center>").css({
                opacity: 0
            });
            $("#kommentar_"+ id).replaceWith(newElement);
            newElement.fadeIn2(300);
            setTimeout(newElement.hide, 50000, "fast", function() {
                this.remove();
            });
        });
    });
}

var timeout = null;
function search(input, reset) {
    var text = $(input).val();
	
    if ($(this).hasClass('prompted'))
        return;
	
    if (timeout)
        clearTimeout(timeout);
	
    if (text.length == 0) {
        $("#search_results").remove();
        return;
    }
	
    timeout = setTimeout(function() {
        if ($("#search_results").length == 0)
            $("<div id='search_results'></div>").appendTo(document.body);
        var results = $("#search_results").css({
            position: "absolute",
            top: "-10px",
            left: "-10px"
        });
        // results.html("<center>Suche nach \""+ text +"\" ...</center>");
        var offset = $(input).offset();
        offset.top += $(input).height() + 3;
        results.offset(offset);
		
        if (input.lastRequest && input.lastRequest == text)
            return;
		
        input.lastRequest = text;
		
        jsonRequest(
        "seite", "list", {
            "q" : text
        },
        function (data) {
            var array = data.content;
            if (array) {
                var list = $("<ul/>");
                $.each(array, function(index, elem) {
                    $("<li><a href='seite.php?id="+ elem.ID +"'>"+ elem.Name +"</a></li>").click(function() {
                        location.href = "seite.php?id="+ elem.ID;
                    }).appendTo(list);
                });
                $(results).empty();
                reset();
                list.appendTo(results);
            } else {
                results.html("<center>Keine Ergebnisse.<center>");
            }
        }
    );
    }, 250);
}

$(document).ready(function() {
    // .ao_link macht jetzt PHP
    /*
     * $('.ao_link').attr("href", function() { return $(this).text();
     * }).attr("target", "_blanc");
     */
    $('.ao_mail').attr("href", function() {
        // TODO: Von AO-Account Mail senden??? Wäre nice...
        return "mailto:"+ $(this).text();
    });
    $('.ao_date').click(function() {
        var matcher = /([012]?[0-9]|3[01]) *\. *([0]?[1-9]|1[012]) *\. *([12][0-9]{3}|[0-9]{2})?((?: +um| +von)? +([01]?[0-9]|2[0-3])(?: *: *([0-5][0-9]))?(?: *Uhr| *h)?)?/;
        var result = matcher.exec($(this).text());
        if (result) {
            var tag = result[1];
            var monat = result[2];
            var jahr = result[3] ? result[3] : (new Date()).getFullYear();
            var uhrzeit = result[4] !== undefined;
            var stunde = uhrzeit ? result[5] : undefined;
            var minute = uhrzeit ? result[6] : undefined;
            if (stunde !== undefined && minute === undefined)
                minute = 0;
            var displayMinute = minute;
            if (displayMinute < 10)
                displayMinute = "0"+ displayMinute;
			
            var dialog = showMessageDialog("Tagesübersicht", "");
            dialog.showLoadingIndicator();
            // Dialog anzeigen mit Tagesübersicht.
            jsonRequest("kalender", "tag", {
                "tag" : tag,
                "monat" : monat,
                "jahr" : jahr
            }, function (data) {
                dialog.hideLoadingIndicator();
                dialog.setContent(data.content.HTML);
                var createA = $("<a/>").attr("href", "#").click(function() {
                    addTermin(tag, monat, jahr, stunde, minute);
                    return false;
                }).text(
                "Erstelle einen Termin am "+ tag +"."+ monat +"."+ jahr
                    + (uhrzeit ? " um "+ stunde +":"+ displayMinute +" Uhr" : "")
            );
                var createP = $("<p/>").append(createA);
                $(dialog.contentElement).append(createP);
            }, function() {
                dialog.hide();
            });
        } else {
            alert("Diese Datum war falsch formattiert!");
        }
        return false;
    });
});

// #### Dialog-Methoden ####

var CANCEL_BUTTON = -1;
var SUBMIT_BUTTON = 0;
var id = 0;

function Dialog() {
    this.prepare = function() {
        var dialog = this;
        this.prepared = true;
		
        this.element = document.createElement('div');
        this.element.className = 'modal_dialog invisible';
        this.element.id = this.id;
        this.element.object = this;
        $(this.element).closeOnEsc(this);
        document.body.appendChild(this.element);
		
        this.closeElement = document.createElement('a');
        this.closeElement.onclick = function() {
            if (dialog.hide(true) && dialog.onclose)
                dialog.onclose(dialog);
        };
        this.closeElement.className = 'modal_closer';
        this.closeElement.innerHTML = 'x';
        //        this.element.appendChild(this.closeElement);
			
        this.contentElement = document.createElement('div');
        this.contentElement.className = 'modal_dialog_content';
        if (this.content)
            this.setContent(this.content);
        this.element.appendChild(this.contentElement);
		
        this.modalBlocker = document.createElement('div');
        this.modalBlocker.id = this.element.id + "_blocker";
        this.modalBlocker.className = 'modal_blocker invisible';
        this.modalBlocker.onclick = this.closeElement.onclick;
        if ($("#main"))
            $("#main").append(this.modalBlocker);
        else
            $(document.body).append(this.modalBlocker);
    };
    this.show = function () {
        var dialog = this;
			
        if (!this.prepared)
            this.prepare();
        $(this.element).css({
            top: (150 + $(window).scrollTop()) +"px"
        });
        this.visible = true;
        $(this.element).fadeIn2(500);
        $('.modal_input', this.element).focus();
        $(this.modalBlocker).fadeIn2(500);
    };
    this.unprepare = function() {
        this.element = null;
        this.closeElement = null;
        this.contentElement = null;
        this.modalBlocker = null;
        this.prepared = false;
    };
    this.hide = function(dontForce) {
        if (!this.visible)
            return true;
        if (this.loadingIndicatorVisible && dontForce && this.blocking) {
            this.shake();
            return false;
        }
        this.visible = false;
        $(this.element).fadeOut2(500, function () {
            $(this).remove();
        });
        $(this.modalBlocker).fadeOut2(500, function () {
            $(this).remove();
        });
        this.unprepare();
        return true;
    };
    this.setContent = function(html) {
        this.content = html;
        if (this.prepared) {
            if (typeof(html) === "string")
                $(this.contentElement).html(html);
            else
                $(this.contentElement).empty().append(html);
        }
    };
    this.showLoadingIndicator = function(message, blocking) {
        if (!message)
            message = "Laden...";
        var loadingDiv = $("<div class='modal_loading invisible'>"+ message +"</div>");
        $(this.element).append(loadingDiv).addClass("waiting");
        loadingDiv.fadeIn(500);
        this.loadingIndicatorVisible = true;
        if (blocking)
            this.blocking = blocking;
    }
    this.hideLoadingIndicator = function() {
        delete this.loadingIndicatorVisible;
        delete this.blocking;
        $(this.element).removeClass("waiting");
        $(".modal_loading", this.element).fadeOut(500, function() {
            $(this).remove();
        });
    }
    this.shake = function() {
        var element = $(this.element);
        element.animate2({
            top: (150 + $(window).scrollTop()) +"px",
            "margin-left": "-160px"
        }, 100, function() {
            element.animate2({
                "margin-left": "-140px"
            }, 100, function() {
                element.animate2({
                    "margin-left": "-150px"
                }, 100);
            });
        });
    }
    this.setWidth = function(width, animated) {
        var newValues = {
            "width": width +"px",
            "margin-left": -width / 2 +"px"
        };
        if (animated)
            $(this.element).animate2(newValues, 300);
        else
            $(this.element).css(newValues);
    }
    this.id = "modal_dialog_"+ ++id;
}

function showMessageDialog(titel, text, onclose) {
    return showHTMLMessageDialog("<h3>"+ titel +"</h3>"+ text, onclose);
}

function showHTMLMessageDialog(html, onclose) {
    var dialog = new Dialog();
    dialog.setContent(html);
    if (onclose) {
        dialog.onclose = function(dialog, result) {
            onclose(dialog);
        };
    }
    dialog.show();
    return dialog;
}

function showInputDialog(titel, aufforderung, prompt, onsubmit, onabort, hilfe) {
    if (onabort && !$.isFunction(onabort)) {
        hilfe = onabort;
        onabort = null;
    }
    var dialog = new Dialog();
    dialog.onclose = function() {
        if (onabort)
            onabort(dialog);
    };
    dialog.prepare();
    var content = $(dialog.contentElement);
    // Elemente erzeugen
    var form = $("<form/>").append("<h3>"+ titel +"</h3>").append(aufforderung).appendTo(content);
    $("<form/>").css("z-index","5");
    form.submit(function() {
        dialog.input = $(".modal_input", dialog.element).val();
		
        if (!onsubmit)
            dialog.hide();
        else if (!onsubmit(dialog))
            dialog.hide();
        return false;
    });
    var animationDuration = 300;
    if (isIOS())
        animationDuration = 0;
    // Textfeld
    var textarea = $("<textarea/>").addClass("modal_input").prompt(prompt).keydown(function(event) {
        if (event.keyCode == 27)
            $(dialog.closeElement).click();
    }).appendTo(form);
    // OK
    var okButton = $("<input type='submit' value='OK' class='modal_input_button modal_input_submit'/>").appendTo(form);
    // Abbrechen
    $("<input type='button' value='Abbrechen' class='modal_input_button'/>").click(function () {
        $(dialog.closeElement).click();
    }).appendTo(form);
    if (hilfe) {
        $("<a href='#'>Hilfe</a>").click(function() {
            showHilfeDialog(hilfe);
            return false;
        }).appendTo(form);
    }
    dialog.show();
    textarea.focus().autoResize({
        animateDuration: animationDuration
    });
    return dialog;
}

function submitUploadForm(form, dialog) {
    // Wir müssen dafür sorgen, dass das Formular nicht
    // über den .serialize-Mechanismus abgeschickt wird
    form.unbind('submit');
    // wenn der iframe neu geladen wird, ist das formular angekommen, meldung
    // dann anzeigen
    $("iframe#upload_target").load(function() {
        // Dieser Bereich muss überarbeitet werden: Die Fehlerbehandlung sollte
        // trotz dem
        // iFrame-Workaround normal durchgeführt werden, also json.fehler und
        // json.nachricht, ...
        dialog.hide();
        json = eval("(" + $(this).contents().text() + ")");
        if (!json.fehler) {
            showMessageDialog("Die Aktion war erfolgreich", json.content);
            if (json.reload)
                window.location.reload();
        } else {
            showMessageDialog("Es ist ein Fehler aufgetreten", json.nachricht );
        }
    });
    // Jetzt schicken wir es (zusammen mit der Datei) ab.
    form.submit();
	
    // und löschen es, damit es nicht nochmal abgeschickt wird.
    // form.remove();
	
    dialog.showLoadingIndicator("Hochladen...", true);
    return "interrupt";
}

function showAjaxDialog(options) {
    // Dialog erzeugen
    var dialog = new Dialog();
    dialog.show();
    dialog.showLoadingIndicator();
	
    options = $.extend({
        script: "dialog", // AJAX-Skript
        action: "load", // AJAX-Aktion
        data: null, // Daten für den Ajax-Request (Parameter)
        close: null, // Callback, wenn der Dialog geschlossen wird
        load: null, // Callback, wenn der Inhalt geladen ist
        form: false, // Wird ein Formular gezeigt?
        submit: null, // Callback, bevor das Formular gesendet wird
        success: null, // Callback, wenn die Formular-Antwort positiv war
        reload: false, // Für default-success-Callback: Seite neu laden oder
        // nicht?
        formEntries: null // Bereits feststehende Formulardaten
    }, options);
	
    // Wenn der Dialog geschlossen wird, Callback aufrufen
    dialog.onclose = function(dialog) {
        if (options.close) {
            options.close(dialog);
        }
    };
	
    // Inhalt per Ajax abfragen
    jsonRequest(options.script, options.action, options.data, function(data) {
        dialog.hideLoadingIndicator();
        var content = null;
        if (options.load)
            content = options.load(data, dialog);
        if (!content)
            content = data.content;
		
        // Formular vorbereiten
        if (options.form) {
            dialog.setContent(content);
            var form = $("form", dialog.contentElement);
            if (form.length == 0) {
                dialog.hide();
                showMessageDialog("Fehlerhafte Antwort", "Der Server hat eine ungültige Antwort zurückgegeben.");
                return;
            }
			
            // Bereits eingetragene Inhalte
            if (options.formEntries) {
                $.each(options.formEntries, function(name, value) {
                    $("input[name=\""+ name +"\"]", form).each(function() {
                        var me = $(this);
                        // Übergeordnete Zeile finden
                        var form = me.closest("form").append("<input type='hidden' name='"+ name +"' value='"+ value +"'/>");
                        var tr = me.closest("tr").remove();
                        if (tr.length == 0)
                            me.remove();
                    });
                });
            }
            // Dialog-Einstellungen
            // Breite des Dialogs
            var width = form.attr("data-aowidth");
            if (width > 0)
                dialog.setWidth(width, true);
			
            // Besondere Input-Inhalte
            // Chooser entdecken (für Seiten- & Profil-Auswahl)
            if ($.fn.chooser)
                $("input[chooser]", form).chooser();
            // Placeholder
            $("input[placeholder],textarea[placeholder]", form).prompt();
            // Autoresize textareas
            var animationDuration = 300;
            if (isIOS())
                animationDuration = 0;
            $("textarea", form).each(function(index, element) {
                var $element = $(element);
                if ($element.hasClass("nicEdit") && !isIOS()) {
                    new nicEditor({
                        buttonList : ['bold','italic','underline','left','center','right','justify','ol','ul','fontSize','fontFamily','indent','outdent','link','unlink','forecolor'],
                        iconsPath : 'pics/nicEditorIcons.gif'
                    }).panelInstance(element);
                } else
                    $element.autoResize({
                        animateDuration: animationDuration
                    });
            });
            // Erstes Text-Element fokussieren
            $(":text:first", form).focus();
            // Styles für modale Input-Elemente aktivieren
            $("input[type=\"text\"], textarea", form).addClass('modal_input');
			
            // Buttons
            var buttonContainer = $("<div/>").addClass("modal_button_container").appendTo(form);
            // OK-Button
            var okButton = $("<input type='submit' value='OK' class='modal_input_button modal_input_submit'/>").appendTo(buttonContainer);
            buttonContainer.append("&nbsp;&nbsp;&nbsp;");
            // Abbrechen-Button
            $("<input type='button' value='Abbrechen' class='modal_input_button'/>").click(function () {
                $(dialog.closeElement).click();
            }).appendTo(buttonContainer);
			
            // Hilfe zum Dialog
            var hilfe = form.attr("aoHilfe");
            if (hilfe) {
                // Hilfe-Link, wenn Hilfe möglicherweise vorhanden ist
                form.append($("<p></p>").css("text-align", "center").append($("<a href=\"#\">Hilfe</a>").click(function() {
                    showHilfeDialog(hilfe);
                    return false;
                })));
            }
			
            // Wenn das Formular abgeschickt werden soll
            form.submit(function(event) {
                // Test, ob das Formular korrekt ausgefüllt wurde
                var valid = $("input", this).aoValid(function(element, grund, first) {
                    // Wird ausgeführt, wenn ein Element falsch ausgefüllt wurde
                    if (first) {
                        element.focus();
                        dialog.shake();
                    }
                    // Es wird ein Popover über falschen Feldern angezeigt
                    var offset = $(element).offset();
                    var notice = $("<div/>").addClass("form_hint").html("&larr; "+ grund).css({
                        position: "absolute",
                        "z-index": 1000
                    }).offset({
                        left: offset.left + $(element).width() + 10,
                        top: offset.top - 2
                    }).appendTo(document.body);
                    setTimeout(function() {
                        notice.fadeOut(500, function() {
                            notice.remove();
                        });
                    }, 3000);
                    var label = $("label[for=\""+ element.id +"\"]").animate2({
                        color: "red"
                    }, 200);
                    setTimeout(function() {
                        label.animate2({
                            color: "black"
                        }, 500);
                    }, 3000);
                });
				
                if (!valid)
                    return false;
				
                // Es findet tatsächlich ein Submit statt => Submit-Callback
                if (options.submit) {
                    submit_return = options.submit(form, dialog, event);
                } else {
                    submit_return = null;
                }
                
                if (submit_return != "interrupt") {
                    dialog.showLoadingIndicator("L&auml;dt...", true);
                    // Formular abschicken
                    jsonRequestWithOptions({
                        data: $(":input", this).serializeObject(),
                        callback: function (data) {
                            // Erfolgreich
                            dialog.hide();
                            if (options.success) {
                                if (options.reload || data.reload && options.success(data, dialog))
                                    window.location.reload();
                            } else {
                                showMessageDialog("Aktion erfolgreich", data.content, function (dialog) {
                                    // Callback, wenn der Erfolgreich-Dialog
                                    // geschlossen wurde
                                    if (options.reload || data.reload)
                                        window.location.reload();
                                });
                            }
                        },
                        errorCallback: function (data) {
                            // Nicht erfolgreich - der Benutzer kann es mit
                            // Hilfe der Fehlermeldung erneut versuchen
                            dialog.hideLoadingIndicator();
                            return true;
                        },
                        progressCallback: function (progress) {
                            console.log(progress);
                        }
                    });
                    // Default-Aktion durch den Browser verhindern - Formular
                    // wurde bereits abgeschickt
                    return false;
                }
            });
        } else {
            // Simpler Fall: Einfach den Inhalt anzeigen
            dialog.setContent(content);
        }
    });
    return dialog;
}

/**
 * Zeigt einen Formular-Dialog an, der das Formular mit dem Namen Name anzeigt.
 * 
 * @param string
 *            name Der Name des Formulars
 * @param object
 *            preEntries Werte-Paare, die anstelle der jeweiligen input-Elemente
 *            bereits eingesetzt werden (optional)
 * @param function
 *            onsubmit Wird aufgerufen, bevor das Formular abgeschickt wird
 *            (optional)
 * @param function
 *            onclose Wird aufgerufen, wenn der Dialog geschlossen wird
 *            (optional)
 * @param function
 *            onload Wird aufgerufen, wenn das Formular geladen wurde (optional)
 * @returns Dialog Den erzeugten Dialog
 */
function showAjaxFormDialog(name, preEntries, onsubmit, onclose, onload, reload) {
    return showAjaxDialog({
        script: "dialog", // AJAX-Skript
        action: "load", // AJAX-Aktion
        data: {
            name: name
        }, // Daten für den Ajax-Request (Parameter)
        close: onclose, // Callback, wenn der Dialog geschlossen wird
        load: onload, // Callback, wenn der Inhalt geladen ist
        form: true, // Wird ein Formular gezeigt?
        submit: onsubmit, // Callback, bevor das Formular gesendet wird
        formEntries: preEntries, // Bereits feststehende Formulardaten
        reload: reload
    });
}

function showHilfeDialog(sourceName) {
    var dialog = new Dialog();
    dialog.show();
    dialog.showLoadingIndicator();
    jsonRequest(
    "dialog", "hilfe", {
        "name" : sourceName
    }, function (data) {
        dialog.hideLoadingIndicator();
        var content = data.content;
        dialog.setContent(content);
        var width = $(dialog.contentElement).children().first().attr("data-aowidth");
        if (width)
            dialog.setWidth(width, true);
        $(dialog.contentElement).append($("<p></p>").css("text-align", "center").append($("<a href=\"#\">Schließen</a>").click(function() {
            dialog.hide();
            return false;
        })));
    }, function (data) {
        dialog.hide();
    }
);
    return dialog;
}

function showConfirmDialog(title, message, onresult, yesButtonName, cancelButtonName) {
    var html = "<h3>"+ title +"</h3>"+ message;
    var dialog = new Dialog();
    dialog.prepare();
    dialog.setContent(html);
    if (onresult)
        dialog.onclose = function(dialog) {
            onresult(false);
        };
    var buttonContainer = $("<div/>").addClass("modal_button_container").appendTo(dialog.contentElement);
    // OK-Button
    var okButton = $("<input type='submit' value='OK' class='modal_input_button modal_input_submit'/>").appendTo(buttonContainer).click(function() {
        dialog.hide();
        onresult(true);
    });
    buttonContainer.append("&nbsp;&nbsp;&nbsp;");
    // Abbrechen-Button
    $("<input type='button' value='Abbrechen' class='modal_input_button'/>").click(function () {
        $(dialog.closeElement).click();
    }).appendTo(buttonContainer);
    dialog.show();
    return dialog;
}

/**
 * Dropdown-Popover über dem Header
 */
function Dropdown(e) {
    this.targetElement = $(e);
    this.prepare = function() {
        var me = this;
		
        this.element = $("<div class='modal_dropdown invisible'></div>").attr("id", this.id).closeOnEsc(this);
        this.element[0].object = this;
		
        this.contentElement = $("<div class='modal_dropdown_content'></div>");
        if (this.content)
            this.contentElement.html(this.content);
        this.element.append(this.contentElement);
        
        this.overlayElement = $("<div class='modal_dropdown_overlay invisible'></div>").html(this.targetElement.html())
        .click(function() {
            me.hide(true);
        }).css("width", this.targetElement.width() +"px");
		
        this.modalBlocker = $("<div class='modal_blocker invisible'></div>").attr("id", this.element.attr("id") + "_blocker")
        .click(function() {
            me.hide(true);
        });
        $(document.body).append(this.modalBlocker);
        
        // Inhalt als letztes, damit Dropdown vor Blocker
        $(document.body).append(this.element);
        $(document.body).append(this.overlayElement);
		
        this.prepared = true;
    };
    this.show = function () {
        var dialog = this;
		
        if (!this.prepared)
            this.prepare();
        var left = $(this.targetElement).offset().left +"px";
        $(this.element).css({
            left: left
        });
        $(this.overlayElement).css({
            left: left
        });
        this.visible = true;
        this.element.fadeIn2(500);
        $('.modal_input', this.element).focus();
        this.modalBlocker.fadeIn2(500);
        this.overlayElement.fadeIn2(500);
    };
    this.unprepare = function() {
        if (this.prepared) {
            this.hide();
            this.prepared = false;
            this.element.remove();
            this.element = null;
            this.modalBlocker.remove();
            this.contentElement = null;
            this.overlayElement.remove();
            this.overlayElement = null;
            this.modalBlocker = null;
        }
    };
    this.hide = function(dontForce) {
        if (!this.visible)
            return true;
        if (this.loadingIndicatorVisible && dontForce && this.blocking) {
            this.shake();
            return false;
        }
        this.visible = false;
        this.element.fadeOut2(500);
        this.modalBlocker.fadeOut2(500);
        this.overlayElement.fadeOut2(500);
        // this.unprepare(); // Cache for later use
        return true;
    };
    this.setContent = function(html) {
        this.content = html;
        if (this.prepared)
            $(this.contentElement).html(html);
    };
    this.showLoadingIndicator = function(message, blocking) {
        if (!message)
            message = "Laden...";
        var loadingDiv = $("<div class='modal_loading invisible'>"+ message +"</div>");
        $(this.element).append(loadingDiv);
        loadingDiv.fadeIn(500);
        this.loadingIndicatorVisible = true;
        if (blocking)
            this.blocking = blocking;
    }
    this.hideLoadingIndicator = function() {
        delete this.loadingIndicatorVisible;
        delete this.blocking;
        $(".modal_loading", this.element).fadeOut(500, function() {
            $(this).remove();
        });
    }
    this.shake = function() {
        var element = $(this.element);
        element.animate2({
            top: (150 + $(window).scrollTop()) +"px",
            "margin-left": "10px"
        }, 100, function() {
            element.animate2({
                "margin-left": "-10px"
            }, 100, function() {
                element.animate2({
                    "margin-left": "0"
                }, 100);
            });
        });
    }
    this.setWidth = function(width, animated) {
        var newValues = {
            "width": width +"px",
        };
        if (animated)
            $(this.element).animate2(newValues, 300);
        else
            $(this.element).css(newValues);
    }
    this.id = "modal_dropdown_"+ ++id;
}

function showDropdown(element, title, content) {
    var dropdown = new Dropdown(element);
    dropdown.setContent("<h3>"+ title +"</h3>"+ content);
    dropdown.show();
    return dropdown;
}

var kalenderDropdown = null
function showKalenderDropdown() {
    if (kalenderDropdown == null) {
        kalenderDropdown = new Dropdown($('#kalender_link'));
        kalenderDropdown.show();
        kalenderDropdown.showLoadingIndicator();
        jsonRequest(
        "kalender", "dropdown", {
        }, function(data) {
            if (data.content) {
                kalenderDropdown.setContent(data.content);
                kalenderDropdown.hideLoadingIndicator();
                $(kalenderDropdown.contentElement).unreadInfo();
            }
        });
    } else
        kalenderDropdown.show();
}

var netzContent = null;
var currentNetzCount = -1;
var currentKalenderCount = -1;
function updateNetzDropdown() {
    if ($("#netz_link").length == 0)
        return;
	
    jsonRequest("netz", "dropdown", {
    }, function(data) {
        if (data.content) {
            netzContent = data.content.html;
			
            if (netzDropdown) {
                netzDropdown.setContent(netzContent);
                netzDropdown.hideLoadingIndicator();
                $(netzDropdown.contentElement).unreadInfo();
            }
			
            var netzCountElem = $("#netz_link .hochrot");
            var newNetzCount = data.content.count;
            currentNetzCount = newNetzCount;
            if (newNetzCount <= 0) {
                netzCountElem.hide();
            } else {
                netzCountElem.show();
                netzCountElem.text(newNetzCount +"");
            }
			
            var kalenderCountElem = $("#kalender_link .hochrot");
            var newKalenderCount = data.content.cal_count;
            currentKalenderCount = newKalenderCount;
            if (newKalenderCount <= 0) {
                kalenderCountElem.hide();
            } else {
                kalenderCountElem.show();
                kalenderCountElem.text(newKalenderCount +"");
            }
        }
    });
}
$(updateNetzDropdown);

var netzDropdown = null
function showNetzDropdown() {
    if (netzDropdown == null) {
        netzDropdown = new Dropdown($('#netz_link'));
        netzDropdown.show();
        netzDropdown.setContent(netzContent);
        $(netzDropdown.contentElement).unreadInfo();
    } else
        netzDropdown.show();
}

var postfachDropdown = null
function showPostfachDropdown() {
    if (postfachDropdown == null) {
        postfachDropdown = new Dropdown($('#postfach_link'));
        postfachDropdown.show();
        postfachDropdown.showLoadingIndicator();
        jsonRequest(
        "postfach", "dropdown", {
        }, function(data) {
            if (data.content) {
                postfachDropdown.setContent(data.content);
                postfachDropdown.hideLoadingIndicator();
                $(postfachDropdown.contentElement).unreadInfo();
            }
        });
    } else
        postfachDropdown.show();
}

/** * Chooser-API */
(function($) {
    var i = 0;
    var PROFIL = 0;
    var PROFILE = 1;
    var SEITE = 2;
    var SEITEN = 3;
    var NICHTPROFILE = 4;
    $.fn.chooser = function(callback) {
        return $.each(this, function() {
            var me = $(this);
            var type = me.attr("chooser");
            var multiple = false;
            switch(type) {
                case "profil":
                    type = PROFIL;
                    break;
                case "profile":
                    type = PROFILE;
                    multiple = true;
                    break;
                case "seite":
                    type = SEITE;
                    break;
                case "seiten":
                    type = SEITEN;
                    multiple = true;
                    break;
                case "nur_seite":
                    type = NICHTPROFILE;
                    multiple = false;
                    break;
                case "nur_seiten":
                    type = NICHTPROFILE;
                    multiple = true;
                    break;
                default:
                    console.log("Unbekannter Chooser-Typ: "+ type);
                    return;
            }
            
            var wrapper = $("<div id='chooser"+ i +"' class='ao_chooser'/>");
            me.wrap(wrapper);
            var list = null;
            // wrapper von oben laesst sich nicht weiter verwenden... jQuery
            // Bug?
            wrapper = $("#chooser"+ i);
            if (multiple)
                me[0].chooser_selection_multiple = "multiple";
			
            var url = null;
            if (type == PROFIL || type == PROFILE)
                url = 'ajax.php?script=profil&action=list';
            else
                url = 'ajax.php?script=seite&action=list&profile=ja';

            if (type == NICHTPROFILE)
                url = 'ajax.php?script=seite&action=list&profile=nein';
           
            me.autocomplete({
                url: url,
                onItemSelect: function(item) {
                    if (!me[0].chooser_selection)
                        me[0].chooser_selection = [];
                    me[0].chooser_selection.push(item);

                    var newElem = document.createTextNode(item.data.name);
                    var remElem = $("<a/>").text("X").click(function() {
                        me[0].chooser_selection = remove(me[0].chooser_selection, item);
                        spaElem.remove();
                        me.css({
                            display: "inline-block"
                        }).focus();
                    });
                    var spaElem = $("<span/>").addClass("ao_chosen").append(newElem).append(" ").append(remElem);
                    spaElem.insertBefore(me);
                    me.val("");
					
                    if (!multiple) {
                        // Textfeld verstecken bei Einzelauswahl.
                        me.css({
                            display: "none"
                        }).val("").keyup();
                    }
                    
                    if (callback) {
                    	callback(me[0].chooser_selection);
                    }
                },
                maxItemsToShow: 8,
                ulCallback: function($ul) {
                    $ul.addClass('seitenListe');
                },
                sortFunction: function(a, b, filter) {
                    a = String(a.data.name).toLowerCase();
                    b = String(b.data.name).toLowerCase();
                    if (a > b) {
                        return 1;
                    }
                    if (a < b) {
                        return -1;
                    }
                    return 0;
                },
                displayValue: function(value, data) {
                    return data.name;
                }
            });
            i++;
        });
    };
    $.fn.getChoosenOnes = function(param) {
        if (this.length == 0)
            return null;
        if (this[0].chooser_selection_multiple) {
            if (!param)
                return this[0].chooser_selection;
            else
                return $.map(this[0].chooser_selection, function(a, b) {
                    return a.data[param];
                });
        } else if (this[0].chooser_selection) {
            if (!param)
                return this[0].chooser_selection[0];
            else
                return $.map(this[0].chooser_selection, function(a, b) {
                    return a.data[param];
                })[0];
        } else
            return null;
    };
})(jQuery);

function remove(array, arrayElement) {
    for (var i = 0; i < array.length; i++) {
        if (array[i] == arrayElement)
            array.splice(i, 1);
    }
    return array;
}

function editInfo(infoID) {
    showAjaxDialog({
        script: "information", // AJAX-Skript
        action: "edit form", // AJAX-Aktion
        data: {
            id: infoID
        }, // Daten für den Ajax-Request (Parameter)
        close: null, // Callback, wenn der Dialog geschlossen wird
        load: null, // Callback, wenn der Inhalt geladen ist
        form: true, // Wird ein Formular gezeigt?
        submit: null, // Callback, bevor das Formular gesendet wird
        formEntries: null // Bereits feststehende Formulardaten
    });
}

// ### Termin-API ###
function addTermin(tag, monat, jahr, stunde, minute, formEntries) {
    if ($.isPlainObject(tag))
        formEntries = tag, tag = undefined;
    if ($.isPlainObject(monat))
        formEntries = monat, monat = undefined;
    if ($.isPlainObject(jahr))
        formEntries = jahr, jahr = undefined;
    if ($.isPlainObject(stunde))
        formEntries = stunde, stunde = undefined;
    if ($.isPlainObject(minute))
        formEntries = minute, minute = undefined;
    showAjaxFormDialog("Termin", formEntries, null, null, function(dialog) {
        var heute = new Date();
        var extra = "";
        if (!tag)
            tag = heute.getDate();
        if (!monat)
            monat = heute.getMonth() + 1;
        if (!jahr)
            jahr = heute.getFullYear();
        if (stunde !== undefined && minute !== undefined) {
            if (stunde < 10)
                stunde = "0"+ stunde;
            if (minute < 10)
                minute = "0"+ minute;
            extra = " "+ stunde +":"+ minute;
        }
		
        if (jahr < 50) // Bis 2049 21. Jhd annehmen
            jahr += 2000
        else if (jahr < 100) // Ab 1950 20. Jhd annehmen
            jahr += 1900
		
        if (tag < 10)
            tag = "0"+ tag;
        if (monat < 10)
            monat = "0"+ monat;
		
        setTimeout(function() {
            $("input[name=\"beginn\"], input[name=\"ende\"]", dialog.element).val(tag +"."+ monat +"."+ jahr + extra).keyup();
        }, 0);
    });
}

function showTerminDetail(id) {
    if (id == -1) {
        // TODO Nicht schön...
        showMessageDialog("Geburtstag", "Das ist ein Geburtstag.");
        return;
    }
    showAjaxDialog({
        script: "termin",
        action: "info",
        data: {
            "terminID": id
        },
        load: function(data, dialog) {
            return "<h3>"+ data.content.Name +"</h3>"+ data.content.HTML;
        }
    });
}

function answerTermin(id, antwort, event, shortAnswer) {
    jsonRequest("termin", "answer", {
        "terminID" : id,
        "answer": antwort,
        "short": shortAnswer ? "true" : "false"
    }, function(data) {
        if (data.content) {
            if (event && event.target)
                $(event.target).parent().html(data.content);
            else
                showMessageDialog("Deine Antwort:", data.content);
        }
    });
}

function answerSeite(id, antwort, event, shortAnswer) {
    var container = null;
    if (event && event.target)
        container = $(event.target).parent().html("<i>Lädt...</i>");
	
    jsonRequest("mitgliedschaft", antwort ? "create" : "remove", {
        seitenID : id,
        typ : 0
    }, function(data) {
        if (data.content) {
            var answer = null;
            if (shortAnswer) {
                if (antwort)
                    answer = "angenommen";
                else
                    answer = "abgelehnt";
            } else {
                if (antwort)
                    answer = "Du hast die Anfrage angenommen und bist jetzt Mitglied der Seite.";
                else
                    answer = "Du hast die Anfrage abgelehnt.";
            }
            if (container) {
                container.html(answer);
            } else {
                showMessageDialog("Deine Antwort:", answer);
            }
        }
    });
}

/**
 * Seite umbenennen.
 */
function renameSeite() {
    showAjaxFormDialog('Seite_Umbenennen');
}

/**
 * Seite löschen.
 */
function deleteSeite() {
    showAjaxFormDialog('Seite_Loeschen');
}

/**
 * Seite verschieben.
 */
function moveSeite() {
    showAjaxFormDialog('Seite_Verschieben');
}

/**
 * Seiten-Sicherheit ändern
 */
function changeSeitenSicherheit(id) {
    if (!id)
        id = 0;
    showAjaxFormDialog('Sicherheit',{
        "seitenID": id
    },null,null,null,true);
}

/**
 * Nachricht versenden. Es kann bereits ein oder mehrere Empfänger via id
 * übergeben werden.
 * 
 * @param id
 *            Array oder String oder Integer: Empfänger-Liste
 */
function sendMessage(id) {
    showAjaxFormDialog('Konversation', {
        "empfaenger": id
    });
}

/**
 * Mitglied der Seite werden. ~> Muss das wirklich ein Formular sein?
 */
function becomeMember(id) {
    showAjaxFormDialog('Mitglied', {
        "seitenID": id
    });
}

/**
 * Mitgliedschaft der Seite löschen.
 */
function cancelMembership(id, event) {
    showAjaxFormDialog('Mitglied_Stop', {
        "seitenID": id
    });
}

/**
 * Mitglieder einladen
 */
function inviteMembers(id) {
    showAjaxFormDialog('Mitglied_Einladen', {
        "seitenID": id
    });
}

/**
 * Jemanden zum Admin der Seite machen
 */
function makeAdmin(id) {
    showAjaxFormDialog('Mitglied_Admin', {
        "seitenID": id
    });
}

/**
 * Mitgliedschaft anfragen
 */
function membershipRequest(id) {
    showAjaxFormDialog('Mitglied_Anfrage', {
        "seitenID": id
    });

}

/**
 * Anfragen beantworten
 */
function answerMembershipRequest(id) {
    showAjaxDialog({
        script: "mitgliedschaftsanfrage", // AJAX-Skript
        action: "form", // AJAX-Aktion
        data: {
            "id": id
        }, // Daten für den Ajax-Request (Parameter)
        close: null,
        load: function(data, dialog) {
            return data.content;
        },
        form: true, // Wird ein Formular gezeigt?
        submit: null, // Callback, bevor das Formular gesendet wird
        formEntries: {
            "seitenID": id
        } // Bereits feststehende Formulardaten
    });
}

function showSeiteWizard(superID) {
    showAjaxFormDialog("Create_Wizard", null, function(form, dialog, event) {
        event.preventDefault();
		
        var data = $(":input", form).serializeObject();
        var type = data.type;
        var preEntries = null;
        if (superID)
            preEntries = {superID: superID};
        if (type == 'Dokument') {
            if (superID)
                location.href = "dokument.php?action=create&superID="+ superID;
            else
                type = "DokumentStart";
        }
        showAjaxFormDialog(type, preEntries);
		
        dialog.hide();
        return "interrupt";
    });
}

/**
 * Seite für eine andere Seite freigeben
 */
function authorizePage(id) {
    showAjaxFormDialog('Mitglied_Freigabe', {
        "seitenID": id
    });
}

/**
 * Admins dürfen Besitz an Seite löschen
 * 
 * Sinn: Nach dem Erstellen von Seiten die zur AO-Grundstruktur gehören die
 * Mitgliedschaft löschen, da man die Seite gar nicht für sich erstellt hat
 */
function unlinkBesitzer(id) {
    showAjaxFormDialog('Mitglied_Stop', {
        "seitenID": id
    });
} 

function showStatistik() {
    showAjaxDialog({
        script: "statistik",
        action: "stats",
        load: function(data, dialog) {
            dialog.setWidth(400, true);
            return "<h3>Statistiken</h3>"+ data.content;
        }
    });
}

function loadMore(target) {
    var $link = $(target);
    var $parent = $link.parent().text("Lädt weitere Beiträge...");
    var $pw = $(".pinnwand");
    jsonRequest("pinnwand", "load", {
        offset: currentCount,
        count: 10
    }, function(data) {
        if (data.content) {
            $pw.append("<div class='divider'/>").append(data.content);
            $parent.text("").append($link);
        } else {
            $parent.text("Keine weiteren Beiträge vorhanden.");
            setTimeout(function() {
                $parent.fadeOut2(500)
            }, 2500);
        }
    });
    currentCount += 10;
}

function editTermin(target) {
    showAjaxDialog({
        script: "termin", // AJAX-Skript
        action: "edit form", // AJAX-Aktion
        data: {
            id: target
        }, // Daten für den Ajax-Request (Parameter)
        close: null, // Callback, wenn der Dialog geschlossen wird
        load: null, // Callback, wenn der Inhalt geladen ist
        form: true, // Wird ein Formular gezeigt?
        submit: null, // Callback, bevor das Formular gesendet wird
        formEntries: null // Bereits feststehende Formulardaten
    });
}

/**
 * Setzt alle Seiten des Netzes auf gelesen
 */
function setNetzGelesen(noMessage) {
    jsonRequest('netz', 'allegelesen', null, function(data) {
    	if (!noMessage) {
            showMessageDialog('Netz', data.content, function (dialog) {
                window.location.reload();
            }); 
    	} else {
            window.location.reload();
    	}
    }, function (data) {
        showMessageDialog('Fehler', 'Es ist ein Fehler aufgetreten beim Ändern der Gelesen-Status.');
    });
}

/**
 * Zeigt eine Form zum ändern des Mitglieder-Status an
 */
 
/**
 * Anfragen beantworten
 */
function changeMembershipStatus(id) {
    showAjaxDialog({
        script: "mitgliedschaft", // AJAX-Skript
        action: "status_aendern_form", // AJAX-Aktion
        data: {
            "id": id
        }, // Daten für den Ajax-Request (Parameter)
        close: null,
        load: function(data, dialog) {
            return data.content;
        },
        form: true, // Wird ein Formular gezeigt?
        submit: null, // Callback, bevor das Formular gesendet wird
        formEntries: {
            "seitenID": id
        } // Bereits feststehende Formulardaten
    });

}

/**
 * Zoom.
 * 
 * @param boolean
 *            Zoom oder nicht?
 * @returns nothing
 */
function setZoomed(value) {
    if (value)
        $(document.body).addClass('zoomed')
    else
        $(document.body).removeClass('zoomed')
}

var _currentZoom = "off"
function toggleZoom() {
    $(document.body).toggleClass('zoomed')
    hashProps.set("zoom", _currentZoom == "on" ? "off" : "on")
}

$(function() {
    // Zoom
    if (hashProps.get("zoom") == "on")
        setZoomed(true)
    else
        setZoomed(false)
	
    hashProps.setListener("zoom", function(newValue) {
        if (newValue == "on")
            setZoomed(true)
        else
            setZoomed(false)
    })
})

function printElement(element) {
    if (!$.fn.printElement) {
        showMessageDialog("Ein Fehler ist aufgetreten",
        "Es kann nicht gedruckt werden, da der dazu benötigte AO-Code nicht geladen wurde.")
        return false
    }
    $(element).printElement()
    return false
}

function submitForm(form, options, dialog) {
    // Test, ob das Formular korrekt ausgefüllt wurde
    var valid = $("input", this).aoValid(function(element, grund, first) {
        // Wird ausgeführt, wenn ein Element falsch ausgefüllt wurde
        if (first) {
            element.focus();
            if (dialog)
            	dialog.shake();
        }
        // Es wird ein Popover über falschen Feldern angezeigt
        var offset = $(element).offset();
        var notice = $("<div/>").addClass("form_hint").html("&larr; "+ grund).css({
            position: "absolute",
            "z-index": 1000
        }).offset({
            left: offset.left + $(element).width() + 10,
            top: offset.top - 2
        }).appendTo(document.body);
        setTimeout(function() {
            notice.fadeOut(500, function() {
                notice.remove();
            });
        }, 3000);
        var label = $("label[for=\""+ element.id +"\"]").animate2({
            color: "red"
        }, 200);
        setTimeout(function() {
            label.animate2({
                color: "black"
            }, 500);
        }, 3000);
    });
	
    if (!valid)
        return false;
	
    // Es findet tatsächlich ein Submit statt => Submit-Callback
    if (options && options.submit) {
        submit_return = options.submit(form, dialog);
    } else {
        submit_return = null;
    }
    
    if (submit_return != "interrupt") {
    	if (dialog)
            dialog.showLoadingIndicator("L&auml;dt...", true);
    	var data = $(":input", form).serializeObject();
    	
    	if (options && options.disable)
            $(":input", form).attr("disabled", "disabled").addClass('submitForm_Disabled');
    	
        // Formular abschicken
        jsonRequestWithOptions({
            data: data,
            callback: function (data) {
            	if (options && options.disable)
                    $(".submitForm_Disabled", form).removeAttr("disabled").removeClass('submitForm_Disabled');
            	
                // Erfolgreich
                if (dialog)
                    dialog.hide();
                if (options && options.success) {
                    if ((options && options.success(data, dialog)) || (options && options.reload) && data.reload)
                        window.location.reload();
                } else {
                    showMessageDialog("Aktion erfolgreich", data.content, function (dialog) {
                        // Callback, wenn der Erfolgreich-Dialog geschlossen
                        // wurde
                        if ((options && options.reload) || data.reload)
                            window.location.reload();
                    });
                }
            },
            errorCallback: function (data) {
                // Nicht erfolgreich - der Benutzer kann es mit Hilfe der
                // Fehlermeldung erneut versuchen
                if (dialog)
                    dialog.hideLoadingIndicator();
                return true;
            },
            progressCallback: function (progress) {
                console.log(progress);
            }
        });
        // Default-Aktion durch den Browser verhindern - Formular wurde bereits
        // abgeschickt
        return false;
    }
}


/**
 * UMFRAGEN
 */

/**
 * Voting-AJAX
 * 
 * @param optionID
 * @param checked
 */
function umfrageAnswer(optionID, checked, element) {
    var antwortElement = $(element).closest('.antwort');
    var countElement = $(element).closest('tr').find('.option_answer_count');
    if (checked) {
        jsonRequest('umfrage', 'answer', {'option': optionID});
        antwortElement.removeClass('nein').addClass('ja');
        countElement.text(parseInt(countElement.text()) + 1);
    } else {
        jsonRequest('umfrage', 'unanswer', {'option':optionID});
        antwortElement.removeClass('ja').addClass('nein');
        countElement.text(parseInt(countElement.text()) - 1);
    }
}

function umfrageEinstellung(umfrage,param,value,confirm) {
    if (confirm) {
        showConfirmDialog("Umfrage bearbeiten", "Durch diese Änderung werden alle Antworten der Umfrage gelöscht! Wirklich ändern?",
        function () {
            jsonRequest("umfrage", "einstellung", {'umfrage':umfrage,'param':param,'value':value});
        },
        "Ja", "Nein");
    } else {
        jsonRequest("umfrage", "einstellung", {'umfrage':umfrage,'param':param,'value':value});
    }
}

/**
 * Ungelesen-Information
 */
(function($) {
    $.fn.unreadInfo = function() {
        this.find(".unread_info").mouseenter(function() {
            var $this = $(this);
            if ($this.data("overlay_shown"))
                return;
			
            if (!$this.data("overlay")) {
                var changes = $this.attr("data-changes");
				
                var position = $this.offset();
                var overlay = $("<div/>").append("<div>Im Netz als gelesen markieren<div class='unread_info_overlay_divider'/>"+ changes +"</div>").addClass("unread_info_overlay").css({
                    top: (position.top + $this.outerHeight() + 5) +"px",
                    left: (position.left - 5) +"px"
                }).appendTo("body");
                $this.data("overlay", overlay);
            }
            $this.data("overlay").show();
            $this.data("overlay_shown", true);
        }).mouseleave(function() {
            var $this = $(this);
            if ($this.data("overlay_shown") && $this.data("overlay")) {
                $this.data("overlay").hide();
                $this.data("overlay_shown", false);
            }
        }).click(function() {
            var $this = $(this);
            var seite = $this.attr("data-id");
            $this.data("overlay").hide().remove();
            $this.data("overlay", null);
            $this.data("overlay_shown", null);
			
            jsonRequest("seite", "setRead", {
                seitenID: seite
            }, function(data) {
                $(".unread_info[data-id="+ seite +"]").remove();
                var netzCountElem = $("#netz_link .hochrot");
                var newNetzCount = parseInt(netzCountElem.text()) - 1;
                if (newNetzCount <= 0) {
                    netzCountElem.remove();
                } else {
                    netzCountElem.text(newNetzCount +"");
                }
            }, function(data) {
                $this.replaceWith("<span>!</span>");
            });
        });
        return this;
    }
})(jQuery);
$(function() {
    $('body').unreadInfo();
});

/**
 * Lädt ein Bild-Array per AJAX und zeigt die Bilder an.
 */
var bilderShowCache = {};

function showLazyBilderShow(showID, bildID, publicShow) {
    if (bilderShowCache[showID]) {
        bilderShowCache[showID].show();
        bilderShowCache[showID].goToBildWithID(bildID);
        return;
    }
    var dialog = new Dialog();
    dialog.show();
    dialog.showLoadingIndicator("Lädt...");
    jsonRequest("bild", "loadShowData", {
        publicShow: publicShow ? true : false,
        showID: showID
    }, function(data) {
        dialog.hideLoadingIndicator();
        bilderShowCache[showID] = new BilderShow(dialog, data.content.titel, data.content.bilder, bildID);
    });
}

/**
 * Zeigt einen Dialog mit einer Bilder-Show an.
 * 
 * @param bilder
 */
function BilderShow(dialog, titel, bilder, bildID) {
    var _me = this;
    if (bilder.length == 0) {
        showMessageDialog("Es wurden keine Bilder gefunden, die angezeigt werden könnten.");
    }
    var topElement = $("<div/>").append("<h3>"+ titel +"</h3>");
    var containerElement = $("<div/>").attr("id", "bilder_show");
    topElement.append(containerElement);
	
    // Zu einem Bild springen
    this.currentIndex = -1;
    this.goToBildWithIndex = function(index) {
        if (index >= bilder.length)
            index = 0;
        else if (index < 0)
            index = bilder.length - 1;
        
        // Als angeschaut zählen
        var postID = bilder[index].id;
        jsonRequest("bild", "count_view", {"id": postID});
		
        // Aktuellen Zustand speichern - so werden Kommentare
        // auch beim nächsten Anzeigen wieder angezeigt
        if (this.currentIndex >= 0 && !containerElement.is(":empty")) {
            bilder[this.currentIndex].html = containerElement.first().html();
        }
		
        // Element vorbereiten
        var bildElement = $(bilder[index].html);
        $(".image_actions > a.image_prev", bildElement).click(function() {
            _me.goToBildWithIndex(index - 1);
            return false;
        });
        $(".image_actions > .image_index", bildElement).text("Bild "+ (index + 1) +" von "+ bilder.length);
        $(".image_actions > a.image_next", bildElement).click(function() {
            _me.goToBildWithIndex(index + 1);
            return false;
        });
        $(".full_picture", bildElement).enableForImageTagging(bilder[index].id);
        containerElement.empty().append(bildElement);
        this.currentIndex = index;
    }
    // Zu einem Bild mit angegebener ID springen
    this.goToBildWithID = function(id) {
        var ok = false;
        $.each(bilder, function(index, element) {
            // Wenn Bild gefunden, dann anzeigen
            if (element.id == id) {
                ok = true;
                _me.goToBildWithIndex(index);
                return false;
            }
        });
        if (!ok)
            this.goToBildWithIndex(0);
    }
    this.show = function() {
        dialog.setContent(topElement);
        dialog.show();
        dialog.setWidth(900);
    }
	
    this.show();
    if (!bildID) {
        this.goToBildWithIndex(0);
    } else {
        this.goToBildWithID(bildID);
    }
}

/**
 * Taggen von Profilen auf Bildern.
 */
(function($) {
    $.fn.enableForImageTagging = function(id, tags) {
        var _me = this.first();
        _me.data("tags", tags);
		
        // Ein kleines Popover, das das Auswählen einer Person ermöglicht
        var $tagPopover = null;
        var tagTaker = _me.closest('.tag_taker');
        tagTaker.click(function(event) {
            // Alt-Klicks auf das Bild => Markierung
            if (!event.altKey)
                return;
			
            // Position auf der Seite bestimmen
            var x = event.pageX;
            var y = event.pageY;
            var offset = _me.offset();
            if (x - offset.left < 0 || x - offset.left > _me.width())
                return;
            if (y - offset.top < 0 || y - offset.top> _me.height())
                return;
			
            if (!$tagPopover) {
                // Popover erzeugen und positionieren
                $tagPopover = $("<div/>").css({
                    top: y +"px",
                    left: x +"px",
                }).addClass('tag_popover').hide();
				
                // Personenauswahl
                var $chooserInput = $("<input/>").attr({
                    placeholder: "Entdeckte Person",
                    type: "text",
                    name: "tagged",
                    chooser: "profil"
                }).chooser(function(selection) {
                    // Koordinaten berechnen
                    var x = (event.pageX - offset.left) / _me.width();
                    var y = (event.pageY - offset.top) / _me.height();
					
                    // Sichervorgang anzeigen
                    $tagPopover.text(selection[0].data.name +" wird makiert...").css("font-style", "italic");
					
                    // Für nächsten Tag vorbereiten
                    var $currentPopover = $tagPopover;
                    $tagPopover = null;
					
                    // Sichern
                    jsonRequest("bilderTag", "create", {
                        x: x,
                        y: y,
                        bildID: id,
                        targetProfil: selection[0].data.id
                    }, function(data) {
                        if (data.content.tags) {
                            // Falls noch oder wieder Tags sichtbar sind, verstecken
                            _me.hideBilderTags(id);
                            // Neue Tags laden und anzeigen
                            _me.data("tags", data.content.tags);
                            _me.showBilderTags(id);
                        }
                        // Popover verstecken
                        $currentPopover.hide("fast", function() {
                            $currentPopover.remove();
                        });
                    }, function(data) {
                        // Popover verstecken
                        $currentPopover.hide("fast", function() {
                            $currentPopover.remove();
                        });
                        // Fehlerdialog anzeigen
                        return true;
                    });
                }).addClass("tag_input");
				
                // OK-Button
                //				var $okButton = $("<button/>").text("OK").click(function() {
                //					$tagPopover.hide("fast", function() {
                //						$tagPopover.remove();
                //						$tagPopover = null;
                //					});
                //				});
				
                // Abbrechen-Button
                var $cancelButton = $("<button/>").text("Abbrechen").click(function() {
                    $tagPopover.hide("fast", function() {
                        $tagPopover.remove();
                        $tagPopover = null;
                    });
                });
				
                $tagPopover.append($chooserInput, /*$okButton, */ "<span> </span>", $cancelButton);
				
                $(document.body).append($tagPopover);
                $tagPopover.show("fast");
            } else {
                $tagPopover.animate2({
                    top: y +"px",
                    left: x +"px",
                });
            }
            $chooserInput.focus();
        });
        tagTaker.mouseenter(function() {
            tagTaker.showBilderTags(id);
        })
        tagTaker.mouseleave(function() {
            tagTaker.hideBilderTags(id);
        });
		
        return this;
    }
    $.fn.showBilderTags = function(bildID) {
        // Alle Bilder durchgehen, für die Tags angezeigt werden sollen
        this.each(function() {
            var _me = $(this);
            var img = _me.find('img:first');
            var tags = _me.find('*[data-tags]:first').data("tags");
			
            // Nur Bilder mit Tags behandeln
            if (!tags)
                return;
			
            // x- und y-Position des Bilds
            var offset = img.position();
            var xBild = offset.left;
            var yBild = offset.top;
            var bildWidth = img.width();
            var bildHeight = img.height();
			
            // Alle Tags durchgehen und anzeigen
            $.each(tags, function() {
                var tag = this;
				
                // Koordinaten berechnen
                var x = xBild + bildWidth * tag.x;
                var y = yBild + bildHeight * tag.y;
				
                // Wir erzeugen eine große Box, die zentriert über den Tag
                // gelegt wird. Dadrin können wir einfach positionieren
                var box = $("<div/>").addClass("tag_box").attr("data-tag-for", bildID);
                box.css({
                    top: y,
                    left: x - 150
                });
				
                var tag = $("<span/>").addClass("tag").text(tag.name);
				
                box.append("<img src='pics/Tag_Triangle.png'/>", tag);
                _me.append(box);
            });
        });
		
        return this;
    }
    $.fn.hideBilderTags = function(bildID) {
        $("*[data-tag-for=\""+ bildID +"\"]").remove();
    }
})(jQuery);

// Mobile toggle
function showMobileAktionen() {
    $("#sidebar_right").hide();
    $(".sidemenu").toggle();
}
function showMobileSeitenbaum() {
    $(".sidemenu").hide();
    $("#sidebar_right").toggle();
}

// Email senden

function sendUserMail() {
    var form = $("#emailSchreiben");
    var empfaenger = document.getElementsByName("empfaenger")[0].value;
    var betreff = document.getElementsByName("betreff")[0].value;
    var emailmessage = document.getElementsByName("emailmessage")[0].value;
    var absenderSelect = document.getElementsByName("absender")[0];
    
    for (i=0;i<absenderSelect.options.length;i++) {
        if (absenderSelect.options[i].selected == true) {
            var absenderID = absenderSelect.options[i].value;
            break;
        }         
    }
           
    jsonRequest("email", "schreiben", {"empfaenger": empfaenger,"absender":absenderID,"betreff":betreff,"emailmessage":emailmessage},function (data) {
            showMessageDialog("Aktion erfolgreich",data.content,function () {window.location.reload();}); 
        }, function(data) { showMessageDialog("Fehler","Email wurde nicht versandt. "+data.fehler)});
      
    }
    
    


