$(document).ready( function() {
    
    // Der Haupt-Container bekommt seine Maße
    $('#rssbox').css('width', widthO + wPixPer);
    if (wPixPer == '%') {
        $('#rssbox').css('margin-left', (100-widthO)/2 + '%');
    } else {
        $('#rssbox').css('margin-left', '1px')
    }
    $('#rssbox').css('height', heightO + 'px');
    if (overTitle) {
        var heightT = 30;
    } else {
        var heightT = 0;
    }
    $('#rsstitle').css('height', heightT + 'px');

    // Bestimmung der Höhe für die einzelnen Item-Container
    var heightI = Math.floor((heightO-heightT)/quantity);
    
    // Nimmt sich die xml-Datei und erzeugt die einzelnen Items
    $.get(xmlDat, function(data) {
        var $xml = $(data);

        // Holt sich den Haupttitel des Feeds samt Link
        var toptitle = $xml.find("title").first().text();
        var toplink = $xml.find("link").first().text();

        // Fügt vor dem ersten Item leere Container ein
        for (var j = 0; j < quantity-1; j++) {
           $('#rsstop').append('<div class=\"item itemP\"></div>');
        }

        // Holt sich die Items, die an AddFeed zur Verarbeitung übergeben werden, deren Rückgabe an den Div-Container #rsstop angehängt wird
        $xml.find("item").each(function() {
            var $thisI = $(this),
                item = {
                    title: $thisI.find("title").text(),
                    link: $thisI.find("link").text(),
                    description: $thisI.find("description").text(),
                    pubDate: $thisI.find("pubDate").text()
                }
                
            $('#rsstop').append(addFeed(item));
        });
        
        // Stellt den Haupttitel dar
        if (overTitle) {
            $('#rsstitle a').text(toptitle);
            $('#rsstitle a').attr('href', toplink);
        }
        
        // Sortiert die Items absteigend nach Datum und Uhrzeit
        itemSort('#rsstop', 'div.item', '.pubDate');
        
        if (solidH) {
            // Alle Items bekommen eine feste Höhe
            $('.item').css('height', heightI - 5 + 'px');
        } else {
            // Nur die leeren Items bekommen eine feste Höhe
            $('.itemP').css('height', heightI - 5 + 'px');
        }

        // Verdeckt alle Items, die keinen Platz mehr haben; merkt sich die Position des ersten verdeckten Items 
        var heightF = 0;
        var a = [];
        var aElem = 0;
        var showC = 1;
        $('.item').each(function() {
            if (showC <= showN) {
                $(this).css('height', $(this).height()+5);
                heightF += $(this).height();
                if (heightF > (heightO-heightT)) {
                    a[aElem] = $('.item').index(this);
                    $(this).hide();
                    aElem++;
                } else if (heightF <= (heightO-heightT) && showC == $('.item').length) {
                    a[1] = -1;
                }
            } else {
                if (heightF <= (heightO-heightT)) {
                    a[1] = -1;
                }
                $(this).remove();
            }
            showC++;
        });

        // Nach speed sec wandern die Items je um eins nach oben, falls die Maus außerhalb des Containers #rsstop ist
        var auto = true;
        var fn = {
            loop: function() {
                $('#rssbox').mousemove(function() {
                    auto = false;
                });
                $('#rssbox').mouseout(function() {
                    auto = true;
                });
                if (auto) {
                    changer($('.item'), fadespeed, a, heightT);
                }
                setTimeout(fn.loop, speed);
            }
        }
        $('#rssbox').mousemove(function() {
            auto = false;
        });
        $('#rssbox').mouseout(function() {
            auto = true;
        });
        setTimeout(fn.loop, speed);

    });

});

// Gibt einem Item seine Darstellung
function addFeed(item) {
    
    // Zuweisung einer eventuellen Hintergrundklasse
    if (backG) {
        var html = '<div class=\"item '
                   + backGClass
                   +'\">';
    } else {
        var html = '<div class=\"item\">';
    }
    
    var htmlTi = '';
    var htmlDa = '';
    var htmlDe = '';
    
    // Vorbereitung der Beschreibung: Abschneidung von HTML Tags, falls diese in <description> eingefügt wurden
    var descr = item.description;
    descr = descr.replace(/<\/?[^>]+>/gi, '');
    
    // Vorbereitung der Beschreibung: Umwandlung von Anführungszeichen
    for (var brS = 0; brS <= descr.length; brS++) {
        if (descr.slice(brS, brS+1) == '\"') {
            if (descr.slice(brS+1, brS+2) == ' ' || 
                descr.slice(brS+1, brS+2) == '.' || 
                descr.slice(brS+1, brS+2) == ',' ||
                descr.slice(brS+1, brS+2) == ';' ||
                descr.slice(brS+1, brS+2) == ':') {
                descr = descr.slice(0, brS) 
                         + '“' 
                         + descr.slice(brS+1);
            } else {
                descr = descr.slice(0, brS) 
                        + '„' 
                        + descr.slice(brS+1);
            }
        }
    }
   
    // Darstellung des Titels
    var tit = item.title;
    var maxLT = strCutT;
    if (!descriptionA) {
        // Komplette Beschreibung als Attribut Title im DIV des Titels, falls die Beschreibung nicht angezeigt wird
        htmlTi += '<div class=\"title\" title=\"'
                + descr
                + '\">';
    } else {
        htmlTi += '<div class=\"title\">';
    }
    htmlTi += '<a href=\"'
            + item.link
            + '\">';
    if (tit.length >= maxLT) {
        while (tit.slice(maxLT,maxLT+1) != ' ') {
            maxLT--;
        }
        htmlTi += tit.slice(0,maxLT)
                + ' [...]'
                + '</a>'
                + '</div>';
    } else {
        htmlTi += tit
                + '</a>'
                + '</div>';
    }   
       
    // Zuweisung des unformatierten Datums für die weitere Verarbeitung
    htmlDa += '<div class=\"pubDate\">'
            + item.pubDate
            + '</div>';
    
    if (descriptionA) {
        // Komplette Beschreibung als Attribut Title im DIV der Beschreibung, falls die Beschreibung angezeigt wird
        htmlDe += '<div class=\"description\" title=\"'
                + descr
                + '\">';
        // Darstellung der Beschreibung
        var maxL = strCutD;
        if (descr.length >= maxL) {
            while (descr.slice(maxL,maxL+1) != ' ') {
                maxL--;
            }
            htmlDe += descr.slice(0,maxL)
                    + ' [...]'
                    + '</div>';
        } else {
            htmlDe += descr
                    + '</div>';
       }   
    }
    
    // Zusammenfügung
    if (dateFirst) {
        html += htmlDa + htmlTi + htmlDe + '</div>';
    } else {
        html += htmlTi + htmlDa + htmlDe + '</div>';
    }

    return html;
}

// Itemwanderfunktion (der Array a hat als 0. Element die Position des ersten verdeckten Items)
function changer(obj, fadespeed, a, heightT) {
    // Abbruch, wenn die Items den Container nicht füllen
    if (a[1] == -1) {
        return;
    }

    // Das erste Item wird zusätzlich als letztes Item angehängt
    var saver = obj.first().clone().hide();
    saver.appendTo('#rsstop');

    // Das erste Item wird ausgeblendet und für den nächsten Durchlauf gelöscht, so dass das 2. Item das neue erste sein wird
    obj.first().removeClass(backGClass).children().remove();
    obj.first().animate({height: '0px'}, fadespeed, function() {
        $(this).remove();
    });

    // Prüft, ob und für wie viele nächste Items Platz ist 
    var heightN = - obj.first().height();
    var c = 0;                                 // Zähler für die Anzahl der freien Plätze
    obj.each(function() {
        if (obj.index(this) < a[0]) {
            heightN += $(this).height();
        } else if (obj.index(this) >= a[0]) {
            $(this).show();
            heightN += $(this).height();
            $(this).hide();
            if ((heightO-heightT) >= heightN) {
                c++;
            }
        } 
    });

    // Blendet das oder die nächsten Items ein, falls c > 0
    changerSub(obj, a[0], c, c);

    // Die Position des neuen ersten verdeckten Item 
    a[0] += c - 1;
    return a;
}

// Blendet das oder die nächsten Items ein, falls num > 0
function changerSub(obj, a, num, c) {
    var heightX;
    obj.each(function() {
       if (obj.index(this) == (a + c - num) && num > 0) {
           $(this).show();
           heightX = $(this).height();
           $(this).css('height', '0px');
           $(this).animate({height: heightX + 'px'}, fadespeed/c, function() {
               num--;
               changerSub(obj, a, num, c);
           });
       }
    });
}

// Sortiert die Items absteigend nach Datum und Uhrzeit
function itemSort(itemRoot, items, sortBy) {
    var itemCollection = $(itemRoot).clone(true).find(items);
    
    // Bricht ab, wenn kein Datum existiert
    if (itemCollection.find(sortBy).text() == '') {
        return;
    }
    
    // Sortiert mit der Array-Methode sort()   
    itemCollection.sort(
        function(a, b) {
            var c = [b, a];
            return (new Date($(c[0]).find(sortBy).eq(0).text()) > new Date($(c[1]).find(sortBy).eq(0).text())) ? 1 : -1;
        }
    );
    
    // Änderung des Datumformats in der sortierten Sammlung und anschließend Ersetzung der unsortierten Items durch die sortierten
    for (var i = 0; i < itemCollection.length; ++i)
    {
        var newDateFormat = dateFormat($(itemCollection).find(sortBy).eq(i).text());
        $(itemCollection).find(sortBy).eq(i).text(newDateFormat);
        $(itemRoot + ' ' + items).eq(i).replaceWith(itemCollection[i]);
    }
}

// Dartellung des Datums im gewünschten Format
function dateFormat(data) {
    if (pubDateA) {
        // Umwandlung des Datums
        var gerMonth = ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 
                        'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'];
        var datumPre = new Date(data);
        var datum = datumPre.getDate() 
                    + '. ' 
                    + gerMonth[datumPre.getMonth()] 
                    + ' '
                    + datumPre.getFullYear();
        var zeroMin = datumPre.getMinutes();
        if (zeroMin < 10) {
            zeroMin = '0' + zeroMin;
        }
        if (dateTime) { 
            datum += ', '
                    + datumPre.getHours()
                    + ':'
                    + zeroMin
                    + ' Uhr';
        }
        return datum;
    } else {
        return '';
    }
}



