/*************************************************/
/* midi Player                                   */
/*   WebページでBGMを流すためのスクリプト        */
/*                                               */
/*          Ver. 1.1     2006. 3. 4  M.Kojima    */
/*          Ver. 1.0     2005.11.20  M.Kojima    */
/*  http://www.petile.com/tips/midiplayer        */
/*************************************************/

MP_TEXT_PLAY    = "演奏";    // PLAYボタンに表示する文字列
MP_TEXT_STOP    = "停止";    // STOPボタンに表示する文字列
MP_TEXT_SELECT  = "選択";    // SELECTボタンに表示する文字列
MP_AUTO_LOAD = 1;            // 自動演奏する：1  しない：0
MP_MAQUEE_SPEED = 100;       // マーキー表示の速度　動かさない：0

MP_MAQUEE_MSG   = "";
MP_TIMER_ID = 0;
/*----------------------------------------------------*/
/*      マーキー表示                                  */
/*  書式   : maquee()                                 */
/*  戻り値 : なし                                     */
/*  Global変数：MP_MAQUEE_MSG （IN/OUT)               */

function maquee(){
  document.MIDIFORM.MIDITEXT.value = MP_MAQUEE_MSG;
  if (MP_MAQUEE_SPEED < 0 ) {
    clearInterval(MP_TIMER_ID);
  } else {
    MP_MAQUEE_MSG = MP_MAQUEE_MSG.substring(1,MP_MAQUEE_MSG.length)+MP_MAQUEE_MSG.substring(0,1);
  }
}

/*----------------------------------------------------------------*/
/*      MIDI PLAYER を作成する                                    */
/*  書式   : midiPlayerOne(css, file, msg)            １曲用      */
/*           midiPlayerRandom(css, file, nsel, msg)   ランダム    */
/*           midiPlayerOclock(css, file, nsel, msg)   時刻        */
/*              css  : CSSファイルへのパス                        */
/*              file : 再生するファイル名の配列                   */
/*              nsel : 選択肢の数                                 */
/*              msg  : メッセージor選択文字列の配列 (省略可）     */
/*  戻り値 : なし                                                 */

function midiPlayerOne(css, file, msg) {
  midiPlayerSpecify(css, file, 0, 0, msg)
}

function midiPlayerRandom(css, file, nsel, msg) {
  sel = Math.floor(Math.random()*nsel);
  midiPlayerSpecify(css, file, nsel, sel, msg);
}

function midiPlayerOclock(css, file, nsel, msg) {
  h = new Date();
  sel = Math.floor(h.getHours()*nsel/24);
  midiPlayerSpecify(css, file, nsel, sel, msg);
}

/*------------------------------------------------------------*/
/*      MIDI PLAYER を作成する (曲指定用）  　                */
/*  書式   : midiPlayerSpecify(css, file, nsel, sel, msg)     */
/*              css  : CSSファイルへのパス                    */
/*              file : 再生するファイル名の配列               */
/*              nsel : 選択肢の数                             */
/*              sel  : 選択曲の番号                           */
/*              msg  : メッセージ文字列の配列                 */
/*  戻り値 : なし                                             */

function midiPlayerSpecify(css, file, nsel, sel, msg){
  param  = new Array();

  if (css != "") {
    document.write('<link rel="stylesheet" type="text/css" href="'+css+'">');
  }
  getParam(1, param);

  str="";
  if (nsel == 0) {                 // midiPlayerOne
    if (msg != undefined ) {
      if (param[0] == 0 ) {
        str = msg[0];              // 停止時メッセージ
      } else {
        str = ( msg[1] == undefined ? msg[0] : msg[1] );   // 再生時メッセージ
      }
    }
  } else {
    if (msg != undefined ) str = msg[sel];
  }

  document.write('<DIV id="PLAYER">');
  document.write( mkMidiEmbed(param[0], sel, file) );
  document.write( mkMidiForm1(param[0], sel, file, str) );
  document.write('</DIV>');
}

/*------------------------------------------------------------*/
/*      MIDI PLAYER を作成する  (選曲用)                      */
/*  書式   : midiPlayerSelect(css, file, nsel, menu, msg)     */
/*              css  : CSSファイルへのパス                    */
/*              file : 再生するファイル名の配列               */
/*              nsel : 選択肢の数                             */
/*              menu : 曲選択のメニューの配列        　       */
/*              msg  : メッセージor選択文字列の配列 (省略可)  */
/*  戻り値 : なし                                             */

function midiPlayerSelect(css, file, nsel, menu, msg){
  param  = new Array();
  if (css != "") {
    document.write('<link rel="stylesheet" type="text/css" href="'+css+'">');
  }
  getParam(nsel, param);
  document.write('<DIV id="PLAYER">');
  document.write( mkMidiEmbed(param[0], param[1], file) );
  document.write( mkMidiForm2(param[0], param[1], file, nsel, msg, menu) );
  document.write('</DIV>');
}

/*----------------------------------------------------*/
/*      パラメータを取得する 　                       */
/*　　　　　　引数優先、なければクッキー              */
/*  書式 :  getParam(nsel,param)                      */
/*             nsel : 選択肢の数                      */
/*  戻り値 :値(string)                                */
/*          param[0]   自動演奏しない：0  する：1     */
/*          param[1]   選択番号  0〜(nsel-1)          */
/*　Global変数：MP_AUTO_LOAD　（IN)                   */

function getParam(nsel, param) {
                                           /*** クッキーの読み込み ***/
  c_autoload = myGetCookie("AUTOLOAD:"+location.pathname);
  c_selected = myGetCookie("SELECTED:"+location.pathname);
  if ( c_autoload == null ) c_autoload =MP_AUTO_LOAD;
  if ( c_selected == null ) c_selected =0;
                                           /*** 引数の読み込み ***/
  arg = new Array();
  if (location.search.length > 1) arg = location.search.substr(1).split("&"); 
                                           /*** 引数1 ***/
  if (arg[0] == 0 ) {
       param[0] = 0;
  } else if (arg[0] == 1) {
       param[0] = 1;
  } else if (c_autoload == 0) {
       param[0] = 0;
  } else if (c_autoload == 1) {
       param[0] = 1;
  } else {
       param[0] = (MP_AUTO_LOAD == 0 ? 0 : 1) ;
  }
                                           /*** 引数2 ***/
  if (arg[1] >= 0 && arg[1] < nsel) {
       param[1] = arg[1];
  } else if (c_selected >= 0 && c_selected < nsel) {
       param[1] = c_selected;
  } else {
       param[1] = 0;
  }
}

/*----------------------------------------------------*/
/*      Embedタグを作成する                           */
/*  書式 :  mkMidiEmbed(auto, sel, file)              */
/*             auto : 自動演奏する：1　しない：0      */
/*             sel  : 選択番号                        */
/*             nsel : 選択肢の数                      */
/*             file : 再生するファイル名の配列        */
/*  戻り値 :なし　　　                                */

function mkMidiEmbed(auto, sel, file){

　a = ( auto == 0 ? "false" : "true");
  ret = '<EMBED id="BGM01" src="' +file[sel]+ '" width="0" height="0" type="audio/midi" loop="true" autostart="' +a+ '" repeat="true" panel="0">';

  return ret;
}

/*----------------------------------------------------*/
/*      Formタグを作成する (1曲用)                    */
/*  書式 :   mkMidiForm1(auto, sel, file, str)        */
/*             auto : 自動演奏しない：0  する：1      */
/*             sel  : 選択番号                        */
/*             file : 再生するファイル名の配列        */
/*             str  : メッセージ文字列                */
/*  戻り値 :値(string)                                */
/*  Global変数：MP_TEXT_PLAY   （IN)                  */
/*              MP_TEXT_STOP   （IN)                  */
/*              MP_MAQUEE_SPEED（IN)                  */

function mkMidiForm1(auto, sel, file, str){
  ret = '<FORM name="MIDIFORM" id="MIDIFORM">';

  if ( str != "" ) {
    ret += '<INPUT name="MIDITEXT" id="MIDITEXT" type="text" value="">';
    MP_MAQUEE_MSG = (MP_MAQUEE_SPEED > 0 ? "　　　　　　　　" : "") +str;
    MP_TIMER_ID = setInterval("maquee()", 40000/MP_MAQUEE_SPEED);
  }
  if (auto == 0 ) {
    ret += '<INPUT id="PLAYBTN" onclick="gotoSelf(1,1)" type="button" value="'+MP_TEXT_PLAY+'">';
  } else {
    ret += '<INPUT id="STOPBTN" onclick="gotoSelf(0,1)" type="button" value="'+MP_TEXT_STOP+'">';
  }
  ret += '</FORM>';
  return ret;
}

/*------------------------------------------------------------*/
/*      Formタグを作成する (多曲用)                           */
/*  書式 :   mkMidiForm2(auto, defsel, file, nsel, msg, menu) */
/*             auto   : 自動演奏しない：0  する：1            */
/*             defsel : 選択曲のデフォルト                    */
/*             file   : 再生するファイル名の配列              */
/*             nsel   : 選択肢の数                            */
/*             msg    : メッセージ文字列の配列                */
/*             menu   : 選択文字列の配列                      */
/*  戻り値 :値(string)                                        */
/*  Global変数：MP_TEXT_SELECT （IN)                          */
/*              MP_TEXT_STOP   （IN)                          */
/*              MP_MAQUEE_SPEED (IN)                          */

function mkMidiForm2(auto, defsel, file, nsel, msg, menu){
  ret = '<FORM name="MIDIFORM" id="MIDIFORM">';

  if (msg != undefined ) {
    if ( msg[defsel] != "" ) {
      ret += '<INPUT id="MIDITEXT" name="MIDITEXT" type="text" value="">';

      MP_MAQUEE_MSG = (MP_MAQUEE_SPEED > 0 ? "　　　　　　　　" : "") + msg[defsel];
      MP_TIMER_ID = setInterval("maquee()", 40000/MP_MAQUEE_SPEED);
    }
  }

  ret += '<SELECT name="MIDISEL" id="MIDISEL">';
  for (i=0; i<nsel; i++){
    ret += '<OPTION';
    if (i == defsel) ret += ' selected';
    ret += '>'+menu[i]+'</OPTION>';
  }
  ret += '</SELECT>';

  ret += '<INPUT id="PLAYBTN" onclick="gotoSelf(1,'+nsel+')" type="button" value="'+MP_TEXT_SELECT+'">';
  ret += '<INPUT id="STOPBTN" ';
  if (auto==0) ret += ' style="visibility:hidden" ';
  ret += 'onclick="gotoSelf(0,'+nsel+')" type="button" value="'+MP_TEXT_STOP+'">';
  ret += '</FORM>';

  return ret;
}
/*----------------------------------------------------*/
/*     引数を指定してページを更新する                 */
/*  書式 :   gotoSelf(auto,nsel)                      */
/*             auto : 自動演奏しない：0  する：1      */
/*             nsel : 選択肢の数                      */
/*  戻り値 :なし                                      */

function gotoSelf(auto,nsel) {
   if     (nsel==1) sel=0;
   else   sel = document.MIDIFORM.MIDISEL.selectedIndex;
   n = location.href.length - location.search.length;

   mySetCookie("AUTOLOAD:"+location.pathname , auto , 365);
   mySetCookie("SELECTED:"+location.pathname , sel  , 365);
   location.href = location.pathname +'?'+auto+'&'+sel;
}

/*----------------------------------------------------*/
/*        クッキーに登録する汎用関数                  */
/* 書式 : mySetCookie(クッキー名,値,有効期限日数)     */
/* 戻り値 : なし(void)                                */
/* http://www.red.oit-net.jp/tatsuya/java/cookie.htm  */

function mySetCookie(myCookie,myValue,myDay){
   myExp = new Date();
   myExp.setTime(myExp.getTime()+(myDay*24*60*60*1000));
   myItem = "@" + myCookie + "=" + escape(myValue) + ";";
   myExpires = "expires="+myExp.toGMTString();
   document.cookie =  myItem + myExpires;
}

/*----------------------------------------------------*/
/*        クッキーを取り込む汎用関数                  */
/* 書式 : myGetCookie(クッキー名)                     */
/* 戻り値 : 値(string)  null:該当なし                 */
/* http://www.red.oit-net.jp/tatsuya/java/cookie.htm  */

function myGetCookie(myCookie){
   myCookie = "@" + myCookie + "=";
   myValue = null;
   myStr = document.cookie + ";" ;
   myOfst = myStr.indexOf(myCookie);
   if (myOfst != -1){
      myStart = myOfst + myCookie.length;
      myEnd   = myStr.indexOf(";" , myStart);
      myValue = unescape(myStr.substring(myStart,myEnd));
   }
   return myValue;
}
