// ==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.8
// ==UserScript==

(function(){

	if(parent.document != document)
	{
		return;
	}
	
	var d2 = unsafeWindow;
	var PO ={};

	PO.url = d2.document.URL;
	PO.time = 0;
	PO.timeTmp = 0;
	PO.cFlg = false;
	PO.rankArr = [30,90,150,210,300,600,900,1200,1800,2700,3600];
	PO.Config = {};

////////////////////////////////////////////////
	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.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;
	
	d2.addEventListener("focus",function()
	{
		if(PO.onFlg == true)
		{
	
			PO.onFlg = false;
			PO.cStart();
		}
	},false);
	
	//PO.onFlg = false;
	d2.addEventListener("blur",function()
	{
		if(!PO.onFlg)
		{

			PO.onFlg = true;
			PO.cEnd();
		}
	},false);
		
////////////////////////////////////////////////
	PO.setConfig =  function()
	{
		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;">\
				<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="text" 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 />\
				<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)
			{
				d2.document.proto_jp_AP2D[i].value = PO.Config[i];
			}	
		
		d2.document.getElementById("proto.jp:AP2D_SAVE").onclick = function()
		{
			if( !d2.document.proto_jp_AP2D["del_NAME"].value || !d2.document.proto_jp_AP2D["del_PASS"].value)
			{
				alert("input del.icio.us account!")
				return;
			}
			
			if( !d2.document.proto_jp_AP2D["min_time"].value || 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<d2.document.proto_jp_AP2D.length;i++)
			{
				d2.document.proto_jp_AP2D[i].name	?	PO.Config[d2.document.proto_jp_AP2D[i].name] = d2.document.proto_jp_AP2D[i].value
													:	null;
			}
			
			GM_setValue("Config" , PO.hA2J(PO.Config));
			
			d2.document.body.removeChild(d2.document.getElementById("proto.jp:AP2D_CONFIG"));
		}
	};
	
	GM_registerMenuCommand("AutoPost2del.icio.us",PO.setConfig);

	if(!GM_getValue("Config"))
	{
		PO.Config["del_NAME"]="";
		PO.Config["del_PASS"]="";
		PO.Config["min_time"]="30";
		
		GM_setValue("Config" ,PO.hA2J(PO.Config));
		
		PO.setConfig();
	}
	else
	{
		PO.Config = eval("("+ GM_getValue("Config")+")");
		this.blur();
		this.focus();
	}
	
////////////////////////////////////////////////
  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";
  };

	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;
	}
	
//del.icio.us post/////////////////////////////////////////////
	var REST = function() {};
	    REST.prototype = {
	      makeURI : function(baseURI, queries) {
	        var query = [];
	        for(q in queries){
	          if(queries.hasOwnProperty(q)){
	            query.push(q + "=" + encodeURIComponent(queries[q]));
	          }
	        }
	        var uri = baseURI + "?" + query.join("&");
	        return uri;
	      },
		  
	      post : function(method, baseURI, queries) {
	        GM_xmlhttpRequest({
	            method : method,
	            url    : this.makeURI(baseURI, queries),
	            onload : function(response) {
	              var status = "del.icio.us: " + 
	              [response.status, response.statusText].join(' - ');
	            }
	          });
	      }
		  
	    };
		
	var rest = new REST();
			
	PO.addPost_delicious = function(){
				
				var title = document.title;
		        if(!title){title = PO.url;}
				var tags = PO.s2r(PO.time);
				var comment="Read:"+ PO.s2m(PO.time);
				
	            var queries = {
	              url         : PO.url,
	              description : title,
	              tags        : tags,
	              extended    : comment.replace(/^\s+|\s+$/, ""),
	              dt          : (function() {
	                  var date = new Date();
	                  return date.getW3CDTF();
	                })()
	            };
						
				rest.post("get", ["https://",PO.Config["del_NAME"],":",PO.Config["del_PASS"],"@api.del.icio.us/v1/posts/add"].join(""),queries);
	           	//rest.post("get", "http://del.icio.us/api/posts/add",queries);
			  };
 

//////////////////////////////
	d2.addEventListener("unload",function()
	{		
		if(PO.cFlg)
		{
			PO.cEnd();
		}
		
		if(PO.time > Number(PO.Config["min_time"]))
		{
			PO.addPost_delicious();
		}
		
	},false);

})();
