var BrowserDetect = {
    init: function () {
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
            || this.searchVersion(navigator.appVersion)
            || "an unknown version";
        this.OS = this.searchString(this.dataOS) || "an unknown OS";
    },
    searchString: function (data) {
        for (var i = 0; i < data.length; i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1) {
                    return data[i].identity;
                }
            } else if (dataProp) {
                return data[i].identity;
            }
        }
    },
    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index === -1) { return; }
        return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    },
    dataBrowser: [
        {
            string: navigator.userAgent,
            subString: "Chrome",
            identity: "Chrome"
        },
        {
            string: navigator.userAgent,
            subString: "OmniWeb",
            versionSearch: "OmniWeb/",
            identity: "OmniWeb"
        },
        {
            string: navigator.vendor,
            subString: "Apple",
            identity: "Safari",
            versionSearch: "Version"
        },
        {
            prop: window.opera,
            identity: "Opera"
        },
        {
            string: navigator.vendor,
            subString: "iCab",
            identity: "iCab"
        },
        {
            string: navigator.vendor,
            subString: "KDE",
            identity: "Konqueror"
        },
        {
            string: navigator.userAgent,
            subString: "Firefox",
            identity: "Firefox"
        },
        {
            string: navigator.vendor,
            subString: "Camino",
            identity: "Camino"
        },
        {
            string: navigator.userAgent,
            subString: "Netscape",
            identity: "Netscape"
        },
        {
            string: navigator.userAgent,
            subString: "MSIE",
            identity: "Explorer",
            versionSearch: "MSIE"
        },
        {
            string: navigator.userAgent,
            subString: "Gecko",
            identity: "Mozilla",
            versionSearch: "rv"
        },
        {
            string: navigator.userAgent,
            subString: "Mozilla",
            identity: "Netscape",
            versionSearch: "Mozilla"
        }
    ],
    dataOS : [
        {
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
        },
        {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
        },
        {
            string: navigator.userAgent,
            subString: "iPhone",
            identity: "iPhone/iPod"
        },
        {
            string: navigator.platform,
            subString: "Linux",
            identity: "Linux"
        }
    ]
};
BrowserDetect.init();
Event.observe(window, "load", function () {
    function getLoginUrlElem() {
        return $("loginurl");
    }
    function getLoginUrl() {
        return getLoginUrlElem().innerHTML;
    }
    function istEingeloggt() {
        return getLoginUrl() === "";
    }
    function punkteToString(p) {
        return String(p).replace(/\./, ",") + " Punkt" + (p == 1 ? "" : "e");
    }
var TOOLTIP_X_OFFSET = 0;
var TOOLTIP_Y_OFFSET = 0;
var pfade = {
    klotzUnbewertet:  "/software/icons/stern_leer.gif",
    klotzHellLeer:    "/software/icons/stern_standard.gif",
    klotzDunkelLeer:  "/software/icons/stern_meinewertung_standard.gif",
    klotzRotLeer:     "/software/icons/stern_rot_standard.gif",
    klotzHalb:        "/software/icons/stern_durchschnitt_halb.gif",
    klotzHellVoll:    "/software/icons/stern_durchschnitt.gif",
    klotzDunkelVoll:  "/software/icons/stern_meinewertung.gif",
    klotzRotVoll:     "/software/icons/stern_rot.gif",
    drehdings:        "/software/icons/drehdings-6666cc.gif"
};
function getByClass(elm, className) {
    return Element.getElementsByClassName(elm, className);
}
var jar = new CookieJar({
    path: "/",
    expires: 60 * 60   
});
Object.extend(jar, {
    statusCookieName: "bewertomatik",
    kodiereStatus: function (status) {
        function kodiereBewertung(b) {
            return [
                b.prgid,
                b.eigenePunktzahl,
                b.durchschnittsPunktzahl,
                b.zahlBewertungen,
                b.gewichtet
            ];
        }
        return $A(status).map(function (b) {
            return kodiereBewertung(b).join("*");
        }).join("_");
    },
    dekodiereStatus: function (statusCookie) {
        function dekodiereBewertung(array) {
            return {
                prgid: array[0],
                eigenePunktzahl: array[1],
                durchschnittsPunktzahl: array[2],
                zahlBewertungen: array[3],
                gewichtet: parseFloat(array[4])
            };
        }
        if (statusCookie === null || statusCookie === "") {
            return $A([]);
        }
        return $A(statusCookie.split("_")).map(function (b) {
            return dekodiereBewertung(b.split("*"));
        });
    },
    lade: function() {
        return this.dekodiereStatus(this.get(this.statusCookieName));
    },
    statusCookieMaxGroesse: 3900,
    speichere: function (bewertung) {
        var ohne = this.lade().findAll(function (e) {
            return e.prgid != bewertung.prgid;
        });
        ohne.push(bewertung);
        var s = this.kodiereStatus(ohne);
        while (s.length > this.statusCookieMaxGroesse) {
            ohne.shift();
            s = this.kodiereStatus(ohne);
        }
        var geklappt = this.put(this.statusCookieName, s);   
        if (! geklappt) {
            throw "Interner Fehler: Konnte Status-Cookie nicht setzen";
        }
    },
    loesche: function () {
        var geklappt = this.remove(this.statusCookieName);
        if (! geklappt) {
            throw "Interner Fehler: Konnte Status-Cookie nicht löschen";
        }
    },
    einlogCookieName: "bewertomatik-einloggen",
    setEinlogCookie: function (prgid, punktzahl) {
        var geklappt = this.put(this.einlogCookieName,
            { prgid: prgid, punktzahl: punktzahl });
        if (! geklappt) {
            throw "Interner Fehler: Konnte Einlog-Cookie nicht machen";
        }
    },
    entferneEinlogCookie: function () {
        var rv = this.get(this.einlogCookieName);
        var geklappt = this.remove(this.einlogCookieName);
        if (! geklappt) {
            throw "Interner Fehler: Konnte Einlog-Cookie nicht löschen";
        }
        return rv;
    }
});
function verarbeiteEinlogCookie() {
    var cookie = jar.entferneEinlogCookie();
    if (cookie === null) {
        return;
    }
    var prog_element = $("prgid_" + cookie.prgid);
    var scrollTarget = prog_element.up(".programmteaser");
    if (scrollTarget) {
        scrollTarget.scrollIntoView();
    }
    prog_element.js.sendeBewertung(cookie.punktzahl);
}
function verarbeiteStatusCookie() {
    if (! istEingeloggt()) {
        jar.loesche();
    }
    var bewertungen = jar.lade();
    bewertungen.each(function (b) {
        var behaelter = $("prgid_" + b.prgid);
        if (behaelter) {
            if (b.eigenePunktzahl == -1) {
                behaelter.js.selbstBewertetModusAus(
                    b.zahlBewertungen,
                    b.durchschnittsPunktzahl,
                    b.gewichtet);
            } else {
                behaelter.js.selbstBewertetModusAn(
                    b.zahlBewertungen,
                    b.durchschnittsPunktzahl,
                    b.eigenePunktzahl,
                    b.gewichtet);
            }
        }
    });
}
function KlotzDomAdapter(klotzDomObj) {
    Event.observe(window, "unload", function () { klotzDomObj = null; });
    Object.extend(this, {
        getSrc: function () { return klotzDomObj.src; },
        setSrc: function (neueSrc) { klotzDomObj.src = neueSrc; }
    });
}
var kloetze = (function () {
    function ext(zusatz) {
        return Object.extend({
            voll   : pfade.klotzDunkelVoll,
            leer   : pfade.klotzDunkelLeer,
            halb   : ""
        }, zusatz);
    }
    return {
        mouseover: ext({
            nullter: pfade.klotzDunkelLeer
        }),
        selbstBewertet: ext({
        }),
        andereBewertet: ext({
            voll: pfade.klotzHellVoll,
            leer: pfade.klotzHellLeer,
            halb: pfade.klotzHalb
        }),
        rot: ext({
            voll: pfade.klotzRotVoll,
            leer: pfade.klotzRotLeer
        }),
        unbewertet: ext({
            voll: pfade.klotzUnbewertet,
            leer: pfade.klotzUnbewertet,
            halb: pfade.klotzUnbewertet
        })
    };
})();
function Klotz(klotzDomObj, klotzBehaelterJs, punktzahl) {
    var self = this;
    var dom = new KlotzDomAdapter(klotzDomObj);
    var mouseoutSrc;
    function mouseoverHandler() {
        klotzBehaelterJs.zeigeMouseover(punktzahl);
        klotzBehaelterJs.setTooltip(punkteToString(punktzahl));
    }
    function clickHandler() {
        if (istEingeloggt()) {
            klotzBehaelterJs.sendeBewertung(punktzahl);
        } else {
            jar.setEinlogCookie(klotzBehaelterJs.getPrgid(), punktzahl);
            window.location = getLoginUrl();
        }
    }
    self.zeige = (punktzahl == 0
        ? function (kloetze) { dom.setSrc(kloetze.nullter); }
        : function (kloetze, bisPunktzahl) {
            dom.setSrc(punktzahl <= bisPunktzahl
                ? kloetze.voll
                : kloetze.leer);
            if (punktzahl == Math.floor(bisPunktzahl) + 1) {
                if (Math.floor(bisPunktzahl) != bisPunktzahl) {
                    dom.setSrc(kloetze.halb);
                }
            }
        }
    );
    Object.extend(self, {
        setBewertbar: function (bool) {
            if (bool) {
                klotzDomObj
                    .observe("mouseover", mouseoverHandler)
                    .observe("click", clickHandler)
                    .setStyle({ "cursor": "pointer" });
            } else {
                klotzDomObj
                    .stopObserving("mouseover", mouseoverHandler)
                    .stopObserving("click", clickHandler)
                    .setStyle({ "cursor": "auto" });
            }
        },
        zeigeMouseover: function (bisPunktzahl) {
            self.zeige(kloetze.mouseover, bisPunktzahl);
        },
        zeigeSelbstBewertet: function (bisPunktzahl) {
            self.zeige(kloetze.selbstBewertet, bisPunktzahl);
        },
        zeigeAndereBewertet: function (bisPunktzahl) {
            self.zeige(kloetze.andereBewertet, bisPunktzahl);
        },
        zeigeUnbewertet: function () { self.zeige(kloetze.unbewertet, 0); },
        zeigeRot: function (bisPunktzahl) {
            self.zeige(kloetze.rot, bisPunktzahl);
        },
        zeigeMouseout: function () { dom.setSrc(mouseoutSrc); },
        updateMouseoutPfad: function () { mouseoutSrc = dom.getSrc(); },
        istDunkelVoll: function () {
            return new RegExp(pfade.klotzDunkelVoll + "$").test(mouseoutSrc);
        }
    });
    self.updateMouseoutPfad();
}
function LoeschenX(klotzBehaelter) {
    var self = this;
    var her = { visibility: "visible" };
    var weg = { visibility: "hidden"  };
    var requestLaeuft = false;
    var punktzahl; 
    var x = klotzBehaelter.tipTarget.appendChild(
        _.baueLoeschenKnopf({
            css: weg,
            onmouseover: function () {
                if (requestLaeuft) { return; }
                getByClass(klotzBehaelter.dom, "loeschbar").invoke("addClassName", "loeschenHervorhebung");
                klotzBehaelter.setTooltip("Zurücknehmen");
                klotzBehaelter.kloetze.invoke("zeigeRot", punktzahl);
            },
            onmouseout: function () {
                if (requestLaeuft) { return; }
                getByClass(klotzBehaelter.dom, "loeschbar").invoke("removeClassName", "loeschenHervorhebung");
                klotzBehaelter.kloetze.invoke("zeigeMouseout");
            },
            onclick: function () {
                if (requestLaeuft) { return; }
                requestLaeuft = true;
                klotzBehaelter.sendeLoeschung();
            }
        })
    );
    function setStyle(neuerStyle) {
        function volleKloetzeZaehlen() {
            var rv = klotzBehaelter.kloetze.invoke("istDunkelVoll").inject(0,
                function (acc, bool) {
                    return acc + (bool ? 1 : 0);
                });
            return rv;
        }
        if (punktzahl === null) {
            punktzahl = volleKloetzeZaehlen();
        }
        x.setStyle(neuerStyle);
    }
    var mouseover = setStyle.bind(null, her);
    var mouseout  = setStyle.bind(null, weg);
    Object.extend(self, {
          hervorhebungWeg: function () {
            getByClass(klotzBehaelter.dom, "loeschbar").invoke(
                "removeClassName", "loeschenHervorhebung");
        },
        requestBeginnt: function () { requestLaeuft = true; },
        requestBeendet: function () { requestLaeuft = false; },
        selbstBewertetModusAn: function () {
            klotzBehaelter.dom.observe("mouseover", mouseover);
            klotzBehaelter.dom.observe("mouseout" , mouseout);
            punktzahl = null; 
        },
        selbstBewertetModusAus: function () {
            klotzBehaelter.dom.stopObserving("mouseover", mouseover);
            klotzBehaelter.dom.stopObserving("mouseout" , mouseout);
            setStyle(weg);
        }
    });
}
function KlotzBehaelter(dom) {
    var self = this;
    var bewertungsTemplate = new Template(
    	"(#{bewertungen}, <a href=\"/software/download/faq#wichtung\">gewichtet</a>: #{gewichtet})");
    Object.extend(self, {
        mouseoutHandler: function (evt) {
            var toElem = $(evt.toElement || evt.relatedTarget);
            if (toElem &&
                toElem.descendantOf &&
                toElem.descendantOf(self.tipTarget)) {
                return;
            }
            self.loeschenX.hervorhebungWeg();
            self.kloetze.invoke("zeigeMouseout");
            if (self.tooltip) {
                self.tooltip.hide();
            }
        },
        bewertbarModusAn: function () {
            self.kloetze.invoke("setBewertbar", true);
            dom.observe("mouseout", self.mouseoutHandler);
        },
        bewertbarModusAus: function () {
            self.kloetze.invoke("setBewertbar", false);
            dom.stopObserving("mouseout", self.mouseoutHandler);
            if (self.tooltip) {
                self.tooltip.hide();
            }
        },
        selbstBewertetModusAn: function (zahlBewertungen,
            durchschnittsPunktzahl, nutzerPunktzahl, gewichtet) {
            var p = self.punktzahlKonvertieren(durchschnittsPunktzahl);
            var bewertungsDaten = {
                "bewertungen": (zahlBewertungen == 1 ?
                                    "eine Bewertung" : (zahlBewertungen + " Bewertungen")),
                "gewichtet": punkteToString(gewichtet.toFixed(2))
            };
            getByClass(dom, "anzahl")[0]
            	.update("Ihre Bewertung:")
            	.addClassName("loeschbar");
            getByClass(dom, "durchschnitt")[0]
            	.update(bewertungsTemplate.evaluate(bewertungsDaten));
            self.kloetze.invoke("zeigeSelbstBewertet", nutzerPunktzahl);
            self.kloetze.invoke("updateMouseoutPfad");
            self.loeschenX.selbstBewertetModusAn();
        },
        selbstBewertetModusAus: function (zahlBewertungen,
            durchschnittsPunktzahl, gewichtet) {
            getByClass(dom, "anzahl")[0].update("Bewertung:");
            if (zahlBewertungen == 0) {
                getByClass(dom, "durchschnitt")[0].update("");
                self.kloetze.invoke("zeigeUnbewertet");
            } else {
                var bewertungsDaten = {
                    "bewertungen": (zahlBewertungen == 1 ?
                                        "eine Bewertung" : (zahlBewertungen + " Bewertungen")),
                    "gewichtet": punkteToString(gewichtet.toFixed(2))
                };
                getByClass(dom, "durchschnitt")[0]
                	.update(bewertungsTemplate.evaluate(bewertungsDaten));
                self.kloetze.invoke("zeigeAndereBewertet", durchschnittsPunktzahl);
            }
            self.kloetze.invoke("updateMouseoutPfad");
            self.loeschenX.selbstBewertetModusAus();
        },
        setTooltip: function (message) {
            if (BrowserDetect.browser === "Opera") {
                return;
            }
            self.tooltip = self.tooltip || (function f() {
                var ht = _.baue("span", { "class": "klotzTooltip" });
                self.tipTarget.appendChild(ht);
                return ht;
            })();
            self.tooltip.update(message);
            self.tooltip.show();
        },
        punktzahlKonvertieren: function (p) {
            p = Number(p);
            if (p < 1 || p > 6) {
                throw "Interner Fehler: Punktzahl " + p +
                	" ist nicht zwischen 1 und 6";
            }
            if ((p * 10) % 5 !== 0) {
                throw "Interner Fehler: Erwarte ganze oder halbe " +
                	"Punkte, nicht " + p;
            }
            return p;
        },
        zeigeMouseover: function (p) {
            self.kloetze.invoke("zeigeMouseover", self.punktzahlKonvertieren(p));
        },
        getPrgid: function () {
            var prgid = dom.id ? dom.id 
                               : dom.up(".aktionen").id;
            return prgid.slice(6);
        },
        sende: function (punktzahl, beiErfolg, beiFehler) {
            var drehdings = self.baueDrehdings();
            function beiFehlerIntern(fehlermeldung) {
                alert(fehlermeldung);
                beiFehler();
            }
            self.bewertbarModusAus();
            self.loeschenX.requestBeginnt();
            var options = {
                url:      "/software/default.shtml?quickvote=" + self.getPrgid()
											   + "&r=" + punktzahl 
											   + "&userid=" + userid 
											   + "&hash=" + hash,
                method:   'get',
                timeout:  10,
                onFinish: function () {
                    drehdings.remove();
                    self.bewertbarModusAn();
                    self.loeschenX.requestBeendet();
                    self.loeschenX.hervorhebungWeg();
                    self.kloetze.invoke("zeigeMouseout");
                },
                onTimeout: function () {
                    beiFehlerIntern(
                        "Verbindungsfehler (Server hat nicht geantwortet)");
                },
                onComplete: function (transport) {
                    if (transport.status !== 200) {
                        beiFehlerIntern(
                            "Verbindungsfehler (" +
                            transport.status +
                            " " +
                            transport.statusText +
                            ")");
                    } else if (transport.responseText.match(/^Fehler:/)) {
                        beiFehlerIntern(transport.responseText);
                    } else {
                        var antwort = transport.responseText.evalJSON();
                        beiErfolg(
                        	antwort.bewertungen,
                        	antwort.punktzahl,
                        	antwort.gewichtet
                        );
                    }
                }
            };
            new Ajax.TimedRequest(options);
        },
        sendeBewertung: function (nutzerPunktzahl) {
            self.sende(nutzerPunktzahl,
                function (zahlBewertungenJetzt, durchschnittsPunktzahlJetzt, gewichtetJetzt) {
                    self.selbstBewertetModusAn(
                        zahlBewertungenJetzt,
                        durchschnittsPunktzahlJetzt,
                        nutzerPunktzahl,
                        gewichtetJetzt
                    );
                    jar.speichere({
                        prgid: self.getPrgid(),
                        eigenePunktzahl: nutzerPunktzahl,
                        durchschnittsPunktzahl: durchschnittsPunktzahlJetzt,
                        zahlBewertungen: zahlBewertungenJetzt,
                        gewichtet: gewichtetJetzt
                    });
                },
                function () { self.kloetze.invoke("zeigeMouseout"); }
            );
        },
        sendeLoeschung: function () {
            self.sende(
                -1,   
                function (zahlBewertungenJetzt, durchschnittsPunktzahlJetzt, gewichtetJetzt) {
                    self.selbstBewertetModusAus(
                        zahlBewertungenJetzt,
                        durchschnittsPunktzahlJetzt,
                        gewichtetJetzt
                    );
                    jar.speichere({
                        prgid: self.getPrgid(),
                        eigenePunktzahl: -1,   
                        durchschnittsPunktzahl: durchschnittsPunktzahlJetzt,
                        zahlBewertungen: zahlBewertungenJetzt,
                        gewichtet: gewichtetJetzt
                    });
                },
                function () {  }
            );
        },
        baueDrehdings: function() {
            var drehdings = _.baue("img", {
                "class": "drehdings",
                "src": pfade.drehdings
            });
            dom.appendChild(drehdings);
            return drehdings;
        }
    });
    self.dom = dom; 
    dom.js = self;
    Event.observe(window, "unload", function () {
        dom.js = null;
        dom = null;
    });
    self.tipTarget = _.baue("span", { "class": "sterne" });
    self.kloetze = $A(dom.getElementsBySelector("span.bewertung img").map(
        function (klotz, index) {
            if (index === 0) {
                klotz.parentNode.insertBefore(self.tipTarget, klotz);
            }
            klotz.remove();
            self.tipTarget.appendChild(klotz);
            return new Klotz(klotz, self, index + 1);
        })
    );
    self.loeschenX = new LoeschenX(self);
    var firstBewertungsElement = dom.getElementsBySelector("span.bewertung img")[0];
    if (firstBewertungsElement.src.endsWith(pfade.klotzDunkelVoll)) {
        self.loeschenX.selbstBewertetModusAn();
    }
    self.bewertbarModusAn();
}
function hintergrundfarbeHer(element) {
    function istTransparent(color) {
        if (color === "transparent") {
            return true;
        }
        var m = color.match(/rgba\(([0-9\s]*,){3}(.*)\)/);
        if (m && (Number(m[2]) === 0)) {
            return true;
        }
        return false;
    }
    var rv;
    if (document.defaultView && document.defaultView.getComputedStyle) {
        rv = document.defaultView.getComputedStyle(element, null).
            getPropertyValue("background-color");
    } else {
        rv = element.currentStyle.backgroundColor;
    }
    if (istTransparent(rv) && element !== document.documentElement) {
        return hintergrundfarbeHer(element.parentNode);
    }
    return rv;
}
function farbeParsen(str) {
    var html401Colors = {
        black:  "#000000", green:  "#008000", silver:  "#C0C0C0",
        lime:   "#00FF00", gray:   "#808080", olive:   "#808000",
        white:  "#FFFFFF", yellow: "#FFFF00", maroon:  "#800000",
        navy:   "#000080", red:    "#FF0000", blue:    "#0000FF",
        purple: "#800080", teal:   "#008080", fuchsia: "#FF00FF",
        aqua:   "#00FFFF"
    };
    if (html401Colors[str.toLowerCase()]) {
        return html401Colors[str.toLowerCase()];
    }
    return str;
}
Ajax.TimedRequest = function (options) {
    options.timeout = options.timeout || 20;
    if (options.onTimeout) {
        var xhr;
        var oldOnCreate   = options.onCreate   || function () {};
        var oldOnComplete = options.onComplete || function () {};
        options.onCreate = function (transport) {
            xhr = transport;
            oldOnCreate(transport);
        };
        var suppressOnComplete = false;
        var watchdog = setTimeout(function () {
            suppressOnComplete = true;
            xhr.abort();
            options.onFinish(xhr);
            options.onTimeout(xhr);
        }, options.timeout * 1000); 
        options.onComplete = function (transport) {
            if (suppressOnComplete) {
                return; 
            }
            clearTimeout(watchdog);
            options.onFinish(xhr);
            oldOnComplete(transport);
        };
    }
    return new Ajax.Request(options.url, options);
};
function init() {
    $$(".aktionen").each(function (kb) { var klotzB = new KlotzBehaelter(kb); });
    verarbeiteEinlogCookie();
    verarbeiteStatusCookie();
}
if (getLoginUrlElem()) {
    init();
}
});
var ThemenBox = Class.create();
ThemenBox.prototype = {
    initialize : function (themenBox) {
        this.themenBoxElement = $(themenBox);
        this.CLASSNAME_SEITENZAHL       = "seitenzahl";
        this.CLASSNAME_SEITENZAHL_AKTIV = "aktiv";
        this.CLASSNAME_TEASER_DA        = "teaser_da";
        this.CLASSNAME_TEASER_WEG       = "teaser_weg";
    },
    init : function () {
        if (!this.themenBoxElement) {
            return;
        }
        this.createControlElements();
        this.initControlElements();
        this.teaser            = this.themenBoxElement.getElementsBySelector(".ateaser");
        this.seitenzahlen      = this.themenBoxElement.getElementsBySelector(".seitenzahl li");
        this.currentContent    = this.themenBoxElement.down(".teaser_da");
        this.currentSeitenzahl = this.themenBoxElement.down(".seitenzahl .aktiv").up("li");
        this.intervalID = 0;
        this.rotationStopped = false;   
        this.activateAutoRotate();
    },
    log : function () {
    },
    switchTeaser: function (nextContent, nextSeitenzahl) {
        this.currentContent.removeClassName(this.CLASSNAME_TEASER_DA);
        this.currentContent.addClassName(this.CLASSNAME_TEASER_WEG);
        nextContent.removeClassName(this.CLASSNAME_TEASER_WEG);
        nextContent.addClassName(this.CLASSNAME_TEASER_DA);
        this.currentSeitenzahl.firstDescendant().removeClassName(this.CLASSNAME_SEITENZAHL_AKTIV);
        nextSeitenzahl.firstDescendant().addClassName(this.CLASSNAME_SEITENZAHL_AKTIV);
        this.currentContent = nextContent;
        this.currentSeitenzahl = nextSeitenzahl;
    },
    rotate : function (forward) {
        this.rotationStopped = true;    
        this.deactivateAutoRotate();
        this.rotate_internal(forward);
    },
    rotate_internal : function (forward) {
        var nextContent    = null;
        var nextSeitenzahl = null;
        if (forward) {
            nextContent = this.currentContent.next(".teaser_weg");
            if (!nextContent) {
                nextContent = this.teaser.first();
            }
            nextSeitenzahl = this.currentSeitenzahl.next("li");
            if (!nextSeitenzahl) {
                nextSeitenzahl = this.seitenzahlen.first();
            }
        } else {
            nextContent = this.currentContent.previous(".teaser_weg");
            if (!nextContent) {
                nextContent = this.teaser.last();
            }
            nextSeitenzahl = this.currentSeitenzahl.previous("li");
            if (!nextSeitenzahl) {
                nextSeitenzahl = this.seitenzahlen.last();
            }
        }
        this.switchTeaser(nextContent, nextSeitenzahl);
    },
    switchToTeaser : function (event) {
        this.rotationStopped = true;    
        this.deactivateAutoRotate();
        var index = Event.element(event).innerHTML;
        var nextContent    = this.teaser[index - 1];
        var nextSeitenzahl = this.seitenzahlen[index - 1];
        this.switchTeaser(nextContent, nextSeitenzahl);
    },
    deactivateAutoRotate : function () {
        if (this.intervalID > 0) {
            window.clearInterval(this.intervalID);
            this.intervalID = 0;
        }
    },
    activateAutoRotate : function () {
        if( (!this.rotationStopped) && (this.intervalID == 0) ) {
            var boundRotate = this.rotate_internal.bindAsEventListener(this);
            this.intervalID = window.setInterval(function() { boundRotate(true); }, 5000);
        }
    },
    createControlElements : function () {
        var alleTeaser = this.themenBoxElement.getElementsBySelector(".teaser_weg, .teaser_da");
        var teaserCount = alleTeaser.size();
        alleTeaser.each(function (element) { element.addClassName("ateaser"); });
        var seitenzahlenHTML = '<ul class="seitenzahl"></ul>';
        var insertion = new Insertion.Top(this.themenBoxElement, seitenzahlenHTML);
        seitenzahlenHTML = '<li><a href="javascript:void(0)">';
        seitenzahlenHTML += $A($R(1, teaserCount)).join('</a></li><li><a href="javascript:void(0)">');
        seitenzahlenHTML += "</a></li>";
        insertion = new Insertion.Top(this.themenBoxElement.down(".seitenzahl"), seitenzahlenHTML);
        this.themenBoxElement.down(".seitenzahl a").addClassName("aktiv");
        var zurueckHTML = '<img width="30" height="30" alt="Zur&uuml;ck bl&auml;ttern" src="/software/icons/startseite_zurueck.gif"/>';
        insertion = new Insertion.Top(this.themenBoxElement.down(".zurueck a"), zurueckHTML);
        var vorHTML = '<img width="30" height="30" alt="Vorw&auml;rts bl&auml;ttern" src="/software/icons/startseite_vor.gif"/>';
        insertion = new Insertion.Top(this.themenBoxElement.down(".vor a"), vorHTML);
        // mehr-Link
        var mehrHTML = '<a href="'+this.themenBoxElement.down("h2 a").href+'" rel="nofollow" id="special_teaser_mehr">weitere&hellip;</a>';
        insertion = new Insertion.Top(this.themenBoxElement, mehrHTML);
    },
    initControlElements : function () {
        this.themenBoxElement.down(".vor a")    .href = "javascript:void(0);";
        this.themenBoxElement.down(".zurueck a").href = "javascript:void(0);";
        this.themenBoxElement.down(".vor a")    .observe("click", this.rotate.bind(this, true) );
        this.themenBoxElement.down(".zurueck a").observe("click", this.rotate.bind(this, false) );
        var switchToTeaser = this.switchToTeaser.bindAsEventListener(this);
        this.themenBoxElement.getElementsBySelector(".seitenzahl a").each( function (element) {
            element.observe("click", switchToTeaser);
        });
    }
};
Event.observe(window, "load", function () {
    var themenBox = new ThemenBox($("themen_box"));
    themenBox.init();
    Event.observe("themen_box", "mouseover", themenBox.deactivateAutoRotate.bind(themenBox));
    Event.observe("themen_box", "mouseout", themenBox.activateAutoRotate.bind(themenBox));
});
