(function($) {

	$.fn.videoPlayer = function(options) {

		options = $.extend({},$.fn.videoPlayer.settings, options);

		return this.each(function(){
			var flg = supportJudge();

			if(flg[0]&&flg[1]){
				var videoObj = $(this);
				var videoWraps = $('<div />').addClass('videoContainer');

				$('.nosupport').hide();

				// コントロールを紐付け
				var container = videoObj.parent('.videoContainer');		// video要素とコントロールを内包
				var playBtn = $('.play', container);					// 再生・停止ボタン
				var playBtnL = $('.playBtn', container);				// 再生ボタン（コンテナ中央）

				if(options.isControl){
					// コントロールのHTML
					var controls = $('<ul class="videoControl"><li class="play"><span></span></li><li class="slider"><ul class="seekBar"><li class="loadProgress"></li><li class="playProgress"><span></span></li></ul></li><li class="time">00:00 / 00:00</li><li class="volume"><ul><li title="0"></li><li title="1"></li><li title="2"></li><li title="3"></li><li title="4"></li><li title="5"></li></ul></li></ul><p class="playBtn"></p>');

					// video要素とコントロールを追加
					videoObj.wrap(videoWraps);
					videoObj.after(controls);

					// コントロールを紐付け
					var control = $('.videoControl', container);			// コントロール
					var seekBar = $('.seekBar', container);					// シークバー
					var seekBarPosition = seekBar.offset().left;			// シークバーの位置取得
					var playProgress = $('.playProgress', container);		// プログレスバー（動画再生時）
					var loadProgress = $('.loadProgress', container);		// プログレスバー（動画ロード時）
					var volumeList = $('.volume li', container);			// 音量ボタン
					var timer = $('.time', container);						// 全体・再生時間

					// テーマのクラス名を追加
					container.width(videoObj.width()).addClass(options.theme);
					// 一旦コントロールを消す
					control.hide();

					// プログレスバーの作成（event:progress）
					var loadProgressBar = function(e){
						// e.originalEvent:Firefox, videoObj[0].buffered.end(0):webkit, operaはprogressイベントが取れない
						var loaded = e.originalEvent.loaded || videoObj[0].buffered.end(0);
						var total = e.originalEvent.total || videoObj[0].duration;
						var p = (loaded / total) * seekBar.width();
						loadProgress.width(p);
					};

					videoObj.bind('progress',function(e){loadProgressBar(e);});

					// video要素のコントロール属性を削除
					videoObj.removeAttr('controls');

					// 時間表示（format:"00：00"）
					var timeMath = function(seconds){
						seconds = Math.round(seconds);
						minutes = Math.floor(seconds / 60);
						minutes = (minutes >= 10) ? minutes : '0' + minutes;
						seconds = Math.floor(seconds % 60);
						seconds = (seconds >= 10) ? seconds : '0' + seconds;
						return minutes + ':' + seconds;
					};

					// 動画全体の時間を取得・表示
					var getVideoTime = function(){
						if(videoObj[0].readyState){
							var duration = videoObj[0].duration;
						}else{
							setTimeout(getVideoTime,150);
						}


						if(duration){
							timer.text('00:00 / '+ timeMath(duration));
						}
					};

					getVideoTime();

					// 動画の現在の再生位置
					var timeDisplay = function(){
						timer.text(timeMath(videoObj[0].currentTime) + ' / ' + timeMath(videoObj[0].duration));
						var p = (videoObj[0].currentTime / videoObj[0].duration) * seekBar.width();
						playProgress.width(p);
					};

					// シークバーを動かした時
					var progressUpdate = function(e){
						if(e.type == "mousedown"){
							videoObj[0].pause();
						}else{
							var seekRange = seekBarPosition + seekBar.width();
							var timePoint = (e.pageX - seekBarPosition) / seekBar.width() * videoObj[0].duration;
							videoObj[0].currentTime = timePoint;
							videoObj[0].play();
						}
					};

					var progressMouseDown = function(e){
						e.preventDefault();
						seekBar.bind('mousemove',progressMouseMove);
						seekBar.bind('mouseup',progressMouseUp);
					};

					var progressMouseMove = function(e){
						progressUpdate(e);
					};

					var progressMouseUp = function(e){
						seekBar.unbind('mousemove',progressMouseMove);
						seekBar.unbind('mouseup',progressMouseUp);
					};

					seekBar.bind('mousedown',progressMouseDown);
					seekBar.bind('click',progressUpdate);

					videoObj.bind('timeupdate',timeDisplay);

					// 音量設定
					var volumeSet = function(sVolume){
						videoObj[0].volume = sVolume;
						localStorage.volume = videoObj[0].volume;
					};

					volumeSet(localStorage.volume || options.defaultVolume);

					// 音量表示作成
					var volumeDisplay = function(){
						var currentVolume = localStorage.volume ? Math.floor(localStorage.volume * 10) / 2 : Math.floor(videoObj[0].volume * 10) / 2;
						volumeList.removeClass('volumeOn');
						if(currentVolume > 0){
							for(var i=0;i<=currentVolume;i++){
								volumeList.eq(i).addClass('volumeOn');
							}
						}else{
							volumeList.eq(0).removeClass('volumeOn');
						}
					};

					// 音量変更
					var volumeChange = function(e){
						var currentVolume = $(e.target).attr('title');
						var sVolume = currentVolume / 5;

						volumeSet(sVolume);
						volumeDisplay();
					};

					volumeList.bind('click',function(e){volumeChange(e);});
					volumeDisplay();

					// コントロールの表示・非表示（event:mouseover,mouseout）
					container.bind('mouseover',function(){ control.show(); });
					container.bind('mouseout',function(){ control.hide(); });

					// コントロールを表示
					control.show();

					// 再生・停止のコントロールをクリックイベントにバインド
					playBtnL.bind('click',OnPlayPause);
					playBtn.bind('click',OnPlayPause);
					videoObj.bind('click',OnPlayPause);
					seekBar.bind('click',OnPlayPause);

					videoObj.bind('play',function(){
							playBtn.removeClass('play').addClass('pause');
					});

					videoObj.bind('playing',function(){
							playBtnL.hide();
					});

					videoObj.bind('pause',function(){
							playBtn.removeClass('pause').addClass('play');
					});
				}else{
					// video要素のコントロール属性を削除
					videoObj.removeAttr('controls');
				}

				// 再生・停止
				var OnPlayPause = function(e){
					var isSlide = false;

					if(e){
						isSlide = ($(e.currentTarget).attr('class') == 'seekBar') ? true : false;
					}

					if(videoObj[0].paused){
						videoObj[0].play();
					}else{
						// 再生途中でシークバーを動かしても停止しないように
						if(isSlide == false){
							videoObj[0].pause();
						}
					}
				}

				videoObj.bind('ended',function(){
					if(options.loop && options.loopInterval > 0){
						intervalTimer = setTimeout(loopPlay,options.loopInterval);
					}else if(options.loop){
						loopPlay();
					}else{
						playBtn.removeClass('pause').addClass('play');
						playBtnL.show();
						OnPlayPause();
					}
				});

				// autoplay属性があったら自動再生
				if(videoObj.attr('autoplay')){
					videoObj[0].play();
				}

				var loopPlay = function(){
					videoObj[0].currentTime = 0;
					videoObj[0].play();
				};
			}
		});
	};

	// video要素がサポートされているか（iPadとWindows Safariははずす）
	supportJudge = function(){
		var videoElement = document.createElement('video');
		var flg = new Array();
		flg[0] = !!(videoElement.canPlayType);
		flg[1] = true;
		var isIpad = navigator.userAgent.match(/iPad/i) != null;
		var winSafari = navigator.userAgent.match(/Win/i) != null && navigator.userAgent.match(/Safari/i) != null ? true : false;
		for(var i=0,len=navigator.plugins.length;len>i;i++){
			if(winSafari == true && navigator.plugins[i].filename.indexOf("QuickTime") > -1){
				flg[1] = false;
				break;
			}
		}
		if(isIpad){
			flg[0] = false;
			flg[1] = false;
		}
		return flg;
	};

	settings = $.fn.videoPlayer.settings = {
		defaultVolume: 0.85,
		isControl:false,
		theme : "defaultTheme",
		loop : false,
		loopInterval : 0
	};

})(jQuery);

$(function(){
	$("#video").videoPlayer();
});



