/**
* Retrieve messages from a reader and notify subscribed listeners.
* (Used by growler an GMT.de)
*
* @author Marco Baumgartl <baumgartl@boerse-go.de>
*/

var BG = BG || {};

/**
* @constructor
*/
BG.CustomerMessage = function(title, content, link, date) {
    this.title  = title;
    this.content= content;
    this.link   = link;
    this.date   = date;
};

BG.CustomerMessage.prototype.getTitle = function() {
    return this.title;
};

BG.CustomerMessage.prototype.getContent = function() {
    return this.content;
};

BG.CustomerMessage.prototype.getLink = function() { return this.link; }

BG.CustomerMessage.prototype.getDate = function() {
    return this.date;
}

/**
* @construtor
*/
BG.MessageChecker = function() {

    /**
    * @type {Array}
    */
    this.listeners  = [];

    /**
    * @type {Array}
    */
    this.messages   = [];

    /**
    * @type {BG.FeedReader}
    */
    this.reader     = null;
    this.url        = null;

    /**
    * Date of last known message.
    * @type {Date}
    */
    this.lastMsgDate= null;

    /**
    * Difference between local and server time.
    *
    * @type {number}
    */
    this.dateDiff   = null;
};

/**
* Set URL of the RSS feed.
*/
BG.MessageChecker.prototype.setUrl = function(url) {
    this.url = url;
};

/**
* Set reader for RSS feed.
*/
BG.MessageChecker.prototype.setReader = function(reader) {
    this.reader = reader;
};

/**
* Set date of last message known to the user.
*/
BG.MessageChecker.prototype.setLastMessageDate = function(value) {

    if (value instanceof Date) {
        this.lastMsgDate = value;
    } else if (!isNaN(parseInt(value, 10))) {
        this.lastMsgDate = new Date();
        this.lastMsgDate.setTime(value);
    }
};

BG.MessageChecker.prototype.setDateDiff = function(value) {
    this.dateDiff = value;
};

BG.MessageChecker.prototype.getDateDiff = function() {
    return this.dateDiff;
};

/**
* Check the news feed.
*/
BG.MessageChecker.prototype.check = function() {

    // jQuery hack
    jQuery.ajax({
        url: this.url,
        context: this,
        dataType: 'text', // 'xml' doesn't work in IE
        success: function(data, status, response) {

            var currentDate = new Date(response.getResponseHeader('Date'));

            this.reader.read(data);
            this._handleItems(this.reader.getItems());
            this.setDateDiff(currentDate.getTime() - (new Date()).getTime());
        }
    });
};

/**
* Convert items from configured reader into BG.CustomerMessage objects
* and notify listerners about new messages.
*/
BG.MessageChecker.prototype._handleItems = function(items) {

    var i = 0,
        len = 0,
        message,
        messages = [];

    for (i=0, len = items.length; i<len; ++i) {

        message = new BG.CustomerMessage(
            items[i].getTitle(),
            items[i].getContent(),
            items[i].getLink(),
            items[i].getDate()
        );

        this.messages.push(message);
    }

    if (this.lastMsgDate !== null) {
        for (i=0, len=this.messages.length; i<len; ++i) {
            if (this.messages[i].getDate() > this.lastMsgDate) {
                messages.push(this.messages[i]);
            }
        }
    } else {
        messages = this.messages;
    }

    if (messages.length > 0 && this.listeners.length > 0) {
        for (i=0, len=this.listeners.length; i<len; ++i) {
            this.listeners[i](messages);
        }
    }
};

BG.MessageChecker.prototype.addListener = function(listener) {
    if (typeof listener === 'function') {
        this.listeners.push(listener);
    }
};

/**
* Check for new message and show box to user if necessary.
*/
jQuery(document).ready(function() {

    var cookieName  = 'BGO.LastGrowlerMsgTs',
        rssReader   = new BG.RssFeedReader(new BG.XmlParser()),
        msgChecker  = new BG.MessageChecker(),
        lastMsgTs   = parseInt(bgTools.getCookie(cookieName), 10);

    msgChecker.setReader(rssReader);
    msgChecker.setUrl('/support.php');

    if (lastMsgTs !== NaN) {
        msgChecker.setLastMessageDate(lastMsgTs);
    }

    msgChecker.addListener(function(messages) {

        var msg,
            linkHtml,
            growler = jQuery('.growler:first');

        if (messages.length > 0) {
            msg = messages[0];
            linkHtml = '<a href="' + msg.getLink() + '" target="_blank">' + msg.getTitle() + '</a>';
            growler.find('p:first').html(linkHtml);
            growler.show();
        }
    });

    jQuery('.growler h6 a').click(function(e) {

        var localTimestamp = (new Date()).getTime();

        e.preventDefault();
        bgTools.setCookie(cookieName, (localTimestamp + msgChecker.getDateDiff()), 7, '/');
        jQuery('.growler').hide();
    });

    msgChecker.check();
});

