﻿(function () {

    MooTools.lang.setLanguage("da-DK");
    Date.defineParser('%d([-./]%m([-./]%Y((T| )%X)?)?)?');

    var createNowElement = function (data) {
        element = new Element('li', { 'class': data.type, 'id': data.id });
        if (data.type == 'playlist' && data.postDate < new Date(new Date() - 600000)) {
            element.addClass('playlistOld');
        }
        var pTag = new Element('p', { 'html': data.text });
        var timeElement = new Element('span', {
            'title': 'Nyt ' + data.type + '-indhold modtaget ' + data.postDate.format('kl. %H.%M d. %D. %B %Y')
			, 'class': 'metainfo'
			, 'text': ' // ' + data.postDate.format('%H.%M')
        });
        timeElement.inject(pTag, 'bottom');
        pTag.inject(element, 'bottom');
        return element;
    }
    var nowPlayingHandlers = {};
    //nowPlayingHandlers["epg"] = function(data) { return new Element('li'); }
    nowPlayingHandlers["playlist"] = function (data, msg) {
        data.id = msg.getElementsByTagName("element")[0].getAttribute('id');
        var payload = msg.getElementsByTagName('payload')[0];
        data.text = '<span class="title">' + gettext(payload.getElementsByTagName("title")[0]) + '</span> af <span class="artist">' + gettext(payload.getElementsByTagName('artist')[0]) + '</span>';
        return data;
    }
    nowPlayingHandlers["twitter"] = function (data, msg) {
        data.id = msg.getElementsByTagName("element")[0].getAttribute('id');
        var payload = msg.getElementsByTagName('payload')[0];
        var statusid = msg.getElementsByTagName('tweet')[0].getAttribute('id');
        var tags = $A(msg.getElementsByTagName("tag"));
        var name = tags.filter(function (item) { return gettext(item).contains('twitter:alt_name'); })[0];
        var from = gettext(msg.getElementsByTagName("from")[0]);
        var text = gettext(payload.getElementsByTagName("text")[0]);
        name = name || from;
        name = name.replace("twitter:alt_name:", "");
        var url = tags.filter(function (item) { return gettext(item).contains('twitter:alt_url') })[0];
        url = url || "http://www.twitter.com/" + from;
        url.replace("twitter:alt_url:", "");
        text = text.replace(/(^|[^'">])((ftp|http|https):\/\/(\S+))(\b|$)/gi, "$1<a href='$2'>$2</a>");
        data.text = '<a href="' + url + '">' + name + '</a>: ' + text;
        return data;
    }
    nowPlayingHandlers["facebook"] = function (data, msg) {
        data.id = msg.getElementsByTagName("element")[0].getAttribute('id');
        var payload = msg.getElementsByTagName('payload')[0];
        data.text = "<strong>" + gettext(payload.getElementsByTagName("author")[0]) + ':</strong> <a href="' + gettext(payload.getElementsByTagName("link")[0]) + '" target="_blank">' + gettext(payload.getElementsByTagName("content")[0]) + '</a>';
        return data;
    }

    var gettext = function (element) {
        var text = element.text;
        if (text === undefined) { text = element.get('text'); }
        return text;
    };

    var stripEntities = function (text) {
        text = text.replace(/(&.+?;)/gi, '')
        text = text.replace(/[(&æøå)]/gi, '')
        return text;
    };

    var usedNowIDs = $A([]);

    var addItem = function (container, data) {
        var element = $(data.id);
        if (element == undefined
		&& !usedNowIDs.contains(data.id)
		&& !$$('.livefeed li p').some(function (item) {
		    var newText = stripEntities(data.text).toLowerCase().replace(/"/gi, '');
		    var oldHtml = stripEntities(item.get('html')).toLowerCase().replace(/"/gi, '');
		    return oldHtml.contains(newText) && item.getElement('.metainfo').get('text') == ' // ' + data.postDate.format('%H.%M');
		})) {

            usedNowIDs.push(data.id);
            element = createNowElement(data);
            element.inject(container.getElement('ol'), 'top');
            element.addClass('new');
            if (element.hasClass('playlist') && !element.hasClass('playlistOld')) {
                element.addClass('first');
            }
        }
    };

    var checkList = function (element) {
        var container = element;
        var list = container.getElement('ol');
        var hasFirstPlaylist = false;
        list.getElements('li').each(function (el) {
            if (el.getCoordinates(container).bottom > container.getStyle('height').toInt()) {
                el.addClass('old');
            }
            if (el.hasClass('playlist')) {
                if (el.hasClass('first') && !el.hasClass('new') && hasFirstPlaylist) {
                    el.removeClass('first');
                } else { hasFirstPlaylist = true; }
            }
        });
    };

    var animateList = function (element) {
        var container = element;
        var oldItems = container.getElements('li.old');
        var newItems = container.getElements('li.new');
        if (newItems) {
            newItems.removeClass('new');
            newItems.each(function (el) { el.slide('hide').slide('in'); });
        }
        if (oldItems) {
            oldItems.each(function (el) { el.nix(true); });
        }
    };

    var p3nowMsgHandler = function (element) {
        return function (msg) {
            var id = msg.getAttribute('id');
            if (id == null) { return; }
            var type = gettext(msg.getElementsByTagName('type')[0]);
            var postDate = Date.parse(gettext(msg.getElementsByTagName('date')[0]));
            var data = { id: id, type: type, text: "", postDate: postDate };
            if (data.postDate < (new Date(new Date() - 80 * 1000 * 60)) && type == 'playlist') {
                return;
            }
            addItem(element, nowPlayingHandlers[type](data, msg));
            checkList(element);
            animateList(element);
        };
    }

    var setItem = function (data) {
        var element = $('p3epg');
        element.set('href', data.url);
        element.set('title', "Lige nu på P3: " + data.title);
        var prog = (data.name || "") == "http://" ? "noProg" : data.name;
        element.set('class', "badge " + prog);
        element.set('html', '<span>' + data.title + '</span>');
    };

    var prependIfNotFound = function (text, obj) {
        if (obj.indexOf(text) != 0) {
            return text + obj;
        }
        return obj;
    };

    var p3epgMsgHandler = function (msg) {
        var title = gettext(msg.getElementsByTagName('title')[0]);
        var url = prependIfNotFound("http://", gettext(msg.getElementsByTagName('link')[0])).toLowerCase();
        var name = url.replace("http://www.dr.dk/p3/programmer/", "");
        name = name.replace("http://www.dr.dk/p3/temaer/", "");
        var data = { title: title, name: name, url: url };
        setItem(data);
    };


    window.addEvent('domready', function () {
        //*
        pubsub = null;
        pubsub = new Pubsub('chatol');

        pubsub.addEvent('connected', function () {
            pubsub.subscribe(LIVE_FEED_NODE, p3nowMsgHandler($$('.livefeed')[0]));
            pubsub.subscribe('/p3/epg', p3epgMsgHandler);
        });
        pubsub.connect();
        //*/
    });
})();

