/**
 * @file:			Tweetywall.js
 * @owner:			Alex Hall (http://www.devseo.co.uk
 * @version:		1.0.7
 * @dependencies:	Yahoo-Dom-Event, Animation, Get
 *
 **/
YAHOO.namespace('tweetywall');
YAHOO.tweetywall.main = {
	// Change the settings below this line
	//---------------------------------------------------------------------------------------
	show_feeds:		5,			// The maximum number of feeds to show
	searchterm:		'seo',		// Search term (for more separate with a comma)
	speed:			5000,		// Change this setting to change the speed of tweets
	recheck:		10000,		// The time to re-check Twitter once all feeds have shown
	show_anim:		true,		// If set to false the feeds will not animate
	show_menu:		true,		// If set to false it will remove the number of tweets section
	show_picture:	true,		// If set to false the profile picture will not show up in the tweet
	picture_side:	'left',		// Which side of the tweet should the profile picture appear (left or right)
	max_feeds:		15,			// The maximum number of feeds to return at once (max is 15)
	language:		'en',		// Language code for the language you would like to search for (blank for all)
	api_key:		'',			// Your API Key, which you should have been given when you signed up
								// Should look like '570cfc5ca9d32dd577c75d287f905e68' (this won't work!)
	//---------------------------------------------------------------------------------------
	// Do not modify anything below this line unless you know what you're doing!
	//---------------------------------------------------------------------------------------
	YE:				YAHOO.util.Event,
	Dom:			YAHOO.util.Dom,
	$:				YAHOO.util.Dom.get,
	Get:			YAHOO.util.Get,
	numTweets:		0,
	numFeeds:		0,

	// Main starter function to set things up
	init: function(){
		tw.container = tw.$('twitterFeeds');
		if(tw.container){
			tw.container.innerHTML = '<p id="firstRun">Requesting feeds...</p>';

			if(tw.show_menu === true){
				tw.build_container();
			}
			tw.get_tweets();
			tw.pauseLink = tw.$('pauseTweets');
			if(tw.pauseLink)
			{
				tw.YE.on(tw.pauseLink, "click", tw.pause_tweets);
			}
			tw.clearLink = tw.$('clearTweets');
			if(tw.clearLink)
			{
				tw.YE.on(tw.clearLink, "click", tw.clear_tweets);
			}
			tw.changeLink = tw.$('changeLink');
			if(tw.changeLink)
			{
				tw.YE.on(tw.changeLink, "click", tw.change_interval);
			}
		}
	},

	// Build the container for the number of tweets (if set to true)
	build_container: function(){
		var twSt = document.createElement('div');
		tw.Dom.insertBefore(twSt, tw.container);
		twSt.id = 'tweetStats';

		tw.numTweetsP = document.createElement('p');
		twSt.appendChild(tw.numTweetsP);
		tw.numTweetsP.id = 'numberTweets';

		tw.totalTweetsP = document.createElement('p');
		twSt.appendChild(tw.totalTweetsP);
		tw.totalTweetsP.id = 'totalTweets';
	},

	// Uses a YUI Get request to retrieve tweets as a JSON object
	get_tweets: function(){
		var sUrl = 'http://www.devseo.co.uk/ajax/tweetywall?getquotes=true&term='+tw.searchterm+'&max_feeds='+tw.max_feeds+'&lang='+tw.language+'&api_key='+tw.api_key;
		var transactionObj = tw.Get.script(sUrl, {
	        onSuccess: tw.show_results.success,
	        onFailure: tw.show_results.error,
	        scope    : this,
			varName: ["YAHOO.tweetywall.main"]
	    });
	},

	// Handler function for the Get response
	show_results: {
		success: function(){
			// Success handler for event changes on transaction success
		},
		error: function(){
			// Error handler in case of issues
			tw.container.innerHTML = '<p id="firstRun">Requesting feeds...</p>';
		}
	},

	// Callback function for the Get reponse (where most of the magic happens!)
	callback: function(results){
		var firstRun = tw.$('firstRun');
		if(firstRun){
			firstRun.parentNode.removeChild(firstRun);
		}
		myresults = '{"results":[';
		tw.results = results;
		tw.error = tw.results.Error ? true : false;
		if(tw.error){
			tw.container.innerHTML = '<p>'+tw.results.Error+'</p>';
		} else {
			var aResults = tw.results.ResultSet.results;
			var resLen = aResults.length;
			if(aResults){
				for (var i=0; i < resLen; i++) {
					if(i === (resLen -  1)){
						myresults+= '{"text" : "'+escape(aResults[i].text)+'",'+
						'"from_user" : "'+escape(aResults[i].from_user)+'",'+
						'"profile_image_url" : "'+escape(aResults[i].profile_image_url)+'"}';
					} else {
						myresults+= '{"text" : "'+escape(aResults[i].text)+'",'+
						'"from_user" : "'+escape(aResults[i].from_user)+'",'+
						'"profile_image_url" : "'+escape(aResults[i].profile_image_url)+'"},';
					}
	        	}
			}
			myresults+= ']}';

			var data = [];
			try {
	   			data = YAHOO.lang.JSON.parse(myresults);
	        }
	        catch (x) {
				alert("Error: " + x);
	        }
	        tw.quotesobject = eval(data.results);
	        tw.index = 0;
			tw.numTweets = ((tw.quotesobject.length) - 1);

			var newDiv = tw.create_tweet();

			tw.numFeeds++;

			if(tw.show_menu === true){
				tw.numTweetsP.innerHTML = 'Number of tweets: ' + ((tw.quotesobject.length) - 1);
		        tw.totalTweetsP.innerHTML = 'Total Tweets: ' + tw.numFeeds;
		    }

			if(tw.numFeeds > tw.show_feeds){
				tw.remove_last_tweet();
			}

			if(tw.show_anim === true){
		        tw.Dom.setStyle(newDiv, 'opacity', '0');

				newAnim =  new YAHOO.util.Anim(newDiv,
					{
					   opacity: { to: 1 }
					}, 1, YAHOO.util.Easing.easeOut
				);
				newAnim.animate();
				newAnim.onComplete.subscribe(function(){
			        tw.numTweets = ((tw.quotesobject.length) - 1);
					if(tw.show_menu === true){
			    		tw.numTweetsP.innerHTML = 'Number of tweets: ' + tw.numTweets;
			    	}
				});
			} else {
		        tw.numTweets = ((tw.quotesobject.length) - 1);
				if(tw.show_menu === true){
		    		tw.numTweetsP.innerHTML = 'Number of tweets: ' + tw.numTweets;
		    	}
			}

	        tw.intervalSet = setInterval(tw.next_tweet, tw.speed);
	    }
	},

	// Show next tweet
	next_tweet: function(){
		tw.index++;

		if(tw.numTweets === 0){
			if(tw.show_menu === true){
				tw.numTweetsP.innerHTML = 'Number of tweets: ' + tw.numTweets;
			}
			clearInterval(tw.intervalSet);
			tw.timeOut = setTimeout(tw.get_tweets, tw.recheck);
			return;
		} else {
			tw.numTweets = (tw.numTweets - 1);
			if(tw.show_menu === true){
				tw.numTweetsP.innerHTML = 'Number of tweets: ' + tw.numTweets;
			}

			var newDiv = tw.create_tweet();

			if(tw.show_anim === true){
		    	tw.Dom.setStyle(newDiv, 'opacity', '0');
				newAnim =  new YAHOO.util.Anim(newDiv,
					{
					   opacity: { to: 1 }
					}, 1, YAHOO.util.Easing.easeOut
				);
				newAnim.animate();
			}

			tw.numFeeds++;

			if(tw.show_menu === true){
				tw.totalTweetsP.innerHTML = 'Total Tweets: ' + tw.numFeeds;
			}

			if(tw.numFeeds > tw.show_feeds){
				tw.remove_last_tweet();
			}
		}
	},

	// When the number of tweets hits the limit this removes the last one
	remove_last_tweet: function(){
		var twitFeeds = tw.Dom.getElementsByClassName('twitDiv', 'div', 'twitterFeeds');
		tw.lastTwit = twitFeeds[((twitFeeds.length) - 1)];
		if(tw.lastTwit){
			if(tw.show_anim === true){
				var newAnim = new YAHOO.util.Anim(tw.lastTwit,
					{
						opacity: { to: 0 }
					}, 0.5, YAHOO.util.Easing.easeOut
				);
				newAnim.animate();
				newAnim.onComplete.subscribe(function(){
					tw.lastTwit.parentNode.removeChild(tw.lastTwit);
				});
			} else {
				tw.lastTwit.parentNode.removeChild(tw.lastTwit);
			}
		}
	},

	// For each new tweet we get, this function builds it in HTML (DOM)
	create_tweet: function(){

        var firstTwitDiv = tw.container.getElementsByTagName('div')[0];

        var newDiv = document.createElement('div');
		if(firstTwitDiv){
			tw.Dom.insertBefore(newDiv, firstTwitDiv);
		} else {
	        tw.container.appendChild(newDiv);
	    }
		tw.Dom.addClass(newDiv, 'twitDiv');

		if(tw.show_picture === true){
			var imgDiv = document.createElement('div');
			if(tw.picture_side === 'right'){
				tw.Dom.addClass(imgDiv, 'twitImgDiv right');
			} else {
				tw.Dom.addClass(imgDiv, 'twitImgDiv');
			}
			newDiv.appendChild(imgDiv);
			profileImage = document.createElement('img');
			imgDiv.appendChild(profileImage);
			profileImage.setAttribute('src', unescape(tw.quotesobject[tw.index].profile_image_url));
			profileImage.setAttribute('alt', unescape(tw.quotesobject[tw.index].from_user) + '\'s Image');
			tw.Dom.addClass(profileImage, 'twitImg');
		}

	    newP = document.createElement('p');
        newSpan = document.createElement('span');
        newP.appendChild(newSpan);
        newSpan.innerHTML = '<a href="http://www.twitter.com/' + unescape(tw.quotesobject[tw.index].from_user) + '" title="View This Person On Twitter" onclick="window.open(this.href);return false;">'+unescape(tw.quotesobject[tw.index].from_user)+'</a>: ';
		tw.Dom.addClass(newSpan, 'twitAuth');
		newDiv.appendChild(newP);
		tw.Dom.addClass(newP, 'twitText');
	    newP.innerHTML+= unescape(tw.quotesobject[tw.index].text);

	    return newDiv;
	},

	pause_tweets : function(e){
		tw.YE.stopEvent(e);
		clearInterval(tw.intervalSet);
		tw.pauseLink.innerHTML = "Resume Tweets";
		tw.YE.removeListener(tw.pauseLink, "click");
		tw.YE.on(tw.pauseLink, "click", tw.resume_tweets);
	},

	resume_tweets: function(e){
		tw.YE.stopEvent(e);
		tw.next_tweet();
	    tw.intervalSet = setInterval(tw.next_tweet, tw.speed);
		tw.pauseLink.innerHTML = "Pause Tweets";
		tw.YE.removeListener(tw.pauseLink, "click");
		tw.YE.on(tw.pauseLink, "click", tw.pause_tweets);
	},

	clear_tweets: function(e){
		tw.YE.stopEvent(e);
		tw.container.innerHTML = "";
		tw.index = 0;
	},

	change_interval: function(e){
		tw.YE.stopEvent(e);
		if(tw.speed === 1000){
			tw.speed = 3000;
		} else if(tw.speed === 3000){
			tw.speed = 5000;
		} else {
			tw.speed = 1000;
		}
		tw.changeLink.innerHTML = 'Interval ' + (tw.speed / 1000) + ' seconds';
		clearInterval(tw.intervalSet);
	 	tw.intervalSet = setInterval(tw.next_tweet, tw.speed);
	},

	// PHP Function written for JavaScript. Very handy!
	str_replace: function (search, replace, subject, count){
	    f = [].concat(search),
	    r = [].concat(replace),
	    s = subject,
	    ra = r instanceof Array, sa = s instanceof Array;    s = [].concat(s);
	    if (count) {
	        this.window[count] = 0;
	    }
	     for (i=0, sl=s.length; i < sl; i++) {
	        if (s[i] === '') {
	            continue;
	        }
	        for (j=0, fl=f.length; j < fl; j++) {            temp = s[i]+'';
	            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
	            s[i] = (temp).split(f[j]).join(repl);
	            if (count && s[i] !== temp) {
	                this.window[count] += (temp.length-s[i].length)/f[j].length;}        }
	    }
	    return sa ? s : s[0];
	}
}
tw = YAHOO.tweetywall.main;
tw.YE.onDOMReady(tw.init);
