// ==UserScript==
// @name           BikkuriMonkey
// @namespace      BikkuriMonkey
// @description    �ï����
// @include        https://twitter.com/*
// @include        http://twitter.com/*
// ==/UserScript==

// ビックリモンキー　ランダムで一日３回変わる(0-7 8-15 16-23)
// 名前ごとに違うシールが出るようにした。かなり適当

(function(){
	var Util = {
		observe: function (elem, event, func, capture) {
			capture = !!capture;
			if (elem.attachEvent) {
				elem.attachEvent("on" + event, func);
			} else if (elem.addEventListener) {
				elem.addEventListener(event, func, capture);
			} else {
				elem["on" + event] = func;
			}
		}
	}; //

	// todo:ちゃんとした乱数にしたい
	function Randomizer(seed) {
		var T = this;
		T.rndA = 8 * 5 + 5;
		T.rndC = 1213;
		T.rndM = 0x10000000;
		T.get = function(){
			var T = this;
			T.rnd = ( T.rndA * T.rnd + T.rndC ) % T.rndM;
			return  T.rnd ;
		}
		T.set = function( seed ){ 
			var T = this;
			T.rnd = seed % 0x10000000;
			if ( T.rnd == 0 ) T.rnd = 1;
			for ( var i = 0 ; i < 100 ; i++ ) {
				T.get();
			}
		}

		T.set( seed );

	} //
	// ユーザー名取得　適当
	function getUserName() {
		var uname = "";
		if ( location.toString().match(/twitter\.com\/(.+)$/) ) {
			uname = RegExp.$1;
			uname = uname.replace(/\?.*$/,"");
			if ( uname == "home" ) {
				if ( document.getElementById("profile-image") ) 
					uname = document.getElementById("profile-image").alt;
			}
		}
		uname = uname.replace(/[^0-9^a-z]/ig,"");
		if ( uname == "" ) uname = "twitter";
		return uname;
	} //
	
	// ランダム選択
	// todo:第n弾ごとに枚数が違うのでテーブル作る
	function randomSelect( ) {
		var dan = randomizer.get() % 31 + 1; // 第n弾
		var num = randomizer.get() % ( 12 * 3 + 1 ) + 1; // 基本は12*3 + ヘッドの数　終盤は違うらしい
		var key =(dan * 1000 + ( num + 1000 ) - 1000 + 100000).toString().substring(1);
		var src = [
				  "http://bikkuri-man.mediagalaxy.ne.jp/search/image/omote/b"
				, key
				, ".jpg"
				].join("");
		return src;
	} //

	var area = document.getElementById("side_ad_base");
	var side = document.getElementById("side");
	var mydata ="" , myflag = [];
	var dt = new Date();
//		dt.setMonth("4");
//		dt.setDate("14");
//		dt.setHours("16");
	var dtkey = ( (dt.getFullYear() * 100000 ) 
				+ (dt.getMonth() + 101) * 1000 
				+ (dt.getDate() + 100 ) * 10 
				+ Math.floor( dt.getHours() / 8 ) 
				) - 101000;
	var uname = getUserName();
	var userkey = dtkey + parseInt( uname , 36 );
	var randomizer = new Randomizer( userkey );
	var src = randomSelect();
	var img = document.createElement("IMG");
	var sento = "http://image.blog.livedoor.jp/dqnplus/imgs/7/8/788fe3c2.jpg";
	var retrycnt = 3;

		img.style.width  = "185px";
		img.style.height = "185px";
		img.style.cursor = "pointer";
		img.src = src;
		Util.observe(img, "error", function (e) {
			retrycnt--;
			if ( retrycnt > 0 )
				img.src = randomSelect();
			else
			if ( retrycnt == 0 )
				img.src = sento;
		});
		Util.observe(img, "abort", function (e) {
			retrycnt--;
			if ( retrycnt > 0 )
				img.src = randomSelect();
			else
			if ( retrycnt == 0 )
				img.src = sento;
		});


	if ( area ) {

		// 右上追加
		Util.observe(img , "click" , function (e) {
			if (addSticker( img.src ) ) {
				var st = document.getElementById("status");
				if ( st ) {
					st.value = img.src + " ゲット！";
				}
			}
		});

		area.innerHTML = "";
		area.appendChild(img);





	} else {
//		document.body.appendChild(img);
	}

	if ( side ) {
		// シールのコレクション追加
		function addSticker( s ) {
			var div = document.getElementById("mySticker");
			if ( !myflag[s] && div ) {
				var img2 = document.createElement("IMG");
				img2.style.width  = "24px";
				img2.style.height = "24px";
				img2.style.cursor = "pointer";
				img2.title = "SHIFT+クリックで削除";
				img2.src = s;
				div.appendChild( img2 );
				myflag[ s ] = 1;
				if ( mydata.indexOf( s ) < 0 ) mydata += "," + s;
				GM_setValue("collection" , mydata );
				Util.observe(img2 , "click" , function (e) {
					if ( e.shiftKey ) {
						div.removeChild( img2 );
						removeSticker( img2.src );
					} else {
						img.src = img2.src;
					}
				});
				return true;
			}
			return false;
		} //
		function removeSticker( s ) {
			var div = document.getElementById("mySticker");
			if ( myflag[s] && div ) {
				myflag[ s ] = null;
				mydata = mydata.replace( "," + s , "");
				GM_setValue("collection" , mydata );
			}
		} //
		var section = document.createElement("div");
		section.className = "section";
		section.innerHTML = [""
							,'<div class="section-header">'
							,'<h1>コレクション</h1>'
							,'</div>'
							,'<div id="mySticker"></div>'
							].join("");
							
		side.appendChild(section);



		mydata = GM_getValue("collection" , ""); 
		var md = mydata.split(",");
		mydata = "";
		for ( var i in md ) {
			var s = md[i];
			if ( s.match(/^http/) ) {
				addSticker( s );
			}
		}

	}

})();