(function($){
	var volumeTimeout=[];
	var controlsTimeout=[];
	var messageTimeout=[];

	$.fn.jVideo=function(options){
			var options=$.extend({'margin':2}, options);

			jVtimeFormat=function(seconds)
			{
				var m=Math.floor(seconds/60)<10?"0"+Math.floor(seconds/60):Math.floor(seconds/60);
				var s=Math.floor(seconds-(m*60))<10?"0"+Math.floor(seconds-(m*60)):Math.floor(seconds-(m*60));
				return m+":"+s;
			};
			jVprogress=function(video,elem)
			{
				return Math.round($("#"+elem+" .jV-slider").width()*video.attr("currentTime")/video.attr("duration"));
			};
			jVmessage=function(elem,text)
			{
				$("#"+elem+" .jV-modal").fadeIn().next().html(text).position({my:'center',at:'center',of:"#"+elem}).fadeIn();
				jVmessageDelay(elem,0);
			};
			jVmessageDelay=function(elem,count)
			{
				jVcontrolsDelay(elem,0);
				window.clearTimeout(messageTimeout[elem]);
				if(count>=2)
				{
					$("#"+elem+" .jV-modal,#"+elem+" .jV-info").fadeOut();
					messageTimeout[elem]=false;
				}
				else
				{
					$("#"+elem+" .jV-modal,#"+elem+" .jV-info").fadeIn();
					messageTimeout[elem]=window.setTimeout(function(){jVmessageDelay(elem,count+1)}, 1000);
				}
			};
			jVvolumeDelay=function(elem,count)
			{
				jVcontrolsDelay(elem,0);
				window.clearTimeout(volumeTimeout[elem]);
				if(count>=3)
				{
					$("#"+elem+" .jV-volume-slider").fadeOut();
					volumeTimeout[elem]=false;
				}
				else
				{
					$("#"+elem+" .jV-volume-slider").fadeIn();
					volumeTimeout[elem]=window.setTimeout(function(){jVvolumeDelay(elem,count+1)}, 1000);
				}
			};
			jVcontrolsDelay=function(elem,count)
			{
				window.clearTimeout(controlsTimeout[elem]);
				if(count>=5)
				{
					$("#"+elem+" .jV-controls").fadeOut().parent().addClass("jV-nocursor");
					controlsTimeout[elem]=false;
				}
				else
				{
					$("#"+elem+" .jV-controls").fadeIn().parent().removeClass("jV-nocursor");
					controlsTimeout[elem]=window.setTimeout(function(){jVcontrolsDelay(elem,count+1)}, 1000);
				}
			};

			jVenterFullScreen=function(elem)
			{
				$("#"+elem+" .ui-icon-arrowthick-2-se-nw").fadeOut("normal").next().fadeIn("normal");

				if($("#"+elem+">video").get(0).webkitSupportsFullscreen)
				{
					$("#"+elem+">video").get(0).webkitEnterFullScreen();
				}
				else
				{
					$("#"+elem).addClass("jV-full","fast");
					$("body").css({"overflow":"hidden"});
				}
			};
			jVleaveFullScreen=function(elem)
			{
				$("#"+elem+" .ui-icon-closethick").fadeOut("normal").prev().fadeIn("normal");
				$("#"+elem).removeClass("jV-full","fast");
				$("body").css({"overflow":"auto"});
			};
			jVgenId=function(elem)
			{
				var uid=("video" + Math.random() * Math.pow(10, 17));
				elem.attr("id",uid);
				return uid;
			};
			jVresize=function(elem)
			{
				var totalH=$("#"+elem).height();
				var totalW=$("#"+elem).width();
				var buttonsH=$("#"+elem+" .jV-play").height()+(options.margin*2);
				var buttonsW=$("#"+elem+" .jV-play").width()+(options.margin*2);
				var currentW=$("#"+elem+" .jV-current").width()+(options.margin*2);

				$("#"+elem+" .jV-controls").css({"width":totalW,"height":buttonsH,"paddingTop":options.margin,"marginTop":totalH-buttonsH-1-options.margin});
				$("#"+elem+" .jV-current").css({"marginLeft":totalW-(buttonsW*2)-currentW});
				$("#"+elem+" .jV-volume,#"+elem+" .jV-volume-slider").css({"marginLeft":totalW-(2*buttonsW)+options.margin});
				$("#"+elem+" .jV-fullscreen").css({"marginLeft":totalW-buttonsW});
				$("#"+elem+" .jV-slider").css({"marginLeft":buttonsW+options.margin,"width":totalW-(3*buttonsW+currentW+options.margin*6)}).slider("option","max",$("#"+elem+" .jV-slider").width());
				$("#"+elem+" .jV-modal").css({"top":"inherit","left":"inherit","width":totalW,"height":totalH}).next().position({my:'center',at:'center',of:"#"+elem});
			};

			return this.each(function(){
			var video=$(this);
			var unique=video.parent().attr("id")!=""?video.parent().attr("id"):jVgenId(video.parent());
			video.attr("controls","")
			.before('<div class="jV-modal ui-widget-overlay" style="display:none;"/><div class="jV-info ui-state-highlight ui-corner-all" style="display:none;width:199px;height:14px;text-align:center;position:absolute;padding:4px;left:inherit;top:inherit" /><div class="jV-controls ui-widget-header"><span class="jV-play ui-icon ui-icon-play"/><span class="jV-pause ui-icon ui-icon-pause"/><span class="jV-current"/><span class="jV-slider"/><span class="jV-volume ui-icon ui-icon-volume-on"/><span class="jV-volume ui-icon ui-icon-volume-off"/><span class="jV-volume-slider"/><span class="jV-fullscreen ui-icon ui-icon-arrowthick-2-se-nw"/><span class="jV-fullscreen ui-icon ui-icon-closethick"/></div>')
			.css({"height":"100%","width":"100%"})
			.bind("timeupdate",function(){
				$("#"+unique+" .jV-current").html(jVtimeFormat(video.attr("currentTime"))+"/"+jVtimeFormat(video.attr("duration")));
				$("#"+unique+" .jV-slider").slider("value",jVprogress(video,unique));
				jVmessageDelay(elem,99);
			})
			.bind("volumechange",function(){
				$(".jV-volume-slider").slider("value",video.attr("muted")?0:Math.round(video.attr("volume")*100));
			})
			.bind("seeking",function(){
				jVmessage(unique,"Seeking position ...");
			})
			.bind("waiting",function(){
				jVmessage(unique,"Waiting for video ...");
			})
			.bind("durationchange",function(){
				$("#"+unique+" .jV-current").html(jVtimeFormat(video.attr("currentTime"))+"/"+jVtimeFormat(video.attr("duration")));
			})
			.bind("ended",function(){
				$("#"+unique+" .jV-controls>span:first").next().fadeOut("normal").prev().fadeIn("normal");

				video.attr("currentTime",0);
				video.get(0).pause();
			})
			.bind("mousemove",function(){
				jVcontrolsDelay(unique,0);
			})
			.parent().bind("click",function(){
				video.parent().addClass("jV-active");
				$("body").unbind("keydown").bind("keydown",function(e){
					var keyCode = e.keyCode || e.which;
					jVcontrolsDelay(unique,0);
					if(keyCode==32||keyCode==80) {
						if(video.get(0).paused)
						{
							$("#"+unique+" .jV-controls>span:first").fadeOut("normal").next().fadeIn("normal");
							video.get(0).play();
						}
						else
						{
							$("#"+unique+" .jV-controls>span:first").next().fadeOut("normal").prev().fadeIn("normal");
							video.get(0).pause();
						}
					}
					else if(keyCode==77 && video.attr("muted")==true)
					{
						jVvolumeDelay(unique,0);
						video.attr("muted",false);
						$("#"+unique+" .ui-icon-volume-off").fadeOut("normal").prev().fadeIn("normal");
					}
					else if(keyCode==77 && video.attr("muted")==false)
					{
						jVvolumeDelay(unique,0);
						video.attr("muted",true);
						$("#"+unique+" .ui-icon-volume-on").fadeOut("normal").next().fadeIn("normal");
					}
					else if(keyCode==70 && $("#"+unique).hasClass("jV-full")==false)
					{
						jVenterFullScreen(unique);
					}
					else if(keyCode==70 && $("#"+unique).hasClass("jV-full")==true)
					{
						jVleaveFullScreen(unique);
					}
					else if(keyCode==57 && video.attr("volume")>0.1)
					{
						jVvolumeDelay(unique,0);
						video.attr("volume",video.attr("volume")-0.1);
					}
					else if(keyCode==57)
					{
						jVvolumeDelay(unique,0);
						video.attr("volume",0);
					}
					else if(keyCode==48 && video.attr("volume")<0.9)
					{
						jVvolumeDelay(unique,0);
						video.attr("volume",video.attr("volume")+0.1);
					}
					else if(keyCode==48)
					{
						jVvolumeDelay(unique,0);
						video.attr("volume",1);
					}
					else if(keyCode==37)
					{
						video.attr("currentTime", video.attr("currentTime")-10<0?0:video.attr("currentTime")-10);
					}
					else if(keyCode==38)
					{
						video.attr("currentTime", video.attr("currentTime")+60>video.attr("duration")?0:video.attr("currentTime")+60);
					}
					else if(keyCode==39)
					{
						video.attr("currentTime", video.attr("currentTime")+10>video.attr("duration")?0:video.attr("currentTime")+10);
					}
					else if(keyCode==40)
					{
						video.attr("currentTime", video.attr("currentTime")-60<0?0:video.attr("currentTime")-60);
					}
					else if(keyCode==79)
					{
						if($("#"+unique+" .jV-controls").hasClass("ui-helper-hidden-accessible"))
						{
							$("#"+unique+" .jV-controls").removeClass("ui-helper-hidden-accessible");
						}
						else
						{
							$("#"+unique+" .jV-controls").addClass("ui-helper-hidden-accessible");
						}
					}
					if(keyCode==81) {
						video.attr("currentTime",0);
						$("#"+unique+" .jV-controls>span:first").next().fadeOut("normal").prev().fadeIn("normal");
						video.get(0).pause();
					}
					e.preventDefault;
				});
			})
			.bind("mouseout",function(){
				video.parent().removeClass("jV-active");
				$("body").unbind("keypress");
			});

			$("#"+unique+" .jV-controls>span:first").click(function(){
				$(this).fadeOut("normal").next().fadeIn("normal");
				video.get(0).play();
			})
			.next().css({"display":"none"}).click(function(){
				$(this).fadeOut("normal").prev().fadeIn("normal");
				video.get(0).pause();
			})
			.next()
			.next().slider({
				value: 0,
				orientation: "horizontal",
				range: "min",
				max: 1,
				animate: true,
				slide: function(event, ui) {
					video.attr("currentTime",Math.round(ui.value/$(this).slider("option","max")*video.attr("duration")));
				}
			})
			.next().mouseover(function(){
				jVvolumeDelay(unique,0);
				$(this).next().next().fadeIn("slow");
			})
			.mousemove(function(){
				jVvolumeDelay(unique,0);
			})
			.click(function(){
				jVvolumeDelay(unique,0);
				video.attr("muted",true);
				$(this).fadeOut("normal").next().fadeIn("normal");
			})
			.next().css({"display":"none"}).mouseover(function(){
				jVvolumeDelay(unique,0);
				$(this).next().fadeIn("slow");
			})
			.mousemove(function(){
				jVvolumeDelay(unique,0);
			})
			.click(function(){
				video.attr("muted",false);
				$(this).fadeOut("normal").prev().fadeIn("normal");
			})
			.next().slider({
				value: video.attr("volume")*100,
				orientation: "vertical",
				range: "min",
				min: 0,
				max: 100,
				step: 1,
				animate: true,
				slide: function(event, ui) {
					if(video.attr("muted"))
					{
						video.attr("muted",!video.attr("muted"));
						$(this).prev().removeClass("ui-icon-volume-off").addClass("ui-icon-volume-on");
					}
					video.attr("volume",ui.value/100);
				}
			})
			.mousemove(function(){
				jVvolumeDelay(unique,0);
			})
			.next().click(function(){
				jVenterFullScreen(unique);
			})
			.next().css({"display":"none"}).click(function(){
				jVleaveFullScreen(unique);
			});
			window.setInterval(function(){jVresize(unique)},60);
			jVcontrolsDelay(unique,0);
		});
	};
})(jQuery);
