/* =================================================================
 雪のように画像を降らせるアニメーション処理 falling_snow.js Ver1.0
 Written  2002.5.21  By C.Tomimura 
 
 Copyright(C) Chihaya TOMIMURA 2002-2003
 Contact:tmchihaya@s4.xrea.com  URL:http://tmchihaya.s4.xrea.com/
 Attention:
 このプログラムはフリーソフトです。このプログラムを使用することにより発生
 したいかなる損害に対しても作者は一切の責任を負いません。
================================================================== */
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//  プログラム設置前にここでお好みの設定情報をセットしてください  

var img_snow0 = "images/otiba_1.gif";	// imgデータパスその1
var img_snow1 = "images/otiba_2.gif";	// imgデータパスその2
var tsz_snow = 10;		// 画像タテサイズ
var ysz_snow = 10;		// 画像ヨコサイズ
var num_snow = 7;		// 表示する画像枚数
var tim_snow = 2000;		// 実行時間
                                //（100=1秒実行 0以下=ずっと実行)
var speed_snow = 5;		

//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

//-------------------------------------------------------------------
// グローバル変数
//-------------------------------------------------------------------
var tarea_snow;	// ブラウザ内可動エリア・タテサイズ
var yarea_snow;	// ブラウザ内可動エリア・ヨコサイズ
var brwsName_snow;	// ブラウザ種類
var timeID_snow;	// タイマーID
var timeIndex_snow;	// 実行時間カウント用Index
 
fallimg_snow = new Array();  // 降らせる画像
xline_snow = new Array();    // x軸・描画座標
yline_snow = new Array();    // y軸・描画座標
xrandom_snow = new Array();  // x軸・乱数
yrandom_snow = new Array();  // y軸・乱数
dx = new Array();
am = new Array();
//-------------------------------------------------------------------
// ブラウザチェッカ  browserChecker_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function browserChecker_SNOW()
{
  brwsName_snow = ""; // ブラウザ名

  if ( document.all){
       brwsName_snow = "IE";	// IE4/5/6
       return;
  }
  if (document.layers){
       brwsName_snow = "Netscape"; // ネスケ4
       return;
  }
  if (document.getElementById){
       brwsName_snow = "Mozilla"; // ネスケ6
       return;
  }
}

//-------------------------------------------------------------------
// 降らせるエリアset  setFallArea_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function setFallArea_SNOW()
{
  if ( brwsName_snow == "Netscape" ||	// ネスケ
       brwsName_snow == "Mozilla"){
     tarea_snow = self.innerHeight;
     yarea_snow = self.innerWidth;
  }else{				// IE
     tarea_snow = document.body.clientHeight;
     yarea_snow = document.body.clientWidth;
  }
}

//-------------------------------------------------------------------
// 乱数初期値発生、配列にセット  setDefRandomArray_SNOW()
// 引数：index_num,index_fall…関数呼び元から与えられるindex値
// 戻り値：なし
//-------------------------------------------------------------------
function setDefRandomArray_SNOW(index_num)
{
  // x軸・ｙ軸の座標を(x,y)とします。
  xline_snow[index_num] = Math.random()*(yarea_snow-ysz_snow); // x初期値
  yline_snow[index_num] = Math.random()*tarea_snow; 	 // y初期値
  xrandom_snow[index_num] = 0.02 + Math.random()/10;  	 // x乱数初期値
  yrandom_snow[index_num] = 0.7 + Math.random();	 // y乱数初期値

  dx[index_num] = 0;
  am[index_num] = Math.random()*20;

  return;
}

//-------------------------------------------------------------------
// 描画用乱数発生、配列にセット  setDrawRandomArray_SNOW()
// 引数：index_num…関数呼び元から与えられるindex値
// 戻り値：なし
//-------------------------------------------------------------------
function setDrawRandomArray_SNOW(index_num)
{
  // x軸・ｙ軸の描画座標を(x,y)とします。
  yline_snow[index_num] += yrandom_snow[index_num];	// yに乱数加算

  if ( yline_snow[index_num] > tarea_snow-tsz_snow ){ // yがタテ余白より大
       xline_snow[index_num] = Math.random()*(yarea_snow-am[index_num]-ysz_snow);
       yline_snow[index_num] = 0;
       // 乱数発生し直し
       xrandom_snow[index_num] = 0.02 + Math.random()/10;
       yrandom_snow[index_num] = 0.7 + Math.random();
  }
  dx[index_num] += xrandom_snow[index_num];

  return;
}

//-------------------------------------------------------------------
// スタイルシート記述  cssWrite_SNOW()
// 引数：index_num,index_fall…関数呼び元から与えられるindex値
// 戻り値：なし
//-------------------------------------------------------------------
function cssWrite_SNOW(index_num, index_fall)
{
  /* 記述内容（ダミー) ===================================================
  <DIV ID="img1" STYLE="POSITION: absolute; Z-INDEX: 1; VISIBILITY: visible;
  TOP: 15px; LEFT: 15px; width:1;">
  <IMG SRC="img/xxx.gif" border="0">
  </DIV>
  ===================================================================== */

  document.write("<DIV ID=\"dot"+ index_num +"\" STYLE=\"POSITION: absolute; Z-INDEX: "+ index_num +"; VISIBILITY: visible; TOP: " + num_snow + "px; LEFT: " + num_snow + "px; width:1;\">");
  document.write("<IMG SRC=\"" + fallimg_snow[index_fall] + "\" BORDER=\"0\">");
  document.write("</DIV>");

  return;
}
//-------------------------------------------------------------------
// LAYERタグ記述  layerWrite_SNOW()
// 引数：index_num,index_fall…関数呼び元から与えられるindex値
// 戻り値：なし
//-------------------------------------------------------------------
function layerWrite_SNOW(index_num, index_fall)
{
  /* 記述内容（ダミー) ===================================================
  <LAYER NAME="dot1" LEFT="15" TOP="15" VISIBILITY="fallimg">
  <IMG SRC="img/xxx.gif" BORDER="0">
  </LAYER>
  ===================================================================== */

  document.write("<LAYER NAME=\"dot" + index_num + "\" LEFT=" + num_snow + " TOP=" + num_snow + " VISIBILITY=\"fallimg_snow\">");
  document.write("<IMG SRC=\"" + fallimg_snow[index_fall] + "\" BORDER=\"0\">");
  document.write("</LAYER>");
    
  return;
}

//-------------------------------------------------------------------
// スタイルシートによる描画処理  drawCssProc_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function drawCssProc_SNOW()
{
  var i;
  var css_name;
  
  tim_snow = tim_snow - timeIndex_snow;
  if ( tim_snow == 0 ){
     // 描画消去ループ
     for (i = 0; i < num_snow; ++ i) {
         // 描画消去
         css_name = "dot"+i;
         document.all[css_name].style.visibility = "hidden";
     }
     clearInterval(timeID_snow);
     return;
  }

  // 描画ループ
  for (i = 0; i < num_snow; ++ i) {
      // 描画用乱数発生、配列にセット
      setDrawRandomArray_SNOW(i);
      // 描画
      css_name = "dot"+i;
      document.all[css_name].style.pixelTop = yline_snow[i];
      document.all[css_name].style.pixelLeft = xline_snow[i] + am[i]*Math.sin(dx[i]);
  }
}

//-------------------------------------------------------------------
// LAYERによる描画処理  drawLayerProc_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function drawLayerProc_SNOW()
{
  var i;
  var layer_name;
  
  tim_snow = tim_snow - timeIndex_snow;
  if ( tim_snow == 0 ){
     // 描画消去ループ
     for (i = 0; i < num_snow; ++ i) {
         // 描画消去
         layer_name = "dot"+i;
         document.layers[layer_name].visibility = "hide";
     }
     clearInterval(timeID_snow);
     return;
  }

  // 描画ループ
  for (i = 0; i < num_snow; ++ i) {
      // 描画用乱数発生、配列にセット
      setDrawRandomArray_SNOW(i);
      // 描画
      css_name = "dot"+i;
      document.layers[css_name].top = yline_snow[i];    
      document.layers[css_name].left = xline_snow[i] + am[i]*Math.sin(dx[i]);
  }
}

//-------------------------------------------------------------------
// DOMによる描画処理  drawDomProc_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function drawDomProc_SNOW()
{
  var i;
  var dom_name;
  
  tim_snow = tim_snow - timeIndex_snow;
  if ( tim_snow == 0 ){
     // 描画消去ループ
     for (i = 0; i < num_snow; ++ i) {
         // 描画消去
         dom_name = "dot"+i;
         document.getElementById(dom_name).style.visibility = "hidden";
    
     }
     clearInterval(timeID_snow);
     return;
  }

  // 描画ループ
  for (i = 0; i < num_snow; ++ i) {
      // 描画用乱数発生、配列にセット
      setDrawRandomArray_SNOW(i);
      // 描画
      dom_name = "dot"+i;
      document.getElementById(dom_name).style.top  = yline_snow[i];
      document.getElementById(dom_name).style.left = xline_snow[i] + am[i]*Math.sin(dx[i]);
  }
}

//-------------------------------------------------------------------
// 前準備〜降らせる処理（IE4/5/6専用処理） kickProcIE_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function kickProcIE_SNOW()
{
  var i, n;		// for文用index
  n = 0;

  // 前準備
  for (i = 0; i < num_snow; i++) {  
	// 乱数初期値発生、配列にセット
	setDefRandomArray_SNOW(i);	
	// HTML記述
	cssWrite_SNOW(i, n);	// スタイルシート
	 // imgパス用配列index
	if (n == (fallimg_snow.length-1)){
	   n = 0;
	}else{
	   n += 1; 
	}
  }

  // 降らせる
  timeID_snow = setInterval("drawCssProc_SNOW()",10); 

  return;
}

//-------------------------------------------------------------------
// 前準備〜降らせる処理（ネスケ4専用処理） kickProcNetscape_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function kickProcNetscape_SNOW()
{
  var i, n;		// for文用index
  n = 0;

  // 前準備
  for (i = 0; i < num_snow; i++) {  
	// 乱数初期値発生、配列にセット
	setDefRandomArray_SNOW(i);	
	// HTML記述
	layerWrite_SNOW(i, n);	// LAYERタグ
	 // imgパス用配列index
	if (n == (fallimg_snow.length-1)){
	   n = 0;
	}else{
	   n += 1; 
	}
  }

  // 降らせる
  timeID_snow = setInterval("drawLayerProc_SNOW()",10); 

  return;
}

//-------------------------------------------------------------------
// 前準備〜降らせる処理（ネスケ6専用処理） kickProcMozilla_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function kickProcMozilla_SNOW()
{
  var i, n;		// for文用index
  n = 0;
  speed_snow = speed_snow + 10; // スピード調整
  
  // 前準備
  for (i = 0; i < num_snow; i++) {  
	// 乱数初期値発生、配列にセット
	setDefRandomArray_SNOW(i);	
	// HTML記述
	cssWrite_SNOW(i, n);	// スタイルシート
	 // imgパス用配列index
	if (n == (fallimg_snow.length-1)){
	   n = 0;
	}else{
	   n += 1; 
	}
  }

  // 降らせる
  timeID_snow = setInterval("drawDomProc_SNOW()",10); 

  return;
}

//-------------------------------------------------------------------
// HTMLからじかに呼ばれる関数 kickProc_SNOW()
// 引数：なし
// 戻り値：なし
//-------------------------------------------------------------------
function kickProc_SNOW()
{

  //===== ブラウザチェッカ
  browserChecker_SNOW();	
  if ( brwsName_snow == "" ){
       return;	// ブラウザがネスケでもIEでもない
  }

  //=====  降らせるエリアset
  setFallArea_SNOW();

  //=====  降らせる画像セット
  fallimg_snow[0] = img_snow0; 
  fallimg_snow[1] = img_snow1;

  //=====  実行時間のチェック
  if ( tim_snow <= 0 ){
	tim_snow = -1;
	timeIndex_snow = 0;	// 実行時間カウントしない
  }else{
	timeIndex_snow = 1;	// 実行時間カウントする
  }

  //=====  前準備〜降らせる処理（各ブラウザ専用処理）
  switch(brwsName_snow){
    case "IE":	    // IE4/5/6
	kickProcIE_SNOW();
	break;

   case "Netscape": // ネスケ4
	kickProcNetscape_SNOW();
	break;

   case "Mozilla": // ネスケ6
	kickProcMozilla_SNOW();
	break;

   default:
	break;
  }

  return;
}

