$.fn.flowplayer = function(options) {
	
	// getters & setters
	this.setId = function(value) {
		id = value;
	}
	this.getId = function() {
		return id;
	}
	this.setOptions = function(value) {
		options = defaultOptions(value);
	}
	this.getOptions = function() {
		return options;
	}
	this.setThemes = function(value) {
		themes = value;
	}
	this.getThemes = function() {
		return themes;
	}
	this.setTooltips = function(value) {
		tooltips = value;
	}
	this.getTooltips = function() {
		return tooltips;
	}
	this.setControlSizes = function(value) {
		controlSizes = value;
	}
	this.getControlSizes = function() {
		return controlSizes;
	}
	this.setHidings = function(value) {
		hidings = value;
	}
	this.getHidings = function() {
		return hidings;
	}
	this.setPlayer = function(value) {
		player = value;
	}
	this.getPlayer = function() {
		return player;
	}
	
	// atributos
	var id = this.attr("id");
	var player;
	var themes = {
		"orange": {
			backgroundColor: '#E6E6E6', 
			backgroundGradient: 'high',
			tooltipColor: '#FFFFFF',
			tooltipTextColor: '#454545',
			buttonColor: '#C47221',
			buttonOverColor: '#BE5015',
			volumeSliderColor: '#5B7682',
			sliderColor: '#7B7B7B',
			bufferColor: '#5B7682',
			progressColor: '#C47221'
		}
	};
	var tooltips = {
		"es": {
			buttons: true,
			fullscreen: 'Pantalla Completa',
			fullscreenExit: 'Pantalla Reducida',
			pause: 'Pausa',
			play: 'Reproducir',
			next: 'Siguiente',
			previous: 'Anterior',
			mute: 'Silenciar',
			unmute: 'Enceder'
		},
		"en": {
			buttons: true,
			fullscreen: 'Fullscreen',
			fullscreenExit: 'Small screen',
			pause: 'Pause',
			play: 'Play',
			next: 'Next',
			previous: 'Previous',
			mute: 'Mute',
			unmute: 'Sound on'
		}
	};
	var controlSizes = {
		"medium": {
			scrubberHeightRatio: 0.6,
			volumeSliderHeightRatio: 0.6,
			scrubberBarHeightRatio: 0.5,
			volumeBarHeightRatio:0.5,
			height:19
		}
	};
	var hidings = {
		"always_fast":{
			autoHide: "always",
			hideDelay: 1500,
		}
	};
	this.defaults = {
		load: true,
		width: 382,
		height: 255,
		lang: "es",
		flowPath: "modulos/videos/flash/flowplayer-3.1.5.swf",
		controlsPath: "modulos/videos/flash/flowplayer.controls-3.1.5.swf",
		backgroundImage: "images/fondo_player.jpg",
		autoPlay: true,
		autoBuffering: true,
		baseUrl: getActualDir()+"videos/",
		playlist: [],
		controlsPlaylist: true,
		theme: "orange",
		time: false,
		stop: true,
		controlSize: "medium",
		hiding: "always_fast",
		errors: false
	}
	var that = this;
	var options = defaultOptions(options);
	
	function defaultOptions(options) {
		if(options === undefined) {
			options = {};
		}
		if (options.load === undefined) {
			options.load = that.defaults.load;
		}
		if (options.width === undefined) {
			options.width = that.defaults.width;
		}
		if (options.height === undefined) {
			options.height = that.defaults.height;
		}
		if (options.lang === undefined) {
			options.lang = that.defaults.lang;
		}
		if (options.flowPath === undefined) {
			options.flowPath = that.defaults.flowPath;
		}
		if (options.controlsPath === undefined) {
			options.controlsPath = that.defaults.controlsPath;
		}
		if (options.backgroundImage === undefined) {
			options.backgroundImage = that.defaults.backgroundImage;
		}
		if (options.autoPlay === undefined) {
			options.autoPlay = that.defaults.autoPlay;
		}
		if (options.autoBuffering === undefined) {
			options.autoBuffering = that.defaults.autoBuffering;
		}
		if (options.baseUrl === undefined) {
			options.baseUrl = that.defaults.baseUrl;
		}
		if (options.playlist === undefined) {
			options.playlist = defaultPlaylist(that.defaults.playlist);
		}
		else {
			options.playlist = defaultPlaylist(options.playlist);
		}
		if (options.controlsPlaylist === undefined) {
			options.controlsPlaylist = that.defaults.controlsPlaylist;
		}
		if (options.theme === undefined) {
			options.theme = that.defaults.theme;
		}
		if (options.time === undefined) {
			options.time = that.defaults.time;
		}
		if (options.stop === undefined) {
			options.stop = that.defaults.stop;
		}
		if (options.controlSize === undefined) {
			options.controlSize = that.defaults.controlSize;
		}
		if (options.hiding === undefined) {
			options.hiding = that.defaults.hiding;
		}
		if (options.errors === undefined) {
			options.errors = that.defaults.errors;
		}
		return options;
	}
	function defaultPlaylist(playlist) {
		var numVideos = playlist.length;
		if(numVideos > 0) {
			var video;
			for(var i = 0; i < numVideos; i++) {
				if (typeof playlist[i] == "object") {
					if(playlist[i].autoPlay === undefined) {
						playlist[i].autoPlay = false;
					}
					if(playlist[i].title === undefined) {
						playlist[i].title = "";
					}
				}
			}
		}
		else {
			if(that.getOptions().errors) {
				new PlaylistVaciaException();
			}
		}
		return playlist;
	}
	
	// metodos
	this.addTheme = function(name, theme) {
		var themes = this.getThemes();
		themes[name] = theme;
		this.setThemes(themes);
	}
	this.addTooltip = function(name, tooltip) {
		var tooltips = this.getTooltips();
		tooltips[name] = tooltip;
		this.setTooltips(tooltips);
	}
	this.addControlSize = function(name, controlSize) {
		var controlSizes = this.getControlSize();
		controlSizes[name] = controlSize;
		this.setControlSize(controlSizes);
	}
	this.addHiding = function(name, hiding) {
		var hidings = this.getHiding();
		hidings[name] = hiding;
		this.setHiding(hidings);
	}
	function getActualDir() {
		var url = window.location.toString();
		var parts = url.split("/");
		var limite = parts.length-1;
		var dir = "";
		for(var i = 0; i < limite; i++) {
			dir += parts[i]+"/";
		}
		return dir;
	}
	this.load = function() {
		var options = that.getOptions();
		var themes = that.getThemes();
		var theme = themes[options.theme];
		var tooltips = that.getTooltips();
		var controlSizes = that.getControlSizes();
		var controlSize = controlSizes[options.controlSize];
		var hidings = that.getHidings();
		var hiding = hidings[options.hiding];
		that.css({
			width: options.width,
			height: options.height
		});
		var img = that.find("img");
		if(img.length > 0) {
			img.css({
				width: options.width,
				height: options.height,
				cursor: "pointer"
			});
		}
		var player = $f(that.getId(), options.flowPath, {
			canvas: { 
				backgroundImage: 'url('+options.backgroundImage+')'
			}, 
			clip : {
				autoPlay: options.autoPlay,
				autoBuffering: options.autoBuffering, 
				baseUrl: options.baseUrl
			}, 
			playlist: options.playlist, 
			plugins: {
				controls: {
					url: options.controlsPath, 
					playlist: options.controlsPlaylist,
					backgroundColor: theme.backgroundColor, 
					backgroundGradient: theme.backgroundGradient,
					tooltipColor: theme.tooltipColor,
					tooltipTextColor: theme.tooltipTextColor,
					buttonColor: theme.buttonColor,
					buttonOverColor: theme.buttonOverColor,
					volumeSliderColor: theme.volumeSliderColor,
					sliderColor: theme.sliderColor,
					bufferColor: theme.bufferColor,
					progressColor: theme.progressColor,
					time: options.time,
					autoHide: hiding.autoHide,
					hideDelay:  hiding.hideDelay,
					scrubberHeightRatio: controlSize.scrubberHeightRatio,
					volumeSliderHeightRatio: controlSize.volumeSliderHeightRatio,
					scrubberBarHeightRatio: controlSize.scrubberBarHeightRatio,
					volumeBarHeightRatio: controlSize.volumeBarHeightRatio,
					height: controlSize.height,
					stop: options.stop,
					tooltips: tooltips[options.lang]
				} 
			}
		});
		that.setPlayer(player);
	}
	// lo agrego como data al elemento
	if(this.getOptions().load) {
		this.load();
	}
	this.data("flowplayer", this);
	return this;
}
function Exception(text) {
	console.error("Exception thrown: "+text);
}
function PlaylistVaciaException() {
	new Exception("The playlist is empty. Please supply a valid playlist.");
}
