
function WritePage1() {
  var str = "";
  str += '<form name="f1">';
  str += '<img align="right" src="../support/okikaze.png">';
  str += '<h1>' + FName + '</h1>';
  str += '<table bgcolor="#f9f9f9" border="1px" bordercolor="silver" cellspacing="0" align="right"><tr><td>';
  str += '<p><a href="javascript:ResetView()">表示のリセット</a></p>';
  str += '<p><a href="javascript:writeDocumentTray()">ドキュメントトレイを表示</a>';
  str += '<br><a href="javascript:writeSrcTray()">ソーストレイを表示</a></p>';
  str += '<p><a href="javascript:Blocks()">ソースをブロック化して表示</a>';

  str += '<br><a href="javascript:CommentoutDecorate(\'commentout_gray\')">コメントアウトを淡くする</a>';
  str += ' / <a href="javascript:CommentoutDecorate(\'commentout_erase\')">消す</a>';
  str += '<br><a href="javascript:CommentoutDecorate(\'code_gray\')">コメントアウトを強調する</a>';
  str += ' / <a href="javascript:CommentoutDecorate(\'code_erase\')">だけを表示する</a>';

  str += '<br><font color="yellow">■</font><input size=30 name="key_yellow" value=""> <font style="background: silver"><a href="#" onClick="$(\'view_src\').innerHTML = Kensaku( $(\'view_src\').innerHTML , document.f1.key_yellow.value, \'yellow\', \'search_summary_yellow\' );">検索する</a></font><span id="search_summary_yellow"></span>';

  str += '<br><font color="lightgreen">■</font><input size=30 name="key_lightgreen" value=""> <font style="background: silver"><a href="#" onClick="$(\'view_src\').innerHTML = Kensaku( $(\'view_src\').innerHTML , document.f1.key_lightgreen.value, \'lightgreen\', \'search_summary_lightgreen\' );">検索する</a></font><span id="search_summary_lightgreen"></span>';

  str += '<br><font color="pink">■</font><input size=30 name="key_pink" value=""> <font style="background: silver"><a href="#" onClick="$(\'view_src\').innerHTML = Kensaku( $(\'view_src\').innerHTML , document.f1.key_pink.value, \'pink\', \'search_summary_pink\' );">検索する</a></font><span id="search_summary_pink"></span>';

  str += '</p>';
  str += '</td></tr></table>';
  str += '<span id="header"></span>';
  str += '<span id="upper_area"></span>';
  str += '<tt><span id="view_src"></span></tt>';
  str += '<hr>';
  str += '</form>';
  document.write(str);
}


function CommentoutDecorate(type) {

  var arr = new Array;
  var larr = new Array;
  var str = "";
  var src = Br2Yn_IE( $('view_src').innerHTML );
  var i;

  larr = getLeveledSrc();

  arr = src.split(/\r?\n/);

  arr = CommentoutViewChange(arr, larr, type);

  for (i = 0; i < arr.length; i++) {
    str += arr[i] + "\n";
  }
  str = Yn2Br_IE(str);
  $('view_src').innerHTML = str;
}


function CommentoutViewChange(arr, larr, type) {
  var plushome = new Array;
  var plusend = new Array;
  var i;

  plushome = ArrReady(plushome, larr.length);
  plusend = ArrReady(plusend, larr.length);

  if (type == "commentout_gray") {
    for (i=0; i< larr.length; i++){
      if ( larr[i].match(/^c/i) ){
        plushome[i] = '<font color="silver">';
        plusend[i] = '</font>';
      }
    }
  } else if (type == "commentout_erase") {
    for (i=0; i< larr.length; i++){
      if ( larr[i].match(/^c/i) ){
        plushome[i] = '<!-- ';
        plusend[i] = ' -->';
      }
    }
  } else if (type == "code_gray") {
    for (i=0; i< larr.length; i++){
      if ( !larr[i].match(/^c/i) ){
        plushome[i] = '<font color="silver">';
        plusend[i] = '</font>';
      }
    }
  } else if (type == "code_erase") {
    for (i=0; i< larr.length; i++){
      if ( !larr[i].match(/^c/i) ){
        plushome[i] = '<!-- ';
        plusend[i] = ' -->';
      }
    }
  }

  arr = AddPlus(arr, larr, plushome, plusend);

  return (arr); 
}



function ResetView() {  
  onLoad_scripts();
  Span_Reset('upper_area');
}


function onLoad_scripts() {
  writeHeader();
  writeSrc();
  setLeveledSrc();  
}


function Blocks() {
  var arr = new Array;
  var larr = new Array;
  var str = "";
  var src = Br2Yn_IE( $('view_src').innerHTML );
  var i;

  larr = getLeveledSrc();

  arr = src.split(/\r?\n/);
  arr = If_Enclose(arr, larr);
  arr = Loop_Enclose(arr, larr);
  arr = Goto_Express(arr, larr);

  for (i = 0; i < arr.length; i++) {
    str += arr[i] + "\n";
  }

  str = Yn2Br_IE(str);
  $('view_src').innerHTML = str;
}


function Goto_Express(arr, larr) {
  var plushome = new Array;
  var plusend = new Array;
  var sentencenolst = new Array;

  plushome = ArrReady(plushome, larr.length);
  plusend = ArrReady(plusend, larr.length);

// すべての行にアンカーをつける
  for (i=0; i< larr.length; i++){
    plushome[i] += '<a name="lineno'+ i + '"></a>';
  }

// 文番号にアンカーをつける
  for (i=0; i< larr.length; i++){
    if ( larr[i].slice(0,6).match(/([0-9]+)/i) ){
      plushome[i] += '<a name="sentenceno'+ RegExp.$1 + '"></a>';      
      sentencenolst[i] = RegExp.$1;
    }
  }

// goto
  for (i=0; i< larr.length; i++){
    if ( larr[i].match(/([^A-Za-z0-9_]goto\s+)([0-9]+)/i) ){
      arr[i] = arr[i].replace(/[^A-Za-z0-9_]goto\s+[0-9]+/i, RegExp.$1 + '<a href="#sentenceno' + RegExp.$2 + '">' + Goto_Info( i, RegExp.$2, sentencenolst, plushome) +'</a>');
    }
  }

// 算術IF文(Fortran90廃止予定事項)対応
  for (i=0; i< larr.length; i++){
    if ( larr[i].match(/([^A-Za-z0-9_]if\s*\(.*\)\s*)([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)/i) ){
      arr[i] = arr[i].replace(/[^A-Za-z0-9_]if\s*\(.*\)\s*[0-9]+\s*,\s*[0-9]+\s*,\s*[0-9]+/i, RegExp.$1 + '<a href="#sentenceno' + RegExp.$2 + '">' + Goto_Info( i, RegExp.$2, sentencenolst, plushome) +'</a>, ' + '<a href="#sentenceno' + RegExp.$3 + '">' + Goto_Info( i, RegExp.$3, sentencenolst, plushome) +'</a>, ' + '<a href="#sentenceno' + RegExp.$4 + '">' + Goto_Info( i, RegExp.$4, sentencenolst, plushome) +'</a>');
    } else if ( larr[i].match(/([^A-Za-z0-9_]if\s*\(.*\)\s*)([0-9]+)\s*,\s*([0-9]+)/i) ){
      arr[i] = arr[i].replace(/[^A-Za-z0-9_]if\s*\(.*\)\s*[0-9]+\s*,\s*[0-9]+/i, RegExp.$1 + '<a href="#sentenceno' + RegExp.$2 + '">' + Goto_Info( i, RegExp.$2, sentencenolst, plushome) +'</a>, ' + '<a href="#sentenceno' + RegExp.$3 + '">' + Goto_Info( i, RegExp.$3, sentencenolst, plushome) +'</a>');
    }
  }

  arr = AddPlus(arr, larr, plushome, plusend);

  return (arr); 
}


function Goto_Info (lineno, sentenceno, sentencenolst, plushome) {
// plushome への追記もする
  var i;
  var str = sentenceno + "";
  for (i=0; i< sentencenolst.length; i++){
    if (sentenceno == sentencenolst[i]) {
      if (lineno < i) { // Gotoの行き先が下側。つまり、If性のGoto。
        str = '<font color="blue">' + sentenceno + '↓(to ' + addFrontZero(i, 4) + ')</font>';
        plushome[i] += '<font color="blue">(from <a href="#' + lineno +'"><font color="blue">' + addFrontZero(lineno, 4) + '</font></a>)<b>&gt;&gt;</b></font><br>';
      } else {  // lineno > i  Gotoの行き先が上側。つまり、Loop性のGoto。なお、lineno = i はあり得ない
        str = '<font color="red">' + sentenceno + '↑(to ' + addFrontZero(i, 4) + ')</font>';
        plushome[i] += '<font color="red">(from <a href="#' + lineno +'"><font color="red">' + addFrontZero(lineno, 4) + '</font></a>)<b>&gt;&gt;</b></font><br>';
      }
    }
  }
  return (str);
}

function Loop_Enclose(arr, larr) {
  var plushome = new Array;
  var plusend = new Array;
  var plushome_templete = new Array;
  var plusend_templete = new Array;
  var counta = -1;
  var temp;
  var i,j;

  plushome_templete[0] = '<table class="loopblock_0"><tr><td><blockquote><pre>';
  plushome_templete[1] = '<table class="loopblock_1"><tr><td><blockquote><pre>';
  plushome_templete[2] = '<table class="loopblock_2"><tr><td><blockquote><pre>';
  plushome_templete[3] = '<table class="loopblock_3"><tr><td><blockquote><pre>';
  plusend_templete[0] = '</pre></blockquote></td></tr></table>';

  plushome = ArrReady(plushome, larr.length);
  plusend = ArrReady(plusend, larr.length);

// do -- end do
  for (i=0; i< larr.length; i++){
    if ( larr[i].match(/[^A-Za-z0-9_]do\s+[a-zA-Z]/i) && !larr[i].match(/[^A-Za-z0-9_]end\s?do($|[^A-Za-z0-9_])/i) ){
      counta++;
      plushome[i] = plushome_templete[counta % plushome_templete.length];
    }
    if ( larr[i].match(/[^A-Za-z0-9_]end\s?do($|[^A-Za-z0-9_])/i) ){
      plusend[i] = plusend_templete[0];
    }
  }
// do # -- # continue ! 端末共有Do (Fortran90廃止予定事項)にも対応
  for (i=0; i< larr.length; i++){
    if ( larr[i].match(/[^A-Za-z0-9_]do\s+([0-9]+)\s/i) ){
      counta++;
      plushome[i] = plushome_templete[counta % plushome_templete.length];
      temp = RegExp.$1 + " ";
      for (j= i+1; j< larr.length; j++) {
        if ( ( larr[j].slice(0,6).indexOf(temp) == 0 )||( larr[j].slice(0,6).indexOf(" " + temp) != -1 ) ) {
          plusend[j] += plusend_templete[0];
        }
// continue 以外の端末にも対応させるため、廃止。2009/ 4/13
//        if ( ( larr[j].indexOf(temp) == 0 )||( larr[j].indexOf(" " + temp) != -1 ) ) {
//          if ( larr[j].match(/[^A-Za-z0-9_]continue($|[^A-Za-z0-9_])/i) ){        
//            plusend[j] += plusend_templete[0];
//          }
//        }
      } 
    }
  }

  arr = AddPlus(arr, larr, plushome, plusend);

  return (arr); 
}


function ArrReady(arr, size) {
  var i;
  for (i=0; i< size; i++){
    arr[i] = "";
  }
  return (arr);
}


function If_Enclose(arr, larr) {
  var plushome = new Array;
  var plusend = new Array;
  var plushome_templete = new Array;
  var plusend_templete = new Array;
  var counta = -1;
  var i;

  plushome_templete[0] = '<table class="ifblock_0"><tr><td><blockquote><pre>';
  plushome_templete[1] = '<table class="ifblock_1"><tr><td><blockquote><pre>';
  plushome_templete[2] = '<table class="ifblock_2"><tr><td><blockquote><pre>';
  plushome_templete[3] = '<table class="ifblock_3"><tr><td><blockquote><pre>';
  plusend_templete[0] = '</pre></blockquote></td></tr></table>';

  plushome = ArrReady(plushome, larr.length);
  plusend = ArrReady(plusend, larr.length);

  for (i=0; i< larr.length; i++){
    if ( !larr[i].match(/[^A-Za-z0-9_]else\s?if($|[^A-Za-z0-9_])/i) && !larr[i].match(/[^A-Za-z0-9_]end\s?if[^A-Za-z0-9_]/i) && larr[i].match(/[^A-Za-z0-9_]if[^A-Za-z0-9_]/i) && larr[i].match(/[^A-Za-z0-9_]then($|[^A-Za-z0-9_])/i) ){
      counta++;
      plushome[i] = plushome_templete[counta % plushome_templete.length];
    }
    if ( larr[i].match(/[^A-Za-z0-9_]end\s?if($|[^A-Za-z0-9_])/i) ){
      plusend[i] = plusend_templete[0];
    }
  }
  arr = AddPlus(arr, larr, plushome, plusend);

  return (arr); 
}


function AddPlus(arr, larr, plushome, plusend) {
  var i;

  for (i=0; i< larr.length; i++){
    if ( larr[i].match(/^&/i) ){
      plusend[i] = plusend[i-1];
      plusend[i-1] = ""; 
    }    
  }

  for (i=0; i< arr.length; i++){
    if (plushome[i] == undefined) {
      plushome[i] = "";
    }
    if (plusend[i] == undefined) {
      plusend[i] = "";
    }
    arr[i] = plushome[i] + arr[i] + plusend[i];
  }  
  return (arr);
}


function setLeveledSrc() {
// Global :  LevSrc
  var arr = new Array;
  var src = Br2Yn_IE( $('src').innerHTML );
  arr = src.split(/\r?\n/);
  LevSrc = Leveling( arr );
}


function getLeveledSrc() {
// Global :  LevSrc
  return (LevSrc);
}


function Leveling( src_in ) {
// src はコード配列
  var src = new Array;
  var i = 123;
  src = src_in;

// 改行の削除
  for (i=0; i<src.length; i++){
    src[i] = src[i].replace(/\r?\n/, "");
  }
// /改行の削除

// '...' を消す ※'...'内の ! を消去するため、コメントアウトの削除以前に行う ###
  for (i=0; i<src.length; i++){
    src[i] = src[i].replace(/'.*?'/, "");
  }  
// /'...' を消す ###

// コメントアウトの削除
  for (i=0; i<src.length; i++){
    src[i] = src[i].replace(/^(c|\*).*$/, "c");
    src[i] = src[i].replace(/^(.*?)(!.*)$/, RegExp.$1);
  }
// /コメントアウトの削除

// 複数行にまたがるコードをまとめる
  for (i= src.length-1 ; i >= 1; i--){
    if (src[i].search(/^(     )\S( *)(.*)$/) != -1){
      if (src[i-1] == "c") {  // コメント行で分離された複数行コードに対応する。
        src[i-1] = src[i];
      } else {
        src[i-1] += RegExp.$3;
      }
      src[i] = '&';
    }
  }
// /複数行にまたがるコードをまとめる

// '...' を消す ※念のため ###
  for (i=0; i<src.length; i++){
    src[i] = src[i].replace(/'.*?'/, "");
  }  
// /'...' を消す ###

  return (src);
}


function eraseLineNo( src_in ) {
// 先頭のラインナンバーを削除
// src_in はコード配列
// func addLineNo と組
  var src = new Array;
  var i;
  src = src_in;
  for (i=0; i<src.length; i++){
    src[i].match (/^[0-9]*  (.*?)$/);
    src[i] = RegExp.$1;
  }
  return (src);
}


function addLineNo( src ) {
// 行ナンバーをつける
  var i;
  for (i = 0; i < src.length; i++) {
    src[i] = addFrontZero(i, 4) + "  " + src[i];
  }
  return (src);
}


function addFrontZero(i, digit) {
// 数字の先頭にゼロをつける
  var str ="";
  var j;
  for (j = 0; j < digit; j++) {
    str += '0';
  }
  str += i +"";
  str = str.slice(-1* digit);
  return (str);
}


function Span_Reset(id) {
  $(id).innerHTML = ""; 
}


function writeDocumentTray() {
  var str ="";
  str += '<h2>ドキュメント</h2>';
  str += '<iframe src="' + DocDir + '/' + FName + '/" width="100%" height="300" frameborder="0" STYLE="border-style: dashed; border-color: #666666; border-width:1"></iframe>';
  $('upper_area').innerHTML = str; 
}


function writeSrcTray() {
  var str ="";
  str += '<h2>ソース</h2>';
  str += '<iframe src="' + StageDir + '/' + FName + '/" width="100%" height="300" frameborder="0" STYLE="border-style: dashed; border-color: #666666; border-width:1"></iframe>';
  $('upper_area').innerHTML = str; 
}


function Kensaku(obj, key, color, summaryid){
// 来歴: writing/keyword.html を改。
  var i;
  var str = "";
  var TempArr = new Array;
  if (key == "") {
    return (obj);
  }
  TempArr = HighLightKey(obj, key, color);
  $(summaryid).innerHTML = '<br>キーワードは、' +TempArr[1] +' 回 ソース中に出現します';

  str += TempArr[0];

  return (str);
}



function HighLightKey(obj, key, color) {
// 来歴: writing/keyword.html を改。
  var TempArr = new Array;
  TempArr = allReplace_wCounta(obj, key, '<font style=\"background:' + color + '\">' + key + '</font>');
  return TempArr;
}


function allReplace_wCounta(text, sText, rText) {
// 来歴: writing/scripts.js
                   // 全置換する関数。（textの、sTextをrTextに置換）

// 浅桐静人さん( http://www.asahi-net.or.jp/~rb3r-ngi/ )による
// http://www.altum.jp/js/41.txt を一部改。

    var dummy1 = "";
    var dummy2 = text;
    var dummy3 = "";
    var index;
    var counta = 0;

    while (true) { // 無限ループ。
     index = dummy2.indexOf(sText, 0);    // 検索。
     if (index == -1) {
      break;       // 検索文字列がなければループを抜ける。
     }

     if ( DirectTagInOut(dummy2, index) == 0) {

       counta++;

       dummy3 = dummy2.replace(sText, rText); // 置換。
       dummy1 += dummy3.substring(0, index + rText.length);
       dummy2 =  dummy3.substring(index + rText.length, text.length);
                     // dummy1 は置換部分以前（置換部分含む）、
                     // dummy2 は置換部分以降 の文字列になる。
     } else {

       dummy3 = dummy2; // 置換しない。
       dummy1 += dummy3.substring(0, index + sText.length);
       dummy2 =  dummy3.substring(index + sText.length, text.length);
                     // dummy1 は置換部分以前（置換部分含む）、
                     // dummy2 は置換部分以降 の文字列になる。

     }

    }
    return [dummy1 + dummy2, counta];  // 置換後の文字列を返して終了。
}


function DirectTagInOut (text, p) {
// タグ内 : DirectTagInOut = 1;
// タグ外 : DirectTagInOut = 0; 
  var str = text;
  var point = p;
  var p_lt = str.indexOf("<", point);
  var p_gt = str.indexOf(">", point);

 if ((p_lt == -1) && ( point < p_gt) ) {
    return ( 1 );
  } else if ((point < p_gt) && ( p_gt < p_lt) ) {
    return ( 1 );
  }    
  return ( 0 );
}


function writeSrc() {
  var arr = new Array;
  var str = "";
  var i;
  arr = Br2Yn_IE( $('src').innerHTML ).split(/\r?\n/);
  arr = CovertSp2Nbsp(arr);   // IE対応のため
  arr = addLineNo( arr );
  for (i = 0; i < arr.length; i++) {
    str += arr[i] + "\n";
  }
  str = Yn2Br_IE(str);
  $('view_src').innerHTML = str; 
}


function CovertSp2Nbsp(arr){
  var i;
  for (i = 0; i < arr.length; i++) {
    arr[i] = arr[i].replace(/^\s/ig,'&nbsp;');
    while ( arr[i].match(/&nbsp;\s/ig) ){
      arr[i] = arr[i].replace(/&nbsp;\s/ig,'&nbsp;&nbsp;');
    }
  }
  return (arr);
}


function StrWithLineNo(str) {
  var arr = new Array;
  var str_out = "";
  var i;
  arr = str.split(/\r?\n/);
  arr = addLineNo( arr );
  for (i = 0; i < arr.length; i++) {
    str_out += arr[i] + "\n";
  }
  return (str_out);
}


function writeHeader() {
  var arr = new Array;
  var str = "";
  var i;
  arr = Br2Yn_IE( $('subfuncnote').innerHTML ).split(/\r?\n/);

  if ( arr[1] ) {
    str += "<p>機能: " + arr[1] + "</p>";
  }
  if ( arr[2] ) {
    str += "<p>" + arr[2] + "</p>";
  }

  $('header').innerHTML = str; 
}


// ====================

function OLD_allReplace_wCounta(text, sText, rText) {
// 来歴: writing/scripts.js
                   // 全置換する関数。（textの、sTextをrTextに置換）

// 浅桐静人さん( http://www.asahi-net.or.jp/~rb3r-ngi/ )による
// http://www.altum.jp/js/41.txt を一部改。

    var dummy1 = "";
    var dummy2 = text;
    var dummy3 = "";
    var index;
    var counta = 0;

    while (true) { // 無限ループ。
     index = dummy2.indexOf(sText, 0);    // 検索。
     if (index == -1) {
      break;       // 検索文字列がなければループを抜ける。
     }
     counta++;

     dummy3 = dummy2.replace(sText, rText); // 置換。
     dummy1 += dummy3.substring(0, index + rText.length);
     dummy2 =  dummy3.substring(index + rText.length, text.length);
                   // dummy1 は置換部分以前（置換部分含む）、
                   // dummy2 は置換部分以降 の文字列になる。
    }
    return [dummy1 + dummy2, counta];  // 置換後の文字列を返して終了。
}

