/* rvplayer.js */

//var myPlayer = null;

;(function($) {

	// global private settings
	var last_player_id = 0;
	
	$.fn.rvplayerResize = function(width, height) {
		return this.each(function() {
			obj = $(this);
			obj.css( 'height', (parseInt(height)+30) +'px');
			obj.css( 'width', parseInt(width) +'px');
			this.AdjustScreen();
		});
	};
	
	$.fn.rvplayerSet = function() {
		var my_args = arguments;
		return this.each(function() {
			if( my_args.length > 2 ) {
				this.SetMedia( my_args[0], my_args[1], my_args[2] );
			} else if( my_args.length > 1 ) {
				this.SetMedia( my_args[0], my_args[1] );
			} else {
				this.SetMedia( my_args[0] );
			}
		});
	};
	
	$.fn.rvplayerPlay = function() {
		return this.each(function() {
			this.PlayMedia();
		});
	};
	
	$.fn.rvplayerPause = function() {
		return this.each(function() {
			this.PauseMedia();
		});
	};
	
	$.fn.rvplayer = function(options) {
		
		// private variables
		var defaults = {
			autoplay: false,
			poster: '',
			text_play: 'Play',
			text_pause: 'Pause',
			text_mute: 'Mute',
			text_unmute: 'Unmute',
			mute: false,
			volume: 80, /* as a percentage */
			duration: 0, /* total time in seconds */
			position: 0, /* start position in seconds */
			audio_swf: 'player_mp3_js.swf',
			video_swf: 'player_flv_js.swf',
			log_to: ''
		};  
		var options = $.extend(defaults, options);
		
		this.each(function() { // start constructor
		
			
			var obj = $(this);
			//var myPlayer = this; // pointer to this object
			
			var media = $( '.rvplayer-play', obj ).attr('href');
			var poster = $( '.rvplayer-poster', obj ).attr('src');
			var media_loaded = false;
			var html5_type = false;
			var flash_type = false;
			var isPlaying = false;
			var isVideo = false;
			var isFlash = false;
			
			var ext = _get_ext(media); // get file extension
			
			
			var html5_type = _get_html5_type('mp4');
			//var html5_type = _get_html5_type(ext);
			
			if( html5_type == false ) {
				flash_type = _get_flash_type(ext);
			} else {
				html5_type = _get_html5_type(ext); // May be audio
			}
				
			if( html5_type == false && flash_type == false ) {
				return; } // We cannot load this file
			
			var player = null;
			var player_audio = null;
			var player_video = null;
			var player_id = _get_player_id();
			var pos_changing = false;
			var last_volume = options.volume;
			var muted = options.mute;
			var duration =  options.duration;
			var position = options.position;
			var video_width = 0;
			var video_height = 0;
			if( duration == 0 && $('.rvplayer-seconds', obj ) ) {
				duration = $('.rvplayer-seconds', obj ).html();
			}
			
			// Append controls for this player
			$( '.rvplayer-controls', obj ).append( _controls(options) );
			$( '.rvplayer-pause', obj ).css('display', 'none');
			_set_volume( obj, last_volume);
			_set_position( obj, position, duration, pos_changing); // default duration
			_set_muted(obj, muted);
			_refresh_poster_image(obj, options.poster);
			
			if( html5_type )
			{
				/*
				var html5tag = html5_type.split('/')[0];
				if( html5tag == 'audio' ) { // HTML5 AUDIO
					obj.prepend('<audio id="'+ player_id +'_audio"></audio>');
				} else { // HTML5 VIDEO
					obj.prepend('<video id="'+ player_id +'_video" width="1" height="1"></video>');
				}
				*/
				
				obj.prepend('<video id="'+ player_id +'_video" width="1" height="1"></video>');
				obj.prepend('<audio id="'+ player_id +'_audio"></audio>');
				
			} else {
				/*
				var flashtag = flash_type.split('/')[0];
				
				if( flashtag == 'audio' ) {
					obj.prepend( _flash_audio(player_id, options) );
				} else {
					obj.prepend( _flash_video(player_id, options) );
				}
				*/
				obj.prepend( _flash_audio(player_id, options) );
				obj.prepend( _flash_video(player_id, options) );
				
				g_rvListener.AddPlayer(player_id + '_audio', this); // For audio flash player
				g_rvListener.AddPlayer(player_id + '_video', this); // For flash video player
			}
			
			//player = $( '#'+player_id ).get(0);
			player_audio = $( '#'+player_id +'_audio' ).get(0);
			player_video = $( '#'+player_id +'_video' ).get(0);
			
			if( !player_video || player_video.id != player_id + '_video' ) { // Something happened
				_rvplayer_log('Failed to retrieve player element');
				return; }
			
			var update_interval = false; // Hack for Chrome
			
			if( options.autoplay ) {
				setTimeout( function() {
						_play();
					}, 1000 );
			}
			
			// Volume control:
			$('.rvplayer-volumebox', obj).mousedown(function(event) {
				var vol_changing = true;
				var startX = event.pageX;
				var startPos = parseInt($('.rvplayer-volume', obj).css('right').split(/[^\d]/g)[0], 10);
				_rvplayer_log('volume mousedown() start  position X: '+ startX + '; start right offset: '+startPos );
				
				var funct_mousemove = function (event) {
					if( vol_changing ) {
						var newX = startPos -(event.pageX-startX);
						_rvplayer_log('volume mousemove() newX: '+newX );
						
						if( newX < 0 ) {
							last_volume = 100;
						} else if( newX < 30 ) {
							last_volume = Math.round(100*((30-newX)/30) );
						}
						
						if( html5_type ) {
							_rvplayer_log('New HTML5 volume: '+last_volume);
							if( !muted ) {
								if( last_volume ) {
									player_audio.volume = (last_volume/ 100);
									player_video.volume = (last_volume/ 100);
								} else {
									player_audio.volume = 0;
									player_video.volume = 0;
								}
							}
						} else {
							//_rvplayer_log('New Flash volume: '+last_volume);
							if( !muted ) {
								player_audio.SetVariable("method:setVolume", last_volume);
								player_video.SetVariable("method:setVolume", last_volume);
							}
						}
						
						_set_volume(obj, last_volume );
						return false;
					}
				};
				var funct_mouseup = function (event) {
					if( vol_changing ) {
						vol_changing = false;
						$(document).unbind('mousemove', funct_mousemove);
						$(document).unbind('mouseup', funct_mouseup);
						_rvplayer_log('volume mouseup()' );
					}
				};

				$(document).bind('mousemove', funct_mousemove);
				$(document).bind('mouseup', funct_mouseup);
				return false;
			});
			
			// Change position in media
			$('.rvplayer-position-button', obj).mousedown(function(event) {
				
				pos_changing = true;
				var startX = event.pageX;
				var playX = $('.rvplayer-position-button', obj).position().left;
				_rvplayer_log('start drag position left: '+ playX );
				
				var funct_mousemove = function (event) {
					if( pos_changing ) {
						var newX = playX + (event.pageX-startX);
						var totalPlayW = $('.rvplayer-progress', obj).width();
						if( newX < -5 ) {
							newX = -5;
						} else if( newX > (totalPlayW-5) ) {
							newX = (totalPlayW-5);
						}
						
						$('.rvplayer-position-button', obj).css('left', newX+'px');
						
						_rvplayer_log('mouse at: '+ event.pageX );
						return false;
					}
				};
				var funct_mouseup = function (event) {
					if( pos_changing ) {
						pos_changing = false;
						$(document).unbind('mousemove', funct_mousemove);
						$(document).unbind('mouseup', funct_mouseup);
						
						// Actually move to this new position
						var newPlayX = $('.rvplayer-position-button', obj).position().left + 5; // Factor in offset
						var totalPlayW = $('.rvplayer-progress', obj).width();
						
						if( newPlayX < 1 ) {
							position = 0;
						} else if( newPlayX >= totalPlayW ) {
							position = duration-1;
						} else {
							position = Math.round( duration * ( newPlayX / totalPlayW ) );
						}
						
						if( html5_type ) {
							var html5tag = html5_type.split('/')[0];
							if( html5tag == 'audio' ) {
								player_audio.currentTime = position;
							} else {
								player_video.currentTime = position;
							}
							_rvplayer_log('HTML5 set new time: '+position);
						} else {
							var flashtag = flash_type.split('/')[0];
							if( flashtag == 'audio' ) {
								player_audio.SetVariable("method:setPosition", (position*1000) );
							} else {
								player_video.SetVariable("method:setPosition", (position*1000) );
							}
							_rvplayer_log('Flash set new time: '+position);
						}
					}
					
					$(document).unbind('mouseup', funct_mouseup);
					$(document).unbind('mousemove', funct_mousemove);
				};

				$(document).bind('mousemove', funct_mousemove);
				$(document).bind('mouseup', funct_mouseup);
				return false;
			});
			
			/* START IP$d SUPPORT  */
			if( RegExp(" AppleWebKit/") .test(navigator.userAgent) && RegExp(" Mobile/") .test(navigator.userAgent) ) {
				
				_rvplayer_log('Updating player for iPhone/iPad...');
				obj.addClass('rvplayer-ipod');
				$('.rvplayer-position', obj).css('width', '0%');
				
				$('.rvplayer-controls', obj).bind('touchstart', function(e) {
					
					pos_changing = true;
					var startX = e.originalEvent.touches[0].pageX;
					var playX = $('.rvplayer-position-button', obj).position().left;
					var distX = 0;
					_rvplayer_log('.rvplayer-controls touch start at x'+ startX );
					
					$('.rvplayer-controls', obj).bind('touchmove', function(e) {
						distX = e.originalEvent.touches[0].pageX - startX;
						var newX = playX + distX;
						var totalPlayW = $('.rvplayer-progress', obj).width();
						if( newX < -5 ) {
							newX = -5;
						} else if( newX > (totalPlayW-5) ) {
							newX = (totalPlayW-5);
						}
						
						$('.rvplayer-position-button', obj).css('left', newX+'px');
						
						_rvplayer_log('.rvplayer-controls touch moved: '+ distX + (distX>0?' right':' left') );
					});
					
					$('.rvplayer-controls', obj).bind('touchend', function() {
						pos_changing = false;
						
						// Actually move to this new position
						var newPlayX = $('.rvplayer-position-button', obj).position().left + 5; // Factor in offset
						var totalPlayW = $('.rvplayer-progress', obj).width();
						
						if( newPlayX < 1 ) {
							position = 0;
						} else if( newPlayX >= totalPlayW ) {
							position = duration-1;
						} else {
							position = Math.round( duration * ( newPlayX / totalPlayW ) );
						}
						
						var html5tag = html5_type.split('/')[0];
						if( html5tag == 'audio' ) {
							player_audio.currentTime = position;
						} else {
							player_video.currentTime = position;
						}
							
						_rvplayer_log('HTML5 set new time: '+position);
					
						_rvplayer_log('.rvplayer-controls touch ended, total distance: '+distX);
						
						$( '.rvplayer-controls', obj).unbind('touchend');
						$( '.rvplayer-controls', obj).unbind('touchmove');
					});
				});
			}
			/* END IP$d SUPPORT  */
			
			/* Play control */
			$( '.rvplayer-play', obj ).click(function(e) {
				e.preventDefault();
				
				_play();
			});
			
			/* Pause */
			$( '.rvplayer-pause', obj ).click(function(e) {
				e.preventDefault();
				
				if( player_audio == null && player_video == null ) {
					return;
				}
				
				_pause();
			});
			
			/* Mute */
			$( '.rvplayer-mute', obj ).click(function(e) {
				e.preventDefault();
				
				if( player_audio == null && player_video == null ) {
					return;
				}
				
				muted = true;
				if( html5_type ) {
					player_audio.volume = 0;
					player_video.volume = 0;
				} else {
					player_audio.SetVariable("method:setVolume", 0);
					player_video.SetVariable("method:setVolume", 0);
				}
				
				_set_muted(obj, muted);
			});
			
			/* Unmute */
			$( '.rvplayer-unmute', obj ).click(function(e) {
				e.preventDefault();
				
				if( player_audio == null && player_video == null ) {
					return;
				}
				
				muted = false;
				if( html5_type ) {
					player_audio.volume = (last_volume / 100);
					player_video.volume = (last_volume / 100);
				} else {
					player_audio.SetVariable("method:setVolume", last_volume);
					player_video.SetVariable("method:setVolume", last_volume);
				}
				
				_set_muted(obj, muted);
			});
			
			/* Flash Listener event */
			this.ListenerEvent = function(name, listener) {
				switch( name ) {
					case 'init': {
						_rvplayer_log('ListenerEvent, init()');
					}; break;
					case 'update': {
						if( !isPlaying ) { return; }
						var new_duration = Math.round(listener.duration/1000);
						if( duration != new_duration ) {
							if( listener.bytesPercent > 99 || duration == 0 || new_duration > duration ) {
								duration = new_duration;
							}
						}
						_set_position(obj, Math.round(listener.position/1000), duration, pos_changing);
						if( listener.videoWidth != null ) {
							_rvplayer_log('ListenerEvent, position: '+listener.position+'; video width: '+listener.videoWidth+'; height: '+listener.videoHeight+'; duration: '+duration +'; loaded: '+ listener.bytesPercent +'%');
						} else {
							_rvplayer_log('ListenerEvent, position: '+ Math.round(listener.position/1000) +'; duration: '+duration +'; loaded: '+ listener.bytesPercent +'%');
						}
						if( listener.isPlaying != "true" ) {
							_set_play(obj, false);
							isPlaying = false;
						}
						
						var flashtag = flash_type.split('/')[0];
						if( flashtag == 'video' && listener.videoWidth != null && ( listener.videoWidth != video_width || listener.videoHeight != video_height ) ) {
							// Resize the control to maintain aspect ratio
							_rvplayer_log('Scaling video window to fit screen with video width: '+listener.videoWidth+'; height: '+listener.videoHeight);
							$('.rvplayer-window', obj).css('display', 'none'); // Hide the poster window so we can display the actual video in it's place
							video_width = listener.videoWidth;
							video_height = listener.videoHeight;
							this.AdjustScreen();
						}
						
						_rvplayer_log('Listener playing: '+listener.isPlaying);
					}; break;
					case 'finished' : {
						_set_position(obj, 0, Math.round(listener.duration/1000), pos_changing);
						_set_play(obj, false);
						isPlaying = false;
					}; break;
				}
			};
			this.AdjustScreen = function() {
				
				var screenHeight = obj.height()-30;
				var screenWidth = obj.width();
				
				var posterWin = $('.rvplayer-window', obj);
				posterWin.width(screenWidth);
				posterWin.height(screenHeight);
				
				if( video_height > 0 && video_width > 0 ) {
					var newWidth = screenWidth;
					var newHeight = newWidth * video_height / video_width;
					
					if (newHeight > screenHeight) {
						newHeight = screenHeight;
						newWidth = newHeight * video_width / video_height;
					}
					
					player_video.width = newWidth;
					player_video.height = newHeight;
					_update_embed(obj, player_video);
				} else {
					_refresh_poster_image(obj, options.poster);
					var html5tag = html5_type.split('/')[0];
					if( html5tag == 'video' ) {
						player_video.width = obj.width();
						player_video.height = (obj.height()-30);
					}
				}
			};
			this.PlayMedia = function() {
				_play();
			};
			this.PauseMedia = function() {
				_pause();
			};
			
			this.SetMedia = function(new_media) {
				// Look for arguments passed to function for say a new media file to play
				if( isPlaying ) {
					_pause();
				}
				
				$('.rvplayer-window', obj).css('display', 'inline');
				
				player_video.width = 1;
				player_video.height = 1;
				video_width = 0;
				video_height = 0;
				
				var ext = _get_ext(new_media); // get file extension
				if( html5_type ) {
					var new_html5_type = _get_html5_type(ext);
					if( new_html5_type == false ) {
						_rvplayer_log('SetMedia() HTML5 error, unable to play media with extension '+ext);
						return;
					}
					html5_type = new_html5_type;
				} else {
					var new_flash_type = _get_flash_type(ext);
					if( new_flash_type == false ) {
					_rvplayer_log('SetMedia() Flash error, unable to play media with extension '+ext);
						return;
					}
					flash_type = new_flash_type;
				}
				
				/*
				var ext = _get_ext(new_media); // get file extension
				var new_html5_type = _get_html5_type(ext);
				var new_flash_type = false;
				
				if( new_html5_type == false ) {
					new_flash_type = _get_flash_type(ext);
				}
					
				if( new_html5_type == false && new_flash_type == false ) {
					return false; } // We cannot load this file
				
				//$('#'+player_id).empty().remove(); // Remove the existing player
				//$(player).empty().remove();
				$('.rvplayer-window', obj).css('display', 'block');
				
				html5_type = new_html5_type;
				flash_type = new_flash_type;
				
				_rvplayer_log('SetMedia() Creating new player element...');
				// create player object...
				if( html5_type )
				{
					var html5tag = html5_type.split('/')[0];
					if( html5tag == 'audio' ) { // HTML5 AUDIO
						obj.prepend('<audio id="'+ player_id +'"></audio>');
					} else { // HTML5 VIDEO
						obj.prepend('<video id="'+ player_id +'" width="1" height="1"></video>');
					}
					_rvplayer_log('SetMedia() prepended HTML5 '+ html5tag );
				} else {
					var flashtag = flash_type.split('/')[0];
					
					if( flashtag == 'audio' ) {
						obj.prepend( _flash_audio(player_id, options) );
					} else {
						obj.prepend( _flash_video(player_id, options) );
					}
					_rvplayer_log('SetMedia(): added flash for media type: '+flashtag);
				}
				player = $( '#'+player_id ).get(0);
				g_rvListener.RemovePlayer(player_id);
				g_rvListener.AddPlayer(player_id, this); // For flash player
		
				if( player == null ) {
					// Error here
					_rvplayer_log('SetMedia() Unable to obtain player element.');
					return;
				}
				*/
				
				media = new_media;
				media_loaded = false;
				position = 0;
				if( arguments.length > 1 ) {
					duration = arguments[1];
					_rvplayer_log('duration changed to: '+duration);
				}
				if( arguments.length > 2 ) {
					options.poster = arguments[2];
					_rvplayer_log('image changed to: '+poster);
					
					_refresh_poster_image(obj, options.poster);
				}
				_set_position(obj, position, duration, false);
				_rvplayer_log('position updated to: '+position);
			};
			
			// Private object functions
			var _play = function() {
				
				
				if( player_video == null && player_audio == null ) {
					// Error here
					_rvplayer_log('_play(): No player element availale to play media in.');
					return;
				}
			
				_rvplayer_log('click play!');
				if( html5_type && !media_loaded )
				{
					/*
					if( options.volume )
						player.volume = (options.volume / 100);
					else
						player.volume = 0;
					*/
					var html5tag = html5_type.split('/')[0];
					_rvplayer_log('_play() setting HTML5 media: '+html5tag);
					if( html5tag == 'video' ) {
						
						player_video.width = obj.width();
						player_video.height = obj.height()-30;
						//if( $.browser.mozilla ) {
							player_video.poster = poster;
						//}
						$('.rvplayer-window', obj).css('display', 'none');
						_rvplayer_log( '_play() Set video player width: '+player_video.width+'; height: '+ player_video.height);
						
						$('#'+player_id+'_video').css('display', 'block'); // CHECK HERE
						player_video.setAttribute('src', media);
						player_video.load();
						
						player_video.addEventListener('ended', function(evt) {
							
							if( update_interval ) {
								clearInterval( update_interval );
								update_interval = false;
							}
							_rvplayer_log( 'Playback end called.');
							position = 0;
							player_video.currentTime = 0;
							player_video.pause();
							_set_play(obj, false);
							isPlaying = false;
							_set_position(obj, position, duration, pos_changing);
							_rvplayer_log( 'Playback ended.');
						}, false);
						
						player_video.addEventListener('timeupdate', function(evt) {
							
							if( player_video ) {
								if( duration != player_video.duration ) {
									duration = player_video.duration; }
								if( position != player_video.currentTime ) {
									position = player_video.currentTime; }
								_set_position(obj, position, duration, pos_changing);
								_rvplayer_log( 'timeupdate() at position: '+position+'; total duration: '+duration);
							}
						}, true);
						
						player_video.addEventListener('progress', function(evt) {
							// TODO: For showing buffering
							if( player_video.buffered && player_video.buffered.length > 0 ) {
								_rvplayer_log( 'HTML5 video progress() buffered: '+player_video.buffered.end(0) );
							} else {
								_rvplayer_log( 'HTML5 video progress() buffered: n/a' );
							}
						}, false);
						
						// Hack for google Chrome
						if( $.browser.webkit ) {
							update_interval = setInterval( function() {
								if( player_video ) {
									if( duration != player_video.duration ) {
										duration = player_video.duration; }
									if( position != player_video.currentTime ) {
										position = player_video.currentTime; }
									_set_position(obj, position, duration, pos_changing);
									_rvplayer_log( 'setInterval() at position: '+position+'; current time: '+player_video.currentTime);
								}
							}, 1000 );
						}
					} else {
						$('#'+player_id+'_video').css('display', 'none');
						_rvplayer_log( 'Hide Video player');
						
						player_audio.setAttribute('src', media);
						player_audio.load();
						
						player_audio.addEventListener('ended', function(evt) {
							
							if( update_interval ) {
								clearInterval( update_interval );
								update_interval = false;
							}
							_rvplayer_log( 'Playback end called.');
							position = 0;
							player_audio.currentTime = 0;
							player_audio.pause();
							_set_play(obj, false);
							isPlaying = false;
							_set_position(obj, position, duration, pos_changing);
							_rvplayer_log( 'Playback ended.');
						}, false);
						
						player_audio.addEventListener('timeupdate', function(evt) {
							
							if( player_audio ) {
								if( duration != player_audio.duration ) {
									duration = player_audio.duration; }
								if( position != player_audio.currentTime ) {
									position = player_audio.currentTime; }
								_set_position(obj, position, duration, pos_changing);
								_rvplayer_log( 'timeupdate() at position: '+position+'; total duration: '+duration);
							}
						}, true);
						
						// Hack for google Chrome
						if( $.browser.webkit ) {
							update_interval = setInterval( function() {
								if( player_audio ) {
									if( duration != player_audio.duration ) {
										duration = player_audio.duration; }
									if( position != player_audio.currentTime ) {
										position = player_audio.currentTime; }
									_set_position(obj, position, duration, pos_changing);
									_rvplayer_log( 'setInterval() at position: '+position);
								}
							}, 1000 );
						}
					}
					
					/*
					player.addEventListener('progress', function(evt) {
						// TODO: For showing buffering
					}, false);
					*/
					
					
					media_loaded = true;
				}
				else if( flash_type && !media_loaded )
				{
					_rvplayer_log('Loading flash media...');
					var flashtag = flash_type.split('/')[0];
					if( flashtag == 'audio' ) {
						player_audio.SetVariable("method:setUrl", media);
						player_audio.SetVariable("method:setPlayerID", player_id+'_audio');
						player_audio.SetVariable("enabled", "true");
					} else {
						player_video.SetVariable("method:setUrl", media);
						player_video.SetVariable("method:setPlayerID", player_id+'_video');
						player_video.SetVariable("enabled", "true");
						//$('#'+player_id+'_video').css('display', 'block'); // CHECK HERE
					}
					media_loaded = true;
				}
				
				if( html5_type ) {
					var html5tag = html5_type.split('/')[0];
					_rvplayer_log( 'HTML5 currentTime seto to: '+position);
					if( html5tag == 'audio' && position != player_audio.currentTime && player_audio.readyState != player_audio.HAVE_NOTHING ) {
						player_audio.currentTime = position; }
					else if( html5tag == 'video' && position != player_video.currentTime && player_video.readyState != player_video.HAVE_NOTHING ) {
						player_video.currentTime = position; }
					
					if( html5tag == 'audio' ) {
						player_audio.play();
						_rvplayer_log( 'HTML5 play() audio');
					} else {
						player_video.play();
						_rvplayer_log( 'HTML5 play() video');
					}
				} else {
					var flashtag = flash_type.split('/')[0];
					if( flashtag == 'audio' ) {
						player_audio.SetVariable("method:play", "");
						_rvplayer_log( 'Flash audio play()');
					} else {
						player_video.SetVariable("method:play", "");
						_rvplayer_log( 'Flash video play()');
					}
					
				}
				
				_set_play(obj, true);
				isPlaying = true;
			}
			var _pause = function() {
				
				if( isPlaying ) {
					
					if( html5_type ) {
						var html5tag = html5_type.split('/')[0];
						if( html5tag == 'audio' ) {
							player_audio.pause();
						} else {
							player_video.pause();
						}
					} else {
						var flashtag = flash_type.split('/')[0];
						if( flashtag == 'audio' ) {
							player_audio.SetVariable("method:pause", "");
						} else {
							player_video.SetVariable("method:pause", "");
						}
					}
					
					if( update_interval ) {
						clearInterval( update_interval );
						update_interval = false;
					}
					
					_set_play(obj, false);
					isPlaying = false;
				}
			}
			
			
		}); // End constructor
		
		/* for testing (to be removed) */
		function _rvplayer_log(str) {
			if( options.log_to ) {
				$(options.log_to).prepend('<div>'+str+'</div>'); }
		};
		
		// Private instance functions:
		
		return this;
	}; // End rvplayer object
	
	// private functions
	/* Load media controls */
	function _controls(options) {
		var html = '<a href="" class="rvplayer-pause" title="'+ options.text_pause +'"></a>';
		html += '<div class="rvplayer-loaded">';
		html += '<div class="rvplayer-progress">';
		html += '<div class="rvplayer-position"></div>';
		html += '<a class="rvplayer-position-button"></a>';
		html += '</div>'; // End Progress
		html += '</div>'; // End loaded
		html += '<div class="rvplayer-playtime"></div>';
		html += '<div class="rvplayer-duration"></div>';
		html += '<a href="" class="rvplayer-mute" title="'+ options.text_mute +'"></a>';
		html += '<a href="" class="rvplayer-unmute" title="'+ options.text_unmute +'"></a>';
		html += '<div class="rvplayer-volumebox">';
		html += '<div class="rvplayer-volume"></div>';
		html += '</div>';
		return html;
	}
	
	/* Create flash audio */
	function _flash_audio(id,options) {
		var html = '';
		html += '<object id="'+id+'_audio" type="application/x-shockwave-flash" data="'+ options.audio_swf +'" width="1" height="1"';
		if($.browser.msie) {
			html += ' classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
			var ie_fix = document.createElement('script'); // Special sauce so we can capture events from flash in IE
			ie_fix.setAttribute("type", "text/javascript");
			ie_fix.setAttribute("event", "FSCommand(command,args)");
			ie_fix.setAttribute("for", id+'_audio');
			ie_fix.text = 'eval(args);';
			var headtmp = document.getElementsByTagName('head')[0];
			headtmp.appendChild(ie_fix);
		}
		html += '>';
		html += '<param name="movie" value="'+ options.audio_swf +'" />';
		html += '<param name="AllowScriptAccess" value="always" />';
		html += '<param name="FlashVars" value="listener=g_rvListener&amp;interval=500" />';
		html += '</object>';
		return html;
	}
	
	/* Create flash video */
	function _flash_video(id, options) {
		var html = '';
		html += '<object class="playerpreview" id="'+ id +'_video" type="application/x-shockwave-flash" data="'+ options.video_swf +'" width="1" height="1"';
		if($.browser.msie) {
			html += ' classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"';
			var ie_fix = document.createElement('script'); // Special sauce so we can capture events from flash in IE
			ie_fix.setAttribute("type", "text/javascript");
			ie_fix.setAttribute("event", "FSCommand(command,args)");
			ie_fix.setAttribute("for", id+'_video');
			ie_fix.text = 'eval(args);';
			var headtmp = document.getElementsByTagName('head')[0];
			headtmp.appendChild(ie_fix);
		}
		html += '>';
		html += '<param name="movie" value="'+ options.video_swf +'" />';
		html += '<param name="AllowScriptAccess" value="always" />';
		html += '<param name="FlashVars" value="listener=g_rvListener&amp;interval=500&amp;useHandCursor=0&amp;bgcolor=000000" />';
		html += '<param name="scale" value="noscale" />';
		html += '</object>';
		return html;
	}
	
	function _refresh_poster_image(obj,poster)
	{
		var posterWin = $('.rvplayer-window', obj);
		var posterImg = $('img', posterWin);
		
		posterImg.css('max-width', obj.width() +'px');
		posterImg.css('max-height', (obj.height()-30) +'px');
			
		if( poster == '' ) {
			poster = posterImg.attr('src'); // Use previous image
		}
		var sizeImg = _get_img_size(poster);
		var diff = posterWin.height() - sizeImg.height;
		if( diff > 2 && sizeImg.height > 0 ) { // The Window is higher than the image...
			posterImg.css('margin-top', Math.floor(diff/2) +'px' );
		} else {
			posterImg.css('margin-top', 0 );
		}
		posterImg.attr('src', poster);
	}
	
	function _update_embed(obj,player)
	{
		var maxHeight = obj.height()-30;
		var videoHeight = player.height;
		if( maxHeight > videoHeight ) {
			var diff = maxHeight - videoHeight;
			if( diff > 2 ) {
				player.style.marginTop = Math.floor(diff/2) +'px';
			} else {
				player.style.marginTop = 0;
			}
		} else {
			player.style.marginTop = 0;
		}
	}
	
	function _update_html5video(obj, player)
	{
		player.width = obj.width();
		player.height = (obj.height()-30);
		//player.resizeTo(obj.width(), (obj.height()-30));
		$('#log').prepend('resizing video player width: ' + obj.width() +'; height: '+(obj.height()-30));
		return;
		/*
		player.style.width = obj.width()+'px';
		player.style.height = (obj.height()-30)+'px';
		return;
		*/
		/*
		var newHeight = obj.height()-30;
		var videoHeight = player.height;
		if( maxHeight > videoHeight ) {
			var diff = maxHeight - videoHeight;
			if( diff > 2 ) {
				player.style.marginTop = Math.floor(diff/2) +'px';
			} else {
				player.style.marginTop = 0;
			}
		} else {
			player.style.marginTop = 0;
		}
		*/
	}
	
	/* get valid file extension */
	function _get_ext(url) {
		var ext = url.substring( url.length-3 ).toLowerCase();
		switch ( ext ) {
			/* audio */
			case 'mp3':
			case 'm4a':
			case 'oga':
			/* video */
			case 'mp4':
			case 'm4v':
			case 'ogv': {
				return ext;
			}; break;
			case 'ogg': {
				return 'ogv';
			}; break;
		}
		return '';
	}
	
	function _set_volume(obj, volume) {
		var vol_control = $( '.rvplayer-volume', obj );
		var new_top = 0;
		var new_right = 0;
		
		if( volume < 100 ) {
			new_right = Math.ceil(30 * ((100-volume)/100) );
			new_top = Math.ceil(15 * ((100-volume)/100) );
		}
		
		vol_control.css('right', new_right+'px');
		vol_control.css('top',new_top+'px');
	}
	
	function _set_play(obj,playing) {
		$('.rvplayer-pause', obj).css('display', (playing?'inline':'none'));
		$('.rvplayer-play', obj).css('display', (playing?'none':'inline'));
	}
	
	function _set_muted(obj,muted) {
		$('.rvplayer-unmute', obj).css('display', (muted?'inline':'none') );
		$('.rvplayer-mute', obj).css('display', (muted?'none':'inline') );
	}
	
	function _set_position(obj, current, duration, changing_pos) {
		var new_position = _readable_duration(current);
		var new_total = _readable_duration(duration);
		if( new_position != $('.rvplayer-duration', obj ).html() ) {
			var vol_progress = $( '.rvplayer-progress', obj );
			
			var max_width = vol_progress.width();
			var new_width = 0;
			if( max_width > 0 && current > 0 && duration > 0 ) {
				new_width = Math.round( (max_width * current) / duration);
			}
			
			if( new_width > max_width ) {
				new_width = max_width;
			}
			
			$('.rvplayer-duration', obj ).html(new_position);
			if( new_position == '0:00' ) { // display total time
				$('.rvplayer-duration', obj ).css('display', 'none');
				$('.rvplayer-playtime', obj ).css('display', 'inline');
			} else { // display current time
				$('.rvplayer-duration', obj ).css('display', 'inline');
				$('.rvplayer-playtime', obj ).css('display', 'none');
			}
			$('.rvplayer-position', obj ).width(new_width);
			
			if( changing_pos == false ) { // obj.pos_changing == false ) {
				$('.rvplayer-position-button', obj ).css('left', (new_width-5)+'px');
			}
		}
		if( new_total != $('.rvplayer-playtime', obj ).html() ) {
			$('.rvplayer-playtime', obj ).html( new_total );
		}
	}
	
	function _readable_duration(seconds) {
		seconds = Math.round(seconds);
		var second = 0;
		var hour = 0;
		var minute = 0;
		if( seconds >= (60*60) ) {
			hour = Math.floor( seconds /(60*60) );
			seconds -= (60*60*hour);
		}
		if( seconds >= (60) ) {
			minute = Math.floor( seconds /(60) );
			seconds -= (60*minute);
		}
		second = seconds;
		if( isNaN(second) ) {
			second = 0;
		}
		
		if( hour && minute < 10 ) {
			minute = "0"+minute; }
		if( second < 10 ) {
			second = "0"+second; }
		if( hour ) {
			return hour + ":" + minute + ":" + second; }
		return minute + ":" + second;
	}
	
	function _get_flash_version() {
		if(navigator.plugins && navigator.plugins.length>0){
			var type = 'application/x-shockwave-flash';
			var mimeTypes = navigator.mimeTypes;
			if(mimeTypes && mimeTypes[type] && mimeTypes[type].enabledPlugin && mimeTypes[type].enabledPlugin.description){
				var version = mimeTypes[type].enabledPlugin.description.replace(/\D+/g, '.').replace(/^\./,'');
				var parts = version.split(/\./g);
				if(parts.length){
					return parts[0];
				}
			}
		}
		if( navigator.appVersion.indexOf("MSIE") != -1 ){ // Check ActiveX
			var obj = null;
			try{
				obj = new ActiveXObject("shockwaveFlash.shockwaveFlash");
			}catch(err){
				try{
					obj = new ActiveXObject("shockwaveFlash.shockwaveFlash.7");
				}catch(err){
					obj = null; }
				if( obj ){
					return 7; }
				try{
					obj = new ActiveXObject("shockwaveFlash.shockwaveFlash.6");
				}catch(err){
					obj = null; }
				if( obj ){
					return 6; }
			}
			if(obj && !obj.activeXError){
				var version = null;
				try{
					version = obj.GetVariable("$version");
				}catch(err){}
				if(version){
					var parts = version.split(/[^\d]/g);
					if(parts.length){
						return parts[0];
					}
				}
			}
		}
		return false;
	}
	
	function _get_html5_type(extension) {
		var type = '';
		var status = '';
		switch( extension ) {
			case 'mp3': type = 'audio/mpeg'; break;
			case 'oga': type = 'audio/ogg'; break;
			case 'wma': type = 'audio/x-ms-wma'; break;
			case 'm4a': type = 'audio/mp4'; break;
			case 'mp4':
			case 'm4v': type = 'video/mp4'; break;
			case 'mov': type = 'video/quicktime'; break;
			case 'wmv': type = 'video/x-ms-wmv'; break;
			case 'ogg':
			case 'ogv': type = 'video/ogg'; break;
		}
		
		if( type == '' ) {
			return false; }
		
		try {
			var test = document.createElement( type.split('/')[0] );
			if ( test.canPlayType ) {
				status = test.canPlayType( type );
			}
			delete(test);
		} catch (e) {}
		
		if( status == 'probably' || status == 'maybe' ) {
			return type; }
		return false;
	}
	
	function _get_flash_type(extension) {
		var type = '';
		var version = 6;
		switch( extension ) {
			case 'mp3': type = 'audio/mpeg'; break;
			case 'm4a': type = 'audio/mp4'; version = 9; break;
			case 'mp4':
			case 'm4v': type = 'video/mp4'; version = 9; break;
			case 'flv': type = 'video/x-flv'; break;
		}
		
		if( type == '' ) {
			return false; }
		
		if( version > _get_flash_version() ) {
			return false; }
		
		return type;
	}
	
	function _get_img_size(url) {
		var newImg = new Image();
		newImg.src = url;
		return { width: newImg.width, height: newImg.height };
	}
	
	function _get_player_id() {
		last_player_id++;
		return 'rvplayer_'+last_player_id;
	}

})(jQuery);

/*
Class for handling the FLV/MP3/MP4 Player via JS
*/
function rvPlayerListener() {
	this.player_objects = new Array();
	this.AddPlayer = function(id,obj) {
		var toAdd = new Object();
		toAdd.player = obj;
		toAdd.player_id = id;
		this.player_objects[ this.player_objects.length ] = toAdd;
	}
	this.RemovePlayer = function(id) {
		for( var x = 0; x < this.player_objects.length; x++ ) {
			if( id == this.player_objects[x].player_id ) {
				this.player_objects.splice(x, 1);
				break;
			}
		}
	}
	this.DispatchEvent = function(name, obj) {
		for( var x = 0; x < this.player_objects.length; x++ ) {
			if( obj.playerID == this.player_objects[x].player_id ) {
				//$('#log').prepend('<div>DispatchEvent(name='+name+', id='+ obj.playerID +') </div>');
				this.player_objects[x].player.ListenerEvent(name, obj);
				return;
			}
		}
		//$('#log').prepend('<div>FAILED: DispatchEvent(name='+name+', id='+ obj.playerID +') </div>');
	}
	this.onInit = function() {
		this.DispatchEvent('init', this);
	};
	this.onUpdate = function() {
		this.DispatchEvent('update', this);
	};
	this.onClick = function() {
		this.DispatchEvent('click', this);
	};
	this.onKeyUp = function() {
		this.DispatchEvent('keyup', this);
	};
	this.onFinished = function() {
		this.DispatchEvent('finished', this);
	};
}

g_rvListener = new rvPlayerListener();



