// Original script written by nazoking.
// http://nazo.yi.org/
//
// ==UserScript==
// @name           Nice Link for MovableType
// @namespace      http://a-h.parfe.jp/einfach/
// @author         AUSGANG SOFT
// @description    Make link tag from google result.
// @include        http://yoursite.jp/mt/cgi-bin/mt.cgi?__mode=view&_type=entry*
// ==/UserScript==

(function () {

  var HatenaId = ''; //はてなIDを設定するとダイアリーとブックマークが検索できます。
  var AmazonId = ''; //アソシエイトIDを設定するとAmazonの商品が検索できます。


  var Textarea = document.getElementById('text');
  //var Textarea = document.evaluate("//textarea[@name='text']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; //MT2用

  if(!Textarea) return;

  var ResultView =null;
  var setLink=function(r){
    setSelectedText( Textarea, '<a href="'+r.link+'" title="'+r.title+'" target="_blank">'+htmlEscape(r.word)+'</a>');
  }
  var setLinkAt=function(r){
    setSelectedText( Textarea, '<a href="'+r.link+'/'+AmazonId+'/ref=nosim/'+'" title="'+r.summary+'" target="_blank">'+r.product+'</a>');
  }
  var setLinkAi=function(r){
    setSelectedText( Textarea, '<a href="'+r.link+'/'+AmazonId+'/ref=nosim/'+'" title="'+r.title+'" target="_blank"><img src="http://images-jp.amazon.com/images/P/'+r.asin+'.09.THUMBZZZ.jpg" border="0"></a><a href="'+r.link+'/'+AmazonId+'/ref=nosim/'+'" title="'+r.summary+'" target="_blank">'+r.product+'</a>');
  }
  var init=function(){
    var toolbar = document.evaluate("//div[@class='field-buttons']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
    //var toolbar = document.evaluate("//td[@colspan='2'][@align='center'][@valign='top']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; //MT2用
    var n;
    toolbar.appendChild( n=createButton( 'Nice', getGoogleResults, setResultView ,unescape('%u9078%u629E%u3055%u308C%u305F%u6587%u5B57%u5217%u3092WEB%u3067%u691C%u7D22%u3057%u3001%u30EA%u30F3%u30AF%u3057%u307E%u3059') ) );//選択された文字列をWEBで検索し、リンクします
    n.style.marginRight='0';
    toolbar.appendChild( createButton( '1!', getGoogleResults, setResult1,unescape("WEB%u691C%u7D22%u3057%u4E00%u756A%u76EE%u306E%u30B5%u30A4%u30C8%u306B%u30EA%u30F3%u30AF%u3057%u307E%u3059") ) );// WEB検索し一番目のサイトにリンクします

    if(HatenaId!=''){
        toolbar.appendChild( createButton( '?D',getHatenaResults, setResultView ,unescape('%u81EA%u5206%u306E%u30C0%u30A4%u30A2%u30EA%u30FC%u5185%u3092%u691C%u7D22%u3057%u3001%u30EA%u30F3%u30AF%u3057%u307E%u3059') ) );// 自分のダイアリー内を検索し、リンクします
        toolbar.appendChild( createButton( '?B',getHatenaBMResults, setResultView, unescape('%u81EA%u5206%u306E%u306F%u3066%u306A%u30D6%u30C3%u30AF%u30DE%u30FC%u30AF%u5185%u3092%u691C%u7D22%u3057%u3001%u30EA%u30F3%u30AF%u3057%u307E%u3059') ) ); //自分のはてなブックマーク内を検索し、リンクします
    }

    toolbar.appendChild( createButton( 'MT',getMTSearchResults, setResultView, unescape('%u81EA%u5206%u306EBlog%u5185%u3092%u691C%u7D22%u3057%u3001%u30EA%u30F3%u30AF%u3057%u307E%u3059') ) ); //自分のBlog内を検索し、リンクします

    if(AmazonId!=''){
        toolbar.appendChild( createButton( 'Amz',getAmazonResults, setResultViewAmz, unescape('Google%u3092%u4F7F%u3063%u3066Amazon%u306E%u5546%u54C1%u3092%u691C%u7D22%u3057%u3001%u30EA%u30F3%u30AF%u3057%u307E%u3059') ) ); //Googleを使ってAmazonの商品を検索し、リンクします
    }
  };


  var initResultView=function(word){
    if( !ResultView ) ResultView = createResultView();
    ResultView.innerHTML = 'Searching ' + htmlEscape(word)+'...';
    ResultView.word = word;
    ResultView.show();
  }
  var createResultView=function(){
    ResultView = document.createElement( 'div' );
    ResultView.setAttribute('style','position:absolute; background:white; border:2px solid black;padding:2px 2px 2px 1em; z-index: 1;');
    ResultView.onclick=function(){ this.unshow(); return false; };
    ResultView.show=function(){ this.style.display='' };
    ResultView.unshow=function(){ this.style.display='none' };
    ResultView.setNotFound=function(word){
      this.innerHTML = '<b>Not Found</b><br />'+htmlEscape(word);
    }
    ResultView.maxlist = 10;
    ResultView.setList2=function(ret){
      this.ret = ret;
      if( !ret.length ) return this.setNotFound(ret.word);
      this.innerHTML = '<b>Select Link Site ('+htmlEscape(ret.word)+')</b><br>';
      for( var i=0; i<ret.length; i++ ){
	var url = ret[i].link;
	if(url.match(/ASIN/)){
		var ai=url.indexOf('ASIN');
		ret[i].asin=url.substring(ai+5,ai+15);
		var title = ret[i].title.split(": ");
		ret[i].product = title[1];
		var img = document.createElement( 'img' );
	        img.src = 'http://images-jp.amazon.com/images/P/'+ret[i].asin+'.09.THUMBZZZ.jpg';
		ret[i].word = ret.word;
	        img.r = ret[i];
		img.title = ret[i].summary;
	        img.onclick=function(){ setLinkAi(this.r); }
	        img.onload=function(){ replaceImage(this); }
		img.onmouseover=function(){ mover(this); }
		img.onmouseout=function(){ mout(this); }
		this.appendChild( img );
		var a = document.createElement( 'a' );
                a.href= ret[i].link;
	        a.innerHTML=ret[i].product;
	        a.r = ret[i];
		a.title = ret[i].summary;
                a.setAttribute('style','color:green;text-decoration:underline;cursor:pointer;margin-left:5px;');
	        a.onclick=function(){ setLinkAt(this.r); }
	        this.appendChild( a );
	        var a = document.createElement( 'a' );
                a.href= ret[i].link;
                a.innerHTML='[keyword]';
		a.setAttribute('style','cursor:pointer;margin-left:5px;');
                a.r = ret[i];
	        a.title = ret[i].summary;
                a.onclick=function(){ setLink(this.r); }
                this.appendChild( a );
		var a = document.createElement( 'a' );
	        a.href= ret[i].link;
		a.title = ret[i].summary;
		a.target= '_blank';
	        a.innerHTML = '[_b]';
		a.setAttribute('style','color:#cc3300;text-decoration:none;cursor:pointer;margin-left:5px;');
		a.onclick=function(){ window.open(this.href); }
	        this.appendChild( a );
	        this.appendChild( document.createElement( 'br' ) );
	        if( i+1 >= this.maxlist )break;
	}
      }
    }
    ResultView.setList=function(ret){
      this.ret = ret;
      if( !ret.length ) return this.setNotFound(ret.word);
      this.innerHTML = '<b>Select Link Site ('+htmlEscape(ret.word)+')</b><br>';
      for( var i=0; i<ret.length; i++ ){
        var a = document.createElement( 'a' );
        a.innerHTML=ret[i].title;
        a.setAttribute('style','color:green;text-decoration:underline;cursor:pointer;margin-right:5px;');
        a.r = ret[i];
	a.title = ret[i].summary;
        a.onclick=function(){ this.r.word = this.r.title; setLink(this.r); }
        this.appendChild( a );
	var a = document.createElement( 'a' );
        a.href= ret[i].link;
        a.innerHTML = ret[i].link;
        ret[i].word = ret.word;
        a.title = ret[i].summary;
        a.r = ret[i];
        a.onclick=function(){ setLink(this.r); }
        this.appendChild( a );
	var a = document.createElement( 'a' );
        a.href= ret[i].link;
	a.title = ret[i].summary;
	a.target= '_blank';
        a.innerHTML = '[_b]';
	a.setAttribute('style','color:#cc3300;text-decoration:none;cursor:pointer;margin-left:5px;');
	a.onclick=function(){ window.open(this.href); }
        this.appendChild( a );
        this.appendChild( document.createElement( 'br' ) );
        if( i+1 >= this.maxlist )break;
      }
    }
    Textarea.parentNode.insertBefore( ResultView, Textarea );
    Textarea.addEventListener( 'focus', function(){ ResultView.unshow(); },false );
    return ResultView;
  }
  var createButton=function(label, searchfunc, viewfunc ,title){
    var btn = document.createElement( 'button' );
    btn.setAttribute('style','background:#FFFFFF; border-right:1px solid #8FAEBE; border-bottom:1px solid #8FAEBE; border-top:1px solid #EFF3FF; border-left:1px solid #EFF3FF; height:19px; font-size:9pt; padding:0px; cursor:pointer; vertical-align:top;margin-right:5px;font-family: "Trebuchet MS", Trebuchet, Verdana, Arial, sans-serif;font-weight:bold;');
    btn.innerHTML = label;
    btn.addEventListener( 'click',function(e){
      e.preventDefault(); e.stopPropagation();
      var word = getWord();
      if(!word)return;
      if( ResultView && ResultView.lastsearch == searchfunc && ResultView.word == word ) return viewfunc( ResultView.ret );
      initResultView( word );
      ResultView.lastsearch = searchfunc;
      searchfunc( word, viewfunc );
    } , false );
    if( title ) btn.title = title;
    return btn;
  }
  var setResult1=function(ret){
    if( !ret || !ret.length ) return ResultView.setNotFound(ret.word);
    ResultView.unshow();
    ret[0].word = ret.word;
    setLink( ret[0] );
  }
  var setResultView=function(ret){
    ResultView.show();
    ResultView.setList(ret);
  }
  var setResultViewAmz=function(ret){
    ResultView.show();
    ResultView.setList2(ret);
  }
  var getWord=function(){
    return removeTags(getSerectedText( Textarea )) || prompt('Site Title');
  }



  var getGoogleResults=function(word,onloaded){
    var url = 'http://www.google.co.jp/search?start=0&ie=utf-8&oe=utf-8&q='+encodeURI(word);
    GM_xmlhttpRequest({
      method:"GET",
      headers:{"Cookie":"-"},
      url:url,
      onload:function(details) {
        var b = details.responseText;
        b = b.substr(b.indexOf('<div'));
        var as = b.match( /\<a href="[^\/].*?".*?\>.*?\<\/a\>(.|\n|\r)*?\#008000\>/g );
        var ret = new Array;
        ret.word = word;
        if( !as ) return onloaded(ret);
        for( var i=0; i<as.length; i++ ){
          as[i].match(/\<a href="(.*?)".*?>(.*?)\<\/a\>/);
          var title = RegExp.$2;
          var link = RegExp.$1;
          var summary = RegExp.rightContext;
          summary = removeTags(summary);
          title = removeTags(title);
          ret.push( {link:link, title:title, summary:summary } );
        }
        return onloaded(ret);
      }
    } );
  }
  var getHatenaResults=function(word,onloaded){
    var host = 'http://d.hatena.ne.jp';
    var url = host + '/' + HatenaId + '/searchdiary?word='+encodeURI(word);
    GM_xmlhttpRequest({
      method:"GET",
      url:url,
      onload:function(details) {
        var b = details.responseText;
        b = b.substr(b.indexOf('<div class="day">'));
        var as = b.match( /\t\t\<div class="section"\>(.|\n)*?\n\t\t\<\/div\>/g );
        var ret = new Array;
        ret.word = word;
        if( !as ) return onloaded(ret);
        for( var i=0; i<as.length; i++ ){
          if( as[i].indexOf('<span class="highlight">')!=-1 || removeTags(as[i]).indexOf( word )!=-1 ){
            as[i].match( /\<h3\><a href="(.*?)" name="(.*?)">.*?\<\/a\>(.*?)\<\/h3\>/ );
            var title = RegExp.$3;
            var link =  host + RegExp.$1;
            var summary = removeCtrls(removeTags(RegExp.rightContext)).substr(0,100);
            ret.push( { title:removeTags( title ), link:link, summary:summary } );
          }
        }
        return onloaded(ret);
      }
    } );
  }

  var getHatenaBMResults=function(word,onloaded){
    var url = 'http://b.hatena.ne.jp/' + HatenaId + '/?word='+encodeURI(word);
    GM_xmlhttpRequest({
      method:"GET",
      url:url,
      onload:function(details) {
        var b = details.responseText;
        b = b.substr(b.indexOf('<dl class="bookmarklist">'));
        b = b.substr(0,b.indexOf('</div>'));
        var as = b.split( '<dt class="bookmark">');
        as.shift();
        var ret = new Array;
        ret.word = word;
        if( !as || !as.length ) return onloaded(ret);
        for( var i=0; i<as.length; i++ ){
          if( as[i].match( /\<a href=\"(.*?)\".*?\>(.*?)\<\/a\>/ ) ){
            ret.push( {
              link:RegExp.$1,
              title:removeTags(RegExp.$2),
              summary: ( as[i].match( /class="comment"\>(.*?)\<\/dd\>/ ) )?
                  htmlUnEscape( removeTags( RegExp.$1 ) ):''
                  } );
          }
        }
        return onloaded(ret);
      }
    } );
  }

  var getMTSearchResults=function(word,onloaded){
    var u = location.href.split('mt.cgi');
    u[1].match( /blog_id=(\d+)/ );
    var url = u[0]+'mt-search.cgi?IncludeBlogs='+RegExp.$1+'&search='+encodeURI(word);
    GM_xmlhttpRequest({
      method:"GET",
      url:url,
      onload:function(details) {
        var b = details.responseText;
        b = b.substr(b.indexOf('</form>'));
        b = b.substr(b.indexOf('</h2>'));
        b = b.substr(0,b.indexOf('</div>'));
        var as = b.split( '<h3>');
        as.shift();
        var ret = new Array;
        ret.word = word;
        if( !as || !as.length ) return onloaded(ret);
        for( var i=0; i<as.length; i++ ){
          if( as[i].match( /\<a href=\"(.*?)\".*?\>(.*?)\<\/a\>/ ) ){
            ret.push( {
              link:RegExp.$1,
              title:removeTags(RegExp.$2),
              summary: ( as[i].match( /<p\>(.*?).../ ) )?
                  htmlUnEscape( removeTags( RegExp.$1 ) ):''
                  } );
          }
        }
        return onloaded(ret);
      }
    } );
  }

  var getAmazonResults=function(word,onloaded){
    var url = 'http://www.google.co.jp/search?start=0&ie=utf-8&oe=utf-8&q='+encodeURI(word)+'+site%3Aamazon.co.jp';
    GM_xmlhttpRequest({
      method:"GET",
      headers:{"Cookie":"-"},
      url:url,
      onload:function(details) {
        var b = details.responseText;
        b = b.substr(b.indexOf('<div'));
        b = b.substr(0,b.indexOf('<!--z-->'));
        var as = b.match( /\<a href="[^\/].*?".*?\>.*?\<\/a\>(.|\n|\r)*?\#008000\>/g );
        var ret = new Array;
        ret.word = word;
        if( !as ) return onloaded(ret);
        for( var i=0; i<as.length; i++ ){
          as[i].match(/\<a href="(.*?)".*?>(.*?)\<\/a\>/);
          var title = RegExp.$2;
          var link = RegExp.$1;
          var summary = RegExp.rightContext;
          summary = removeTags(summary);
          title = removeTags(title);
          ret.push( {link:link, title:title, summary:summary } );
        }
        return onloaded(ret);
      }
    } );
  }

  var htmlEscape=function(word){
    return word.replace(/&/g,'&amp;').replace(/\</g,'&lt;').replace(/\>/g,'&gt;');
  }
  var htmlUnEscape=function(word){
    return word.replace(/\&gt\;/g,'<').replace(/\&gt\;/g,'>').replace(/\&amp\;/g,'&');
  }
  var removeTags=function(word){
    return word.replace(/\<.*?\>/g,'' );
  }
  var removeCtrls=function(word){
    return word.replace(/[\x00-\x20]/g,' ' ).replace(/ {2,}/,' ');
  }
  var getSerectedText=function(e){
    if (document.selection) return document.selection.createRange().text;
    var length = e.textLength;
    var start = e.selectionStart;
    var end = e.selectionEnd;
    if (end == 1 || end == 2) end = length;
    return e.value.substring(start, end).replace(/(.*)\n+$/,"$1");
  }
  var setSelectedText=function(e,v){
    if (document.selection) document.selection.createRange().text = v;
    var scrollTop=e.scrollTop;
    var length = e.textLength;
    var start = e.selectionStart;
    var end = e.selectionEnd;
    if (end == 1 || end == 2) end = length;
    e.value = e.value.substring(0, start) + v + e.value.substr(end, length);
    e.setSelectionRange(start, start + v.length);
    e.focus();
    e.scrollTop=scrollTop;
  }
  var mover=function(img){
    img.setAttribute('style','height:60px;padding:2px;');
  }
  var mout=function(img){
    img.setAttribute('style','height:15px;padding:2px;');
  }
  var replaceImage=function(img){
    if (img.width == '1' && img.src.match(/\.01\./)) {
      img.src = 'http://images-jp.amazon.com/images/G/09/x-locale/detail/thumb-no-image.gif';
    } else if (img.width == '1') {
      img.src = img.src.replace('.09.','.01.');
    } else {
      img.setAttribute('style','height:15px;padding:2px;');
    }
  }
  init();
})();