String.prototype.withClickableURLs = function() {
	return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(url) {
		return url.link(url);
	});
};


$(function(){

	getFooterTweets('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=SenseInternet', '#senseInfo p');
	getFooterTweets('http://api.twitter.com/1/statuses/user_timeline.json?screen_name=tweetcurve', '#tweetcurveInfo p');
	function getFooterTweets( url, container ) {
		$.ajax({
			url			: url,
			dataType	: 'jsonp',
			success		: function(json){ 
				$(container).html(json[0].text.withClickableURLs());
			}
		});
	}
	

	
	
	var homepage = $('#homepage');
	var graphPage = $('#graphPage');

	/*********************
	 *
	 *	HOMEPAGE
	 *
	 *********************/
	if (homepage.length) {
				
		// Homepage help text
		var currText = 1; 
		$('#explainNavigation').find('a').click(function(e) {
			e.preventDefault();
			var scrollerText 	= $('#introTextContainer');
			var infoTexts 		= $('.infoText');			
			
			if ($(this).hasClass('left')) { 
				if (currText > 1) {
					currText--;
					scrollerText.animate( { left: '+=940' }, 400, updateDots );
				}
			} else {
				if (currText < infoTexts.size()) {
					currText++;
					scrollerText.animate( { left: '-=940' }, 400, updateDots );
				}
			}
		});
		function updateDots() {
			$('#jsPagePosition').attr("src", "images/scanPosition"+currText+".png");
			
			(currText == 1) ? $('.scanLeft').css({visibility:"hidden"}) : $('.scanLeft').css({visibility:"visible"});
			(currText == $('.infoText').size()) ? $('.scanRight').css({visibility:"hidden"}) : $('.scanRight').css({visibility:"visible"});
		}
		
		updateDots();
		
		$('#piechart').click(function(e){ window.scrollBy(0, 400); });

	// Get homepage graph data
	$.ajax({
        type: "GET", url: "data/frontPage.xml", dataType: "xml",
		success: function(xml) {
			var allParties 	= [];
			var pieChart	= [];	
	
            $(xml).find('party[name=cons]').attr({ outlineColor: "#018BCA", fillColor: "rgba(98, 204, 253, 1)", 	domElement: "#miniConservatives .miniGraph" });
            $(xml).find('party[name=labs]').attr({ outlineColor: "#C40F02", fillColor: "rgba(255, 71, 58, 1)", 	domElement: "#miniLabour .miniGraph" });
            $(xml).find('party[name=libs]').attr({ outlineColor: "#F7CE00", fillColor: "rgba(255, 237, 81, 1)", 	domElement: "#miniLibDems .miniGraph" });
            
			$(xml).find('party').each(function(){
				
				var party			= this.getAttribute('name');
				
				// GRAPHS
				var partyData 		= [];
				var hours 			= $(this).find('hour');
				var partyFillColor	= this.getAttribute('fillColor');
				var outlineColor	= this.getAttribute('outlineColor');
				var domElement		= this.getAttribute('domElement');
				
				var lastWeek		= [ party, parseInt(this.getAttribute('numTweetsLastWeek')) ];
				pieChart.push( lastWeek );
				
				hours.each(function(i){ 
					partyData.push( [ i, this.getAttribute('total') ] ); 
				});
				
				$.plot($(domElement), [ { data: partyData } ], {
					grid	: { show: false, hoverable: false },
					colors	: [ outlineColor ],
					bars	: {
						show		: true,
						align		: "center",
						lineWidth	: 1,
						fillColor	: partyFillColor
						}
					});
					
				// TEXT
				$("ul."+party+" .jsTweetsToday").html(this.getAttribute('numTweetsToday'));
				$("ul."+party+" .jsTweetsYesterday").html(this.getAttribute('numTweetsYesterday'));
				
				// Build top words string
				var words			= $(this).find('word');
				var wordsString		= "";
				words.each(function(i){ 
					var thisWrd		= ($(this).text().length > 10) ? $(this).text().substr(0,10)+"...": $(this).text() ;
					wordsString		+= thisWrd+", ";
				});
				wordsString = wordsString.substr(0, wordsString.lastIndexOf(",")); // trim the comma off the end
				wordsString = (wordsString.length > 130) ? wordsString.substr(0, 130)+"..." : wordsString ;
				var wordsArr = wordsString.split(",");
				$("."+party+" .jsTopWords").html(wordsString);				
			});
		
			// PIE CHART - Normalise last weeks totals (must be less than 100)
			var pieTot = 0;
			for(var x=0; x<3; x++) { pieTot += pieChart[x][1]; }
			for(var x=0; x<3; x++) { pieChart[x][1] = pieChart[x][1] / pieTot; }
			$('#piechart').attr( {"src":"http://chart.apis.google.com/chart?cht=p&chs=200x150&chd=t:"+pieChart[0][1]+","+pieChart[1][1]+","+pieChart[2][1]+"&chco=ef2719|fcd92c|008ac9&chf=bg,s,00000000&chp=0.628"} );
			$('.infoText li.cons').html( Math.round(pieChart[2][1]*100)+"%" );
			$('.infoText li.labs').html( Math.round(pieChart[0][1]*100)+"%" );
			$('.infoText li.libs').html( Math.round(pieChart[1][1]*100)+"%" );
			
			// Animate in the party graphs
			$("#miniConservatives .miniGraph").animate({top:0}, 900, function() { 
				$("#miniLabour .miniGraph").animate({top:0}, 600, function() {
					$("#miniLibDems .miniGraph").animate({top:0}, 800);
				}); 
			} );
			
		}
	});
	}

	
	/*********************
	 *
	 *	GRAPH PAGE
	 *
	 *********************/
	if (graphPage.length) {
				
		$('#tweetsWrap').hide();
		$('#graphOptions').hide();
		
		// Overlays
		$("#goHelpLink[rel]").overlay({effect: 'apple'});
		$("a.viewAllLink[rel]").overlay({effect: 'apple'});
		
		if ($.browser.msie) {
			var ieBlocker 	= $('#IEblocker'), caution 	= $('#cautionLink');
			
			ieBlocker.show();
			caution.show();
			
			caution.click(function(e){
				ieBlocker.toggle();
			});
			ieBlocker.find('a.jsClose').click(function(e){
				e.preventDefault();
				ieBlocker.hide();
			});
		}
		
		/*
		 *	More / Less Options
		 */
		var moreOpts = $('#moreOptionsWrap'); //moreOpts.hide();
		$('#minMaxOptions a').click(function(e) {
			e.preventDefault();
			$(this).toggleClass('showMore');
			($(this).hasClass('showMore')) ? $(this).prev('label').html('More') : $(this).prev('label').html('Less');
			moreOpts.toggle();
		});

		$('#TGViewModeChooser').get(0).selectedIndex=0;
		$('#TGViewModeChooser').change( function() {
			theGraph2.setViewMode($(this).val());
		});		
		
		// Search filter
		var filterInput		= $('#TGWordFilter');
		var clearBtn		= $('#refineSearch a');
		clearBtn.hide();
		clearBtn.click(function(e){
			e.preventDefault();
			filterInput.val("").trigger('keyup');
			filterInput.removeClass('searching');
			clearBtn.hide();
		});
		filterInput.keydown( function() { 
			filterInput.addClass('searching');
			clearBtn.show();
		});
		
		/*
		 *		scrollbar
		 */
		var tweetsWrap = $('#allTweetsWrap');
		var scrollbarImg = $("#scrollbarImg");		
		$("#scrollbarImg").draggable({
			containment	: 'parent',
			start		: function() { console.log('started dragging'); },
			drag		: function() {
							var percent = $(this).position().top / 343;
							var fullScrollAmt = tweetsWrap.height() - 475;
							var newPos = percent * fullScrollAmt;
							tweetsWrap.css({top: -newPos});
						},
			stop		: function() { 
				var twYpos = tweetsWrap.position().top;
				var snapPx = Math.abs( Math.round( (twYpos * -1) % 95) - 95 );
				
				if (snapPx >= 48) {
					var dwn = 95 - snapPx;
					tweetsWrap.animate({top: "+="+dwn+"px"}, 100, updateScrollbar);
				} else {
					tweetsWrap.animate({top: "-="+snapPx+"px"}, 100, updateScrollbar);
				}
			}
		});
		$('#tweetsScrollbar').children('img').click(function(e) {
			var amt = ($(this).hasClass('jsUp')) ? 95 : -95 ;
			
			if (!isScrollable(tweetsWrap, amt)) return;
			tweetsWrap.animate({top: "+="+Math.round(amt)+"px"}, 100, updateScrollbar);
		});
		$('#tweetsScrollbar').click(function(e){
			var scrollbarBtm = scrollbarImg.position().top;
			if (e.pageY > scrollbarBtm ) {}
			console.log('clicked at: '+e.pageY+' scrollbarBtm: '+scrollbarBtm);
		});
		function updateScrollbar() {
			var barTop = Math.round( (343 / (tweetsWrap.height() - 475)) * (-1 * tweetsWrap.position().top) );
			$("#scrollbarImg").css({top: barTop});
		}     
		function isScrollable(tweetsWrap, amt) {
			var Ypos = Math.round( tweetsWrap.position().top );
			console.log('Ypos='+Ypos+' amt='+amt);
			if (Ypos >= 0 && amt > 0) return false;
			if (amt < 1) { // negative means scroll down
				return ( (tweetsWrap.height() + Ypos) > 475 ) ? true : false;
			} else {
				return ( Ypos != 0 ) ? true : false;
			}
		}
		
		/*
		 *		Dynamic link to current view
		 */
		$("#sendALinkPanel").find("a.close").click(function(e){ $("#sendALinkPanel").hide(); });
		$("#sendALinkPanel").find("a.jsFullUrlLink").click(function(e){ 
			var longLinkRow = $("#longLinkRow");
			longLinkRow.show();
			longLinkRow.find("#longLink").select();
			$("#longUrlLink").hide();
		});
		
		$("#sendALink").click(function(e){
			e.preventDefault();
				
			var lnkPanel 		= $("#sendALinkPanel");
			var tweetThisBtn 	= lnkPanel.find("#tweetThisButton");	
				
			lnkPanel.toggle();
			
			var myLink   =  window.location.toString().replace(/\?.*/,'');
			myLink		+= "?party="+escape($.query.get('party'));
			myLink		+= "&load=true";
			myLink		+= "&from="+escape(theGraph1.getZoom().from);
			myLink		+= "&to="+escape(theGraph1.getZoom().to);
			myLink		+= "&viewMode="+escape(theGraph1.options.viewMode);
			myLink		+= "&wordFilter="+escape($("#TGWordFilter").val());
			myLink		+= "&genderFilter="+escape($("#TGGenderFilter").val());
			myLink		+= "&retweetFilter="+escape($("#TGRetweetFilter").val());
			myLink		+= "&showTweets="+escape($('#tweetsWrap:visible').length);
			myLink		+= "&barClickX="+escape(barClickX);
			myLink		+= "&barClickY="+escape(barClickY);
	
            $.getJSON('http://api.bit.ly/v3/shorten?login=tweetlectionusers&apiKey=R_0f64812dd9c3703bb389cd3ec04dfb2e&longUrl='+escape(myLink)+'&callback=?',function(response) {
                var shortUrl = response.data.url;
                var twitterMessage = "Just seen this on tweetlection.co.uk "+shortUrl;
                var twitterUrl = "http://twitter.com/home?status="+escape(twitterMessage);
                console.log('Link = '+shortUrl);
                console.log('Twitter = '+twitterUrl); 

				lnkPanel.find("#shortLink").val(shortUrl).select();
				lnkPanel.find("#longLink").val(myLink);
				
				tweetThisBtn.unbind('click');
				tweetThisBtn.click(function(e){
					window.open(twitterUrl);
				});				
            });
		});
		

		/*
		 *		THE GRAPHS
		 */
		var theGraph2;		
		var mainColours 		= [ "rgb(99, 95, 79)", "rgb(127, 123, 105)", "rgb(172, 167, 143)", "rgb(117, 110, 84)", "rgb(204, 199, 177)", "rgb(163, 156, 125)", "rgb(214, 207, 172)", "rgb(153, 145, 116)", "rgb(191, 186, 160)", "rgb(152, 149, 126)" ];
		var partyColor			= "";
		var timeLabel 			= $('#timeLabel');
		var dataLabel 			= $('#dataLabel');
		var party 				= $.query.get('party');
		var searchTerm			= "";

        // In order to be able to open whichever bar the user may have had open when using the
        // "link to this view" option we need to capture the pageX and pageY location of all the clicks
        // and then replay the click
        // so that we can access these parameters for inclusion in the "link to this view" link
        var barClicked = false;
        var barClickX = 0;
        var barClickY = 0;
        
		$('#mainGraphHolder').click( function(e) {
            // This is required to capture the click location
            // when the user clicks on a bar
            if (barClicked) {
                var offset = $('#mainGraphHolder').offset();
                barClickX=Math.round(e.pageX - offset.left);
                barClickY=Math.round(e.pageY - offset.top);
                barClicked = false;
            }
        });
      
        var setupPhase = 0;
        var needsClickTrigger = false;
        
        function setupView() {
            if (setupPhase>2) return false;

            if ($.query.get('load')!='true') {
                setupPhase=99;
                return false;
            }

            setupPhase++;

            if (setupPhase==1) {
                var wordFilter = $.query.get('wordFilter');
                var genderFilter = $.query.get('genderFilter');
                var retweetFilter = $.query.get('retweetFilter');
                var viewMode = $.query.get('viewMode');
            
                if (wordFilter.length>0) {
                    $("#TGWordFilter").val(wordFilter);
                    theGraph1.getTweetFilter().setWordFilter(wordFilter);
                }
                if (genderFilter.length>0) {
                    $("#TGGenderFilter").val(genderFilter);
                    theGraph1.getTweetFilter().setGenderFilter(genderFilter);
		}
                if (retweetFilter.length>0) {
                    $("#TGRetweetFilter").val(retweetFilter);
                    theGraph1.getTweetFilter().setRetweetFilter(retweetFilter);
		}
                theGraph1.reprocessData();
            }

            if (setupPhase==2) {

                var barClickX = $.query.get('barClickX');
                var barClickY = $.query.get('barClickY');
                
                var offset = $('#mainGraphHolder').offset();
                var x = Math.round(barClickX + offset.left);
                var y = Math.round(barClickY + offset.top);
                console.log('Clicking at ',x,y);

                window.setTimeout(function() {
                    $('div#mainGraphHolder canvas:first').trigger({
                        type    : 'click',
                        pageX   : x,
                        pageY   : y
                    });
                },500);
            }
            
        }
        
        addWordsToIgnore('party,vote,up,out,don,think,people,now,well,more,less,new,voting,done,good');
        addWordsToIgnore('labour,lib,dem,dems,conservative,tory,tories');
		switch(party) {
			case 'cons':
				searchTerm		= "conservative OR conservatives OR tory OR tories";
				partyColor 		= "rgba(98, 204, 253, 1)";
				partyColorDark	= "rgba(3, 91, 120, 1)";
				var grad1		= "#63cdfd";
				var grad2		= "#028bca";
                addWordsToIgnore('cameron,david');
				break;
			case 'labs':
				searchTerm		= "labour OR labours";
				partyColor 		= "rgba(255, 71, 58, 1)";
				partyColorDark	= "rgba(147, 11, 1, 1)";
				var grad1		= "#ef281a";
				var grad2		= "#bc190d";
                addWordsToIgnore('gordon,brown');
				break;
			case 'libs':
				searchTerm		= '"liberal democrats" OR "lib dems" OR "lib dem" OR "liberal democrat"';
				partyColor 		= "rgba(255, 237, 81, 1)";
				partyColorDark	= "rgba(136, 115, 1, 1)";
				var grad1		= "#fcd92b";
				var grad2		= "#f7ce00";
                addWordsToIgnore('nick,clegg');
				break;
		}

	
		var datFile = ($.browser.msie) ? party+'_ie': party;
		var now = new Date().getTime();
        
        var from = $.query.get('from');
        var to = $.query.get('to');
        var startZoomFrom = from?from:1273100400000;
        //var startZoomFrom = from?from:now-86400000*1;
        var startZoomTo = to?to:1273100400000+86400000;

		theGraph1 = new TweetGraph({
            bucketSizes         : [
                    30*60, 3600, 7200, 3600*6
            ],
			staticDataUrl		: 'data/'+datFile+'.dat',
            numLoadPages    : 10,
			autoWidth	: true,
            viewMode    : $.query.get('viewMode'),
			searchTerm	: searchTerm,
			container	: $('#mainGraphHolder'),
			showWordBreakdown : true,
            highlightColor  : partyColorDark,
			zoom		: {from:startZoomFrom, to:startZoomTo},
			flotOptions	: {
				legend	: { 
					container : $('#topTenWords'),
					noColumns : 11,
					labelBoxBorderColor: "rgb(255, 255, 255)",
					labelFormatter: function(label, series) {
						// series is the series object for the label
						return '<div class="TGHighlight" style="z-index:999" TGword="' + label + '">' + label + '</div>';
					}
				},
				colors	: mainColours,
				bars	: { lineWidth: 0, fill: 0.9, align: "left" },
				grid	: { 
					borderWidth	: 0,
					color		: "rgb(51, 51, 51)",
					tickColor	: "rgb(231, 231, 231)",
					labelMargin	: 10
					},
				yaxis	: { 
					labelWidth	: 0, 
					tickFormatter: function(){ return ""; }
				},
				xaxis	: { 
					labelWidth		: 30
					//tickSize		: [ 1, "day" ]
				},
				crosshair: { mode: "x", color: "rgba(51, 51, 51, 0.6)" }
			},
            onZoom				: function( from, to ) {
				if (!theGraph2) return true;
				theGraph2.flotGraph.setSelection({ xaxis: { from: from, to: to } }, true);
				return true;
			},
			onLoadEnd			: function() {
				if (!theGraph2) {
					theGraph2 = new TweetGraph({
                        bucketSizes         : [
                                3600
                        ],
						autoWidth	: true,
						container	: $('#graph2'),
						dataSource	: theGraph1.getDataSource(),
						onZoom		: function( from, to ) {
							theGraph1.zoomTo(from,to);
							return false;
						},
						flotOptions	: {
							legend	: { show: false },
							grid	: { show: true, borderWidth	: 0, labelMargin: 0, backgroundColor: { colors: [grad1, grad2] } },
							bars	: { lineWidth: 0, fillColor: partyColor },
							series	: [ {clickable:false, hoverable:false} ],
							yaxis	: { ticks:0, labelWidth: 0, tickFormatter: function(){ return ""; } },
							xaxis	: {
								autoscaleMargin	: 5,
								labelWidth		: 30,
								labelHeight		: 0,
								tickSize		: [ 1, "day" ]	
								//tickSize		: [ 1, "hour" ]	
							}
						},
                        onClick     : function(e,pos) {
                            theGraph1.zoomTo(pos.x-3600000*0.5,pos.x+3600000*0.5);
                            //theGraph1.zoomTo(pos.x-86400000*0.5,pos.x+86400000*0.5);
                        },
						onLoadEnd	: function() {
							$('#graph2').css( {background: "#fff"} );
                            setupView();
						},
						onDraw              : function() {
							theGraph2.flotGraph.setSelection({ xaxis: theGraph1.getZoom() }, true);
							$('#IEblocker').hide();
							$('#graphOptions').show();
						}
					});
					theGraph2.draw();
				} else {
					theGraph2.setDataSource(theGraph1.getDataSource());
				}
			},
			onDraw				: function() {
				// Append empty cell to topTenWords table for dynamic width calculator
				$(".legendLabel:last").after("<td></td>");
				
				// click handlers for top ten words
				var tenWords = $('.TGHighlight');
				tenWords.each(function(){ 
					$(this).click(function(e){ 
						filterInput.val( $(this).html() ).trigger('keyup');
						clearBtn.show();
					}); 
				});
				filterInput.removeClass('searching');
				if (!filterInput.val()) clearBtn.hide();
                setupView();
			},
			onLoadProgressUpdate	: function(pct) {
				pct = pct || 0;
				$('#loadingProgressBar').html(pct+'%').css('width',pct+'%'); // temp conditional to make ie work
			},
			onProcessingProgressUpdate	: function(pct) {
				pct = pct || 0;
				$('#processingProgressBar').html(pct+'%').css('width',pct+'%'); // temp conditional to make ie work
			},
			onHover				: function( e, pos, data ) {
				// compute offsets
				var buffer	= $("#content").position().left + 44;
				var bufferD = buffer + (dataLabel.width() / 2);
				var bufferT = buffer + (timeLabel.width() / 2);
				
				// min and max vals
				var dataPos = (pos.pageX-bufferD <= 0) ? 0 : (pos.pageX-bufferD >= 895) ? 895 : pos.pageX-bufferD; 
				var timePos	= (pos.pageX-bufferT <= 0) ? 0 : (pos.pageX-bufferT >= 840) ? 840 : pos.pageX-bufferT;
				
				dataLabel.html( data.numTweets * data.samplingRatio +" tweets" ).css('left',dataPos);
				timeLabel.html( new Date(pos.x).toLocaleString() ).css('left',timePos);
			},
			onBarHoverStart		: function(data) {
				this.hightlightWord( data.series, partyColorDark );
				
				var wrd 	= $(".TGHighlight[tgword="+data.word+"]");
				var nxtWrd 	= wrd.parent().next();
				var wdth 	= nxtWrd.position().left - wrd.position().left;
				
				wrd.addClass('hovering');
				$("#hoveredWord").stop().animate({ 
					left	: wrd.position().left -29,
					width	: wdth + 15,
					opacity	: 0.7					
				}, 500);
			},
			onBarHoverEnd		: function() {
				this.unhighlight();
				$(".TGHighlight").removeClass('hovering');
				$("#hoveredWord").stop().animate({ opacity: 0 }, 500);
			},
			onBarClick	: function(data) {
		
				var tweetGraph 	= this;
				var tweets 		= false;
				var tweetView 	= $('#tweetsWrap');
				var tweetFilter = new TweetFilter();
				var wordFilter	= tweetView.find('#wordFilters');

				this.unhighlight();
				this.highlightColumn( data.item.dataIndex, partyColorDark );
			
                // this gets picked up and then unset by a click handler associated with the canvase element
                // This handler is defined above
                barClicked = true;

				function processTweets(theTweets) {
					console.log()
					rebuildWordFilter();
					tweets = theTweets;
					displayTweets('');
				}

				function getSampledTweets() {
					data.getSampledTweets( processTweets );
				}

				function rebuildWordFilter() {
					
					wordFilter.html('');
					
					var fltrHTML = '<ul><li><a href="#" class="selected">All tweets ('+data.numTweets*data.samplingRatio+')</a></li>';
					
					var len = (data.topWords.length > 9) ? 9 : data.topWords.length;
					for (var i=len; i>=0; i--) {
						var word = (data.topWords[i].length < 15) ? data.topWords[i]: data.topWords[i].substr(15)+'...';
						var count = data.wordCounts[word];
						if (!count) continue;
						fltrHTML += '<li><a href="#" word="'+data.topWords[i]+'">'+data.topWords[i] + ' ('+count*data.samplingRatio+')</a></li>';
					}
					fltrHTML += '</ul>';
					wordFilter.html(fltrHTML);
					
					// define onclick for the new buttons
					wordFilter.find('a').click(function(e) {
						e.preventDefault();
						
						wordFilter.find('a').removeClass('selected');
						$(this).addClass('selected');

						displayTweets( $(this).attr('word') );
					});
				}

				function displayTweets( word ) {	
					console.log('refiltering ',tweets.length,' tweets for ',word);
					if (!tweets) return;

					console.log(tweetGraph.flotGraph.getSelection);
					
					$("#scrollbarImg").css({top: 0});
					tweetsWrap.css({top: 0});
					
					if (word) {
						tweetFilter.setWordFilter( word );
						tweetView.find('#filterDetails').html('Containing "'+word+'"');
					} else {
						tweetFilter.setWordFilter('');
						tweetView.find('#filterDetails').html('Filter by:');
					}

					tweetView.find('.tweetWrap').remove();
					//tweetView.find('#tweetDataFooter').remove();

					var numTweets 	= 0;
					var html 		= "";
					for (var i=tweets.length-1; i>=0; i--) {
						if (i>500) i=500;
						var tweet = tweets[i];
						if (!tweetFilter.includeTweet(tweet)) continue;
						numTweets++;
						
						
						var re = new RegExp("\\s"+word,"i");
						if (word) tweet.fullText = tweet.fullText.replace(re,'<span class="keyword">'+word+'</span>');
						
						html  += '<div class="tweetWrap">';
						//html  += '<div class="profilePic"><img src="images/defaultTwitterPic.jpg" alt="Profile pic" /></div>';
						html  += '<div class="tweetData">';
						html  += '<div class="tweetAuthor '+party+'">'+tweet.fromUser+' ';
						html  += '<span class="tweetTimestamp">'+(new Date(tweet.createdAt).toLocaleString())+'</span>';
						html  += '</div>';
						html  += '<div class="tweetText">'+tweet.fullText.withClickableURLs()+'</div>';
						html  += '</div>';
						html  += '</div>';
						
					}
					tweetView.find('#allTweetsWrap').prepend(html);
					tweetView.find('.tweetText a').attr("target","_blank").css("color",partyColorDark);
					
					tweetView.find('#numTweets').html(numTweets);
					tweetView.find('#scaledNumTweets').html(numTweets * data.samplingRatio);

					(numTweets < 5) ? $('#tweetsScrollbar').css({visibility:"hidden"}) : $('#tweetsScrollbar').css({visibility:"visible"});				
				
					// remove previous keyword highlighting
					$('.tweetText span.keyword').each(function(e){
						if ($(this).html() != word) $(this).removeClass('keyword');
					});
				}

				
				tweetView.show();

				// Tweets - meta data
				console.log( 'date from ' + formatDate(data.bounds.from).time );

				tweetView.find('#fromDate').html( formatDate(data.bounds.from).date );
				tweetView.find('#fromTime').html( formatDate(data.bounds.from).time );
				tweetView.find('#toDate').html( formatDate(data.bounds.to).date );
				tweetView.find('#toTime').html( formatDate(data.bounds.to).time );
				
				tweetView.find('#totalTweets').html(data.numTweets*data.samplingRatio);
				
				getSampledTweets();

				tweetView.find('#viewOlderButton').unbind('click').click(function(e) {
					e.preventDefault();
					tweetGraph.processBarClick( data.item, data.series, +1 );
				});

				tweetView.find('#viewNewerButton').unbind('click').click(function(e) {
					e.preventDefault();
					tweetGraph.processBarClick( data.item, data.series, -1 );
				});
				
			}
		});

	}
	
	function formatDate( date ) {
		
		var dateObj	= {};
		var dateRaw = new Date(date).toDateString();
		
		dateObj.date	= 	dateRaw.substr(0, dateRaw.length-5);
		dateObj.time	= 	new Date(date).toLocaleTimeString();
		
		return dateObj;
	}

 
 });

