
//// twitter.js (for SINAP.jp, v2010.01)
//// .	based on "http://twitter.com/javascripts/blogger.js".
//// .	customized by SINAP,inc. 2010.

sML = {};

sML.getOpacity = (function() {
	if(UA.IE) return function(Ob) { return (parseFloat(Ob.style.filter.replace(/alpha\(opacity=([\d\.]+)/, "$1")) / 100); };
	else      return function(Ob) { return  parseFloat(Ob.style.opacity); };
})();

sML.setOpacity = (function() {
	if(UA.IE) return function(Ob, Op) { Ob.style.filter  = "alpha(opacity=" + (Op * 100) + ")"; };
	else      return function(Ob, Op) { Ob.style.opacity = Op; return Ob; };
})();

sML.getDisplay = function(Ob, D) { return Ob.style.display; }

sML.setDisplay = function(Ob, D) { Ob.style.display = D; return Ob; }

sML.smoothFader = sML.sF = {};

sML.smoothFader.fadeOpacityTo = function(Ob, tO, Cx, fT, Ac) {
	(Ob.sF == undefined) ? (Ob.sF = {}) : clearInterval(Ob.sF.timer);
	Ob.sF.sO = sML.getOpacity(Ob);
	Ob.sF.tO = tO;
	Ob.sF.Cx = Cx ? Cx : 10;
	Ob.sF.fT = fT ? fT : 100;
	Ob.sF.Ac = Ac ? Ac : function() {};
	Ob.sF.Ct = 0;
	Ob.sF.timer = setInterval(function() {
		Ob.sF.Ct ++;
		if(Ob.sF.Ct == Ob.sF.Cx) {
			sML.setOpacity(Ob, Ob.sF.tO);
			clearInterval(Ob.sF.timer);
			Ob.sF.Ac();
		} else {
			sML.setOpacity(Ob, (sML.getOpacity(Ob) + ((Ob.sF.tO - Ob.sF.sO) / Ob.sF.Cx)));
		}
	}, Ob.sF.fT);
}

tttr = {
	tweets   : [],
	prefs    : {
		URL      : 2, // 0: 全体をホームに, 1: それぞれリンク, 2: 全体を末尾URLに（末尾のURLは削除）
		Reply    : 0, // 0: そのまま,       1: それぞれリンク
		Time     : 0, // 0: 非表示,         1: 表示,           2: 読み込み時を基準にして表示
		Interval : 8, // 秒
		JSON     : "http://twitter.com/statuses/user_timeline/sinapinc.json?callback=tttr.cb&count=3"
	},
	clockman : {
//		second  : '1秒以内',
		seconds : '1分以内',
		minute  : '約1分前',
		minutes : '分前',
		hour    : '約1時間前',
		hours   : '時間前',
		day     : '1日前',
		days    : '日前',
		relative_time : function(time_value) {
			var Time = "";
			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 T = parseInt((relative_to.getTime() - parsed_date) / 1000);
			delta = delta + (relative_to.getTimezoneOffset() * 60);
				 if(delta < 60)         Time = this.seconds;
			else if(delta < 120)        Time = this.minute;
			else if(delta < (60*60))    Time = (parseInt(delta / 60)).toString() + this.minutes;
			else if(delta < (120*60))   Time = this.hour;
			else if(delta < (24*60*60)) Time = 'about ' + (parseInt(delta / 3600)).toString() + this.hours;
			else if(delta < (48*60*60)) Time = this.day;
			else                        Time = (parseInt(delta / 86400)).toString() + this.days;
			return Time;
		}
	},
	tweetman : {
		now     : -1,
		activateURL : function(tweet) {
			if(tttr.prefs.URL == 1) {
				tweet = tweet.replace(/((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])/g, "<a class=\"external\" href=\"$1\">$1</a>");
			} else if(tttr.prefs.URL == 2) {
				tweet = tweet.replace(/(.+)[\s\t]*((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])$/, "<a class=\"external\" href=\"$2\">$1</a>");
			}/* else if(tttr.prefs.URL == 3) {
				tweet = tweet.replace(/(.+)[\s\t]*((https?|s?ftp|ssh)\:\/\/[^"\s\<\>]*[^.,;'">\:\s\<\>\)\]\!])$/, "<a class=\"external\" href=\"http://twitter.com/sinapinc\">$1</a> <a class=\"external\" href=\"$2\">$2</a>");
			}*/ else {
				tweet = '<a class="external" href="http://twitter.com/sinapinc">' + tweet + '</a>'
			}
			return tweet;
		},
		activateReply : function(tweet) {
			tweet = tweet.replace(
				/\B@([_a-z0-9]+)/ig,
				function(Reply) {
					return Reply.charAt(0) + '<a href="http://www.twitter.com/' + Reply.substring(1) + '">' + Reply.substring(1) + '</a>';
				}
			);
			return tweet;
		},
		activateTime : function(tweet, id, time) {
			if(tttr.prefs.Time == 2) time = tttr.clockman.relative_time(time);
			tweet = tweet + "&nbsp;" + '<span class="tweet-time">……<a class="external" href="http://twitter.com/sinapinc/status/' + id + '">' + time + '</a></span>';
			return tweet;
		},
		trans   : function() {
			tttr.shade.style.display = "none";
			var Interval = (this.now < 0) ? 10 : (tttr.prefs.Interval * 1000);
			setTimeout(function() {
				tttr.shade.style.display = "block";
				sML.smoothFader.fadeOpacityTo(tttr.shade, 1, 10, 20, function() {
					tttr.tweetman.now++;
					if(tttr.tweetman.now >= tttr.tweets.length) tttr.tweetman.now = 0;
					tttr.tweet.innerHTML = tttr.tweets[tttr.tweetman.now];
					var exs = tttr.tweet.getElementsByClassName("external");
					for(var i = 0; i < exs.length; i++) {
						exs[i].onclick = exs[i].onkeypress = function() {
							open(this.href);
							return false;
						}
					}
					sML.smoothFader.fadeOpacityTo(tttr.shade, 0, 10, 20, tttr.tweetman.trans);
				});
			}, Interval);
		}/*,
		refresh : function() {
			setTimeout(function() {
				var tJS = document.createElement("script");
				tJS.type = "text/javascript", tJS.src = tttr.prefs.JSON;
				tttr.tweet.appendChild(SCRIPT);
			}, 1000);
		}*/
	}
}

tttr.cb = function(twitters) {
	for(var i = 0; i < twitters.length; i++){
		var HTML = [];
//		var uname = twitters[i].user.screen_name;
		var tweet = {
			body : twitters[i].text,
			id   : twitters[i].id,
			time : twitters[i].created_at
		}
		tweet.body = tttr.tweetman.activateURL(tweet.body);
		if(tttr.prefs.Reply) tweet.body = tttr.tweetman.activateReply(tweet.body);
		tweet.body = '<span class="tweet-body">' + tweet.body + '</span>';
		if(tttr.prefs.Time) tweet.body = tttr.tweetman.activateTime(tweet.body, tweet.id, tweet.time);
		tttr.tweets.push(tweet.body);
	}
	tttr.tweetman.trans();
}

SINAP.onRead.addEventListener(function() {
	tttr.birdCage = document.getElementById("hot");
	tttr.tweet = tttr.birdCage.getElementsByClassName("tweet")[0];
	tttr.shade = document.createElement("div");
	tttr.shade.id = "tweet-shade";
	sML.setOpacity(tttr.shade, 0);
	tttr.shade.style.display = "none";
	tttr.birdCage.appendChild(tttr.shade);
	var tJS = document.createElement("script");
	tJS.type = "text/javascript", tJS.src = tttr.prefs.JSON;
	document.getElementsByTagName("head")[0].appendChild(tJS);
});
