function onYouTubePlayerReady(playerId){
	var id = decodeURI(playerId);
	var player = document.getElementById(id);
	
	window['eventListener_youtube_jquery_'+ id] = function(state){
		$('#'+ id).youtube('state', state);
	};
	
	player.addEventListener("onStateChange", "eventListener_youtube_jquery_"+ id);
}

(function($){
	$.fn.youtube = function(options, value){
		var constants = $.fn.youtube.contants;
		
		if(typeof(options) == 'string'){
			if(arguments.length > 1){
				return $(this).each(function(){
					function interval(){
						var event = false;
						
						if($('#'+ id).length){
							var bytesStart = player.getVideoStartBytes()
							var bytesTotal = player.getVideoBytesTotal();
							
							if(opt.event.buffer){
								if(player.getVideoBytesLoaded() != bytesTotal || bytesTotal < 100)
									event = true;
								opt.event.buffer(bytesStart, player.getVideoBytesLoaded(), bytesTotal);
							}
							if(opt.event.time){
								if(opt.state == 1 || opt.state == 2)
									event = true;
								
								var timeTotal = Math.ceil(player.getDuration());
								
								opt.event.time(Math.floor(timeTotal / bytesTotal * bytesStart), Math.ceil(player.getCurrentTime()), timeTotal);
							}
						}
						
						if(!event){
							clearInterval($.fn.youtube.interval[id]);
						}
					}
					
					var id = $(this).attr('id');
					
					var opt = $.fn.youtube.settings[id];
					var player = document.getElementById(id);
					
					switch(options){
						case 'mute':
							if(value == 'toggle')
								value = !opt['mute'];
							
							if(opt.event.mute)
								opt.event.mute($(this), value);
							
							if(value){
								player.mute();
								if(opt.event.volume)
									opt.event.volume($(this), 0);
							}
							else{
								player.unMute();
								if(opt.event.volume)
									opt.event.volume($(this), opt['volume']);
							}
							
							opt['mute'] = value;
							
							if(constants['cookies'])
								$.cookies.set('jquery_youtube_mute', value, {expiresAt:new Date($.now() + 31558464000)});
							
							break;
						case 'pause':
							player.pauseVideo();
							break;
						case 'play':
							if(opt.stopped){
								opt.stopped = false;
								
								player.seekTo(0);
							}
							else
								player.playVideo();
							break;
						case 'playpause':
							if(value === 'toggle')
								value = !(opt.state == 1);
							
							if(value)
								$(this).youtube('play', true);
							else
								$(this).youtube('pause', true);
							
							break;
						case 'seek':
							opt.stopped = false;
							
							var index;
							if(index = value.indexOf('%')){
								value = Math.ceil(player.getDuration()) / 100 * Math.floor(value.substr(0, index));
							}
							
							player.seekTo(value, true);
							break;
						case 'state':
							if(opt.state != value){
								var prevState = opt.state;
								opt.state = value;
								
								var func;
								var intv = 0;
								
								switch(value){
									case -1:
										var mute = opt['mute'];
										$(this).youtube('volume', opt['volume']);
										$(this).youtube('mute', mute);
										
										func = opt.event.create;
										break;
									case 0:
										intv = 2;
										func = opt.event.ended;
										break;
									case 1:
										if(prevState == 0)
											intv = 1;
											
										func = opt.event.play;
										break;
									case 2:
										func = opt.event.pause;
										break;
									case 3:
										intv = 1;
										func = opt.event.buffering;
										break;
									case 5:
										intv = 2;
										opt.stopped = true;
										func = opt.event.stop;
										break;
								}
								
								if(typeof(func) == 'function')
									func($(this));
								
								if(opt.event.playpause){
									opt.event.playpause($(this), (value==1?true:false));
								}
								
								if(value > -1){
									if(intv == 1){
										clearInterval($.fn.youtube.interval[id]);
										$.fn.youtube.interval[id] = setInterval(interval, 250);
									}
									else if(internval == 2){
										clearInterval($.fn.youtube.interval[id]);
									}
								}
							}
							break;
						case 'stop':
							player.stopVideo();
							break;
						case 'video':
							var index;
							var index2;
							
							if((index = value.indexOf('v=')) > -1){
								if((index2 = value.indexOf('&', index + 2)) > -1)
									value = value.substr(index + 2, (index2 - index -2));
								else
									value = value.substr(index + 2);
							}
							player.loadVideoById(value, 0);
							break;
						case 'volume':
							opt['volume'] = value;
							
							if(opt['mute'] && value > 0)
								$(this).youtube('mute', false);
							else if(!opt['mute'] && value == 0)
								$(this).youtube('mute', true);
							
							if(value > 0){
								if(constants['cookies'])
									$.cookies.set('jquery_youtube_volume', value, {expiresAt:new Date($.now() + 31558464000)});
								player.setVolume(value);
							}
							
							if(opt.event.volume)
								opt.event.volume($(this), value);
							break;
					}
				});
			}
			else{
				var id = $(this).attr('id');
				
				var opt = $.fn.youtube.settings[id];
				var player = document.getElementById(id);
				
				switch(options){
					case 'video':
						return opt['video'];
						break;
					case 'volume':
						return player.getVolume();
						break;
				}
			}
		}
		else{
			var o = $.extend({}, $.fn.youtube.defaults, options);
			
			if(constants['cookies']){
				if($.cookies.get('jquery_youtube_volume') != null)
					o['volume'] = $.cookies.get('jquery_youtube_volume');
				if($.cookies.get('jquery_youtube_mute') != null)
					o['mute'] = $.cookies.get('jquery_youtube_mute');
			}
			
			return $(this).each(function(){
				$.fn.youtube.count++;
				var id = $(this).attr('id');
				
				$.fn.youtube.settings[id] = o;
				swfobject.embedSWF('http://www.youtube.com/apiplayer?enablejsapi=1&version=3&playerapiid='+ id, id, $(this).width(), $(this).height(), '8', null, null, {allowScriptAccess:'always', wmode:'opaque'}, {'id':id});
			});
		}
	};
	$.fn.youtube.count = 0;
	$.fn.youtube.interval = {};
	$.fn.youtube.settings = {};
	$.fn.youtube.defaults = {
		'event':{
			'buffer':false,
			'buffering':false,
			'create':false,
			'ended':false,
			'mute':false,
			'play':false,
			'pause':false,
			'playpause':false,
			'stop':false,
			'time':false,
			'volume':false
		},
		'mute':false,
		'state':-2,
		'time':0,
		'stopped':false,
		'video':false,
		'volume':50
	};
	$.fn.youtube.contants = {
		'cookies':false
	};
})(jQuery);

$(document).ready(function(){
	if($.cookies)
		$.fn.youtube.contants['cookies'] = true;
});
