﻿/*global jQuery, window, document */
function socialMediaPluginFormatDate(dateString) {
    var result, m, datePart, timePart, i, j,
        today = new Date(),
        oneMinute = 1000 * 60,
        oneHour = oneMinute * 60,
        minutesPast, hoursPast,
        tests = [
            /^(\d{4}\-\d{2}\-\d{2})T(\d{2}\:\d{2})/,
            /^(\d{4}\-\d{2}\-\d{2}) (\d{2}\:\d{2})/,
            /^(\w+\s\w{3}\s\d{2})\s(\d{2}\:\d{2}\:\d{2})\s(\+?\-?\d{4})\s(\d{4})/
        ],
        monthNames = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

    for (i = 0, j = tests.length; i < j; i++) {
        m = tests[i].exec(dateString);
        if (m) {
            if (i === 2) {
                result = new Date(m[1] + "," + m[4] + " " + m[2] + " " + m[3]);
                break;
            } else {
                datePart = m[1].split("-");
                timePart = m[2].split(":");
                result = new Date(datePart[0], parseInt(datePart[1], 10) - 1, datePart[2], timePart[0], timePart[1]);
                result = new Date(result.valueOf() - (result.getTimezoneOffset() * 60 * 1000));
                break;
            }
        }
    }

    minutesPast = Math.ceil((today.getTime() - result.getTime()) / oneMinute);
    hoursPast = Math.ceil((today.getTime() - result.getTime()) / oneHour);

    //if less than 60 minutes ago, show minutes
    if (minutesPast < 60) {
        return minutesPast + (minutesPast === 1 ? ' minute ago' : ' minutes ago');
    } else {
        //if less than 24 hours ago, show hours
        if (hoursPast < 24) {
            return hoursPast + (hoursPast === 1 ? ' hour ago' : ' hours ago');
        } else {
            //else show date
            var hourDisplay = (result.getHours() < 10 ? '0' : '') + result.getHours().toString();
            var minuteDisplay = (result.getMinutes() < 10 ? '0' : '') + result.getMinutes().toString();
            return result.getDate() + ' ' + monthNames[result.getMonth()] + ' ' + result.getFullYear() + ' ' + hourDisplay + ':' + minuteDisplay;
        }
    }
}

//plugin for the social media plugin module
(function ($) {
    var xhr,
        noDataHandler = function(container, mediaSettings) {
            return function() {
                if(mediaSettings.isLoading) {
                    container.empty();
                    $("<li></li>").appendTo(container).addClass("no-data").html(mediaSettings.noDataHtml);
                    clearTimeout(mediaSettings.intervalId);
                    if (mediaSettings.xhr && typeof mediaSettings.xhr.abort==="function") {
                        mediaSettings.xhr.abort();
                    }
                    mediaSettings.isLoading=false;
                } 
            };
        },
        pluginSettings = {
            noDataTimeout : 2000,
            twitter: {
                username: '',
                recordCount: 0,
                noDataHtml : '<p>Unable to connect to Twitter.</p><p>Please refresh the page to connect again.</p>',
                intervalId : -1,
                isLoading : true,
                xhr : null
            },
            facebook: {
                apiKey: '',
                width: 0,
                height: 0,
                colorScheme: 'light',
                showFaces: 'false',
                stream: 'true',
                header: 'false',
                noDataHtml : '<p>Unable to connect to Facebook.</p><p>Please refresh the page to connect again.</p>',
                intervalId : -1,
                isLoading : true
            },
            disqus: {
                serviceUrl: '',
                forumId: '',
                recordCount: 0,
                categoryIds: '',
                filter: '',
                exclude: '',
                messageLength: 200,
                useCurrentDomain: false,
                noDataHtml : '<p>Unable to connect to the commenting service.</p><p>Please refresh the page to connect again.</p>',
                intervalId : -1,
                isLoading : true,
                xhr : null,
                enabled : true
            },
            defaultTabIndex: 0
        },
        handlers = {
        loadTwitter : function (tabPanel, tabIndex) {
            var twSettings = pluginSettings.twitter;

            //ensure only load once
            if (twSettings.isLoading) {
                twSettings.intervalId = setTimeout(noDataHandler(tabPanel,twSettings),pluginSettings.noDataTimeout);

                twSettings.xhr = $.ajax({
                    url: 'http://twitter.com/status/user_timeline/' + twSettings.username + '.json?count=' + twSettings.recordCount + '&callback=?',
                    dataType: 'json',
                    success: function (data) {
                        if (twSettings.isLoading) {
                            //clear loading status
                            tabPanel.empty();
                            $.each(data, function (i, item) {
                                //get all hyperlinks from the text and wrap in anchors
                                var link = /(http:\/\/\S+)\b/i.exec(item.text);
                                if (link) {
                                    //wrap link with anchor if found
                                    link = link[1];
                                    item.text = item.text.replace(link, '<a target=\'_blank\' href=\'' + link + '\'>' + link + '</a>');
                                }
                                tabPanel.append('<li><p class=\'message\'>' + item.text + '<span class=\'date\'>' + socialMediaPluginFormatDate(item.created_at) + '</span></p></li>');
                            });

                            //apply css to last li
                            tabPanel.find('li:last').addClass('last');

                            //append footer
                            tabPanel.append("<div class='follow-us-on-twitter'><a target='_blank' href='http://twitter.com/" + twSettings.username + "'>Follow us on Twitter!</a></div>");
                            clearTimeout(twSettings.intervalId);
                            twSettings.isLoading=false;
                        }
                    }
                });
            }
        },
        loadFacebook : function (tabPanel, tabIndex) {
            //ensure only load once
            var fbSettings = pluginSettings.facebook;
            fbSettings.intervalId = setTimeout(noDataHandler(tabPanel,fbSettings),pluginSettings.noDataTimeout);

            if (fbSettings.isLoading) {
                //clear loading status & insert iframe
                tabPanel.empty().html("<li><iframe src='http://www.facebook.com/plugins/likebox.php?href=http%3A%2F%2Fwww.facebook.com%2F" + fbSettings.domain + "&amp;width=" + fbSettings.width + "&amp;colorscheme=" + fbSettings.colorScheme + "&amp;show_faces=" + fbSettings.showFaces + "&amp;stream=" + fbSettings.stream + "&amp;header=" + fbSettings.header + "&amp;height=" + fbSettings.height + "' scrolling='no' frameborder='0' style='border:none; overflow:hidden; width:" + fbSettings.width + "px; height:" + fbSettings.height + "px;' allowTransparency='true'></iframe></li>");
                fbSettings.isLoading=false;
            }
        },
        loadDisqus : function (tabPanel, tabIndex) {
            var dqSettings = pluginSettings.disqus;
            dqSettings.intervalId = setTimeout(noDataHandler(tabPanel,dqSettings),pluginSettings.noDataTimeout);

            //ensure only load once
            if (dqSettings.isLoading) {
                //add filter params to disqus service url
                var disqusUrl = dqSettings.serviceUrl + '&forumId=' + dqSettings.forumId + '&recordCount=' + dqSettings.recordCount;

                //categoryIds
                if (dqSettings.categoryIds.length > 0) {
                    disqusUrl += '&categoryIds=' + dqSettings.categoryIds;
                }
                //disqusFilter
                if (dqSettings.filter.length > 0) {
                    disqusUrl += '&filter=' + dqSettings.filter;
                }
                //disqusExclude
                if (dqSettings.exclude.length > 0) {
                    disqusUrl += '&exclude=' + dqSettings.exclude;
                }
                
                dqSettings.xhr=$.ajax({
                    url: disqusUrl,
                    dataType: 'json',
                    dataFilter: function (s) { return JSON.parse(s); },
                    success: function (data) {

                        if (dqSettings.isLoading) {
                            //clear loading status
                            tabPanel.empty();
                            $.each(data.message, function (i, message) {
                                var authorName;
                                //trouble sorting out author vs anonymouse
                                if (message.author) {
                                    authorName = !(message.author.display_name) ? message.author.username : message.author.display_name;
                                } else {
                                    authorName = message.anonymous_author.name;
                                }

                                //trim the message if to long
                                if (message.message.length > dqSettings.messageLength) {
                                    message.message = message.message.substring(0, dqSettings.messageLength) + "...";
                                }
                                
                                if(dqSettings.useCurrentDomain) {                                                                
                                    var a = document.createElement('a'); 
                                    a.href = message.thread.url;
                                    tabPanel.append("<li><p>" + authorName + ": <span class='message'>" + message.message + "</span></p><p><a class='view-article' href='" +  message.thread.url.replace(a.hostname, document.domain) + "'>" + message.thread.title + "</a><span class='date'>" + socialMediaPluginFormatDate(message.created_at) + "</span></p></li>");
                                }
                                else {
                                    tabPanel.append("<li><p>" + authorName + ": <span class='message'>" + message.message + "</span></p><p><a class='view-article' href='" + message.thread.url + "'>" + message.thread.title + "</a><span class='date'>" + socialMediaPluginFormatDate(message.created_at) + "</span></p></li>");
                                }                                
                                                               
                                clearTimeout(dqSettings.intervalId);
                            });
                            
                            //apply css to last li
                            tabPanel.find('li:last').addClass('last');
                            dqSettings.isLoading=false;
                        }
                    }
                });
            }
        }
    };

    $.fn.socialMediaPlugin = function (options) {
        pluginSettings = $.extend(true, pluginSettings, options);

        //apply simpleTabs plugin behaviour
        var tabCallbacks = [handlers.loadFacebook,handlers.loadTwitter];

        if(pluginSettings.disqus.enabled) {
            tabCallbacks.push(handlers.loadDisqus);
		}

        return this.simpleTabs({
            callbacks: tabCallbacks,
            defaultTabIndex: pluginSettings.defaultTabIndex
        });
    };

} (jQuery));
