(function (){

    var $list, $speakers, $keynotes, $prev_button, $next_button;
    var per_page, page_num = 1, pages = {}, total_pages = 1;

    jQuery(function ()
    {
	    getTweetsBy();
	    getTweetsAbout();
	    initSpeakerPagination();

    });

    function initSpeakerPagination()
    {
	    var internal_page = $('#content.internal').length;
        per_page = internal_page ? 6 : 10;

	    getElements();
        shuffleSpeakers();
	    getPage(1).show();
	    if (internal_page){ applyScrollControls(); }
    }

    function formatResults( response, type )
    {
        type = type || 'rest';
	    var REST = (/^rest$/i).test(type);

	    var id = REST ? 'tweets_by' : 'tweets_about';
        var list = document.getElementById( id );
	    var rgx = {
	        url: (/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g),
	        user: (/\B@([_a-zA-Z0-9]+)/ig),
	        hash: (/\B#([_a-zA-Z0-9]+)/ig)
	    };

	    var tweets = REST ? response : response.results;
	    var i=0, l=tweets.length;
	    var html = [], tweet, username, status, by, item, url, at, link;
	    while (i < l){
	        tweet    = tweets[ i ]; 
    	    username = REST ? tweet.user.screen_name : tweet.from_user;
    	    status   = tweet.text.replace(rgx.url, createAnchor).replace(rgx.user, formatUser).replace(rgx.hash, formatTag);
	        url      = ['http://twitter.com/', username, '/statuses/', tweet.id ].join('');
	        by       = !(REST) ? '<em class="tweeter">By: '+formatUser( username ) + '</em>' : null;
	        at       = relativeTime( tweet.created_at);
	        link     = createAnchor(url, at, 'tweet-time');
	        item     = [ '<li> <span>' ,status, '</span> ', by, link, '</li>' ].join('');

	        html.push( item );
	        i++;
  	    }
  	    list.innerHTML = html.join('');
    }

    function formatTag( tag )
    {
	    return [ tag.charAt(0), createAnchor('http://search.twitter.com/search?q=%23'+tag.substring(1), tag.substring(1)) ].join('');
    }

    function formatUser( user ) {
        return [ '@', profileURL( user.replace('@','') ) ].join('');
    }

    function profileURL( user )
    {
        return createAnchor('http://twitter.com/'+user, user);
    }

    function createAnchor( url, text, css ) 
    {
    	text = text || url;
        
        return [ '<a class="',css,'" href="',url,'">',text,'</a>' ].join('');
    }

    function relativeTime( time_value, relative_to )
    {
	    relative_to = relative_to || new Date();

  	    var parsed_date = Date.parse(time_value);
  	    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 getTweetsBy()
    {	
	    $.ajax({
	        type: 'get',
	        dataType: 'jsonp',
	        url: 'http://api.twitter.com/statuses/user_timeline/surgecon.json',
	        data: {count: 1},
	        success: function ( response ){ formatResults( response, 'rest' ); },
	        error: function (){  }
	    });
    }

    function getTweetsAbout()
    {	
    	var terms = ['#surgecon', '#surgeconf'], search = terms.join(' OR ');

	    $.ajax({
	        type: 'get',
	        dataType: 'jsonp',
	        url: 'http://search.twitter.com/search.json',
	        // there isn't a 'count' or 'max' argument
	        // so do 'rpp' (results_per_page) * 'page' instead
	        data: {q: search, rpp: 1, page: 1},
	        success: function ( response ){ formatResults( response, 'search' ); },
	        error: function (){  }
	    });
    }

    function getElements()
    {
	    $list        = $('#speaker-list');
	    $speakers    = $list.find('.speaker');
	    $keynotes    = $speakers.filter('.keynote');
	    $prev_button = $('#left-arrow');
	    $next_button = $('#right-arrow');
	    total_pages  = Math.ceil( $speakers.length / per_page );
    }

    function applyScrollControls()
    {
	    $prev_button.bind('click', -1, onPrevNextButtonClick);
	    $next_button.bind('click', 1, onPrevNextButtonClick);
	    if (total_pages > 1){ $next_button.show(); }
    }

    function onPrevNextButtonClick( e )
    {
        var modifier = e.data,
	        new_num = page_num + modifier,
	        limited = Math.clamp(new_num, 1, total_pages)
	    ;

	    e.preventDefault();
	    getPage( page_num ).fadeOut(function (){ getPage( limited ).fadeIn(); });	

	    (total_pages > 1 && limited < total_pages) ? $next_button.show() : $next_button.hide();
	    (total_pages > 1 && limited !== 1) ? $prev_button.show() : $prev_button.hide();

	    if (limited != 1 && limited != total_pages){
	        $prev_button.addClass('both');
	        $next_button.addClass('both');
	    } else {
	        $prev_button.removeClass('both');
	        $next_button.removeClass('both');
	    }
    }

    function getPage( page, force )
    {
	    page_num = page = Math.clamp(page, 1, total_pages);
        if (!force && pages[ page ]) return pages[ page ];

	    var min = ( (page-1) * per_page);
	    var max = ((per_page >= $speakers.length || (page * per_page) >= $speakers.length ) ? $speakers.length : (page * per_page));

	    return pages[ page_num ] = $speakers.slice(min, max);
    }

    function shuffleSpeakers()
    {
	    var keynotes = $keynotes.length, last_keynote = (keynotes && keynotes-1) || 0,
            shuffled = shuffle( $speakers.filter(':gt('+last_keynote+')').get() );

	    $speakers = $( [].concat($keynotes.get(), shuffled) );
	    updatePages();
    }

    function updatePages(){
        for (var i=0; ++i <= total_pages;){ getPage(i); }
    }

    function shuffle( arr , act_on_copy )
    {
	    if (act_on_copy){ arr = [].concat(arr); }
    	var i = arr.length;
    	var temp = {};

    	if ( !i ) return false;

    	while ( --i ) {
	        var j = Math.floor( Math.random() * ( i + 1 ) );
	        temp.i = arr[ i ];
	        temp.j = arr[ j ];
	        arr[ i ] = temp.j;
	        arr[ j ] = temp.i;
        }

        return arr;
    }

    Math.clamp = function( num, min, max )
    {
	    return Math.min(max, Math.max(min, num));
    };

})();

// Asynchronous version of Google Analytics tracking
var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-2585213-1']);
_gaq.push(['_trackPageview']);

(function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

