/**
 * Contains
 * Truncate more/less http://henrik.nyh.se/2008/02/jquery-html-truncate
 * @author Henrik Nyh
 * Usage:
 * $(function() {
 *    $('.example').truncate({max_length: 24});
 *  });
 */

if(jQueryNoConflict == undefined){
    jQuery.noConflict();
    var jQueryNoConflict = true;
}

(function($){
    jQuery.fn.neat = function(username, length){
        var $before = jQuery('<img/>').attr({'src':'http://www.thw-mainz.de/twitter_block/images/twitter_follow_before.png', 'class':'before'});
        $before = jQuery('<a/>').attr({'href':'http://twitter.com/' + username, 'target':'_blank', 'title':'Follow ' + username + ' on twitter'}).html($before);
        var $after = jQuery('<img/>').attr({'src':'http://www.thw-mainz.de/twitter_block/images/twitter_follow_after.png', 'class':'after'});
        jQuery(this).prepend($before).append($after).children('.truncated').truncate({max_length: length});
    };
    jQuery.fn.getTinyUrl = function(){
        var $el = this;
        var skip = false;
        var skipArray = new Array('tinyurl.com', 'nyti.ms', 'bit.ly', 'snipurl.com', 'is.gd', 'ow.ly', 'notlong.com');
        jQuery.each(skipArray, function(key, val){
            if( jQuery($el).attr("href").indexOf(val) > 0){
                skip = true;
            }
        });
        if(!skip){
            jQuery.getJSON(
                "http://json-tinyurl.appspot.com/?&callback=?",
                {url: jQuery($el).attr("href")},
                function(data){
                    jQuery($el).attr("href", data.tinyurl).text(data.tinyurl);
                }
            );
        }

    }
    jQuery.fn.getTwitterSearch = function(searchTerm, numberOfTweets){
        numberOfTweets = (numberOfTweets == undefined)?5:numberOfTweets;
        var $base = this;
        var url = "http://search.twitter.com/search.json?callback=?";
        var data = {
            'q': searchTerm,
            'rpp': numberOfTweets
        };
        $.ajax({
            type: "GET",
            url: url,
            data: data,
            dataType: "json",

            success: function(data){
                if (data.results) {
                    try {
                        $base.empty().append('<a href="http://search.twitter.com/?q=' + data.query + '" target="_blank"><img src="http://www.thw-mainz.de/twitter_block/images/twitter_search_160x37.png"/></a><br />');
                        jQuery.each(data.results, function(key, val){
                            var $date;
                            var $img = jQuery('<a/>').attr({'href':'http://twitter.com/' + val.from_user, 'target':'_blank'});
                            jQuery($img).html(jQuery('<img/>').attr({'src':val.profile_image_url, 'class':'profile_img', 'title':val.from_user}));
                            $img = (val.profile_image_url != '')?$img:'';
                                                            $date = val.created_at.substring(4, 16);
                                                        //$date = (val.created_at != '')?$date:'';
                            var $dateLink = jQuery('<a/>').attr({'href':'http://twitter.com/' + val.from_user + '/status/' + val.id, 'target':'_blank'}).text($date).addClass('date');
                            var $tweet = jQuery('<span></span>').text(val.text).prepend('<br />');
                            $tweet.html(
                                $tweet.html()
                                    .replace(/((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi, '<a class="tweet-url" href="$1" target="_blank">$1</a>')
                                    .replace(/(^|\s)#(\w+)/g, '$1<a href="http://search.twitter.com/search?q=%23$2" target="_blank">#$2</a>')
                                    .replace(/(^|\s)@(\w+)/g, '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>')
                                    .wordWrap(28, '\n', 0)
                            )
                            jQuery('<p></p>').appendTo($base).append($img).append($dateLink).append($tweet);
                        });
                        jQuery('#tweet-text p:last').css('border-bottom', 'solid 0px grey');

                        $base.show();
                                            }
                    catch (e) {
                        // Just in case
                        jQuery($base).hide().siblings().hide();
                    }
                }
            }
        });
    };
    jQuery.fn.getSearch = function(searchTerm, numberOfTweets){
        jQuery("<span id='tweet-text'></span>").hide().appendTo(this).getTwitterSearch(searchTerm, numberOfTweets);
    }
    jQuery.fn.getSingleTweet = function(username, length, id){
        username = (username == '')?'THWMainz':username;
        length = (length == undefined)?36:length;
        var $base = this;
        if (id > 0){
            var url = "http://twitter.com/statuses/show/" + id + ".json?callback=?";
            var data = {};
        } else {
            var url = "http://twitter.com/statuses/user_timeline.json?callback=?";
            var data = {
                'screen_name': username,
                'count': 1
            };
        }

        jQuery.ajax({
            type: "GET",
            url: url,
            data: data,
            dataType: "json",

            success: function(data){
                if (data) {
                    if (data.text != undefined) {
                        var $tweet = jQuery('<span></span>').addClass('truncated').text(data.text);
                        $tweet.html(
                            $tweet.html()
                                .replace(/((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi, '<a class="mini-tweet-url" href="$1" target="_blank">$1</a>')
                                .replace(/(^|\s)#(\w+)/g, '$1<a href="http://search.twitter.com/search?q=%23$2" target="_blank">#$2</a>')
                                .replace(/(^|\s)@(\w+)/g, '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>')
                        )
                        jQuery($base).append($tweet).neat(username, length);
                    } else {
                        jQuery.each(data, function(key, val){
                            var $tweet = jQuery('<span></span>').addClass('truncated').text(val.text);
                            $tweet.html(
                                $tweet.html()
                                    .replace(/((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi, '<a class="mini-tweet-url" href="$1" target="_blank">$1</a>')
                                    .replace(/(^|\s)#(\w+)/g, '$1<a href="http://search.twitter.com/search?q=%23$2" target="_blank">#$2</a>')
                                    .replace(/(^|\s)@(\w+)/g, '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>')
                            )
                            jQuery($base).append($tweet).neat(username, length);
                        });
                    }
                }
                            }
        });
    }
    jQuery.fn.getTweets = function(username, numberOfTweets){
        username = (username == '')?'THWMainz':username;
        numberOfTweets = (numberOfTweets == undefined)?5:numberOfTweets;
        jQuery("<span id='tweet-text'></span>").hide().appendTo(this).lastTwitterMessage(username, numberOfTweets);
        (jQuery(this).attr("id") == "twitter_tag")?"":jQuery(this).siblings().hide();    }
    jQuery.fn.lastTwitterMessage = function(username, numberOfTweets){

        var $base = this;
        if (!username || username == "") {
            var url = "http://www.thw-mainz.de/twitter_block/index.php";
            var data = {
                'view': 'first_run'
            }
        } else {
            var url = "http://twitter.com/statuses/user_timeline.json?callback=?";
            var data = {
                'screen_name': username,
                'count': numberOfTweets
            }
        }
        var $img;
        $.ajax({
            type: "GET",
            url: url,
            data: data,
            dataType: "json",

            success: function(data){
                if (data && data.length >= 1) {
                    try {
                        $base.empty().append('<a href="http://twitter.com/' + username + '" target="_blank"><img src="http://www.thw-mainz.de/twitter_block/images/" title="Follow ' + username + ' on twitter" alt="Follow ' + username + ' on twitter"/></a><br />');
                        jQuery.each(data, function(key, val){
                            var $img = jQuery('<a/>').attr({'href':'http://twitter.com/' + username, 'target':'_blank'});
                            jQuery($img).html(jQuery('<img/>').attr({'src':val.user.profile_image_url, 'class':'profile_img', 'title':username}));
                            $img = (val.user.profile_image_url != '')?$img:'';
                                                            var $date = val.created_at.substring(4, 16);
                                                        $date = (val.created_at != '')?$date:'';
                            var $dateLink = jQuery('<a/>').attr({'href':'http://twitter.com/' + username + '/status/' + val.id, 'target':'_blank'}).text($date).addClass('date');
                            var $tweet = jQuery('<span></span>').text(val.text).prepend('<br />');
                            $tweet.html(
                                $tweet.html()
                                    .replace(/((ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?)/gi, '<a class="tweet-url" href="$1" target="_blank">$1</a>')
                                    .replace(/(^|\s)#(\w+)/g, '$1<a href="http://search.twitter.com/search?q=%23$2" target="_blank">#$2</a>')
                                    .replace(/(^|\s)@(\w+)/g, '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>')
                                    .wordWrap(28, '\n', 0)
                            )
                            jQuery('<p></p>').appendTo($base).append($img).append($dateLink).append($tweet);
                        });
                        $link = jQuery('<a/>').attr({'href':'http://twitter.com/' + username, 'title':'Follow ' + username + ' on twitter', 'target':'_blank'}).text('Follow ' + username + ' on twitter');
                        jQuery('<div align="center"></div>').appendTo($base).append($link);
                        jQuery('#tweet-text p:last').css('border-bottom', 'solid 0px grey');

                        $base.show();
                                            }
                    catch (e) {
                        // Just in case
                        jQuery($base).hide().siblings().hide();
                    }
                }
            }
        });
    };
    var trailing_whitespace = true;
    jQuery.fn.truncate = function(options){

        var opts = jQuery.extend({}, jQuery.fn.truncate.defaults, options);

        jQuery(this).each(function(){

            var content_length = jQuery.trim(squeeze(jQuery(this).text())).length;
            if (content_length <= opts.max_length)
                return; // bail early if not overlong
            var actual_max_length = opts.max_length - opts.more.length - 3; // 3 for " ()"
            var truncated_node = recursivelyTruncate(this, actual_max_length);
            var full_node = jQuery(this).hide();

            truncated_node.insertAfter(full_node);

            findNodeForMore(truncated_node).append('  <span class="more-less"><a href="#show more content">' + opts.more + '</a></span>');
            findNodeForLess(full_node).append('  <span class="more-less"><a href="#show less content">' + opts.less + '</a></span>');

            truncated_node.find('a:last').click(function(){
                truncated_node.hide();
                full_node.show();
                return false;
            });
            full_node.find('a:last').click(function(){
                truncated_node.show();
                full_node.hide();
                return false;
            });

        });
    }

    // Note that the " (…more)" bit counts towards the max length – so a max
    // length of 10 would truncate "1234567890" to "12 (…more)".
    jQuery.fn.truncate.defaults = {
        max_length: 100,
        more: '...more',
        less: '...less'
    };

    function recursivelyTruncate(node, max_length){
        return (node.nodeType == 3) ? truncateText(node, max_length) : truncateNode(node, max_length);
    }

    function truncateNode(node, max_length){
        var node = jQuery(node);
        var new_node = node.clone().empty();
        var truncatedChild;
        node.contents().each(function(){
            var remaining_length = max_length - new_node.text().length;
            if (remaining_length == 0)
                return; // breaks the loop
            truncatedChild = recursivelyTruncate(this, remaining_length);
            if (truncatedChild)
                new_node.append(truncatedChild);
        });
        return new_node;
    }

    function truncateText(node, max_length){
        var text = squeeze(node.data);
        if (trailing_whitespace) // remove initial whitespace if last text
            text = text.replace(/^ /, ''); // node had trailing whitespace.
        trailing_whitespace = !!text.match(/ $/);
        var text = text.slice(0, max_length);
        // Ensure HTML entities are encoded
        // http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb
        text = jQuery('<div/>').text(text).html();
        return text;
    }

    // Collapses a sequence of whitespace into a single space.
    function squeeze(string){
        return string.replace(/\s+/g, ' ');
    }

    // Finds the last, innermost block-level element
    function findNodeForMore(node){
        var $node = jQuery(node);
        var last_child = $node.children(":last");
        if (!last_child)
            return node;
        var display = last_child.css('display');
        if (!display || display == 'inline')
            return $node;
        return findNodeForMore(last_child);
    };

    // Finds the last child if it's a p; otherwise the parent
    function findNodeForLess(node){
        var $node = jQuery(node);
        var last_child = $node.children(":last");
        if (last_child && last_child.is('p'))
            return last_child;
        return node;
    };

    String.prototype.wordWrap = function(m, b, c){
        var i, j, l, s, r;
        if(m < 1)
            return this;
        for(i = -1, l = (r = this.split("\n")).length; ++i < l; r[i] += s)
            for(s = r[i], r[i] = ""; s.length > m; r[i] += s.slice(0, j) + ((s = s.slice(j)).length ? b : ""))
                j = c == 2 || (j = s.slice(0, m + 1).match(/\S*(\s)?$/))[1] ? m : j.input.length - j[0].length
                || c == 1 && m || j.input.length + (j = s.slice(m).match(/^\S*/)).input.length;
        return r.join("\n");
    };

    function relative_time(time_value, search) {
        if (search == true) {
            var values = time_value.split(" ");
            time_value = values[2] + " " + values[1] + ", " + values[3] + " " + values[4];
        }else{
            var values = time_value.split(" ");
            time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
        }
        var parsed_date = Date.parse(time_value);
        var relative_to = new Date();
        var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
        delta = delta + (relative_to.getTimezoneOffset() * 60);

        if (delta < 60) {
        return 'less than a minute ago';
        } else if(delta < 120) {
        return 'about a minute ago';
        } else if(delta < (60*60)) {
        return (parseInt(delta / 60)).toString() + ' minutes ago';
        } else if(delta < (120*60)) {
        return 'about an hour ago';
        } else if(delta < (24*60*60)) {
        return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
        } else if(delta < (48*60*60)) {
        return '1 day ago';
        } else {
        return (parseInt(delta / 86400)).toString() + ' days ago';
        }
    };

})(jQuery);

