// ==UserScript==
// @name            AutoPost2del.icio.us
// @namespace       http://proto.jp
// @description     AutoPost2del.icio.us
// @include         http://*
// @exclude         http://mail.google.com/*
// @exclude         http://www.google.co.jp/ig*
// @exclude         http://www.google.com/ig*
// @version			0.9.1
// ==/UserScript==

(function(){
	
	////////////////////////////////////////////////
	if(parent.document != document)
	{
		return;
	}
	
	var PO ={};

	PO.d2 = unsafeWindow;
	PO.url = PO.d2.document.URL;
	PO.time = 0;
	PO.timeTmp = 0;
	PO.rankArr = [30,90,150,210,300,600,900,1200,1800,2700,3600];
	PO.urlInfo =[];
	PO.tags = [];
	PO.Config = {};
	PO.cFlg = false;
	PO.urlInfo.Flg = false;

GM_getValue("Config")	?	PO.Config = eval("("+ GM_getValue("Config")+")")
						:	null;

////////////////////////////////////////////////
	PO.hA2J = function(ha)
	{	
		var j = "";
		var o;
		
		for( i in ha)
		{
			try
			{
				o = eval(ha[i]);
			}
			catch(e)
			{	
				o = ha[i];
			}
			
			typeof o == "object"	?	j += '"'+ i +'":'+ ha[i]+','
									:	j += '"'+ i +'":"'+ ha[i]+'",';
		}
		j = j.slice(0,-1);
		
		return "{"+ j +"}";
	}
	
////////////////////////////////////////////////		
	PO.setConfig =  function()
	{	
		if(PO.d2.document.getElementById("proto.jp:AP2D_CONFIG"))
		{
			return;
		}
		
		PO.d2.document.body.innerHTML+='\
		<div id="proto.jp:AP2D_CONFIG">\
		<div style="z-index:900000;background-color:#29363D;position:fixed;top:0;left:0;width:100%;height:100%;opacity:0.8;"></div>\
		\
		<div style="z-index:900001;background-color:#29363D;color:#899BA7; font-size:16px;position:fixed;absolute;top:20%;width:40%;opacity:1;margin:0 30%;border:solid 2px #899BA7;padding:1px;overflow:auto;">\
			<div style="background-color:#899BA7; color:#29363D; font-weight:bold;text-align:center;font-size:20px;">+ AP2D config +</div>\
			<form action="" method="" name="proto_jp_AP2D" style="padding:5px;text-align:left">\
				<br />\
				*NAME (del.icio.us)<br />\
				<input name="del_NAME" type="text" style="width:60%;background-color:#ABB8C1;" /><br />\
				*PASS (del.icio.us)<br />\
				<input name="del_PASS" type="password" style="width:60%;background-color:#ABB8C1;" /><br />\
				*min post time (sec)<br />\
				<input name="min_time" type="text" style="width:60%;background-color:#ABB8C1;" /><br />\
				<br />\
				*open edit shortcut<br />\
				<select name="key_sub" style="background-color:#ABB8C1;color:#29363D;">\
					<option value="none">none</option>\
					<option value="ctrlKey" selected="selected">Ctrl</option>\
					<option value="altKey">Alt</option>\
				</select>\
				+ \
				<select name="key_shift" style="background-color:#ABB8C1;color:#29363D;">\
					<option value="none">none</option>\
					<option value="shiftKey" selected="selected">Shift</option>\
				</select>\
				+ \
				<input id="key_str" name="key_str" value="" type="text" style="width:15%;background-color:#ABB8C1;text-align:center" maxlength="1" />\
				<input type="hidden" name="key_main" value="" />\
				<br />\
				*add popular upper tags<br />\
				<select name="add_tag" style="background-color:#ABB8C1;color:#29363D">\
					<option value="0">none</option>\
					<option value="1">1</option>\
					<option value="2">2</option>\
					<option value="3">3</option>\
					<option value="4">4</option>\
					<option value="5">5</option>\
					<option value="6">6</option>\
					<option value="7">7</option>\
					<option value="8">8</option>\
					<option value="9">9</option>\
					<option value="999">ALL</option>\
				</select>\
				<div style="text-align:right;"><input id="proto.jp:AP2D_SAVE" type="button" value="SAVE" /></div>\
			</form>\
		</div>\
		</div>';

		PO.Config = eval("("+ GM_getValue("Config")+")");
		
		for(i in PO.Config)
			{
				PO.d2.document.proto_jp_AP2D[i].value = PO.Config[i];
			}
		
		PO.d2.document.proto_jp_AP2D.key_str.addEventListener("focus",function(e)
			{
				this.addEventListener("keydown",function(k)
				{
					PO.d2.document.getElementById(e.target.id).value ="";
					
					PO.d2.document.proto_jp_AP2D["key_main"].value = k.keyCode;
				},false);
				
			},false);

		PO.d2.document.getElementById("proto.jp:AP2D_SAVE").onclick = function()
		{
			if( !PO.d2.document.proto_jp_AP2D["del_NAME"].value || !PO.d2.document.proto_jp_AP2D["del_PASS"].value)
			{
				alert("input del.icio.us account!")
				return;
			}
			if( !PO.d2.document.proto_jp_AP2D["min_time"].value || PO.d2.document.proto_jp_AP2D["min_time"].value.toString().match( /[^0-9]+/ ) )
			{
				alert("\"min post time\" is Number only")
				return;
			}

			for(var i=0;i<PO.d2.document.proto_jp_AP2D.length;i++)
			{				
				PO.d2.document.proto_jp_AP2D[i].name	?	PO.Config[PO.d2.document.proto_jp_AP2D[i].name] = PO.d2.document.proto_jp_AP2D[i].value
														:	null;			
			}
			
			GM_setValue("Config" , PO.hA2J(PO.Config));

			PO.d2.document.body.removeChild(PO.d2.document.getElementById("proto.jp:AP2D_CONFIG"));
		}
	};
	
	GM_registerMenuCommand("AutoPost2del.icio.us",PO.setConfig);


////////////////////////////////////////////////
	PO.s2m = function(s)
	{
		var a0;
		var a1 = Math.floor(s/60);
		if(a1>59)
		{
			a0 = Math.floor(s/3600);
			a1 =a0 + "h" +Math.floor((s%3600)/60);
			s=s%3600;
		}
		
		var a2 = s%60;

		return a1 + "m" +a2 + "s";
	}
////////////////////////////////////////////////
	PO.s2r = function(s)
	{
		var i =0;
		
		while(s>PO.rankArr[i])
		{
			i++;
			if(i>PO.rankArr.length){break;};
		}
		
		return "ReadRank_"+ i;
	}
	
////////////////////////////////////////////////
var complementDate = function(s){
    return (s < 10) ? '0' + s : s;
  };
Date.prototype.getW3CDTF = function()
{
	var Y = this.getFullYear();
	var m = complementDate(this.getUTCMonth() + 1);
	var d = complementDate(this.getUTCDate());
	var H = complementDate(this.getUTCHours());
	var i = complementDate(this.getUTCMinutes());
	var s = complementDate(this.getUTCSeconds());
	
	return Y + "-" + m + "-" + d + "T" + H + ":" + i + ":" + s + "Z";
};

////////////////////////////////////////////////
Array.prototype.fusion = function(a)
{
	var da = [];
	var il = this.length;
	var jl = a.length;
			
	da = da.concat(a);
	
	for(i=0; i<il; i++)
	{
		for(j=0; j<jl; j++)
		{
			this[i]==da[j]	?	delete da[j]
							:	null;
		}
	}
	
	for( j=0; j<jl; j++)
	{
		da[j]	?	this.push(da[j])
				:	null;
	}
}

///////////////////////////////////////////////
PO.makeURI = function(baseURI, queries)
{
	var query = [];
	for(q in queries)
	{
		if(queries.hasOwnProperty(q))
		{
			query.push(q + "=" + encodeURIComponent(queries[q]));
		}
	}
	return baseURI + "?" + query.join("&");
}

PO.GM_XHR = function(u,f)
{
	GM_xmlhttpRequest(
	{
		method: 'GET',
		url: u,
		headers:
			{
				"User-agent": "Mozilla/4.0 (compatible) Greasemonkey",
				"Accept": "text/html,text/plain,text/xml,application/json",
				"Accept-Language":"ja,en"
			},
		onload: f
	})
};


////////////////////////////////////////////////
if(Number(PO.Config["add_tag"]))
{	
	(function()
	{
		var onfuc = function(rObj)
		{
			var max = Number(PO.Config["add_tag"]);
			var r = eval("("+ rObj.responseText +")");
			
			if(!r.length){ return;	}
				
			r = r[0];
			var top_tags_num = [];
			var da = [];
			var c = 0;
			
			for(var i in r.top_tags)	
			{
				top_tags_num[c] = r.top_tags[i];				
				c++;
			}

			for (var i=0; i<top_tags_num.length-1; i++) 
			{
				for (var j=0; j<top_tags_num.length-i-1; j++) 
				{
					if (top_tags_num[j] > top_tags_num[j+1])
					{
						c = top_tags_num[j];
						top_tags_num[j] = top_tags_num[j+1];
						top_tags_num[j+1] = c;
					}
				}
			}
			top_tags_num.reverse();
			
			
			
			for(var i=0; i<top_tags_num.length && i<max; i++)
			{
				for(var j in r.top_tags)	
				{
					if(r.top_tags[j]==top_tags_num[i])
					{
						da.push(j);
						//c+=j + ",";
						delete r.top_tags[j];
					}
				}
			}
			
			PO.tags.fusion(da);
		}

	PO.GM_XHR("http://badges.del.icio.us/feeds/json/url/data?url="+PO.url , onfuc);
	})();
}

////////////////////////////////////////////////
PO.delicious_gurl = function()
	{
		var fnc = function(rObj)
		{
			if(rObj.status!=200)return;
			
			var tmp = rObj.responseText;
			var da = [];

			if( tmp.indexOf("<post ") == -1 )return;
			tmp = tmp.substring(tmp.indexOf("<post ")+6 , tmp.indexOf(" \/>")-1).split('" ');

			for(var i =0; i<tmp.length; i++)
			{
				tmp[i] = tmp[i].split('="');
				PO.urlInfo[tmp[i][0]] = tmp[i][1].toString();
			}

			da = PO.urlInfo.tag.split(" ");

			try
			{
				PO.urlInfo.extended.match(/Read:/)	?	tmp = PO.urlInfo.extended.match(/Read:[0-9]*h[0-9]*m[0-9]*s|Read:[0-9]*m[0-9]*s|Read:[0-9]*s/).toString()
													:	tmp = "Read:0m0s";
			}
			catch(e)
			{	
				tmp = "Read:0m0s";
				GM_log("たぶんcatchしてるから大丈夫");
			}

			if(!PO.urlInfo.Flg)
			{
			tmp.match(/[0-9]*h/)	!=	null	?	PO.time += Number(tmp.match(/[0-9]*h/).toString().slice(0,-1))*3600
												:	null;
			tmp.match(/[0-9]*m/)	!=	null	?	PO.time += Number(tmp.match(/[0-9]*m/).toString().slice(0,-1))*60
												:	null;
			tmp.match(/[0-9]*s/)	!=	null	?	PO.time += Number(tmp.match(/[0-9]*s/).toString().slice(0,-1))
												:	null;
			}

			tmp = "/"+tmp+"/";
			PO.urlInfo.comm2 = PO.urlInfo.extended.replace(eval(tmp),"").toString();//

			PO.tags.fusion(da);
			PO.urlInfo.Flg = true;
		}

		var url = ["https://",PO.Config["del_NAME"],":",PO.Config["del_PASS"],"@api.del.icio.us/v1/posts/get?url=",PO.url].join("");
	
		PO.GM_XHR(url,fnc);
};
PO.delicious_gurl();

//del.icio.us//////////////////////////////////////////////
PO.delicious_post = function()
	{
		var title = document.title;	if(!title)title = PO.url;
		var comment = "";
		var tag = "";
		
		PO.urlInfo.Flg	?	comment = PO.urlInfo.comm2	:	null;
		comment= "Read:" + PO.s2m(PO.time)+" "+ comment;
		
		tag = PO.tags.join(" ");
		tag = tag.replace(/ReadRank_[0-9]* |ReadRank_[0-9]*/, "");
		tag = PO.s2r(PO.time)+" "+ tag;

	    var queries = {
	      url         : PO.url,
	      description : title,
	      tags        : tag,
	      extended    : comment.replace(/^\s+|\s+$/, ""),
	      dt          : (function()
		  				{
							if(PO.urlInfo.Flg){ return PO.urlInfo.time;}
							
							var date = new Date();
							return date.getW3CDTF();
						})()
	    };
		
		var url = PO.makeURI(["https://",PO.Config["del_NAME"],":",PO.Config["del_PASS"],"@api.del.icio.us/v1/posts/add"].join(""),queries);

		PO.GM_XHR(url,null);
	};
	
//////////////////////////////////////////////////
	PO.cStart = function()
	{		
			var d = new Date();
			PO.timeTmp = Math.floor(d.getTime()/1000);
			PO.cFlg = true;
	}
	
	PO.cEnd = function()
	{
			var d = new Date();
			PO.time += Math.floor(d.getTime()/1000)-PO.timeTmp;
			
			PO.cFlg = false;
	}

////////////////////////////////
	PO.onFlg = true;
	
	PO.d2.addEventListener("focus",function()
	{
		if(PO.onFlg == true)
		{
			PO.delicious_gurl();
			PO.onFlg = false;
			PO.cStart();
		}
	},false);

	PO.d2.addEventListener("blur",function()
	{
		if(!PO.onFlg)
		{
			PO.onFlg = true;
			PO.cEnd();
		}
	},false);
	
////////////////////////////////////////////"	
if(!GM_getValue("Config"))
{
	PO.Config["del_NAME"]="";
	PO.Config["del_PASS"]="";
	PO.Config["min_time"]="30";
	
	PO.Config["add_tag"]="0";
	PO.Config["key_sub"]="ctrlKey";
	PO.Config["key_shift"]="shiftKey";
	PO.Config["key_str"]="s";
	PO.Config["key_main"]="83";
	
	GM_setValue("Config" ,PO.hA2J(PO.Config));
	
	PO.setConfig();
}
else
{
	this.blur();
	this.focus();
}

//////////////////////////////
	PO.d2.addEventListener("unload",function()
	{
		if(PO.cFlg)
		{
			PO.cEnd();
		}
		
		if(PO.time > Number(PO.Config["min_time"]))
		{
			PO.delicious_post();
		}
		
	},false);
	
//////////////////////////////
PO.d2.addEventListener("keydown",function(e)
{
	var f0,f1,f2;
		
	PO.Config["key_sub"]=="none"	?	f1 = true
									:	f1 = e[PO.Config["key_sub"]];
									
	PO.Config["key_shift"]=="none"	?	f2 = true
									:	f2 = e[PO.Config["key_shift"]];	
										
	e.keyCode==Number(PO.Config["key_main"])	?	f0 = true
												:	f0 = false;																	

	if(!f0 || !f1 || !f2) return;

	if(PO.cFlg)PO.cEnd();
	
	var title0 = PO.d2.document.title;	if(!title0)title0 = PO.url;
	var comment = "";
	var tag = "";

	PO.urlInfo.Flg	?	comment = PO.urlInfo.comm2
					:	PO.d2.document.getSelection()	?	comment = '-'+PO.d2.document.getSelection()+'-'
														:	null;
					
	comment = "Read:" + PO.s2m(PO.time)+" "+ comment;
	
	tag = PO.tags.join(" ");
	tag = PO.s2r(PO.time)+" "+ tag;

	var queries = {
	      url		: PO.url,
	      title		: title0,
	      tags		: tag,
	      extended	: comment.replace(/^\s+|\s+$/, ""),
		  noui:"",
		  jump:"close",
		  v:4
	    };
	
	var url = PO.makeURI("http://del.icio.us/"+PO.Config["del_NAME"] , queries);
	
	var x = (screen.width - 700) / 2; 
	var y = (screen.height - 400) / 2;
	
	PO.d2.open(url,"_blank","left="+x+",top="+y+",width=700,height=400,scrollbar=yes,resizable=yes,locationbar=no,status=no,toolbar=0");
	PO.time = 0;
},false);

})();
