/**
 * "twTicker" jQuery plugin
 *
 * Simple Twitter slideshow.
 *
 * @author     RaNa design associates, inc.
 * @copyright  2010 RaNa design associates, inc.
 * @license    http://www.opensource.org/licenses/mit-license.html  MIT License
 * @version    Release: 1.1
 * @since      2010-09-16
 * @update     2011-10-12
 */

(function($) {
	$.fn.twTicker = function(options) {
		if (!this[0]) { return; }
		// Variable to keep index of instance
		if (!$.twTicker) { $.twTicker = {}; }
		if (!$.twTicker.index) { $.twTicker.index = 0; }

		this.each(function(i) {
			var index = $.twTicker.index;
			var instanceName = "instance" + (index + i);
			// Make new instance in $.twTicker array object
			$.twTicker[instanceName] = new $.TwTicker();
			// Merge options from arguments
			var opt = $.twTicker[instanceName].options;
			$.extend(opt, options);
			// Append wrapper element
			$.twTicker[instanceName].wrapper = $('<div/>', {
					"class": opt.wrapperClassName
				}).appendTo(this);
			// Insert loading image
			$.twTicker[instanceName].showLoadingImg();
			// Insert Twitter script element
			$('<script/>', {
				"src": ("https:" === document.location.protocol ? "https://" : "http://") + "search.twitter.com/search.json?q=" + opt.query + "&rpp=" + opt.length + "&callback=jQuery.twTicker.instance" + (index + i) + ".callback"
			}).appendTo("head");
			// Update index of instance
			$.twTicker.index ++;
			// Setting for style
			$(this).addClass(opt.className);
		});
		
		return this;
	};

	// TwTicker Constructor
	$.TwTicker = function() {
		this.options = {
			query: "from%3Atoptweets_ja",
			// Query Example
			//   %23TagName
			//   from%3AUserName
			length: 10,
			tweetLink: true,
			duration: 0,
			loading: true,
			loadingImg: "loading.gif",
			loadingImgId: "twTickerLoadingImg",
			className: "twTicker",
			wrapperClassName: "twTickerWrapper",
			datePosition: "before",
			dateFormat: function(y, m, d, hs, ms ,ss) {
				//return " (" + y + "-" + m + "-" + d + " " + hs + ":" + ms + ":" + ss + ")";
				return   y + "." + m + "." + d;
			}
		};
		this.wrapper = {};
	};

	$.TwTicker.prototype = {
		callback: function(data) {
			var self = this,
				opt = this.options,
				res = data.results,
				tweetContainers = [];
			this.hideLoadingImg();
						
			// Prevent query error
			if (!res[0]) { return; }

			// Build Tweet List
			var $twTickerInner = $('<div/>', {"class":"twTickerInner"});
			cnt = 0;
			$.each(res, function(i) {
				var resUser = res[i].from_user,
				resText = res[i].text,
				resDate = res[i].created_at,
				resId = res[i].id_str,
				content = "";
				// Join text data
				// 他ユーザへのレスは表示しない
				if (resText.match(/^@/)){
					return true;//contine
				} 
				// 表示件数が指定値を越えたら処理終了
				if (cnt > 0){
					return false;//break
				}
				cnt++;				
				//30文字以上であれば省略
				if (resText.length > 30){
					resText = resText.substring(0,29) + "…";
				}
				content = '<h5><img src="images/ico_tw.gif" width="120" height="23" alt="Twitter" /> ■' + self.createDateText(resDate) + '</h5>';

				//content = self.htmlspecialchars(content);
				// Set content link
				if (opt.tweetLink) {
					content += '<div class="twInner"><p><a href="http://twitter.com/' + resUser + '/status/' + resId + '" target="_blank">'+ resText +'</a></p></div>';
				}
				// Tweet container
				tweetContainers[i] = $('<div/>', {"class":"tweet"});
				// Publish
				tweetContainers[i].append(content).appendTo($twTickerInner);
			});

			// Append to wrapper
			$(this.wrapper).append($twTickerInner);

			// Constant variables in animation function
			var boxIndex = 0,
				baseDuration = opt.duration;
		},
		showLoadingImg: function() {
			var opt = this.options;
			if (opt.loading) {
				var $loadingImg = $('<img/>', {
					"src": opt.loadingImg,
					"id": opt.loadingImgId
				}).appendTo(this.wrapper);
			}
		},
		hideLoadingImg: function() {
			var opt = this.options;
			if (opt.loading) {
				$("#" + opt.loadingImgId).remove();
			}
		},
		createDateText: function(responseDateText) {
			// ResponseDateText example:
			// ["Fri,", "17", "Sep", "2010", "06:28:39", "+0000"]
			var created_at = responseDateText.split(" ");
				// Date string -> Date object
			var d = new Date(created_at[2] + " " + created_at[1] + ", " + created_at[3] + ", " + created_at[4]);
				// UTC -> JST (+9h)
			d.setHours(d.getHours() + 9);
				// If hour/minutes in single digit, add "0" to it's double digit
			var dY = d.getFullYear(),
				dM = d.getMonth() + 1,
				dD = d.getDate(),
				dHs = (d.getHours() + 100).toString().slice(1, 3),
				dMs = (d.getMinutes() + 100).toString().slice(1, 3),
				dSs = (d.getSeconds() + 100).toString().slice(1, 3);
			return this.options.dateFormat(dY,dM,dD,dHs,dMs,dSs);
		},
		htmlspecialchars: function(s) {
			s = s.replace(/&/g,"&amp;").replace(/&amp;amp;/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/</g,"&lt;").replace(/>/g,"&gt;");
			return s;
		},

		// Below this line, inactive method.
		createUserLink: function(text) {
			text = '<a href="http://twitter.com/' + text + '" target="_blank">' + text + '</a>';
			return text;
		},
		createReplyLink: function(text) {
			text = text.replace(/@([\w_]+)/g, '<a href="http://twitter.com/$1" target="_blank">@$1</a>');
			return text;
		},
		createTagLink: function(text) {
			text = text.replace(/#([\w_]+)/g, '<a href="http://twitter.com/#search?q=%23$1" target="_blank">#$1</a>');
			return text;
		}
	};

})(jQuery);


