			
	window.currentPosition 	= 0;
	window.currentRemaining = 0;
	window.currentState 	= -1;
	
	window.currentVolume;
	window.currentItem;	
	window.currentLoad;
	window.currentXsize;
	window.currentYsize;
	window.totalTime;
	
	window.onSongEndNotified = false;
	
	/* Hack para deshabilitar share a usuarios no logueados en wambafm */
	if (!$defined(window.guiObj.isShareAvailable)) {
		window.guiObj.isShareAvailable = true;
	}
	
	// Bandera que indica si se sete� el tiempo faltante */
	window.isTimeLeftSet = false;	
	
	window.isDragging = false;	
		
	// Funci�n de la API del player que le env�a eventos */
	function sendEvent(swf, typ, prm) {
		try {
			thisMovie(swf).sendEvent(typ,prm)	  
		} catch (e){} 
	};
	
	function getLength(swf) { 
	  var len = thisMovie(swf).getLength();
	};
	
	function addItem(swf,obj,idx) { 
	  thisMovie(swf).addItem(obj,idx); 
	};
	
	function removeItem(swf,idx) { 
	  thisMovie(swf).removeItem(idx); 
	};
	
	function itemData(swf, idx) { 
	  var obj = thisMovie(swf).itemData(idx); 
	};
	
	// Funci�n que se invoca al seleccionar un tema de la playlist */		
	function getItemData(idx) {		
		var obj = thisMovie(myFmPlayer.options.swfPlayerId).itemData(idx);
		// Se agrega este if para que no salte un error javascript cuando la b�squeda de wambafm no arroj� resultados */
		if ($type(obj) == "object") {
			myFmPlayer.updateData(obj);
			return true;
		} else {
			return false;
		}		
	}
	
	// Funci�n que devuelve la referencia a la pel�cula del player */
	function thisMovie(swf) {
	  if(navigator.appName.indexOf("Microsoft") != -1) {
	    return window[swf];
	  } else {
	    return document[swf];
	  }
	};
	
	// Funci�n que brinda la API que en todo momento est� reportando lo que hace el player */		
	function getUpdate(typ, pr1, pr2, swf) { 
		if(typ == "time") { currentPosition = pr1; pr2 == undefined ? null: currentRemaining = Math.round(pr2); 
		
			if(pr2 > 0 && !window.isTimeLeftSet) {
				/* Activamos los botones de antes y después */
				myFmPlayer.activateNext();
				myFmPlayer.activatePrevious();
				
				window.isTimeLeftSet 	= true;
				window.timeLeft			= pr2;
				window.totalTime 		= pr1 + pr2;
				
				progressKnob	= $$('.progressBar .bar')[0];
				progressSlider	= $$('.progressBar')[0];
				
				// Instancio el slider de la barra de progreso del video */
				window.progressSlider	= new Slider(progressSlider,  progressKnob, {
					steps: totalTime,
					onChange: function(step){
						// Hago el el update �nicamente si el usuario est� arrastrando el knob */
						if(window.isDragging){
							myFmPlayer.sendEvent('scrub', step);
							progressKnob.setAttribute('title', myFmPlayer.integerToMinutes(step));
						}
					}
				}).set(0);

				// Instancio el slider de la barra de volumen */
				myFmPlayer.volumeSlider 	= new Slider(myFmPlayer.slider, myFmPlayer.knob , {
					steps: 100,
					onChange: function(step){
						if (myFmPlayer.volumeToggler.hasClass('disabled')) {
							myFmPlayer.volumeToggler.removeClass('disabled');
						}
						myFmPlayer.knob.setAttribute('title', step);
						// Por un defecto del player uso 1 como si fuera que el volumen estuviera apagado */
						if(step < 1){
							step = 1;
							if (!myFmPlayer.volumeToggler.hasClass('disabled')) {
								myFmPlayer.volumeToggler.addClass('disabled');
							}
						}
						myFmPlayer.sendEvent('volume', step)
						
					}
				}).set(parseInt(window.currentVolume));

				window.totalTime = pr2;
				
				
			} else {				
				window.updatedTimes			= 0;
			}
			
			// Si el usuario no arrastra el knob actualizo la coordenada del knob en base al tiempo transcurrido */
			if(!window.isDragging){
				window.progressSlider.set(pr1);
				progressKnob.setAttribute('title', myFmPlayer.integerToMinutes(pr1));
			}
			
			// Disparo un pseudo-evento para notificar que se termin� la canci�n */
			// Tuve que poner una bandera porque el player se actualiza cada 1/2 segundo y sino disparaba 2 veces el evento */
			if(currentPosition == totalTime && window.onSongEndNotified == false){
				window.onSongEndNotified = true;
				myFmPlayer.fireEvent('onSongEnd');
			}
		}
		else if(typ == "volume") { currentVolume = pr1; } 
		else if(typ == "item") { currentItem = pr1; setTimeout("getItemData(" + currentItem + ")", 100);}
		else if(typ == "state") {currentState = pr1;}
		else if(typ == "load") { currentLoad = pr1; }
		else if(typ == "size") { currentXsize = "X=" + pr1; pr2 == undefined ? null: currentYsize = "Y=" + Math.round(pr2); } 



		
		
		window.myFmPlayer.updateTime();
	};

	/**
	 * @author Juan Pablo Brocca
	 */
	var FmPlayer = new Class({
		/**
		 * @author Juan Pablo Brocca
		 * @classDescription Clase actua como intermediario entre el player de flash y la GUI en HTML. 
		 * Termina siendo una especia de skin para el player de flash hecho con HTML y CSS
		 */
		 
		 /**
		 * options lo que hace es crear valores por defecto
		 *
		 * @param {String} swfContainer Es el contenedor en donde se crear� el player de flash
		 * @param {String} swfPlayerId  Es el identificador del player
		 * @param {String} swfPlayerLocation Es la ubicaci�n del player de flash en el sitio
		 *
		 * @param {String} playListLocation  Es la ubicaci�n de la playlist en el sitio 
		 * @param {String} fmPlayerId Es el id del html del fmPlayer 
		 * @swfPlayerId 
		 */
		 options: {
		 	swfContainer		: 'document.body',
		 	swfPlayerId			: 'swfFmPlayer',
		 	swfPlayerLocation	: '/site/common/components/fmplayer/mediaplayer.swf',
		 	playListLocation	: '/site/wambafm/playlist.xml',
		 	width				: 200,
		 	height				: 300,
		 	swfVersion			: 8,
		 	displayHeight		: 30,
		 	fmPlayerId			: 'fmPlayer',
		 	autostart			: 'true',
		 	
		 	onSongUpdate		: Class.empty,
			onSongEnd			: Class.empty,
			onAResultsClick		: Class.empty,
			onASearchClick		: Class.empty
		 },
		 
		initialize: function (options) {
			this.setOptions(options);
			
			this.playToggler 	= $(this.options.fmPlayerId).getElements('.playStop')[0];
			this.volumeToggler 	= $(this.options.fmPlayerId).getElements('.volumeToggler')[0];
			this.progressKnob	= $(this.options.fmPlayerId).getElements('.progressBar .bar')[0];
			this.progressSlider	= $(this.options.fmPlayerId).getElements('.progressBar')[0];
			
			this.knob 			= $(this.options.fmPlayerId).getElements('.knob')[0];
			this.slider			= $(this.options.fmPlayerId).getElements('.slider')[0];
			
			this.song			= $(this.options.fmPlayerId).getElements('.song')[0];
			this.timeLeft		= $(this.options.fmPlayerId).getElements('.timeLeft')[0];
			this.elapsedTime	= $(this.options.fmPlayerId).getElements('.elapsedTime')[0];
			this.playNext		= $(this.options.fmPlayerId).getElements('.playNext')[0];
			this.playPrevious	= $(this.options.fmPlayerId).getElements('.playPrevious')[0];
			
			this.aAdd			= $(this.options.fmPlayerId).getElements('.add')[0];
			this.aResults		= $(this.options.fmPlayerId).getElements('.results')[0];
			this.aSpace			= $(this.options.fmPlayerId).getElements('.space')[0];
			this.aWindow		= $(this.options.fmPlayerId).getElements('.window')[0];
			
			this.actualSongName		= '';
			this.actualArtistName	= '';
			
			// Flag que indica si el usuario est� arrastrando el slider que controla el avance de la reproducci�n */
			this.isDragging = false;
			
			// Creo el swfPlayer */
			this.createPlayer();
			
			// Si el player est� con estilo deshabilitado, entonces se lo saco */
			if ($(this.options.fmPlayerId).hasClass('disabled')) {
				$(this.options.fmPlayerId).removeClass('disabled')
			}
			
			this._resetEvents();
			//Agrego los eventos
			this._addEvents();	
			
			this._tmpObj = null;	
		},
		
		/**
		* @method M�todo "privado" que remueve los eventos a cada uno de los elementos de la GUI de esta clase
		*/
		_resetEvents: function (){
			this.progressKnob.removeEvents();
			this.volumeToggler.removeEvents();
			this.playToggler.removeEvents();
			
			// Aprovecho y quito la clase play */
			this.playToggler.removeClass('play');
			
			this.playNext.removeEvents();
			this.playPrevious.removeEvents();
			this.aAdd.removeEvents();
			this.aResults.removeEvents();
			this.aSpace.removeEvents();
			this.aWindow.removeEvents();
		},
		
		/**
		* @method M�todo "privado" que asocia los eventos a cada uno de los elementos de la GUI de esta clase
		*/
		_addEvents: function (){
			//alert('e1');
			var me 				= this;

			
			// Hago el bind para el evento mousedown para el progressKnob */
			// de modo de levantar una bandera que diga si el usuario dej� de arrastrar */
			this.progressKnob.addEvent('mousedown', function () {
				window.isDragging = true;
			});
			
			// Hago el bind para el evento mouseup para el progressKnob de modo de levantar una bandera que diga si el usuario lo arrastra */
			this.progressKnob.addEvent('mouseup', function () {
				window.isDragging = false;
			});
			
			// Hago el bind para el evento click al toggler del volumen */
			this.volumeToggler.addEvent('click', function (event){
				new Event(event).stop();
				me.toggleVolume(this.volumeToggler);
			});
			//alert('e0');
			// Hago el bind para el evento click al toggler de reproducci�n */
			this.playToggler.addEvent('click', function (event) {
				new Event(event).stop();
				me.togglePlay(this.playToggler);
			});
			//alert('e2');
			// Hago el bind para el evento click al toggler de reproducci�n */
			this.activateNext();
			//alert('e3');
			// Hago el bind para el evento click al toggler de reproducci�n */
			this.activatePrevious();
			
			// Bloque con los botones de acci�n en wamba */
			
			// Hago el bind para el evento click al bot�n que agrega a la playlist del usuario */
			if (window.guiObj.isShareAvailable)
			{
				this.aAdd.addEvent('click', function (event) {
					new Event(event).stop();
					
					$('modalWindow').style.display = 'block';
					
					// Instancio la ventana modal */	
					window.myModalWindow = new StickyWinFxModal({
						content			: $('modalWindow'), 
						position		: 'center', 
						edge			: 'center', 
						fade			: true, 
						hideOnClick		: false, 
						fadeDuration	: 500,
						className		: 'modalWindow',
						elementsToHide	: 'embed, object',
						useIframeShim	: false,
						
						// HACK PARA IE6! */
						onDisplay		: function (){
													// Hack para el maldito IE6, basado en la detecci�n de mootools */
													if (window.ie6){
														setTimeout(function(){
																	$('cmbMusicAlbums').setStyle('opacity', 1);
																	}, 1000
														);
	
													}
										}
					});
					window.myModalWindow.pin();
					
				});
			} else {
				if (!$(this.aAdd).hasClass('disabled')) {
					$(this.aAdd).addClass('disabled');
				}
			}

			// Hago el bind para el evento click al bot�n que agrega a la playlist del usuario */
			this.aResults.addEvent('click', function (event) {
				//new Event(event).stop();
				this.fireEvent('onAResultsClick', event);
			}.bind(this));
			
			// Hago el bind para el evento click al bot�n que agrega a la playlist del usuario */
			this.aSpace.addEvent('click', function (event) {
				//new Event(event).stop();
				this.fireEvent('onASpaceClick', event);
			}.bind(this));
						
			// Hago el bind para el evento click al bot�n que agrega a la playlist del usuario */
			this.aWindow.addEvent('click', function (event) {
				new Event(event).stop();
				
				alert('@TODO: Abrir ventana con el player\n\nFalta confirmar con Espa�a que quieren hacer con esto');
			});
		},
		
		/**
		 * @method M�todo que retorna la referencia a la pel�cula de flash
		 */		
		getMovie: function (swf){
			if(navigator.appName.indexOf("Microsoft") != -1) {
				return window[swf];
			} else {
				return document[swf];
			}
		},
		
		/**
		* @method Este m�todo se comunica con la funci�n global (definida en window) que es la que interact�a con el player swf
		*/
		sendEvent: function (typ, prm) { 
			window.sendEvent(this.options.swfPlayerId, typ, prm);
		},
		
		/**
		 * M�todo que crea el player de flash
		 */
		createPlayer: function () {		
			var so = new SWFObject(this.options.swfPlayerLocation, this.options.swfPlayerId, this.options.width, this.options.height, this.options.swfVersion);
			so.addParam('allowscriptaccess', 'always');
			so.addParam('allowfullscreen', 'true');
			so.addVariable('width', this.options.width);
			so.addVariable('height', this.options.height);
			
			so.addVariable('displayheight', this.options.displayHeight);
			  
			so.addVariable('javascriptid', this.options.swfPlayerId);
			so.addVariable('enablejs','true');
			so.addVariable('autostart',this.options.autostart);
			so.addVariable('shuffle','false');
			so.addVariable('repeat','list');
			so.addVariable('file', this.options.playListLocation);
			so.write($(this.options.swfContainer));
		}, 
		
		/**
		* @method Devuelve un entero expresado como minutos/segundos
		* @param {integer} Un entero que representa los segundos
		*/
		
		integerToMinutes: function (integer) {
			
			var scratch = integer;								// Discard miliseconds
			var seconds = scratch % 60;							// Get modulus 60 for seconds
			scratch 	= Math.floor((scratch - seconds) / 60);	// Discard seconds.
			var minutes	= scratch % 60;							// Get modulus 60 for minutes
			scratch 	= Math.floor((scratch - minutes) / 60);	// Discard minutes.
			
			if (seconds < 10) {
				seconds = "0" + seconds;
			}
			
			if (minutes < 10) {
				minutes = "0" + minutes;
			}
			 
			return minutes + ':' + seconds;
		}, 
		
		/**
		* @method M�todo que reproduce/detiene el tema actual
		*/
		togglePlay: function () {		
			var toggler = this.playToggler;
			
			switch(window.currentState) {
				case 2:
					toggler.addClass('play');
					break;
				case 0:
					toggler.removeClass('play');
					break;
			}
			
			
			this.sendEvent('playpause');
			
			/* Habilito la posibilidad de que al instanciar el player se dispare este pseudo evento */
			this.fireEvent('onPlayToggle');
		}, 
		
		/**
		* @method Prende/apaga el sonido de la pel�cula
		*/
		 toggleVolume: function() {		
			var volumeToggler 	= this.volumeToggler;
			var me 				= this;
			if (volumeToggler.hasClass('disabled')) {
				this.sendEvent('volume', me._originalVolume);
				myFmPlayer.volumeSlider.set(me._originalVolume);
				volumeToggler.removeClass('disabled');
			} else {
				this._originalVolume = window.currentVolume;
				myFmPlayer.volumeSlider.set(0);
				this.sendEvent('volume', 1);
				volumeToggler.addClass('disabled');
			}
			// Habilito la posibilidad de que al instanciar el player se dispare este pseudo evento */
			this.fireEvent('onVolumeToggle');
		}, 
		
		/**
		* @method Actualiza la informaci�n de la canci�n actual
		*/
		updateData: function (obj) {
			this.updateSongId(obj.id);
			this.totalTime 			= currentPosition + currentRemaining;
			
			this.actualSongName		= obj.title;
			this.actualArtistName	= obj.author;
			
			this.updateSong(obj.author, obj.title);
			this.updateTimeLeft();
			this.updateElapsedTime();
			
			// Habilito la posibilidad de que al instanciar el player se dispare este pseudo evento, el cual pasa el nombre de la canci�n
			
			this.fireEvent('onSongUpdate', obj);
			window.isTimeLeftSet 	 = false;
			window.onSongEndNotified = false; 
		},
		
		/**
		* @method Actualiza el texto que reporta la canci�n que se est� reproduciendo
		*/
		updateSong: function (author, title) {
			var fullSongName = author + ' - ' + title;
			$(this.song).setText(fullSongName);

		},
		
		/**
		* @method Actualiza simult�neamente los tiempos
		*/
		updateTime: function () {
			this.updateTimeLeft();
			this.updateElapsedTime();
		},
		
		/**
		* @method Actualiza el texto que reporta el tiempo faltante
		*/
		updateTimeLeft: function () {
			if (isNaN(currentRemaining)) {
				currentRemaining = 0;
			}
			var currentRemainingTime = this.integerToMinutes(currentRemaining);
			$(this.timeLeft).setText(currentRemainingTime);
			// Habilito la posibilidad de que al instanciar el player se dispare este pseudo evento, el cual pasa el tiempo restante
			this.fireEvent('onTimeLeftUpdate', currentRemainingTime);
		},
		
		/**
		* @method Actualiza el texto que reporta el tiempo transcurrido
		*/
		updateElapsedTime: function () {
			if (isNaN(currentPosition)) {
				currentPosition = 0;
			}
			var currentPlayedTime = this.integerToMinutes(currentPosition);
			$(this.elapsedTime).setText(currentPlayedTime);
			
			// Habilito la posibilidad de que al instanciar el player se dispare este 
			// pseudo evento, el cual pasa el tiempo actualmente transcurrido de reproducci�n
			this.fireEvent('onTimeElapsedUpdate', currentPlayedTime);
		},
		
		/**
		* @method Actualiza el id de la canci�n actual
		*/
		updateSongId: function (id) {
			// Habilito la posibilidad de que al instanciar el player se dispare este 
			// pseudo evento, el cual pasa el id de la canci�n actual */
			this.songId = id;
			this.fireEvent('onSongIdUpdate', id);
		}, 
		
		/**
		* @method Retorna el id de la canci�n
		*/
		getSongId: function () {
			return this.songId;
		},
		
		/**
		 * Activa el botón de siguiente
		 *
		 */
		 activateNext: function () {
		 	me = this;
		 	if (this.playNext.hasClass('disabled')) {
		 		this.playNext.removeClass('disabled');
		 	}
		 	this.playNext.removeEvents();
		 	this.playNext.addEvent('click', function (event) {
				new Event(event).stop();
				me.disableNext();
				me.sendEvent('next');
			});
		 },
		 
		 /**
		 * Desactiva el botón de siguiente
		 *
		 */
		 disableNext: function () {
		 	if (!this.playNext.hasClass('disabled')) {
		 		this.playNext.addClass('disabled');
		 	}
		 	this.playNext.removeEvents();
		 	this.playNext.addEvent('click', function (ev) {
		 		new Event(ev).stop();
		 		return false;
		 	});
		 },
		 
		 /**
		 * Activa el botón de anterior
		 *
		 */
		 activatePrevious: function () {
		 	me = this;
		 	if (this.playPrevious.hasClass('disabled')) {
		 		this.playPrevious.removeClass('disabled');
		 	}
		 	this.playPrevious.removeEvents();
		 	this.playPrevious.addEvent('click', function (event) {
				new Event(event).stop();
				me.disablePrevious();
				me.sendEvent('prev');
			});
		 },
		 
		 /**
		 * Desactiva el botón de anterior
		 *
		 */
		 disablePrevious: function () {
		 	if (!this.playPrevious.hasClass('disabled')) {
		 		this.playPrevious.addClass('disabled');
		 	}
		 	this.playPrevious.removeEvents();
		 	this.playPrevious.addEvent('click', function (ev) {
		 		new Event(ev).stop();
		 		return false;
		 	});
		 }
	});

	FmPlayer.implement(new Events, new Options);
	
	/**
	 * @author Juan Pablo Brocca
	 */
	var AddSongToPlaylist = new Class({
		/**
		 * @author Juan Pablo Brocca
		 * @classDescription 
		 */
		 
		 /**
		 * options lo que hace es crear valores por defecto
		 *
		 * @param {String}  
		 */
		 options: {
		 	targetCmb:					$('cmbMusicAlbums'),
		 	targetTxt:					$('txtNewAlbum'),
		 	targetBtn:					$('btnAddAlbum'),
		 	targetBtnAddSong:			$('btnAddSongToAlbum'),
		 	targetBtnClose:				$('btnCloseAlbumDialog'),
		 	showAutoHeal:				true,
		 	
		 	// Esta es la ubicaci�n de la p�gina que procesa el request de un nuevo playlist */
		 	playlistCreatorLocation:	'/wambafm/createAlbumJSON',
			remoteSaveChangesLocation:	'/wambafm/addSongToAlbumJSON',
		 			 	
		 	onCmbUpdate: 				Class.empty	 			 	
		 },
		 
		initialize: function (options) {
			this.setOptions(options);			
			
			// Referencia a las playlists en el combo
			this.playlists			= [];
			
			// Referencia a la playlist elegida por el usuario del combo. Es sobre la cual se guardar� la canci�n 
			this.selectedPlaylist 	= null;
			
			// Bandera que reporta si una playlist  
			this.isPlaylistInCombo	= false;
							
			// Agrego los eventos 
			this._addEvents();			
		},
		
		/**
		* @method: M�todo "privado" que agrega los eventos a los elementos de la GUI
		*/ 
		_addEvents: function () {
			var me = this;
			
			this.storePlaylists();
			
			this.options.targetCmb.addEvent('change', function () {
				me.options.targetBtnAddSong.disabled = false;
				me.options.targetBtnAddSong.removeClass('disabled');
				
				me.selectedPlaylist = me.options.targetCmb.options[me.options.targetCmb.options.selectedIndex].text;
			});
			
			this.options.targetTxt.addEvent('keyup', function () {
				me._doValidations();
			});
			
			this.options.targetTxt.addEvent('focus', function () {
				me._doValidations();
			});
			
			this.options.targetBtn.addEvent('click', function (){
				// Veo si la playlist no se encuentra actualmente en el combo y 
				// que el texto no sea vac�o de ser as� la agrego 
				if (me.options.targetTxt.value != '' && me.findPlaylistInCombo(me.options.targetTxt.value) === false) {
					me.createNewPlaylist();
					me.options.targetTxt.value = '';
				} else {
					alert(jsLang.ERR_ALBUM_ALREADY_EXISTS);
				}
			});
			
			this.options.targetBtnAddSong.addEvent('click', function (){
				me.saveChanges()
			});
			
			this.options.targetBtnClose.addEvent('click', function () {
				window.myModalWindow.modalHide();
			});

		},
		
		/**
		* @method: M�todo "privado" que efect�a las validaciones de lso elementos de la GUI
		*/	
		_doValidations: function () {
			if (this.options.targetTxt.value != '') {
				this.options.targetBtn.disabled = false;
				this.options.targetBtn.removeClass('disabled');
			} else {
				this.options.targetBtn.disabled = true;
				this.options.targetBtn.addClass('disabled');
			}
		},
		
		/**
		* @method: M�todo que busca una playlist dentro del combo de la gui
		* @param: {string} Nombre de la playlist
		*/		
		findPlaylistInCombo : function (playlist) {
			
			if (this.playlists[playlist]) {
				this.isPlaylistInCombo = true;
				return true;
			} else {
				return false;
			}
		},
		
		/**
		* @method: M�todo guarda las playlists existentes en el combo en un array JS
		*/	
		storePlaylists: function () {
			var cmb 		= this.options.targetCmb;
			var cmbOptions 	= $A(cmb.options);
			var me			= this;
			 	
			cmbOptions.each(function (option) {				
				me.playlists[option.text] = option.text; 
			});
		},
		
		/**
		* @method: M�todo que agrega una playlist al array de playlists
		* @param: {string} Nombre de la playlist
		*/	
		addPlaylist : function (playlist) {
			this.playlists[playlist] = playlist;
			
			// Referencia a la playlist elegida por el usuario del combo. Es sobre la cual se guardar� la canci�n 
			this.selectedPlaylist = playlist;

		},



		/**
		* @method: M�todo que env�a por JSON los detalles de la playlist a crear en el server
		*/	
		createNewPlaylist: function () {
			var me 			= this;
			var remote 		= this.options.playlistCreatorLocation;
			var newPlayList	= {'t': this.options.targetTxt.value};
			
			var jSonRequest = new Json.Remote(remote, {
				onComplete: function(json){
				    me.parseJsonToOption(json);
				}
			}).send(newPlayList);
		},

		/**
		* @method: M�todo parsea/decora el objeto JSON recibido para representar una playlist en el combo
		* @param: {Object} objeto JSON a parsear
		*/	
		parseJsonToOption: function (json) {
			var status 	= json.status;		
			
			/**
			 * condici�n para saber si efectivamente se cre� el playlist en el server
			 * de lo contrario NO deber�a agregar al combo y deber�a mostrar una alerta. 
			 */				
			if (status.toLowerCase() == 'ok') {
				var obj		= Json.evaluate(json.request);
				var id 		= obj.pi;
				var title 	= obj.t;
				 
				var targetOpt = this.options.targetCmb.options[this.options.targetCmb.length];
				this.options.targetCmb.options[this.options.targetCmb.length] = new Option(title, id, false, true);
				if (this.options.showAutoHeal)
				{
					if (!window.myAutoHeal) {
						window.myAutoHeal = new AutoHeal({
							target: targetOpt
						});
					} else {
						window.myAutoHeal.startAutoHeal();
					}
				}
				this.addPlaylist(title);
				
				this.options.targetBtnAddSong.disabled = false;
				this.options.targetBtnAddSong.removeClass('disabled');
				this.fireEvent('onCmbUpdate');
			} else {
				alert(json.request);
			}

		},
		/**
		* @m�thod: "Guarda" los cambios al enviar un JSON a una p�gina remota (que procesa los datos) con los datos de la canci�n elegida y del album
		*/
		saveChanges: function () {
			var me 			= this;
			var remote 		= this.options.remoteSaveChangesLocation;
			var dataToSave	= {'si': myFmPlayer.getSongId() , 'pi': this.options.targetCmb.options[this.options.targetCmb.options.selectedIndex].value};
			
			var jSonRequest = new Json.Remote(remote, {
				onComplete: function(json){
				   var obj 	= json;;
				    if (obj.status.toLowerCase() == 'ok') {
				    	 // Datos grabados, ahora hay que ocultar la ventana
				    	
				    	try {
    	 					window.myModalWindow.modalHide();
    	 				} catch (e) {
    	 					//debug code here
    	 					stopModalWindow();
    	 				}
				    }
				}
			}).send(dataToSave);
		}
	});
		
	AddSongToPlaylist.implement(new Events, new Options);
	
	
	/**
	 * @author Juan Pablo Brocca
	 */
	var AutoHeal = new Class({
		/**
		 * @author Juan Pablo Brocca
		 * @classDescription Clase encargada de implementar al ptr�n gr�fico AutoHeal
		 */
		 
		 /**
		 * options lo que hace es crear valores por defecto
		 *
		 * @param {String}  
		 */
		 options: {
		 	target: $('cmbMusicAlbums'),
		 	text:	'Álbum creado con Éxito',
		 	duration: 5000	 	
		 },
		 
		 initialize: function () {
		 	var me		= this;
		 	var coords 	= me.options.target.getCoordinates();
			var scroll	= window.getSize().scroll;
			
		 	this.div = new Element('div').addClass('autoHeal ok').setStyles({
		 		left		: coords.left + coords.width,
		 		top			: (coords.top + scroll.y + coords.height) - 20
		 	}).setText(me.options.text);
		 	document.body.adopt(this.div);
		 	
		 	this.startAutoHeal();		 	
		 },
		 
		 destroy: function () {
		 	this.div.remove();
		 	try {
		 		delete window.myAutoHeal;
		 	} catch(e){}
		 },
		 
		 startAutoHeal: function (){
		 	var me = this;
			
			new Fx.Style(me.div, 'opacity', {
											duration: 1000, onComplete: function() {
																setTimeout(function () {
																	me.exitAutoHeal()
																}, me.duration)
															}
											}).start(1);
		 },
		 
		 exitAutoHeal: function (){
		 	var me = this;

		 	new Fx.Style(me.div, 'opacity', {
		 									duration: 2000, onComplete: function () {
		 														me.destroy()
		 													}
		 									}).start(0);
		 }
		 
	});
	AutoHeal.implement(new Events, new Options);