//SCRIPT COMPONENTS

//HOPUP HTML ver1.00a



	var setStartTime = new Array()

	var scriptVer = "ver1.00a [ Web for begginer ] 20021210 " //バージョン情報



//■■■■■  デフォルト情報  ■■■■■// (通常は変更する必要はありません)

//この設定情報は初期値であり、setH_ID@ の情報が存在した場合は使用されません



	setStartTime[1] =  6; //ホップアップＯＮのタイム  1/10秒 = 1

	setStartTime[2] =  1; //マウスが対象div要素全てから外れてから、実際にdiv要素が消えるまでのタイム

	setStartTime[3] =  8; //マウスが対象階層から外れたときに、そのdiv要素が消えるまでのタイム（0でOFF)

	hostIDname = "Hopup"; //div要素の ID識別判定文字列（ 標準 : Hopup ）

	offsetXcheck =  15     //２階層目以降のdiv要素のＸ位置を自動調整する　(0=false / 0!=true 重なり値を入力)

	offsetYcheck = -8     //２階層目以降のdiv要素のＹ位置を自動調整する　(0=false / 0!=true マウス位置からの移動量)

	mousedowncheck = true //div要素外でマウスクリックしたときに、表示しているdiv要素を削除する( false / true)



	alphaStatus = true    //アルファフィルタを使用する（ IE5 以降でのみ動作 ） ( false / true )

	alphaLast   = 100      //アルファフィルタの最終値 (0=透明 〜 100=不透明)

	alphaTimer  = 30      //値更新のタイミング ( ns ) １更新で値が10更新されます



	firstDIVx   = 1       //１階層のレイヤーＸ位置を規定（マウス位置＋数値）  0=false 1=>true

	firstDIVy   = 1       //１階層のレイヤーＸ位置を規定（マウス位置＋数値）  0=false 1=>true



//■■■■■■■■■■■■■■■■■■■//



//↓↓これ以降は実動作プログラム部です





//ブラウザチェック (is[ブラウザ] OK=true / NG= false )

	var VarUsrAgt = navigator.userAgent.toLowerCase();

	isMac = (navigator.appVersion.indexOf("Mac") != -1);

	isWin = (navigator.appVersion.indexOf("Win") != -1);

	isNS4 = (document.layers) ? 1 : 0;

	isNS6 = VarUsrAgt.indexOf("netscape6") != -1;

	isNS7 = VarUsrAgt.indexOf("netscape/7.") != -1;

	isIE5 = VarUsrAgt.indexOf("msie 5.") != -1;

	isIE6 = VarUsrAgt.indexOf("msie 6.") != -1;

	isIE7 = VarUsrAgt.indexOf("msie 7.") != -1;

	isIE8 = VarUsrAgt.indexOf("msie 8.") != -1;

	isOP6 = VarUsrAgt.indexOf("opera 6.") != -1;

	isOP7 = VarUsrAgt.indexOf("opera 7") != -1;

	isMZ1 = navigator.appName.indexOf("Netscape") != -1 && navigator.appVersion.charAt(0)   == 5;



	//IE5,IE6=WinOnly  NS6,NS7(Mozilla),OPERA7=Win or MAC

	isJS = ((isIE5 && !isMac) || (isIE6 && !isMac) || (isIE7 && !isMac)|| (isIE8 && !isMac) || isNS6 || isNS7 || isOP7 || isMZ1) && (!isOP6 && !isNS4) && (isWin || isMac)



		//OPERA7 は製品版を待ちます(2002-12現在)

		if (isOP7) isJS = false

		//上スクリプトを切ればOpera7beta1で動作します。

		//DIVで横幅縦幅を絶対値で入力すれば、うまく動くようです



var timercount = 0;

var layData = new Array()

var timerID



	//StyleSheetSetting (DIV:display=none)

	if (isJS || isOP6 || isOP7 || isNS4){ 

		document.write("<style type=\"text/css\">");

		document.write("DIV { display:none }");

		document.write("</style>");

	}





//マウス移動イベントの取得

if (isJS){

	document.onmousemove = mousemove;

	document.onmousedown = mousedown;

}



//動作メインアルゴリズム @ スクリプト最適化 v2.00

//zone laynum power がともに０の場合は、ウインドウリセットを行う

//power =0 OFF / 1 ON(タイマー起動) / 2 ON(即効起動)

//ＩＤオプション(DivOption)チェックスクリプト搭載版（将来の拡張に備える為）

var DivOption=""

function Hopdiv(zone,laynum,power){

	if (!isJS) return;

	//タイマー関数が動作していた場合はリセットを行う

	if (timercount != 0){ ClearTimer(timerID) }

	//アルファチャンネルが動作中であった場合は

	//数値をリセットする

	if ( alphacount >0){

		ClearTimer(a_filter)

		alphacount = 0;dv_main.style.filter = "alpha(opacity="+alphaLast+",style=0)"

	}



	timercount = 1; //時間軸情報を初期化

	if (power==2) { timercount = setStartTime[1] }; //power=2 の場合は時間軸を早送り

	layData[1] = zone;layData[2] = laynum;layData[3] = power



	DivOption=""

	//DIVのIDにオプション識別番号がある場合はそちらを抽出する（将来の拡張用）

	if (!isNaN(layData[1]) && !isNaN(layData[2]) &&(zone+laynum+power!=0 )){

		DivData = div_id.indexOf(layData[1]+"_"+layData[2]) + String.valueOf(layData[1]).length + String.valueOf(layData[2]).length +1 //対象div要素のdiv_idの終端位置

		for (i=DivData;i<=div_id.length; i++){

			if ( div_id.substr(i,1) == "@" ) break;

		}

		DivOption=div_id.substr(DivData,i-DivData)

	}

	timerID = setInterval("HopTimer()",100);

}



//タイマー稼動時間軸

//    setStartTime[n]/10 秒経過時に指定のスクリプトを動作させる

//    割り当て引数  layData[0] 〜 [2]

function HopTimer(){

	if (!isJS) return;

	timercount ++ //時間の加算

	

	if (layData[3] >= 1){ //div要素描画

		if (timercount >= setStartTime[1]){

			//表示対象より低い階層のdiv要素を閉じる

			ClearTimer(timerID);

			DivZonePreset(layData[1],1);

			

			//div要素を描画する (id判定ルーチン付)

			for (i=0; i<=div_count; i++){

				div_data = document.getElementsByTagName('div')[i];

				if (div_data && div_data.id == hostIDname +layData[1]+"_"+layData[2] + DivOption){



					dv_main = document.getElementById(hostIDname + layData[1]+"_"+layData[2] + DivOption);

					if (layData[1] > 1){ //div要素位置情報をoffsetwidthより算出し代入する //２階層目以降

						dv_offset = document.getElementById(nowDIV); //現div要素情報の取得

						if (offsetXcheck && !dv_main.style.left){ //スタイルシートの値を優先

							dv_main.style.left = dv_offset.offsetWidth + parseInt(dv_offset.style.left) - offsetXcheck

						}

						if (offsetYcheck && !dv_main.style.top){  //スタイルシートの値を優先

							dv_main.style.top  = mouseY + offsetYcheck;

						}

					} else { //１階層目は必要に応じて初期位置を代入する　スタイルシートの値を優先

						if (firstDIVx!=0 && firstDIVy!=0 && !dv_main.style.left && !dv_main.style.top){

							dv_offset = document.getElementById(nowDIV); //現div要素情報の取得

							dv_main.style.left = mouseX + firstDIVx

							dv_main.style.top  = mouseY + firstDIVy

						}

						status = (dv_main.style.left +"/"+ dv_main.style.top)

					}



					//アルファチャンネル指定部 (IE5/IE6 ただしMACは除く)

					if ( (isIE5 || isIE6 || isIE7 || isIE8 ) && alphaStatus && !isMac && !isOP7){

						alphacount = 0;dv_main.style.filter = "alpha(opacity=0,style=0)"

						a_filter = setInterval("alphafilter()",alphaTimer);

					}

					dv_main.style.display= "block";

					break;

				}

			}

		}

	}else{ //表示クリア命令

		if (layData[1] + layData[2] + layData[3] ==0){ //全表示をクリア

			if (timercount >= setStartTime[2]){

				ClearTimer(timerID); DivZonePreset(0,0);

			}

		}else{ //指定階層以降のdiv要素をクリア

			if (timercount >= setStartTime[3] ){

				//マウスが削除対象div要素上に乗っていない場合にのみ発動

				if ( parseInt( nowDIV.substr(hostIDname.length ,3)) < layData[1] ){

					DivZonePreset(layData[1],1);

				}

				ClearTimer(timerID);

			}else if(setStartTime[3] ==0){

				ClearTimer(timerID);

			}

		}

	}

}



//アルファフィルタの適応

var alphacount =0

function alphafilter(){

	if (!isJS) return;

	alphacount +=10

	dv_main.style.filter = "alpha(opacity="+alphacount+",style=0)"

	if (alphacount>=alphaLast) { 

		ClearTimer(a_filter) ;alphacount=0

		dv_main.style.filter = "alpha(opacity="+alphaLast+",style=0)"

	}

}



//タイマーの初期化

function ClearTimer(clearid){

	if (!isJS) return;

	if (clearid){

		clearInterval(clearid);timercount = 0;

	}

}



//指定階層(zone)以降のdiv要素データのクリア (v2.0)

//mode  0 非表示対象に指定階層を含む / 1 指定階層を含まない

//終了識別子＠を使用した軽量チェックバージョン

function DivZonePreset(zone,mode){

	if (!isJS) return;

	var k=0;

	for (i=0; i<=div_id.length; i++){

		switch (div_id.substr(i,1)){

			case "/":k=i;break; //開始識別子

			case "@":    		//終了識別子

				div_num = div_id.substr(k+1,(i) - (k+1) ) 

				if (parseInt(div_num)  > zone - mode){

					dv = document.getElementById(hostIDname + div_num);

					dv.style.display= "none";

				}

				break;

			default:break;

		}

	}

}



var mousedata=0;

var div_x=0;div_y=0

function mousemove(myEvents){

	if (!isJS) return;



	if (isIE5 || isIE6 || isIE7 || isIE8 || isOP7){ // mouseX ,Y 絶対座標

		mouseX  = window.event.clientX + document.body.scrollLeft; 

		mouseY  = window.event.clientY + document.body.scrollTop; 

		windowX = document.body.clientWidth

		windowY = document.body.clientHeight

	} else if (isNS6 || isNS7 || isMZ1) {

		mouseX  = myEvents.pageX; mouseY  = myEvents.pageY;

		windowX = innerWidth

		windowY = innerHeight

	}



	//マウスがdiv要素上から外れた場合の処理

	if (nowDIV =="BODY" && mousedata==1){

		mousedata=0;Hopdiv(0,0,0);

	} else if (nowDIV !="BODY" && mousedata==0){

		mousedata=1;ClearTimer(timerID);

	}



	nowDIVlocation() //現在のマウスの情報を取得



	//div要素移動によって自動的に階層以降のdiv要素を非表示にする

	if (nowDIV != oldDIV) {

		divzone = parseInt( nowDIV.substr(hostIDname.length ,3) )

		//受け渡し情報は +1 加算する

		//これは、閉じるdiv要素がマウスの現階層より深いものに限るためである

		if (divzone != isNaN) Hopdiv(divzone+1,0,0); //BODY等の数字以外の情報のときは非発動

	}

}



//マウスクリックダウン時の動作

//クリックダウンした場所がdiv要素でない場合は、div要素を即時クリア

//（ただし、mousedowncheck = TRUE である場合に限る）

function mousedown(myEvents){

	if (!isJS || !mousedowncheck) return;

	if (nowDIV =="BODY"){ ClearTimer(timerID);DivZonePreset(0,0);}

}





//マウスカーソルの位置がdiv要素上にあるかどうかの判定式

//div要素情報抽出機能ＩＥ対応

//ブラウザ統合版 v2.20a ファンクション化

//  マウスが相互に重なったレイヤー上である場合は、後検出したdiv要素位置を実位置として使用する

var nowDIV="-",oldDIV="-";

function nowDIVlocation(){

	if (!isJS) return;

	oldDIV = nowDIV; nowDIV ="BODY";div_num="";

	for (i=0; i<div_id.length; i++){

		switch (div_id.substr(i,1)){

			case "/": k=i ;break

			case "@": 

				divoffset = document.getElementById(hostIDname + div_id.substr(k+1,(i) - (k+1)));

				ofW = divoffset.offsetWidth;ofH = divoffset.offsetHeight; //オフセット値

				dvY = parseInt(divoffset.style.top);dvX = parseInt(divoffset.style.left);

				if (mouseX >= dvX && mouseY >= dvY && mouseX <= dvX+ofW && mouseY <= dvY+ofH){

					nowDIV = hostIDname + div_id.substr(k+1,(i) - (k+1));

				}

				break;

			default:break;

		}

	}

}







var div_data , div_id="/" ,div_count =0;

var div_lastZone=0,div_checkZone=0;

var div_arrange = new Array()

function startwindow(){

	if (!isJS) return;



	//DIVタグ作成されたオブジェクト情報の取得と格納

	//DIVタグスタイルシートへ初期情報を挿入

	for (i = 0 ; i <= 500; i ++){

		div_data = document.getElementsByTagName('div')[i];



		//DIVが存在し、id識別子が合致し、id識別子の後ろが数字である場合

		if (div_data  && div_data.id.substr(0,hostIDname.length)==hostIDname && !isNaN(parseInt(div_data.id.charAt(hostIDname.length)))){

			//DIV情報を配列へ一時格納する

			div_arrange[i] = div_data.id.substr(hostIDname.length,20)

			//DIV初期値格納 (style情報を優先する)

			dv = document.getElementById(div_data.id);

			if(!dv.style.display)  dv.style.display= "none";

			if(!dv.style.position) dv.style.position = "absolute";

			dv.style.zIndex = parseInt(div_data.id.substr(hostIDname.length,7)) //zIndexにレイヤー階層値を代入



			//DIV最終階層を検出

			div_checkZone = parseInt(div_data.id.substr(hostIDname.length,7))

			if (div_checkZone >= div_lastZone) div_lastZone = div_checkZone;



		} else if (!div_data){ //divを読み終えた場合

			div_count =i

			break; //FOR終了

		}



		if (div_data){

			//ＨＴＭＬ埋め込みされた情報の呼び出しフラグを認識した場合

			div_data.style.display= "none";

			div_data.position = "absolute";

			if (div_data.id.substr(0,8) =="setH_ID@") ComponentsDivData(div_data.id)

		}



	}



	//div_idの作成（zIndex階層昇順へ並び替えを行う）

	for(i=0; i<=div_checkZone+1; i++){   //div要素最終階層までのループ

		for (k=0 ; k<=div_count-1; k++){ //div要素合計数のループ

			if ( parseInt(div_arrange[k]) == i){

				div_id += div_arrange[k] + "@/"

			}

		}

	}

	div_id+="EOF"



}



//コンポーネント情報引き渡し用div要素解析部

checkData=""

function ComponentsDivData(data){

	for (di = 0 ; di <= data.length ; di++){

		if ( data.substr(di,1) == "@" || data.substr(di,1) == "," || data.substr(di,1) == ";"){

			checkData = data.substr(di+1,2)

			for (dk = di+1 ; dk <= data.length ; dk++){ //識別子チェッカー

				if ( data.substr(dk,1) == "=" || data.substr(dk,1) == ":" ) break;

				if ( data.substr(dk,1) == "@" || data.substr(dk,1) == "," || data.substr(dk,1) == ";"){

					 dk=0;break;

				}

			}

			numberData = parseInt(data.substr(dk+1,8))

			if (!isNaN(numberData)){

				switch (checkData){

					case "T1":setStartTime[1] = numberData;break; 

					case "T2":setStartTime[2] = numberData;break; 

					case "T3":setStartTime[3] = numberData;break;

					case "oX":offsetXcheck = numberData;break;

					case "oY":offsetYcheck = numberData;break;

					case "mC":mousedowncheck = numberData;break;

					case "aS":alphaStatus = numberData;break;

					case "aL":alphaLast   = numberData;break;

					case "aT":alphaTimer  = numberData;break;

					case "Fx":firstDIVx   = numberData;break;

					case "Fy":firstDIVy   = numberData;break;

					default:break;

				}

			}

		}

	}

}





