/*==========================================================
Script by jin-ren
　ちょこっと強制リンク
　Original ちょこっと強制リンク ver.1.09＋α

　一次配布元（るてんのお部屋：http://www2s.biglobe.ne.jp/~yanai/）
　著作権／免責／転載に関して
　本スクリプトに関するソフトウェア及びデータの著作権は全て、一時配布元である、
　「クロノス・クラウン」の管理人"柳井 政和”さんにあります。
　このスクリプトは柳井さんのオリジナルを元にjin-renがSleipnirアドレスメニュー拡張用に改編してあります。
　このスクリプトによる不具合等は柳井さん宛ではなく、私jin-renまでご連絡下さい。

                                                  2002/09/08
==========================================================*/

    var obj, document, id;
    obj = new ActiveXObject("Sleipnir.API");
    id = obj.GetDocumentID(obj.ActiveIndex);
    obj_doc = obj.GetDocumentObject(id);        // オブジェクトのドキュメント

    if (obj_doc == null){
        obj.MessageBox("Document を作成できません");
    } else {
      /***** 変数の初期化 ============================================= *****/
      //
      sel_obj = obj_doc.selection.createRange(); // 選択範囲

      /***** 分岐処理 ================================================ *****/
      //
      type = "all";
      if ( sel_obj == null || sel_obj.htmlText == "" ) {
        /***** 選択範囲がない場合 =============================== *****/
        //
        rep_data = obj_doc.body.innerHTML;  // ページ全体
        type = "all";

      } else {
        /***** 選択範囲がある場合 =============================== *****/
        //
        rep_data = sel_obj.htmlText;  // 選択範囲のテキストを表示
        type = "sel";
      }

      /***** IEバグ対策 =============================================== *****/
      //
      re = new RegExp( "<[^>]*><[^>]*>", "ig" );
      target = rep_data.match( re );
      if ( target != null ) {
        if ( target.length == 1 && target[0] == rep_data ) {
          /***** 選択範囲がない（空）場合 ================= *****/
          //
          rep_data = obj_doc.body.innerHTML;  // ページ全体
          type = "all";
        }
      }
      rep_data = " " + rep_data;  // 先頭対策

      /***** Yahoo!バグ対策 =========================================== *****/
      //
      re = new RegExp( "[\?]http://w", "g" );
      rep_data = rep_data.replace( re, "esc_q_h_cw_esc" );
      re = new RegExp( "[\?]http://", "g" );
      rep_data = rep_data.replace( re, "esc_q_h_c_esc" );

      re = new RegExp( "=http://w", "g" );
      rep_data = rep_data.replace( re, "esc_e_h_cw_esc" );
      re = new RegExp( "=http://", "g" );
      rep_data = rep_data.replace( re, "esc_e_h_c_esc" );

      re = new RegExp( "[\*]http://w", "g" );
      rep_data = rep_data.replace( re, "esc_a_h_cw_esc" );
      re = new RegExp( "[\*]http://", "g" );
      rep_data = rep_data.replace( re, "esc_a_h_c_esc" );

      /***** プロトコルなし補正 ======================================= *****/
      //
      re = new RegExp( "([^:：][^/／]{1,2})([wｗ][wｗ][wｗ][^.．]*[.．][^/／]+[/／])", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){return p1 + "http://" + p2;} );

      re = new RegExp( "([^:：][^/／]{1,2})([hｈ][oｏ][mｍ][^.．]*[.．][^/／]+[/／])", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){return p1 + "http://" + p2;} );

      /***** 置換準備 ================================================= *****/
      //
      re = new RegExp( "([０-ｚ．-～－0-z.-~\-]+)([：:][／/])([０-ｚ．-～－0-z.-~\-]+)", "ig" );
      sabun = "ａ".charCodeAt(0) - "a".charCodeAt(0);

      rng0a = "０".charCodeAt(0);
      rng0b = "ｚ".charCodeAt(0);
      rng1a = "．".charCodeAt(0);
      rng1b = "～".charCodeAt(0);
      rng2  = "－".charCodeAt(0);

      rep_data = rep_data.replace( re, function( str, p1, p2, p3 ){
        i_size = p1.length; new_str1 = "";
        for ( i = 0; i < i_size; i ++ ) {
          charc = p1.charCodeAt(i)
          if ( ( rng0a <= charc && charc <= rng0b ) || ( rng1a <= charc && charc <= rng1b ) || ( charc == rng2 ) ) {
            new_str1 += String.fromCharCode( charc - sabun ) ;
          } else {
            new_str1 += String.fromCharCode( charc ) ;
          }
        }

        i_size = p3.length; new_str3 = "";
        for ( i = 0; i < i_size; i ++ ) {
          charc = p3.charCodeAt(i)
          if ( ( rng0a <= charc && charc <= rng0b ) || ( rng1a <= charc && charc <= rng1b ) || ( charc == rng2 ) ) {
            new_str3 += String.fromCharCode( charc - sabun ) ;
          } else {
            new_str3 += String.fromCharCode( charc ) ;
          }
        }
        return new_str1 + ":/" + new_str3;
      } );

      /***** 間違えリンク対策 ========================================= *****/
      //
      re = new RegExp( "hp:/", "ig" );
      rep_data = rep_data.replace( re, "http:/" );

      re = new RegExp( "htp:/", "ig" );
      rep_data = rep_data.replace( re, "http:/" );

      re = new RegExp( "(http:/)([0-z])", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){return p1 + "/" + p2;} );

      /***** 半端リンク対策 =========================================== *****/
      //
      re = new RegExp( "([^h])(ttp://)", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){return p1 + "h" + p2;} );

      re = new RegExp( "([^t])(tp://)", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){return p1 + "ht" + p2;} );

      re = new RegExp( "([^t])(p://)", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){return p1 + "htt" + p2;} );

      /***** 置換 ===================================================== *****/
      //
      re = new RegExp( "([^\"'=])(http://)([^ぁ-んァ-ヶ亜-黑】-（ <\"　\n\t\(\)]*)", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2, p3 ){
        return ( p1 + '<A href="' + p2 + p3 + '">' + p2 + p3 + '</A>' );
      } );

      re = new RegExp( "(<A [^>]*>)(<A [^>]*>)", "ig" );
      rep_data = rep_data.replace( re, function( str, p1, p2 ){ return p1; } );
      re = new RegExp( "</A></A>", "ig" );
      rep_data = rep_data.replace( re, "</A>" );

      rep_data = rep_data.substr( 1 );  // 先頭対策

      /***** Yahoo!バグ対策 =========================================== *****/
      //
      re = new RegExp( "esc_q_h_c_esc", "g" );
      rep_data = rep_data.replace( re, "?http://" );
      re = new RegExp( "esc_q_h_cw_esc", "g" );
      rep_data = rep_data.replace( re, "?http://w" );

      re = new RegExp( "esc_e_h_c_esc", "g" );
      rep_data = rep_data.replace( re, "=http://" );
      re = new RegExp( "esc_e_h_cw_esc", "g" );
      rep_data = rep_data.replace( re, "=http://w" );

      re = new RegExp( "esc_a_h_c_esc", "g" );
      rep_data = rep_data.replace( re, "*http://" );
      re = new RegExp( "esc_a_h_cw_esc", "g" );
      rep_data = rep_data.replace( re, "*http://w" );

      /***** 反映 ===================================================== *****/
      //
      if ( type == "sel" ) {
        /***** 選択範囲がある場合 =============================== *****/
        //
        arr = obj_doc.body.innerHTML.split( sel_obj.htmlText );
        if ( arr.length > 1 ) {
          obj_doc.body.innerHTML = arr.join( rep_data );
        } else {
          dd = new Date();
          dd_str = dd.getTime()
          dd_str = String( dd_str );

          new_win = obj.window.open( "", dd_str, "" );
          nd = new_win.document;
          nd.writeln('<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS">');
          nd.writeln('<!-- あ(MOJIBAKE TAISAKU) -->');
          nd.writeln('<html><head><title>ちょこっと 強制リンク</title>');
          nd.writeln('</head>');
          nd.writeln('<BODY BGCOLOR="white" TEXT="black">');
          nd.writeln('<B>選択範囲戻し失敗時</B><SMALL><BR>（選択範囲によってはうまく反映できずに別ウィンドウ表示となります）<BR>（変換する対象がない場合もこのウィンドウは開きます）</SMALL><P>');
          nd.write( rep_data );
          nd.writeln('</BODY></HTML>');

        }

        obj_doc.selection.empty(); // 選択解除
      } else {
        /***** 選択範囲がない場合 =============================== *****/
        //
        obj_doc.body.innerHTML = rep_data;  // ページ全体
      }
    }

    obj.beep();
    obj = null
