var Detect = Class.create({
	initialize: function() {
		this.flash = !!(swfobject && (swfobject.getFlashPlayerVersion().major > 0));
		this.audioTag = false;
		this.audioCodecs = { mp3: false, ogg: false };
		var audioTest = $E('audio');
		
		if(audioTest) {
			this.audioTag = !!audioTest.canPlayType;
			this.audioCodecs.mp3 = !!audioTest.canPlayType && "" != audioTest.canPlayType('audio/mpeg');
			this.audioCodecs.ogg = !!audioTest.canPlayType && "" != audioTest.canPlayType('audio/ogg; codecs="vorbis"');
		}
	},
});

/* Flash Events */

/* playerReady is automatically fired when jwplayer is ready */
/* Cannot be renamed! */
var playerReady = function(obj) {
	$radio.log('Radio#playerReady(), id = \'' + obj.id + '\'');
	clearTimeout($radio.jwPlayTimer);
	$radio.jwPlayer = $(obj.id);
	$radio.jwPlayer.addControllerListener("ITEM", "jwItemTracker");
	$radio.jwPlayer.addModelListener("STATE", "jwStateTracker");
	$radio.jwPlayer.addModelListener("TIME", "jwTimeTracker");
	$radio.jwPlayer.addModelListener("ERROR", "jwErrorTracker");
	// Fire a fake STATE event with current state
	jwStateTracker({ newstate: $radio.jwPlayer.getConfig().state });
	$radio.finishBuilding();
}

var jwItemTracker = function(obj) {
	if($radio.jwFallback) {
		$radio.log('jw[f] event: ITEM=0 (' + $radio.currentItem + ')');
		$radio.onAudioItem($radio.currentItem);

	} else {
		$radio.log('jw event: ITEM=' + obj.index);
		$radio.onAudioItem(obj.index);
	}
}

var jwTimeTracker = function(obj) {
	// audio must have started, so clear timeout!
	clearTimeout($radio.jwPlayTimer);
	$radio.onAudioTime(obj.position, obj.duration);
}

var jwStateTracker = function(obj) {
	$radio.log('jw event: STATE=' + obj.newstate);
	//$radio.log(objInspect($radio.jwPlayer.getConfig()));
	clearTimeout($radio.jwPlayTimer);

	if(obj.newstate == 'PLAYING') {
		$radio.onAudioPlaying();

		// make sure audio has _really_ started (after 5 sec)
		$radio.jwPlayTimer = setTimeout(function() {
			if($radio.jwPlayer.getConfig().duration < 0) {
				$radio.onError('can\'t load file (duration: ' + $radio.jwPlayer.getConfig().duration + ')');
			}
		}, 5000);
	
	} else {
		if(obj.newstate == 'PAUSED') {
			$radio.onAudioPaused();
	
		} else if(obj.newstate == 'COMPLETED') {
			if($radio.jwFallback) {
				$radio.onAudioEnded();
			} else {
				$radio.onAudioCompleted();
			}
		}
	}
}

var jwErrorTracker = function(obj) {
	$radio.onError(obj.message);
}

var Radio = Class.create({
	initialize: function(options) {
		this.currentItem = null;
		this.playlist = new Array();
		this.playlistByAudio = new Array();
		
		this.player = null;
		
		this.jwPlayer = null;
		this.jwPlayerId = 'jw-player';
		this.jwFallback = false;
		this.jwPlayerPath = '/res/swf/mediaplayer/player.swf';
		
		this.playing = false;
		this.playFired = false;
		this.playlistOpened = false;
		this.stalledObserved = false;
		
		var detect = new Detect;
		this.hasFlash = detect.flash;
		this.mobileSafari = !!Prototype.Browser.MobileSafari;
		
		this.playerType = (function() {
			var playerType = detect.audioTag ? 'html' : 'jw';

			if(this.hasFlash && (playerType == 'html')) {
				// desktop safari tanks miserably (on OSX 10.6), give it flash
				// applies also to chrome & any webkit browser
				// except mobile safari which is OK (& doesn't accept flash anyway)
				if(Prototype.Browser.WebKit && !this.mobileSafari) playerType = 'jw';
	
				// give flash to little baby IE too
				if(Prototype.Browser.IE) playerType = 'jw';
			}
			
			if(!this.hasFlash && (playerType == 'jw')) {
				playerType = 'none';
			}

			return playerType;
		}).bind(this)();
		
		this.playerCodecs = detect.audioCodecs;
		
		this.itemTimer = null;
		this.positionTimer = null;
		this.jwPlayTimer = null;

		this.errorCodes = [
			'',
			'MEDIA_ERR_ABORTED',
			'MEDIA_ERR_NETWORK',
			'MEDIA_ERR_DECODE',
			'MEDIA_ERR_SRC_NOT_SUPPORTED',
		]
		
		this.elements = {
			radio: $('radio'),
		};
		
		this.btns = {};
		this.getElements();
		
		// config
		this.dev = false;
		this.logExtraEvents = false;

		if($('radio-playlist-data')) {
			this.hide();

			this.loadPlaylistData({
				play: !!options.autoplay,
				startAudioId: options.startAudioId, 
			});
		}

		this.setupAudioLinks();
	},
	
	log: function(s) {
		if(this.dev) log(s);
		return this;
	},
	
	logError: function(s) {
		if(this.dev) logError(s);
		return this;
	},
	
	hide: function() {
		this.elements.controle.setOpacity(0);
	},
	
	/* Generic functions */

	getCurrentItem: function() {
		if(this.playerType == 'html') {
			return this.currentItem;
		} else if(this.playerType == 'jw') {
			return this.jwPlayer.getConfig() && this.jwPlayer.getConfig().item;
		}
	},
	
	getPosition: function() {
		// returns 0 by default, don't use to test if player works!
	
		if(this.playerType == 'html') {
			return this.player.currentTime || 0;
		} else if(this.playerType == 'jw') {
			return (this.jwPlayer.getConfig() && this.jwPlayer.getConfig().position) || 0;
		}
	},
	
	/* Html events */
	
	setupHtmlEvents: function() {
		this.player.observe('playing', function() {
			this.log('h5 event: playing');
			this.onAudioPlaying();
		}.bind(this));
		
		this.player.observe('pause', function() {
			this.log('h5 event: pause');
			this.onAudioPaused();
		}.bind(this));
	
		this.player.observe('ended', function(event) {
			this.log('h5 event: ended');
			this.onAudioEnded();
		}.bind(this));
	
		this.player.observe('timeupdate', function() {
			this.onAudioTime(this.player.currentTime, this.player.duration);
		}.bind(this));
	
		this.player.observe('durationchange', function() {
			if(this.logExtraEvents) this.log('h5 event: durationchange');
			this.onAudioTime(this.player.currentTime, this.player.duration);
		}.bind(this));
		
		this.player.observe('error', function() {
			this.onError(this.player.error.code);
		}.bind(this));
		
		this.observeStalled(true);
		
		if(this.logExtraEvents) {
			var extraEvents = [
				'loadstart', 'loadedmetadata', 'loadeddata',
				'canplay', 'canplaythrough', 'seeked', 'suspend', 'waiting',
			];
		
			extraEvents.each(function(eventName) {
				this.player.observe(eventName, function() {
					this.log('h5 event: ' + eventName);
				}.bind(this));
			}.bind(this));
		}
	},
	
	observeStalled: function(state) {
		if(this.playerType != 'html') return false;
	
		if(state && !this.stalledObserved) {
			this.stalledObserved = true;

			this.player.observe('stalled', function() {
				this.onError('stalled');
			}.bind(this));

		} else if(!state && !!this.stalledObserved) {
			this.stalledObserved = false;
			this.player.stopObserving('stalled');
		}
	},

	/* Generic Event Interface */
	
	firePlay: function() {
		this.log('Radio#firePlay()');
		this.setPlayFired(true);

		if(this.playerType == 'html' && !this.jwFallback) {
			this.player.pause();
			this.player.load();
			this.player.play();

		} else if(this.playerType == 'jw' || this.jwFallback) {
			var sendEventFunc = function() {
				if(this.jwPlayer) {
					this.jwPlayer.sendEvent('PLAY', 'true');
				} else {
					setTimeout(sendEventFunc.bind(this), 100);
				}
			}.bind(this);
			
			setTimeout(sendEventFunc, 100);
		}
	},
	
	firePause: function() {
		this.log('Radio#firePause()');
		this.setPlayFired(false);
	
		if(this.playerType == 'html' && !this.jwFallback) {
			this.player.pause();

		} else if(this.playerType == 'jw' || this.jwFallback) {
			setTimeout(function() {
				this.jwPlayer.sendEvent('PLAY', 'false');
			}.bind(this), 100);
		}
	},
	
	fireNext: function(options) {
		this.log('Radio#fireNext()');
		options = options || {};
		var item = this.getCurrentItem();
		
		if(this.playerType == 'html') {
			if(options.nowrap && (item >= this.playlist.size() - 1)) {
				this.log('pause (end of playlist)');
				
				if(!this.jwFallback) {
					this.player.pause();
				} else {
					setTimeout(function() {
						this.jwPlayer.sendEvent('PLAY', 'false');
					}.bind(this), 100);
				}

				this.setPlaying(false);
				
				if(!options.failMode) {
					this.currentItem = 0;
					this.buildHtml({ play: false });
				}
	
			} else {
				this.setPlayFired(this.playing || this.playFired);
				this.currentItem = (item < this.playlist.size() - 1) ? item + 1 : 0;
				this.log('next: ' + this.currentItem);
				this.buildHtml({ play: (this.playing || this.playFired || options.forcePlay) });
			}

		} else if(this.playerType == 'jw') {
			setTimeout(function() {
				this.jwPlayer.sendEvent('PLAY', 'false');

				if(options.nowrap && (item >= this.playlist.size() - 1)) {
					this.log('pause (end of playlist)');
					this.setPlaying(false);
					
					if(!options.failMode) {
						this.jwPlayer.sendEvent('ITEM', 0);
					}
				
				} else {
					this.setPlayFired(this.playing || this.playFired || options.forcePlay);
					this.jwPlayer.sendEvent('NEXT');
				}
			}.bind(this), 100);
		}
	},
	
	firePrev: function() {
		this.log('Radio#firePrev()');
		this.setPlayFired(this.playing || this.playFired);
	
		if(this.playerType == 'html') {
			var item = this.getCurrentItem();
			this.currentItem = (item > 0) ? item - 1 : this.playlist.size() - 1;
			this.log('prev: ' + this.currentItem);
			this.buildHtml({ play: this.playing || this.playFired });

		} else if(this.playerType == 'jw') {
			setTimeout(function() {
				this.jwPlayer.sendEvent('PLAY', 'false');
				this.jwPlayer.sendEvent('PREV');
			}.bind(this), 100);
		}
	},
	
	fireItem: function(item) {
		this.log('Radio#fireItem()');
		
		if(this.playerType == 'html') {
			this.currentItem = item;
			this.player.play();
			this.buildHtml({ play: true });

		} else if(this.playerType == 'jw') {
			setTimeout(function() {
				this.jwPlayer.sendEvent('PLAY', 'false');
				this.jwPlayer.sendEvent('ITEM', item);
			}.bind(this), 100);
		}
	},
	
	fireSeek: function(position) {
		this.log('Radio#fireSeek()');
		
		if(this.playerType == 'html' && !this.jwFallback) {
			this.player.currentTime = position;
		} else if(this.playerType == 'jw' || this.jwFallback) {
			this.jwPlayer.sendEvent('SEEK', position);
		}
	},
	
	/* Generic Event Handlers */

	onAudioTime: function(position, duration) {
		var disp = function(seconds) {
			var m = Math.floor(seconds / 60);
			var s = zero2(Math.floor(seconds % 60));
			return m + 'm' + s + 's';
		}
		
		this.position = position;
	
		if(duration > 0) {
			this.duration = duration;
			this.remain = this.duration - this.position;
		}
		
		['position', 'duration', 'remain'].each(function(name) {
			if(this.elements.controle && !this.elements[name]) {
				this.elements[name] = $E('div', 'radio-' + name);
				this.elements.controle.insert(this.elements[name]);
			}
		}.bind(this));

		var positionDisp = disp(this.position);

		if(this.duration) {
			positionDisp += ' / ' + disp(this.duration)
		}

		if(this.elements.position) this.elements.position.update(positionDisp);
		if(this.duration && this.elements.duration) this.elements.duration.update(disp(this.duration));
		if(this.remain && this.elements.remain) this.elements.remain.update('-' + disp(this.remain));
		
		if(this.elements.seekbar && this.elements.seekbtn) {
			this.seekbarLength = this.seekbarLength || this.elements.seekbar.measure('width');
			this.seekbtnLeft = this.seekbtnLeft || this.elements.seekbtn.positionedOffset().left;
			var newLeft = this.seekbtnLeft + (position / duration * (this.seekbarLength - 6));

			this.elements.seekbtn.setStyle({
				'left': newLeft + 'px',
			});
		}
	},
	
	onAudioItem: function(currentItem) {
		this.log('Radio#onAudioItem(' + currentItem + ')');
		this.updateItemDetails(currentItem);
	},
	
	onAudioPlaying: function() {
		this.log('Radio#onAudioPlaying()');
		this.observeStalled(false);
		this.setPlaying(true);
	},
	
	onAudioPaused: function() {
		this.log('Radio#onAudioPaused()');
		this.setPlaying(false);
	},
	
	onAudioEnded: function() {
		this.log('Radio#onAudioEnded()');
		// track has ended
		// but first check for false positives
		
		if(!this.player.paused || this.jwFallback || this.mobileSafari || Prototype.Browser.Chrome) {
			this.log('trying to fireNext()');
			this.fireNext({ nowrap: true, forcePlay: true });
		}
	},
	
	onAudioCompleted: function() {
		this.log('onAudioCompleted()');
		// tracklist has ended
		this.setPlaying(false);
	},
	
	onError: function(error) {
		if(Object.isNumber(error)) {
			this.logError('error #' + error + ': ' + this.errorCodes[error]);
		} else {
			this.logError('error: ' + error);
		}
		
		if(this.playerType == 'html') {
			if(this.hasFlash && !this.jwFallback) {
				// go into fallback mode
				this.jwFallback = true;
				this.buildJw({ play: (this.playing || this.playFired) });

			} else {
				// all fails, so go to next track
				this.jwFallback = false;
				this.fireNext({ nowrap: true, failMode: true });
			}

		} else if(this.playerType == 'jw') {
			this.fireNext({ nowrap: true });
		}
	},

	/* Radio interface */
	
	initInterface: function() {
		if(this.elements.controle.hasClassName('init')) return false;
		this.log('Radio#initInterface()');

		/*
		this.btns.play = $('radio-btn-play');
		this.btns.pause = $('radio-btn-pause');
		this.btns.wait = $('radio-btn-wait');
		this.btns.next = $('radio-btn-nexttrack');
		this.btns.prev = $('radio-btn-prevtrack');
		*/

		if($('radio-btn-play')) {
			var link = $('radio-btn-play').down('a');
	
			link.observe('click', function(event) {
				event.stop();
				link.blur();
				this.firePlay();
			}.bind(this));
		}
	
		if($('radio-btn-pause')) {
			var link = $('radio-btn-pause').down('a');
			link.stopObserving('click');
			
			link.observe('click', function(event) {
				event.stop();
				link.blur();
				this.firePause();
			}.bind(this));
		}
	
		if($('radio-btn-wait')) {
			var link = $('radio-btn-wait').down('a');
			link.stopObserving('click');
			
			link.observe('click', function(event) {
				event.stop();
				link.blur();
				this.firePause();
			}.bind(this));
		}
	
		if($('radio-btn-nexttrack')) {
			var link = $('radio-btn-nexttrack').down('a');
			link.stopObserving('click');
			
			link.observe('click', function(event) {
				event.stop();
				link.blur();
				this.fireNext();
			}.bind(this));
		}
	
		if($('radio-btn-prevtrack')) {
			var link = $('radio-btn-prevtrack').down('a');
			link.stopObserving('click');
			
			link.observe('click', function(event) {
				event.stop();
				link.blur();
				this.firePrev();
			}.bind(this));
		}
		
		if($('radio-seekbar')) {
			var seekbar = $('radio-seekbar');
			var link = seekbar.down('a');
			link.stopObserving('click');
			
			link.observe('click', function(event) {
				event.stop();
				link.blur();
				if(!this.duration) return;

				var width = seekbar.measure('width');
				var offsetX = seekbar.cumulativeOffset().left;
				var scrollOffsetX = seekbar.cumulativeScrollOffset().left;
				var absX = event.pointerX();
				var position = ((absX - (offsetX - scrollOffsetX)) / width) * this.duration
				this.fireSeek(position);
			}.bind(this));
		}
		
		this.elements.controle.addClassName('init');
		document.body.addClassName('radio-actif');
	},
	
	setPlayFired: function(newPlayFired) {
		if(this.playFired !== newPlayFired) {
			this.playFired = newPlayFired;
			this.log('Radio#setPlayFired(' + (this.playFired? 'true': 'false') + ')');
			
			if(this.playFired) {
				$('radio-btn-wait').show();
				$('radio-btn-pause').hide();
				$('radio-btn-play').hide();
	
			} else {
				$('radio-btn-wait').hide();
				
				if(this.playing) {
					$('radio-btn-pause').show();
					$('radio-btn-play').hide();
				} else {
					$('radio-btn-play').show();
					$('radio-btn-pause').hide();
				}
			}
		}
	},
	
	setPlaying: function(newPlaying) {
		this.log('Radio#setPlaying(' + (newPlaying? 'true': 'false') + ')');
		if(newPlaying) this.setPlayFired(false);
		
		if(this.playing !== newPlaying) {
			this.playing = newPlaying;
			
			if(!this.playFired) {
				if(this.playing) {
					$('radio-btn-pause').show();
					$('radio-btn-play').hide();
				} else {
					$('radio-btn-play').show();
					$('radio-btn-pause').hide();
				}
			}
		
			this.updateDocumentLinks();
		}
	},
	
	updateDocumentLinks: function() {
		this.updateCourantLinks();

		if(this.playing) {
			$$('body.cat #nav-tab a, body.bio #nav-tab a').each(Magic.setupLink);
		} else {
			$$('body.cat #nav-tab a, body.bio #nav-tab a').each(Magic.disableLink);
		}
	},

	updateCourantLinks: function() {
		if(!Site.mobile && !Site.tablet) {
			if(this.playing) {
				$$('#courant a').each(Popup.setupLink);
			} else {
				$$('#courant a').each(Popup.disableLink);
			}
		}
	},
	
	updateItemDetails: function() {
		this.itemTimer = setTimeout(function() { 
			var item = this.getCurrentItem();
		
			new Ajax.Request(this.playlist[item].detailUrl, {
				method: 'post',
				parameters: { 'id': this.playlist[item].audioId },
				
				onSuccess: function(transport) {
					var response = transport.responseText || '<div id="corps">Erreur</div>';
					response = response.replace(/\n/g, ' ');
					response = response.replace(/\[base\]/g, Site.baseUrl);
					$('courant-ajax').update(response);
				}.bind(this)
			});
	
			clearTimeout(this.itemTimer);
		}.bind(this), 200);
		
		this.updateCourantLinks();
		this.fixPlaylistSel();
	},
	
	updateScreenPosition: function() {
		var offset = this.elements.radio.viewportOffset().top;
	
		if(this.playing || this.playFired) {
			if(offset < 0) {
				this.elements.radio.addClassName('fix');
				this.positionFixed = true;
			} else {
				this.elements.radio.removeClassName('fix');
				this.positionFixed = false;
			}

		} else {
			if(offset >= 0) {
				this.elements.radio.removeClassName('fix');
				this.positionFixed = false;
			}
		}
		
		if(Site.noFixed) {
			if(this.positionFixed) {
				this.elements.poste.setStyle({
					top: document.viewport.getScrollOffsets().top + 'px',
				});
			} else {
				this.elements.poste.setStyle({
					top: 'auto',
				});
			}
		}
	},
	
	/* Playlist */
	
	fixPlaylistSel: function() {
		this.log('Radio#fixPlaylistSel()');
		var item = this.getCurrentItem();
		if(!this.elements.playlistContenu) this.initPlaylist();
		var contenu = this.elements.playlistContenu;
		
		if(contenu && contenu.visible()) {
			contenu.select('li.audio.sel').invoke('removeClassName', 'sel');
			var here = contenu.down('#audio-' + this.playlist[item].audioId);
			
			if(here) {
				here.addClassName('sel');
		
				var ul = contenu.down('ul');
				var ulHeight = ul.getHeight();
		
				var hereHeight = here.getHeight();
				var hereOffset = here.offsetTop - ul.offsetTop;
				
				if((hereOffset + hereHeight) > (ul.scrollTop + ulHeight)) {
					ul.scrollTop = hereOffset - (ulHeight / 2) + (hereHeight / 2);
				} else if(hereOffset < ul.scrollTop) {
					ul.scrollTop = hereOffset - (ulHeight / 2) + (hereHeight / 2);
				}
			}
		}
	},
	
	initPlaylist: function() {
		this.log('Radio#initPlaylist()');
		this.elements.playlist = $('radio-playlist');
		this.elements.playlistContenu = $('radio-playlist-contenu');
	
		if(this.elements.playlist && !this.elements.playlist.hasClassName('init')) {
			this.elements.playlist.addClassName('init');
			
			/*
			this.btns.playlist = $('radio-btn-playlist');
			this.btns.playlistSel = $('radio-btn-playlist-sel');
			*/
			
			if($('radio-btn-playlist')) {
				var link = $('radio-btn-playlist').down('a');
				link.stopObserving('click');
				
				link.observe('click', function(event) {
					event.stop();
					link.blur();
					this.playlistOpened = true;
					
					Effect.BlindDown($('radio-playlist-contenu'), {
						duration: 0.2,
						queue: 'end',
						afterFinish: this.fixPlaylistSel.bind(this),
					});
					
					$('radio-btn-playlist-sel').show();
					$('radio-btn-playlist').hide();
				}.bind(this));
			}
	
			if($('radio-btn-playlist-sel')) {
				var link = $('radio-btn-playlist-sel').down('a');
				link.stopObserving('click');
				
				link.observe('click', function(event) {
					event.stop();
					link.blur();
					this.playlistOpened = false;
					
					Effect.BlindUp($('radio-playlist-contenu'), {
						duration: 0.2,
						queue: 'end',
					});
					
					$('radio-btn-playlist').show();
					$('radio-btn-playlist-sel').hide();
					event.stop();
				}.bind(this));
			}
			
			if(this.playlistOpened) {
				$('radio-btn-playlist-sel').show();
				$('radio-btn-playlist').hide();
				$('radio-playlist-contenu').show();
				this.fixPlaylistSel();
			}
			
			var ul = this.elements.playlist.down('ul.audio-list')
		
			if(ul) {
				ul.select('li').each(function(li) {
					if(li.hasClassName('actif')) return;
					if(li.hasClassName('no-audio')) return;
				
					if(!li.down('a')) {
						li.addClassName('no-audio');
						return;
					}
					
					li.observe('click', function(event) {
						if(event.findElement('a') && event.findElement('a').match('a')) return;
						event.stop();
						var link = li.down('a');
						if(link) link.fire('audio:click');
					}.bind(this));
					
					li.addClassName('actif');
				}.bind(this));
			
				new PairImpair(ul);
			}
		}
	},
	
	update: function(poste, audioId) {
		this.log('Radio#update(' + poste + ', ' + audioId + ')');
		this.setPlaying(false);
		
		this.elements = {
			radio: $('radio'),
		};
	
		if(!this.elements.radio) {
			this.elements.radio = $E('div', 'radio');
			$('header').insert({ after: this.elements.radio });
			document.body.addClassName('avec-radio');
		}
		
		var requestUrl = Site.baseUrl + '/' + Site.baseLngDir + '/radio/select/?ajax=1&poste=' + poste;
		var playlistOptions = { play: true };
		if(audioId) playlistOptions.startAudioId = audioId;
		
		new Ajax.Request(requestUrl, {
			method: 'post',
			
			onSuccess: function(transport) {
				var response = transport.responseText || '<div id="corps">Erreur</div>';
				response = response.replace(/\n/g, ' ');
				response = response.replace(/\[base\]/g, Site.baseUrl);
				this.elements.radio.update(response);
				this.getElements();
				this.loadPlaylistData(playlistOptions);
			}.bind(this)
		});
		
		//this.updateDocumentLinks();
	},
	
	getElements: function() {
		this.elements.poste = $('radio-poste');
		this.elements.controle = $('controle');
		this.elements.player = $('player');
		this.elements.seekbar = $('radio-seekbar');
		this.elements.seekbtn = $('radio-btn-seek');
	},
	
	setupAudioLinks: function(e) {
		var click = function(event) {
			var stopEvent = false;
			var link = event.element();
			if(link.tagName != 'A') link = link.up('a.audio, a.audio-sel, a.radio');
			link.blur();
			var linkHref = link.href;

			if(linkHref.match(/#audio\:.+$/)) {
				var audioId = linkHref.match(/#audio\:(.+)$/)[1];

				if(this.playlistByAudio[audioId] !== null) {
					this.fireItem(this.playlistByAudio[audioId]);
					stopEvent = true;

				} else if(!Site.mobile) {
					var poste = linkHref.match(/poste=([^&]+)/)[1];
					this.update(poste, audioId);
					stopEvent = true;
				}

			} else if(!Site.mobile) {
				stopEvent = true;
				var poste = linkHref.match(/poste=([^&]+)/)[1];
				this.update(poste, undefined);
			}
			
			if(stopEvent) event.stop();
		}.bind(this);
	
		$$('a.audio, a.audio-sel, a.radio').each(function(link) {
			link.observe('audio:click', click);
			link.observe('click', click);
		}.bind(this));
	},
	
	updateType: function(s) {
		if(!this.elements.type) {
			this.elements.type = $E('div', 'radio-type');
			this.elements.controle.insert(this.elements.type);
		}
		
		this.elements.type.update(s);
		return this;
	},
	
	buildNone: function(options) {
		var erreur = $E('div', 'radio-poste').update(
			'<img src="' + Site.baseUrl + '/res/element/icone-attention.png" />' +
			'<a href="http://www.getfirefox.com/" class="out">HTML5</a> ' +
			lng('ou', 'or') +
			' <a href="http://get.adobe.com/fr/flashplayer/" class="out">Flash</a> ' +
			lng(
				'sont requis pour écouter les extraits audio sur le site web.',
				'are required in order to listen to the audio clips on the site.'
			)
		);
		
		erreur.addClassName('erreur');
		this.elements.radio.update(erreur);
		this.finishBuilding();
	},

	buildJw: function(options) {
		this.log('Radio#buildJw(' + objInspect(options) + ')');
		options = options || {};
	
		var radioInterval = setInterval(function() {
			if(document.loaded) {
				this.updateType('jw' + (this.jwFallback ? '[f]' : ''));
				var playerHeight = 1;
				var displayHeight = 1;
				var displayWidth = 1;
				var jwPlayerUrl = Site.baseUrl + this.jwPlayerPath;
				var req = this.playlist.pluck('audioId').join(';');
				var fileUrl;
				
				if(this.jwFallback) {
					fileUrl = this.playlist[this.currentItem].url;
				} else {
					fileUrl = Site.baseUrl + '/' + Site.baseLngDir + '/radio/radio.xspf.php?req=' + req;
				}
				
				var flashvars = {
					'displayheight': displayHeight,
					'file': fileUrl,
					'height': playerHeight,
					'width': displayWidth,
					'displaywidth': '0',
					'shuffle': 'false',
					'repeat': 'list',
					'enablejs': 'true',
					'javascriptid': this.jwPlayerId,
					'linkfromdisplay': 'false',
					'thumbsinplaylist': 'true',
					'backcolor': '0x000000',
					'frontcolor': '0x000000',
					'lightcolor': '0x000000',
					'screencolor': '0x000000',
					'callback': 'analytics',
					'autostart': (!!options.play ? 'true' : 'false'),
				};
	
				if(this.currentItem != 0) {
					flashvars['item'] = this.currentItem;
					this.updateItemDetails();
				}
				
				var params = {
					'allowfullscreen': 'false',
					'allowscriptaccess': 'true',
				};
				
				var attributes = {
					'id': this.jwPlayerId,
					'name': this.jwPlayerId,
				};
				
				this.elements.player.update($E('div', this.jwPlayerId));
	
				swfobject.embedSWF(
					jwPlayerUrl, this.jwPlayerId, displayWidth, playerHeight, '7', '', 
					flashvars, params, attributes
				);
				
				clearInterval(radioInterval);
			}
		}.bind(this), 50);
	},
	
	buildHtml: function(options) {
		this.log('Radio#buildHtml(' + objInspect(options) + ')');
		options = options || {};
		this.jwFallback = false;
		this.updateType('html5');
		if($(this.jwPlayerId)) $(this.jwPlayerId).update('');
	
		var mp3Url = this.playlist[this.currentItem].url;
		var oggUrl = mp3Url.gsub('mp3', 'ogg');
		
		if(this.elements.player.down('audio')) {
			this.player.pause();
		
			if(this.playerCodecs.mp3) {
				this.player.src = mp3Url;
				this.player.type = 'audio/mpeg';
			} else {
				this.player.src = oggUrl;
				this.player.type = 'audio/ogg';
			}

		} else {
			var playerHTML = '<audio ';
			
			if(this.playerCodecs.mp3) {
				playerHTML += 'src="' + mp3Url + '" ';
				playerHTML += 'type="audio/mpeg" />';
			} else {
				playerHTML += 'src="' + oggUrl + '" ';
				playerHTML += 'type="audio/ogg" />';
			}
			
			this.elements.player.update(playerHTML);
			this.player = this.elements.player.down('audio');
			this.setupHtmlEvents();
		}

		setTimeout(function() {
			this.updateItemDetails();
			this.finishBuilding({ play: options.play });
		}.bind(this), 200);
	},
	
	build: function(options) {
		options = options || {};
		options.play = !!options.play && !this.mobileSafari;
		this.log('Radio#build(' + objInspect(options) + ')');
		this.setPlayFired(!!options.play);
	
		if(this.playerType == 'jw') {
			this.buildJw(options);
		} else if(this.playerType == 'html') {
			this.buildHtml(options);
		} else {
			this.buildNone(options);
		}
	},
	
	finishBuilding: function(options) {
		options = options || {};
		this.log('Radio#finishBuilding()');
		this.initInterface();
		this.initPlaylist();
		this.elements.controle.setOpacity(1);

		if(options.play) {
			this.firePlay();
		}
		
		Event.observe(document, 'scroll', this.updateScreenPosition.bind(this), false);
		Event.observe(window, 'scroll', this.updateScreenPosition.bind(this), false);
	},
	
	loadPlaylistData: function(options) {
		this.log('Radio#loadPlaylistData(' + objInspect(options) + ')');
		options = options || {};
		this.playlist = [];
		this.playlistByAudio = [];
	
		$('radio-playlist-data').down('ul.rpd-items').select('li').each(function(li) {
			var item = parseInt(li.down('div.item').innerHTML.strip());
			var audioId = li.down('div.audio-id').innerHTML.strip();
			var url = li.down('div.url').innerHTML.strip();
			var detailUrl = li.down('div.detail-url').innerHTML.strip();
	
			this.playlist[item] = {
				audioId: audioId,
				url: url,
				detailUrl: detailUrl,
			};
			
			this.playlistByAudio[audioId] = item;
		}.bind(this));
		
		this.currentItem = options.startAudioId ? this.playlistByAudio[options.startAudioId] : 0;
		this.log('currentItem = ' + this.currentItem);
		this.build({ play: !!options.play });
	},
});

Radio.found = function() {
	return !!$('radio-playlist-data');
}

var initRadioDomLoaded = function() {
	$radio = new Radio({
		autoplay: !!$('doc-radio'),

		startAudioId: (function() {
			var query = window.location.href.parseQuery();
			return (query['audio'] != '') ? query['audio'] : null;
		}()),
	});
}

var initRadioAllLoaded = function() {
}

var $radio;

Event.observe(document, 'dom:loaded', initRadioDomLoaded, false);
Event.observe(window, 'load', initRadioAllLoaded, false);

