/***************************************************************
*  Copyright notice
*
*  (c) 2009 Phillip Kroll <kroll@includemedia.de>
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/

var selector = {
    timeline: ".twitter-timeline",
    loading: ".tweetsLoad",
    reload: ".reloadTweets",
    profile: ".userProfile"
}
var monthDict = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];

if ( window.twitterProfiles === undefined ){
var twitterProfiles = new Array();
}

jQuery.noConflict();

jQuery(document).ready(function() {
     loadData( 0 ); 
});

function unique( selector, opt ){
    return( "#" + opt.id + " " + selector );
}

function isdefined(object, variable){
    return (typeof(eval(object)[variable]) != 'undefined');
}

function loadData( index ){

   var opt = twitterProfiles[ index ];
   if ( opt === undefined ){ return( null ); }

   jQuery( unique( selector.loading, opt ) ).show();
   jQuery( unique( selector.reload, opt ) ).hide();
   jQuery( unique( selector.reload, opt ) ).click( function(){ loadData( 0 ); return( false ); });
   
    var userProfile = null;
    var userTimeline = null;

   jQuery.getJSON( opt.path, "id=" + opt.id + "&type=timeline&period=" + opt.cache_period, function(json){
        userTimeline = json;
        jQuery.getJSON( opt.path, "id=" + opt.id + "&type=profile&period=" + opt.cache_period, function(json){
            userProfile = json;
            process( userTimeline, userProfile, opt, index );
        });
    }); 
}

function process( userTimeline, userProfile, opt, index ){
    
   jQuery( unique( selector.timeline, opt ) ).html("");
   jQuery( unique( selector.profile, opt ) ).html("");

    jQuery.each( userTimeline, function(i,item){
        if ( i < opt.max ){
            var licss = "";
            if( i == 0 ){ licss = " class='first'"   };
            if( i == opt.max - 1 ){ licss = " class='last'"   };
            //var d = new Date( Date.parse( item.created_at ) );
            //var d = relative_time1(item.created_at);
            //var d = parseTwitterDate2(item.created_at);
            //var d = parseTwitterDate(item.created_at);
            var d = relative_time(item.created_at);
            //var d = H(item.created_at);            
            //"Wed Dec 08 13:44:21 +0000 2010"
            //Tue Dec 07 13:45:36 +0000 2010
            //Wed Dec 01 20:47:08 +0000 2010
            //Wed Dec 01 20:01:45 +0000 2010
            //Wed Dec 01 19:37:57 +0000 2010
            //Mon Nov 29 14:27:57 +0000 2010             
            var tweet_time = opt.show_time ? " <span class='tweet-time'>(" + d.toLocaleString() + ")</span>" : "";
            
            var re = /((http|https|ftp):\/\/[\w?=&.\/-;#~%-]+(?![\w\s?&.\/;#~%"=-]*>))/g;
            
            //var listItem = jQuery("<li" + licss + ">" +  item.text + tweet_time + "</li>" );
            var listItem = jQuery("<li" + licss + ">" +  item.text.replace(re, '<a href="$1">$1</a> ') + tweet_time + "</li>" );
            //var listItem = jQuery("<li" + licss + "><a href=\"http://www.twitter.com/" + userProfile.screen_name + "\">" +  item.text +"</a>"+ tweet_time + "</li>" );
            if ( opt.parse_urls ){ listItem.linkize(); }
            jQuery( unique( selector.timeline, opt ) ).append( listItem );
        }
    });

   jQuery( unique( selector.profile, opt ) ).append(
       "<img src='" + userProfile.profile_image_url + "' />" +
       "<h1>" + userProfile.screen_name + " (" + userProfile.name + ")" + "</h1>" +
       "<span class='friends'>following: <strong>" + userProfile.friends_count + "</strong></span> " +
       "<span class='friends'>followers: <strong>" + userProfile.followers_count + "</strong></span>"
    );

   if ( opt.link_to_twitter ){
    jQuery( unique( selector.profile, opt ) ).find("h1").wrap("<a target='_blank' href='http://www.twitter.com/" + userProfile.screen_name + "'></a>");
    jQuery( unique( selector.profile, opt ) ).find("img").wrap("<a target='_blank' href='http://www.twitter.com/" + userProfile.screen_name + "'></a>");
   }

   loadData( ++index );
   jQuery( unique( selector.loading, opt ) ).hide();
   if ( opt.show_reload ){ jQuery( unique( selector.reload, opt ) ).show(); }

}

var K = function () {
    var a = navigator.userAgent;
    return {
        ie: a.match(/MSIE\s([^;]*)/)
    }
}();

var H = function (a) {
    var b = new Date();
    var c = new Date(a);
    if (K.ie) {
        c = Date.parse(a.replace(/( \+)/, ' UTC$1'))
    }
    var d = b - c;
    var e = 1000,
        minute = e * 60,
        hour = minute * 60,
        day = hour * 24,
        week = day * 7;
    if (isNaN(d) || d < 0) {
        return ""
    }
    if (d < e * 7) {
        return "right now"
    }
    if (d < minute) {
        return Math.floor(d / e) + " seconds ago"
    }
    if (d < minute * 2) {
        return "about 1 minute ago"
    }
    if (d < hour) {
        return Math.floor(d / minute) + " minutes ago"
    }
    if (d < hour * 2) {
        return "about 1 hour ago"
    }
    if (d < day) {
        return Math.floor(d / hour) + " hours ago"
    }
    if (d > day && d < day * 1) {
        return "yesterday"
    }
    if (d < day * 365) {
        return Math.floor(d / day) + " days ago"
    } else {
        return "over a year ago"
    }
};

function parseTwitterDate(date) {
	var dateArray = date.split(' ');
	return new Date(
		Date.parse( dateArray[0] + ', ' + dateArray[2] + ' '
		+ dateArray[1] + ' ' + dateArray[3] + ' '
		+ dateArray[5].substring(0,4) )
	);
}


function relative_time1(time_value) {
  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 = (arguments.length > 1) ? arguments[1] : 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';
  }
}


function parseTwitterDate2(text) {
var newtext = text.replace(/(\+\S+) (.*)/, '$2 $1')
var date = new Date(Date.parse(newtext)).toLocaleDateString();
var time = new Date(Date.parse(newtext)).toLocaleTimeString();
return date +' • ' + time;
}

//1292428825200
//1292428836000

function relative_time(time_value) {
				var values = time_value.split(" ");
				parsed_date = Date.parse(values[1] + " " + values[2] + ", " + values[5] + " " + (values[3]) );
				//parsed_date = parseInt(parseInt(parsed_date) - parseInt(1000*60*3));
				//parsed_date = parsed_date - 1000*60*3;
				
				//var d_gmt2_millisec = new Date(valueOf(parsed_date.toUTCString())+60*60*1000*3);
				var d_gmt2_millisec = new Date((parsed_date)-60*60*1000*5);
				d_gmt2_millisec1 = d_gmt2_millisec.toString();
				
				parsed_date = d_gmt2_millisec1;

        
            //parsed_date = parseInt(Date.parse(values[1] + " " + values[2] + ", " + values[5] + " " + values[3]) -  3*60*60),
         var date = new Date(parsed_date),
            relative_to = (arguments.length > 1) ? arguments[1] : new Date(),
            delta = parseInt((relative_to.getTime() - parsed_date) / 1000),
            r = '';
        
        function formatTime(date) {
        		
        	 //var values = date.split(" "),
        	 //parsed_date_min5h = parseInt(Date.parse(values[1] + " " + values[2] + ", " + values[5] + " " + values[3]) -  3*60*60);
        	 //dateMin5h = date - 5*60*60;
        	 //alert(parsed_date_min5h);
            //var hour = date.getHours(),
            //parsed_date_min5h = new Date(parsed_date_min5h);
            var hour = date.getHours(),
                min = date.getMinutes() + "",
                ampm = 'AM';
                
                
            
            if (hour == 0) {
                hour = 12;
            } else if (hour == 12) {
                ampm = 'PM';
            } else if (hour > 12) {
                hour -= 12;
                ampm = 'PM';
            }
            
            if (min.length == 1) {
                min = '0' + min;
            }
            hour = hour;
            
            
            return hour + ':' + min + ' ' + ampm;
        }
        
        function formatDate(date) {
            var ds = date.toDateString().split(/ /),
                mon = monthDict[date.getMonth()],
                day = date.getDate()+'',
                dayi = parseInt(day),
                year = date.getFullYear(),
                thisyear = (new Date()).getFullYear(),
                th = 'th';
            
            // anti-'th' - but don't do the 11th, 12th or 13th
            if ((dayi % 10) == 1 && day.substr(0, 1) != '1') {
                th = 'st';
            } else if ((dayi % 10) == 2 && day.substr(0, 1) != '1') {
                th = 'nd';
            } else if ((dayi % 10) == 3 && day.substr(0, 1) != '1') {
                th = 'rd';
            }
            
            if (day.substr(0, 1) == '0') {
                day = day.substr(1);
            }
            
            return mon + ' ' + day + th + (thisyear != year ? ', ' + year : '');
        }
        
        delta = delta + (relative_to.getTimezoneOffset() * 60);

        if (delta < 5) {
            r = 'less than 5 seconds ago';
        } else if (delta < 30) {
            r = 'half a minute ago';
        } else if (delta < 60) {
            r = 'less than a minute ago';
        } else if (delta < 120) {
            r = '1 minute ago';
        } else if (delta < (45*60)) {
            r = (parseInt(delta / 60)).toString() + ' minutes ago';
        } else if (delta < (2*90*60)) { // 2* because sometimes read 1 hours ago
            r = 'about 1 hour ago';
        } else if (delta < (24*60*60)) {
            r = 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
        } else {
            if (delta < (48*60*60)) {
                r = formatTime(date) + ' yesterday';
            } else {
                r = formatTime(date) + ' ' + formatDate(date);
                // r = (parseInt(delta / 86400)).toString() + ' days ago';
            }
        }

        return r;
    }

