﻿// -----------------------------------------------------------------------------------
//
//	playback.js v1.0
//	by Shinichi Fujikawa (f-shin [at] milkstand.net) - http://www.milkstand.net
//	3/31/06
//
//	For more information on this script, visit:
//	http://f-shin.net/labs/2006/10/playbackjs.html
//
//	
//  spacial thanks to WebSig24/7 ( http://websig247.jp )
//
// -----------------------------------------------------------------------------------
/*
    NAME 
	  playback.js - easy slide presentation 
	  
    Library
      require lightbox.js
	  
	Sysnopsis
　　  Call at onload event.
	  myPlayback = new CPlayback( options );

*/


//CSlide ::  slide data class
CSlide = Class.create();
CSlide.prototype = {
	title : String ,
	imageUrl : String , 
	thumbUrl : String , 
	scriptType : String,
	scriptValue : String,
	
	initialize : function (){

		var title = arguments[0].title;
		var imageUrl = arguments[0].imageUrl;
		var thumbUrl = arguments[0].thumbUrl;
		var scriptType = arguments[0].scriptType;
		var scriptValue = arguments[0].scriptValue;
		
		this.title = (title ? title : "");
		this.imageUrl = (imageUrl ? imageUrl : "");
		this.thumbUrl = (thumbUrl ? thumbUrl : "");
		this.scriptType = (scriptType ? scriptType : "");
		this.scriptValue = (scriptValue ? scriptValue : "");
	
	}

};

// CPlayback :: slide control class

CPlayback = Class.create();

CPlayback.getInstance = function(){
		return CPlayback.instance;
};

CPlayback.prototype = {
	slideList:Array , 
	startIdx:Number , 
	maxIdx : Number , 
	activeSlideIdx : Number , 
	lightBox:Object , 
	player : Object , 
	playerId : String ,
	playerLeft : String , 
	parmalink: String , 
	contentPath : String , 
	timeiId : Number,
	instance : Object , 
	
	initialize : function (){
	
		this.slideList = new Array();
		//init values
	    var options = Object.extend({
			  parmalink: "",    // 未使用
			  contentPath: "flv/" , 
			  // 音声、動画データがあるフォルダをswf/player.swfを起点に相対パスで設定(注意！)
			  slidePath: "img/" ,  // スライドが格納されているパス。 <slidepath> / <slidePrefix> + 01(連番) + ". jpg"
			  thumbPath: "thumb/" , // サムネイルが格納されているパス。
			  thumbWidth : 120,  //サムネイルの横幅(px)
			  thumbHeight: 90,   //サムネイルの縦幅(px)
    		  startSlide:  0,    //開始するスライドの枚数(0が1枚目）
			  maxSlide : 1,  //スライド最大枚数( max -1 枚）
			  slidePrefix: "slide_",  //スライドファイルの先頭
			  slideScript: [] ,  //スライドに対するシナリオ
			  imgId : "imgArea" ,     //本クラスから出力するサムネイル一覧のID
			  playerId : "playerArea"  // 音声、動画プレーヤーのサムネイルID
		    }, arguments[0] || {});
	    this.start(options);
		CPlayback.instance = this;	
	},
	

	//サムネイル一覧のHTMLテンプレート
	getSlideTmpl : function(){
		var imgTmpl = "<li><div class='thumb-div' id='thumb##num##'><a href='##fn##' id='link_##num##' title='##title##' rel='lightbox[group]' style='visiblity:hidden'></a><img class='thumb-img' id='thumb-img##num##'  src='##thumb##' width='135' height='102' onclick='myPlayback.playSlide(##num##)'/></a></div></li>";
		// onclick='myPlayback.playSlide(##num##)'
//		var imgTmpl = "<div class='thumb-div' id='thumb##num##'><a href='##fn##' id='link_##num##' title='##title##' rel='lightbox[group]'><img class='thumb-img' id='thumb-img##num##' src='##thumb##' width='##width##' height='##height##'></a>";
//imgTmpl += "<br /><a href='javascript:void(0)' onclick='myPlayback.playSlide(##num##)'>##num-view##(##time##)</a></div>";
		return imgTmpl;
	
	},
	
	//swf/player.swfのHTMLテンプレート
	getPlayerTmpl : function(){
/*
		var plTmpl = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="360" height="277" id="player" align="middle">'
		+ '<param name="allowScriptAccess" value="sameDomain" />'
		+ '<param name="wmode" value="Transparent" />'
		+ '<param name="base" value="swf" />'
		+ '<param name="movie" value="swf/player_360_240_wada.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="Showall" /><embed src="swf/player_360_240_wada.swf#2" quality="high" bgcolor="#ffffff" width="360" height="277" name="player" align="middle" scale="Showall" allowScriptAccess="always" wmode="Transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" base="swf" \/>'
		+ '<\/object>';
*/
		var plTmpl = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="330" height="254" id="player" align="middle">'
		+ '<param name="allowScriptAccess" value="sameDomain" />'
		+ '<param name="wmode" value="Transparent" />'
		+ '<param name="base" value="../../swf" />'
		+ '<param name="scale" value="fit" />'
		+ '<param name="movie" value="../../swf/player_360_240_wada.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /><param name="scale" value="Showall" /><embed src="../../swf/player_360_240_wada.swf#2" quality="high" bgcolor="#ffffff" width="330" height="254" name="player" align="middle" scale="fit" allowScriptAccess="always" wmode="Transparent" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" base="../../swf" \/>'
		+ '<\/object>';
		
		return plTmpl

	},

	//コンストラクタから呼び出される。再生開始までの処理を行う
	start : function (o){
	
		this.startIdx = o.startSlide;
		this.maxIdx  =o.maxSlide;
		this.parmalink = o.parmalink;
		this.contentPath  =o.contentPath;
		this.playerId  = o.playerId;

		var imgTileSrc = "";
		
		var slideScriptHash = new Object();
	
		for (var i = 0 ; i < o.slideScript.length ; i++){
	
			var scr = o.slideScript[i];
			var vnum , vtype , vname ;
			if (scr.length = 3){
				vnum = scr[0];
				vtype = scr[1];
				vname = scr[2];
			}
			slideScriptHash[vnum] = {type : vtype , value : vname};
		}
	 

		 for (var i = this.startIdx  ; i <= this.maxIdx  ; i++){

			var slNum = "";
			if ( i < 9 ) slNum = "0" + (i + 1);
		   	     else slNum = (i + 1);				 
				 
			var tmpSlide = new CSlide(
				{
				title:
					((o.slideTitle  && o.slideTitle.length && o.slideTitle.length > i ) ? o.slideTitle[i] : "") ,
				imageUrl :  o.slidePath + o.slidePrefix + slNum + ".jpg"  ,
				thumbUrl :  o.thumbPath + o.slidePrefix + slNum + ".jpg" , 
				scriptType  : (slideScriptHash[i + 1]) ? slideScriptHash[i + 1].type : null,
				scriptValue  : (slideScriptHash[i + 1]) ? slideScriptHash[i + 1].value : null
 				}
			);
	
			if (this.startIdx <= i){
				var tmp =  this.getSlideTmpl();
				tmp = tmp.replace(/##fn##/g , tmpSlide.imageUrl);
				tmp = tmp.replace(/##thumb##/g , tmpSlide.thumbUrl);
				tmp = tmp.replace(/##time##/g , this.timeFormat(tmpSlide.time));
				tmp = tmp.replace(/##title##/g , tmpSlide.title);
				tmp = tmp.replace(/##width##/g , o.thumbWidth);
				tmp = tmp.replace(/##height##/g , o.thumbHeight);
				tmp = tmp.replace(/##num-view##/g , i - this.startIdx + 1);
				imgTileSrc += tmp.replace(/##num##/g , i);
				this.slideList[i] = tmpSlide; 
			}
		 }
     	 $(o.imgId).innerHTML ="<ul>" +  imgTileSrc + "</ul>";

		//require lightbox.js
		initLightbox();
		this.lightBox = myLightbox;
		
		var plSrc = this.getPlayerTmpl();
		$(o.playerId).innerHTML = plSrc;

		function thisMovie(movieName) {
		    if (navigator.appName.indexOf("Microsoft") != -1) {
		        return window[movieName]
		    }
		    else {
		        return document[movieName]
		    }
		}
		this.player= thisMovie("player");
		this.playerLeft = undefined;
		
//		$(o.playerId).style.visibility ="hidden";
	
		/*
		var lh = usnescape(location.hash);
		var initIdx ;
		if (lh.length >= 2){
		   	var tmp = lh.substring(1,lh.length)
			if (tmp.match(/[0-9]+/)){
  		   		initIdx = parseInt(tmp);
			}else{
				initIdx =this.startIdx;
			}
		}else{
		   initIdx =this.startIdx;
		}
		*/
		//this.playSlide(this.startIdx);
//		setTimeout(function(){ this.playSlide(this.startIdx) }.bind(this) , 10);
	
	},
	
	//引数nから動画、音声を再生するメソッド(0が1枚目のスライド）
	playSlide : function(n){
	
		var nextThumb = $('thumb-img' + n);
		if (this.activeSlideIdx >= 0 && (this.activeSlideIdx >= this.startIdx) &&  (this.activeSlideIdx <= this.maxIdx)){
			var nowThumb = $('thumb-img' + this.activeSlideIdx);
			nowThumb.style.border="none";
		}
		
		nextThumb.style.border="5px solid #F66";
		this.activeSlideIdx = n;
		$('nowSlideView').src = myPlayback.slideList[n].thumbUrl;
		
		switch (myPlayback.slideList[n].scriptType){
			case "movie":
				try{
					this.player.playFlv(this.contentPath + myPlayback.slideList[n].scriptValue , 0);
				}catch(e){
				}
				break;
			default:
				try{
					this.player.playFlv(null);
				}catch(e){
				}
				break;
		}
				
	    $('indNowSlide').innerHTML = "スライド" + (this.activeSlideIdx + 1) ;

	},
	
	//引数 nの次のスライドから再生する
	nextSlide : function(){
		if ( this.activeSlideIdx + 1 <= this.maxIdx)	
			this.playSlide(this.activeSlideIdx + 1);
	},
	//引数 nの前のスライドから再生する
	prevSlide : function(){
		if (this.activeSlideIdx -1 >= this.startIdx)
			this.playSlide(this.activeSlideIdx -1);
	} ,

	//引数 sec （秒）を0:00:00の文字フォーマットで返す
	timeFormat:function (sec){

			var h = parseInt( sec / 3600 );
			var m = parseInt((sec - h * 3600) / 60);
			var s = parseInt(sec - h * 3600 - m * 60); 
			
			if (m < 10) m = "0" + m;
			if (s < 10) s = "0" + s;
		
			return h + ":" + m + ":" + s;
	},
	
	hidePlayer:function(){
	
		var agent = navigator.userAgent.toLowerCase();
		isIE = agent.indexOf("msie") != -1;
		
		if (isIE){
			if (this.playerLeft == undefined){
				$(this.playerId).style.position = "absolute";
				this.playerLeft = $(this.playerId).style.left;
			}
			$(this.playerId).style.left = "-1000px";

		}else{
			$(this.playerId).style.visibility ="hidden";
		}
	
	},
	
	visiblePlayer:function(){
	
		var agent = navigator.userAgent.toLowerCase();
		isIE = agent.indexOf("msie") != -1;
		
		if (isIE){
			if (this.playerLeft == undefined){
				$(this.playerId).style.position = "absolute";
				this.playerLeft = $(this.playerId).style.left;
			}
			$(this.playerId).style.left = this.playerLeft;

		}else{
			$(this.playerId).style.visibility ="visible";
		}
	
	}
		
	
	
}

// global変数、イベント処理

// call from Flash Player
// 再生時間の更新などの画面制御系の処理はすべてここだけに書いてあります。

var nowSlide = undefined;   //現在のスライド番号（0-）

function OnLoadPlayer(){

	var obj = CPlayback.getInstance();
	obj.playSlide(obj.startIdx);

}

//Flashのプレーヤーであるswf/player.swfから呼び出されます
function OnPlayHeadChange(state , playtime){

/*
var tmpNum = myPlayback.getSlideNum(playtime);

if (nowSlide != tmpNum){
	nowSlide = tmpNum;

	if (isLightBoxOpen) myLightbox.start($('link_' + nowSlide));

	$('nowSlideView').src = myPlayback.slideList[nowSlide].thumbUrl;
	
	for (var i=myPlayback.startIdx ; i < myPlayback.slideList.length ; i++){
	
		var t = $('thumb-img' + i);
		
		if (nowSlide == i){
			t.style.border="5px solid #F66";
		}else{
			t.style.border="none";
		}
	}
*/	
	/*
	location.hash=nowSlide;
	var hbAdd = "http://b.hatena.ne.jp/add?mode=confirm&url=##URL##";
	var hbEntry = "http://b.hatena.ne.jp/entry/##URL##";
	var hbImg = "http://b.hatena.ne.jp/entry/image/##URL##";

	$('hbAddLink').href= hbAdd.replace(/##URL##/g , myPlayback.parmalink + "#" + nowSlide);
	$('hbEntryLink').href= hbEntry.replace(/##URL##/g , myPlayback.parmalink + "#" + nowSlide);
	$('hbImg').src = hbImg.replace(/##URL##/g , myPlayback.parmalink + "#" + nowSlide);
	*/
/*
}

    $('indNowSlide').innerHTML = "スライド" + (tmpNum - myPlayback.startIdx + 1) ;
*/	
	/*
	$('time').innerHTML= state + " / " + myPlayback.timeFormat(playtime)
	+ " / 現在のスライド：" + (tmpNum - myPlayback.startIdx + 1);
	*/
}

//カーソルキーによる処理はここに記述
	function handleKey(ev){

		ev = (ev) ? ev : ((window.event) ? event : null );
		if (ev){
		
				switch (ev.keyCode) {
				case 37: //left
				case 80: //P
				case 66: //B
					myPlayback.prevSlide(nowSlide);
					break;
				case 38: //up

					break;
				case 39: //right
				case 70: //F
				case 78: //N
					myPlayback.nextSlide(nowSlide);
					break;
				case 40: // down

					break;
				}
			
			switch (ev.keyCode) {
				case 32: //space
					myLightbox.start($('link_' + nowSlide));
					break;
			}
		}
		
	Event.stop(ev);
		
	}
	document.onkeyup = handleKey;

