/*
 * jQuery Movreak User Review
 * - Live updating Movreak User Review plugin for jQuery
 *
 * Copyright (c) 2010 Andri Yadi
 * Adapted from original code by Inge Jørgensen (elektronaut.no)
 * Licensed under the MIT license (MIT-LICENSE.txt)
 *
 * $Date: 2010/07/18$
 */

/*
 * Usage example:
 * $("#twitterSearch").movreakReview('bacon', {limit: 10, rate: 15000});
 */

(function ($) {
    if (!$.fn.reverse) {
        $.fn.reverse = function () {
            return this.pushStack(this.get().reverse(), arguments);
        };
    }
    $.fn.movreakReview = function (query, options, callback) {
        var domNode = this;
        $(this).each(function () {
            var settings = {};

            // Handle changing of options
            if (this.twitter) {
                settings = jQuery.extend(this.twitter.settings, options);
                this.twitter.settings = settings;
                if (query) {
                    this.twitter.query = query;
                }
                this.twitter.limit = settings.limit;
                this.twitter.mode = settings.mode;
                if (this.twitter.interval) {
                    this.twitter.refresh(true);
                }
                if (callback) {
                    this.twitter.callback = callback;
                }

                // ..or create a new twitter object
            } else {
                // Extend settings with the defaults
                settings = jQuery.extend({
                    mode: 'list', // Mode, valid options are: 'search', 'user_timeline'
                    rate: 15000,    // Refresh rate in ms
                    limit: 10,       // Limit number of results
                    refresh: true
                }, options);

                // Default setting for showAuthor if not provided
                if (typeof settings.showAuthor == "undefined") {
                    settings.showAuthor = (settings.mode == 'user_timeline') ? false : true;
                }

                // Set up a dummy function for the Twitter API callback
                if (!window.twitter_callback) {
                    window.twitter_callback = function () { return true; };
                }

                this.twitter = {
                    settings: settings,
                    query: query,
                    limit: settings.limit,
                    mode: settings.mode,
                    interval: false,
                    container: this,
                    lastTimeStamp: 0,
                    callback: callback,

                    // Convert the time stamp to a more human readable format
                    relativeTime: function (timeString) {
                        var parsedDate = Date.parse(timeString);
                        var delta = (Date.parse(Date()) - parsedDate) / 1000;
                        var r = '';
                        if (delta < 60) {
                            r = delta + ' seconds ago';
                        } else if (delta < 120) {
                            r = 'a minute ago';
                        } else if (delta < (45 * 60)) {
                            r = (parseInt(delta / 60, 10)).toString() + ' minutes ago';
                        } else if (delta < (90 * 60)) {
                            r = 'an hour ago';
                        } else if (delta < (24 * 60 * 60)) {
                            r = '' + (parseInt(delta / 3600, 10)).toString() + ' hours ago';
                        } else if (delta < (48 * 60 * 60)) {
                            r = 'a day ago';
                        } else {
                            r = (parseInt(delta / 86400, 10)).toString() + ' days ago';
                        }
                        return r;
                    },

                    // Update the timestamps in realtime
                    refreshTime: function () {
                        var twitter = this;
                        $(twitter.container).find('span.time').each(function () {
                            $(this).find('a').html(twitter.relativeTime(this.timeStamp));
                        });
                    },

                    // Handle reloading
                    refresh: function (initialize) {
                        var twitter = this;
                        if (this.settings.refresh || initialize) {
                            var url = '';

                            /*if (twitter.mode == 'search') {
                            url = "http://localhost:1819/MoviePhreak.Web/Svc/q.ashx?op=GetAllUserCommentsJson&skip=0&top=" + twitter.limit;
                            } else if(twitter.mode == 'user_timeline') {
                            url = "http://api.twitter.com/1/statuses/user_timeline/"+encodeURIComponent(this.query)+".json?count="+twitter.limit+"&callback=?";
                            } else
                            else*/
                            if (twitter.mode == 'list') {
                                url = "reviews.ashx?skip=0&top=" + twitter.limit;
                                if (this.query != '') {
                                    url += "&" + this.query;
                                }
                            }

                            $.getJSON(url, function (json) {
                                var results = json;
                                var newTweets = 0;
                                
                                var filteredByMovieID = false;
                                if (url.indexOf("movieID") > 0 && results.length > 0) {
                                	filteredByMovieID = true;
                                	var _review = results[0];
                                	var _movTitle = _review.Movie.Title;
                                	document.title = "Latest User Reviews on Movreak - " + _movTitle;
                                }

                                $(results).reverse().each(function () {

                                    var imageNo = Math.floor(Math.random() * 17) + 1;
                                    var profile_image_url = 'App_Globals/Images/Avatar/movreak_' + imageNo + '.png';

                                    /*
                                    var twitterProfileUrl = 'http://api.twitter.com/1/statuses/user_timeline/' + this.UserName + '.json?count=0&callback=?';
                                    $.getJSON(twitterProfileUrl, function (profileJson) {
                                    if (profileJson != null) {// && !profileJson.hasOwnProperty('error')) {
                                    profile_image_url = profileJson[0].user.profile_image_url;
                                    }
                                    });*/

                                    var screen_name = '';

                                    screen_name = this.UserFullname;
                                    //profile_image_url = this.user.profile_image_url;                                        
                                    var jsonDate = this.SubmittedDate.replace(/\/Date\((-?\d+\+0700)\)\//gi, "$1");
                                    jsonDate = jsonDate.replace('+0700', '');
                                    created_at_date = new Date(+jsonDate);
                                    //add 7
                                    created_at_date = new Date(created_at_date.setHours(created_at_date.getHours()));


                                    var linkified_text = this.ReviewContent.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function (m) { return m.link(m); });
                                    //linkified_text = linkified_text.replace(/@[A-Za-z0-9_]+/g, function (u) { return u.link('http://twitter.com/' + u.replace(/^@/, '')); });
                                    //linkified_text = linkified_text.replace(/#[A-Za-z0-9_\-]+/g, function (u) { return u.link('http://search.twitter.com/search?q=' + u.replace(/^#/, '%23')); });

                                    if (!twitter.settings.filter || twitter.settings.filter(this)) {
                                        if (Date.parse(created_at_date) > twitter.lastTimeStamp || initialize) {
                                            newTweets += 1;
                                            var tweetHTML = '<div class="tweet tweet-' + this.ReviewID + '">';
                                            
                                            var twitterShareHtml = '<span style="float:right;">'+
											'<a href="http://twitter.com/share" class="twitter-share-button" '+											
											'data-via="movreak" ' + 
											'data-url="http://movreak.com/reviews.html?movieID=' + this.Movie.MovieID + '" ' +
											'data-text="RT \'' + this.Movie.Title + '\': ' + this.ReviewContent + '" ' + 
											'data-related="dycode:Movreak\'s creator" '+ 
											'data-count="none">Tweet</a>' + 
											'</span>' + ' <script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script>';
											
											var titleUrl = (filteredByMovieID)? '/mov.aspx?id=' + this.Movie.MovieID: '?movieID=' + this.Movie.MovieID;										
                                            tweetHTML += '<span class="movie_title"><a href="' + titleUrl + '" style="float:left;" id="movieTitle">' + this.Movie.Title + '</a>';
                                            if (this.Thumbs != 0) {
                                                tweetHTML += '<span style="float:right">' + Math.abs(this.Thumbs) + ' thumbs ' + ((this.Thumbs >= 0) ? 'up' : 'down') + '</span>';
                                            }
                                            tweetHTML += '</span>';

                                            if (twitter.settings.showAuthor) {
                                                tweetHTML +=
													            '<span class="avatar"><img width="50" height="50" src="' + profile_image_url + '" /></span>' +
                                                                '<span class="text"><span class="username">' + screen_name + '</span> ';
                                                //'<span class="text"><span class="username"><a href="http://twitter.com/' + this.UserName + '">' + screen_name + '</a>:</span> ';
                                            } else {
                                                tweetHTML +=
													            '<span class="text">';
                                            }
                                            
                                            tweetHTML += linkified_text +
												            '<span class="time">' + twitter.relativeTime(created_at_date) + '</span>' +		
												            twitterShareHtml + 
												            '</span>' + 
												            '</div>';
																						
                                            $(twitter.container).prepend(tweetHTML);
                                            var timeStamp = created_at_date;
                                            $(twitter.container).find('span.time:first').each(function () {
                                                this.timeStamp = timeStamp;
                                            });
                                            if (!initialize) {
                                                $(twitter.container).find('.tweet-' + this.ReviewID).hide().fadeIn(5000);
                                            }
                                            twitter.lastTimeStamp = Date.parse(created_at_date);
                                        }
                                    }
                                });
                                if (newTweets > 0) {
                                    // Limit number of entries
                                    $(twitter.container).find('div.tweet:gt(' + (twitter.limit - 1) + ')').remove();
                                    // Run callback
                                    if (twitter.callback) {
                                        twitter.callback(domNode, newTweets);
                                    }
                                    // Trigger event
                                    $(domNode).trigger('tweets');
                                }
                            });
                        }
                    },
                    start: function () {
                        var twitter = this;
                        if (!this.interval) {
                            this.interval = setInterval(function () { twitter.refresh(); }, twitter.settings.rate);
                            this.refresh(true);
                        }
                    },
                    stop: function () {
                        if (this.interval) {
                            clearInterval(this.interval);
                            this.interval = false;
                        }
                    },
                    clear: function () {
                        $(this.container).find('div.tweet').remove();
                        this.lastTimeStamp = null;
                    }
                };
                var twitter = this.twitter;
                this.timeInterval = setInterval(function () { twitter.refreshTime(); }, 5000);
                this.twitter.start();
            }
        });
        return this;
    };
})(jQuery);
