/**
 * MNM-singleton (config)object
 */
var mnm =
{
	config: {
		console:{
			trace:false
		},
		heartbeat:{
			timeoutInterval:10000,
			itemCount:50,
			moreText:'Toon oudere berichten...'
		},
		filter:{
			moreText:'Toon oudere berichten...'
		}
	},
	
	console: null,
	pagescroll: null,
	taskbar: null,
	audioplayer: null,
	requests: null,
	menu: null,
	filter: null,
	mnmtheek: null,
	helpers: null,
	profile: null,
	article: null,
	heartbeat: null,
	deejay: null,
	campains: null,
	comments: null,
	shows: null
};

// debug.trace aanzetten voor != firefox
if (mnm.config.console.trace)
{
	if (!console)
	{
		var console = new Object();
		console.log = function(m)
		{
			$('#console-trace').css('display', 'block');
			$('#console-trace').append('<p>'+m+'</p>');
		};
	}
}

/**
 * MNM-Debug-Console
 * @category MNM
 * @return MNM_Console
 */
function MNM_Console()
{
	this.trace = function(message)
	{
		if (mnm.config.console.trace)
		{
			console.log(message);
		}
	};
}
mnm.console = new MNM_Console();

/**
 * MNM_Requests om requesten af te handelen
 * @category MNM
 * @return MNM_Requests
 */
function MNM_Requests()
{
	var _requestsQueue = new Queue();
	var _currentRequest = null;
	
	/**
	 * Start een request
	 * @param Object params
	 */
	this.doRequest = function(params)
	{	
		//mnm.console.trace('MNM_Requests.doRequest()');
		
		if (_currentRequest == null)
		{
			var success = params.success;
			var error = params.error;
			
			var request = params;
			request.success = mnm.requests.event_onSuccess;
			request.error = mnm.requests.event_onError;
			
			_currentRequest = {params:params,success:success,error:error};
			_currentRequest.request = $.ajax(request);
		}
		else
		{
			_requestsQueue.enqueue(params);
		}
	};
	
	/**
	 * Bij het succesvol laden van een request, roep de juiste methods op
	 * @param string|object data
	 */
	this.event_onSuccess = function(data)
	{
		//mnm.console.trace('MNM_Requests.event_onSuccess()');
		
		try
		{
			_currentRequest.success(data, _currentRequest);
		}
		catch(e)
		{
			//mnm.console.trace(e.message);
		}
		
		setTimeout('mnm.requests.event_onRestart();', 100);
	};
	
	/**
	 * Errorafhandeling van een request
	 * @param object object
	 * @param string message
	 */
	this.event_onError = function(object, message)
	{
		//mnm.console.trace('MNM_Requests.event_onError()');
		
		try
		{
			_currentRequest.error(object, message, _currentRequest);
		}
		catch(e)
		{
			//mnm.console.trace(e.message);
		}
		
		setTimeout('mnm.requests.event_onRestart();', 100);
	};
	
	/**
	 * Ophalen van de volgende request in de queue
	 */
	this.event_onRestart = function()
	{
		//mnm.console.trace('MNM_Requests.event_onRestart()');
		
		_currentRequest = null;
		try
		{
			var request = _requestsQueue.dequeue();
			if( request )
			{
				mnm.requests.doRequest(request);
			}
		}
		catch(e)
		{
			//mnm.console.trace(e.message);
		}
	};
	
	/**
	 * Cancel alle requests
	 */
	this.event_onCancelAll = function()
	{
		//mnm.console.trace('MNM_Requests.event_onCancelAll()');
		
		_requestsQueue = new Queue();
		if (_currentRequest != null)
		{
			if(_currentRequest.params.isCancellable == null)
			{
				_currentRequest.request.abort();
				this.event_onError(null, 'Request aborted');
			}
		}
	};
}
mnm.requests = new MNM_Requests();

/**
 * MNM-PageScroll-Controller
 * @category MNM
 * @return MNM_PageScroll
 */
function MNM_PageScroll()
{
	var _IE6 = false;
	var _scrollObject = null;
	var _isVisible = true;
	
	/**
	 * Initialiseer de scroll-listener
	 * @param boolean isIE6	
	 */
	this.init = function(isIE6)
	{
		//mnm.console.trace('MNM_PageScroll.init('+isIE6+')');
		
		_IE6 = isIE6;
		if (_IE6)
		{
			_scrollObject = $('#bodyContainer');
			
			if($(window).width() <= 1280)
			{
				var resize_width = $(window).width();
				$('#bodyContainer').css("width", resize_width + 'px');
			}
		}
		else
		{
			_scrollObject = $(window);
		}
		
		_scrollObject.scroll(function()
			{mnm.pagescroll.event_onScroll();}
		);
		
		// Als de flashheader niet zichtbaar is bij het inladen, toon de balk.
		if (this.isFlashVisible() == false)
		{
			mnm.taskbar.event_onPageScroll(false);
		}
		
		
	    var o = $('div#ad-halfpage-content')
	    o.attr('originalTop', o.offset().top)
	    o.attr('originalPosition',o.css('position'))
	    o.attr('originalPaddingTop',o.css('paddingTop'))
		o.attr('originalMarginTop',o.css('marginTop'))
		o.attr('originalMarginLeft',o.css('marginLeft'))
	    // o.css('top',0);
		
	};
	
	/**
	 * Is de Flashheader zichtbaar?
	 * @return boolean
	 */
	this.isFlashVisible = function()
	{
		//mnm.console.trace('MNM_PageScroll.isFlashVisible()');
		var scrollPos = _scrollObject.scrollTop();
		var scrollHeader = $('#header').scrollTop() + $('#header').height();
		
		if(scrollPos > scrollHeader)
		{
			return false;
		}
		return true;
	};
	
	/**
	 * Indien er gescrolled wordt... vuur dan een onPageScroll-event af
	 */
	this.event_onScroll = function()
	{
		//mnm.console.trace('MNM_PageScroll.event_onScroll()');
		if (this.isFlashVisible() == false)
		{
			mnm.tb_heartbeat.event_onPageScroll(false);
			mnm.taskbar.event_onPageScroll(false);
		}
		else
		{
			mnm.tb_heartbeat.event_onPageScroll(true);
			mnm.taskbar.event_onPageScroll(true);
		}
		
		// pebble
		var o = $('div#ad-halfpage-content')
        var nowFromTop = pebbleScrollTop();
		var totalFromTop = (parseInt(o.attr('originalTop')) + parseInt(o.attr('originalPaddingTop')) + parseInt(o.attr('originalMarginTop')));
		if(nowFromTop >= totalFromTop) {
			// o.css('position','fixed')
			// o.css('paddingTop',5)
			o.css('paddingTop',nowFromTop - totalFromTop + 5 + 'px')
			// o.css('marginLeft',0);
		} else {
			// o.css('position','fixed')
			o.css('top', (parseInt(o.attr('originalPaddingTop')) - nowFromTop) + 'px')
			// o.css('marginTop', o.attr('originalMarginTop'))
			o.css('paddingTop',0)
			// o.css('marginLeft',o.attr('originalMarginLeft'));
		}
		
		// o.prepend(nowFromTop + ' - ' + totalFromTop + '<br />')
		
	};
	
	/**
	 * Scroll naar boven
	 * @return
	 */
	this.event_onScrollToTop = function()
	{
		//mnm.console.trace('MNM_PageScroll.event_onScrollToTop()');
		if (_IE6)
		{
			var _scrollObject = $('#bodyContainer');
			_scrollObject.scrollTop(0);
		}
		else
		{
			window.scroll(0,0);
		}
	};
	
	/**
	 * Window resize met ie6, scrollbars moeten opnieuw ge�nitialiseerd worden
	 */
	this.event_onWindowResize = function(isIE6)
	{
		if (isIE6)
		{
			if($(window).width() <= 1280)
			{
				var resize_width = $(window).width();
				$('#bodyContainer').css("width", resize_width + 'px');
			}
			else
			{
				$('#bodyContainer').css("width", "100%");
			}
		}
	}
}
mnm.pagescroll = new MNM_PageScroll();

/**
 * MNM-Taskbar-Controller
 * @category MNM
 * @return MNM_Taskbar
 */
function MNM_Taskbar()
{
	this.ANIMATION_TYPE_HIDE = 'hide';
	this.ANIMATION_TYPE_SHOW = 'show';
	
	this.TAB_TYPE_TAB = 'tab_type_tab';
	this.TAB_TYPE_CUSTOMTAB = 'tab_type_icon';
	
	this.TAB_STATE_MINIMIZED_IDLE = 'tab_state_minimized_idle'; // De applicatie is geminimaliseerd is heeft geen huidige activiteit
	this.TAB_STATE_MINIMIZED_ACTIVE = 'tab_state_minimized_active'; // De applicatie is geminimaliseerd maar is actief (de balk mag niet verdwijnen)
	this.TAB_STATE_MAXIMIZED_IDLE = 'tab_state_maximized_idle'; // De applicatie is gemaximaliseerd maar niet actief (de balk mag niet verdwijnen)
	this.TAB_STATE_MAXIMIZED_ACTIVE = 'tab_state_maximized_active'; // De applicatie is gemaximaliseerd en actief (de balk mag niet verdwijnen)
	
	var _isVisible = false; // Is de taskbar zichtbaar?
	var _isAnimating = false; // Animeert de taskbar momenteel?
	var _animationType = null; // Type van animatie dat er momenteel loopt
	var _currentAnimator = null; // Object waarop we de animatie kunnen stoppen
	var _buttonsAnimator = null; // Object waarop we de buttons-animatie kunnen stoppen
	
	var _queue = new Queue(); // Queue dit de tab(s) + params bijhoudt totdat de balk zichtbaar is
	var _tabs = new Array(); // Bijhouden van alle tabs die (al) geactiveerd werden
	
	/**
	 * Voeg een tab toe aan de taskbar
	 * @param MNM_Taskbar_XTab instance
	 * @param Object obj
	 */
	this.addTab = function(instance, obj)
	{
		//mnm.config.console.trace('MNM_Taskbar.addTab()');
		
		obj.state = this.TAB_STATE_MINIMIZED_IDLE;
		instance.tab = obj;
		_tabs.push(instance);
	};
	
	/**
	 * Maximaliseer/minimaliseer de tab
	 * @param MNM_Taskbar_xTab instance
	 */
	this.toggleTab = function(instance)
	{
		//mnm.config.console.trace('MNM_Taskbar.toggleTab(name:'+instance.tab.name+')');
		
		if (!_isAnimating)
		{	
			var tab = instance.tab;
			switch(tab.state)
			{
				case this.TAB_STATE_MINIMIZED_IDLE:
				case this.TAB_STATE_MINIMIZED_ACTIVE:
					this.maximizeTab(tab);
					instance.event_onMaximizeTab();
				break;
				
				case this.TAB_STATE_MAXIMIZED_IDLE:
				case this.TAB_STATE_MAXIMIZED_ACTIVE:
					this.minimizeTab(tab);
					instance.event_onMinimizeTab();
				break;
			}
			
			// Verberg balk? Volg de weg van de page-scroller (omdat deze elke validatie uitvoert)
			mnm.pagescroll.event_onScroll();
		}
	};
	
	/**
	 * Verander de state van idle naar active of van active naar idle (en behoudt maximized/minimized)
	 * @param string state
	 * @return string
	 */
	this.switchIdleActiveState = function(state)
	{
		//mnm.config.console.trace('MNM_Taskbar.switchIdleActiveState(state:'+state+')');
		
		switch(state)
		{
			case this.TAB_STATE_MINIMIZED_IDLE:
				state = this.TAB_STATE_MAXIMIZED_IDLE;
			break;
			case this.TAB_STATE_MINIMIZED_ACTIVE:
				state = this.TAB_STATE_MAXIMIZED_ACTIVE;
			break;
			case this.TAB_STATE_MAXIMIZED_IDLE:
				state = this.TAB_STATE_MINIMIZED_IDLE;
			break;
			case this.TAB_STATE_MAXIMIZED_ACTIVE:
				state = this.TAB_STATE_MINIMIZED_ACTIVE;
			break;
			default:
				state = null;
			break;
		}
		
		return state;
	};
	
	/**
	 * Is de meegeven state actief?
	 * @param String state
	 * @return boolean
	 */
	this.isStateActive = function(state)
	{
		//mnm.console.trace('MNM_Taskbar.isStateActive(state:'+state+')');
		if (state == this.TAB_STATE_MAXIMIZED_ACTIVE || state == this.TAB_STATE_MINIMIZED_ACTIVE)
		{
			return true;
		}
		return false;
	};
	
	/**
	 * Is de meegegeven state maximized?
	 * @param String state
	 * @return boolean
	 */
	this.isStateMaximized = function(state)
	{
		//mnm.console.trace('MNM_Taskbar.isStateMaximized(state:'+state+')');
		if (state == this.TAB_STATE_MAXIMIZED_ACTIVE || state == this.TAB_STATE_MAXIMIZED_IDLE)
		{
			return true;
		}
		return false;
	};
	
	/**
	 * Zijn er tabs actief?
	 * @return boolean
	 */
	this.hasActiveTabs = function()
	{
		//mnm.console.trace('MNM_Taskbar.hasActiveTabs()');
		
		for(var i=0; i<_tabs.length; i++)
		{
			if (_tabs[i].tab.state == this.TAB_STATE_MAXIMIZED_ACTIVE || _tabs[i].tab.state == this.TAB_STATE_MAXIMIZED_IDLE || _tabs[i].tab.state == this.TAB_STATE_MINIMIZED_ACTIVE)
			{
				return true;
			}
		}
		return false;
	};
	
	/**
	 * Maximaliseer alle tabs in de queue
	 */
	this.maximizeQueuedTabs = function()
	{
		//mnm.console.trace('MNM_Taskbar.maximizeQueuedTabs()');
		
		while(_queue.getSize()>0)
		{
			var tabInstance = _queue.dequeue();
			this.maximizeTab(tabInstance.tab);
			tabInstance.event_onMaximizeTab();
		}
	};
	
	/**
	 * Maximaliseer een tab
	 * @param object tab
	 */
	this.maximizeTab = function(tab)
	{
		//mnm.console.trace('MNM_Taskbar.maximizeTab(name:'+tab.name+',state:'+tab.state+')');
		
		var allow_show = true;
		
		if(tab.tabId == 'button-mnmtheek')
		{
			var tabs = $('.simpleTabs-tabs');
			var total_tabs = tabs.length;
			
			if(total_tabs == 0)
			{
				allow_show = false;
			}
		}
		
		if(allow_show)
		{	
			if (!this.isStateMaximized(tab.state))
			{
				tab.state = this.switchIdleActiveState(tab.state);
			}
			
			if (tab.contentId && tab.contentId != null)
			{
				$('#'+tab.contentId).css('bottom', '26px');
				//$('#mediatheek-mnm-placeholder').css('bottom', '24px');
				
				// Initialiseer de scrool functie in de playlist van de audio player
				$('#audioplayer-playlist-placeholder').jScrollPane();
			}
			if (tab.tabId && tab.tabId != null)
			{
				$('#'+tab.tabId+' .button-content img.button-openclose').css('background-position', 'bottom');
			}
		}
	};
	
	this.minimizeTab = function(tab)
	{
		//mnm.console.trace('MNM_Taskbar.minimizeTab(name:'+tab.name+')');
		
		if (this.isStateMaximized(tab.state))
		{
			tab.state = this.switchIdleActiveState(tab.state);
		}
		
		if (tab.contentId && tab.contentId != null)
		{
			$('#'+tab.contentId).css('bottom', '-300px');
			//$('#mediatheek-mnm-placeholder').css('bottom', '-270px');
		}
		if (tab.tabId && tab.tabId != null)
		{
			$('#'+tab.tabId+' .button-content img.button-openclose').css('background-position', 'top');
		}
	};
	
	this.showMediatheek = function(tab)
	{
		$('#mediatheek-mnm-placeholder').css('bottom', '24px');
		$('#mediatheek-mnm-placeholder').fadeIn("slow");
		
		$(".simpleTabs-nav li").removeClass("actif");
		$("#simpleTabs-nav-"+1).addClass("actif");
		$("#simpleTabs-content-"+1).fadeIn("slow");
	}
	
	
	
	/***************************************************************************************************/
	/** Taskbar animatie controls 																	  **/
	/***************************************************************************************************/
	
	/**
	 * Toon de taskbar
	 */
	this.show = function()
	{
		//mnm.console.trace('MNM_Taskbar.show()');
		
		if ((_isVisible && _isAnimating) || (!_isVisible))
		{
			if (_animationType == this.ANIMATION_TYPE_HIDE)
			{
				this.stopAnimation();
			}
			
			if (!_isAnimating)
			{
				_isVisible = false;
				_isAnimating = true;
				_animationType = this.ANIMATION_TYPE_SHOW;
				
				_buttonsAnimator = $('#bar .button').slideDown('slow');
				_currentAnimator = $('#bar').slideDown('slow', function(){mnm.taskbar.event_onVisible();});
			}
		}
	};
	
	/**
	 * Verberg de taskbar
	 */
	this.hide = function()
	{
		//mnm.console.trace('MNM_Taskbar.hide()');
		
		if ( ((_isVisible && !_isAnimating) || (!_isVisible && _isAnimating)) && !this.hasActiveTabs() && _queue.getSize() == 0)
		{
			if (_animationType == this.ANIMATION_TYPE_SHOW)
			{
				this.stopAnimation();
			}
			
			if (!_isAnimating)
			{
				_isVisible = true;
				_isAnimating = true;
				_animationType = this.ANIMATION_TYPE_HIDE;
				
				_buttonsAnimator = $('#bar .button').slideUp('slow');
				_currentAnimator = $('#bar').slideUp('slow', function(){mnm.taskbar.event_onHidden();});
			}
		}
	};
	
	/**
	 * Indien de taskbar volledig zichtbaar is...
	 */
	this.event_onVisible = function()
	{
		//mnm.console.trace('MNM_Taskbar.event_onVisible()');
		
		_isAnimating = false;
		_animationType = null;
		_isVisible = true;
		
		this.maximizeQueuedTabs();
	};
	
	/**
	 * Indien de taskbar volledig onzichtbaar is...
	 */
	this.event_onHidden = function()
	{
		//mnm.console.trace('MNM_Taskbar.event_onHidden()');
		
		_isAnimating = false;
		_animationType = null;
		_isVisible = false;
	};
	
	/**
	 * Stop de animatie
	 */
	this.stopAnimation = function()
	{
		//mnm.console.trace('MNM_Taskbar.stopAnimation()');
		
		if (_isAnimating)
		{
			_currentAnimator.stop();
			_buttonsAnimator.stop();
			
			if (_animationType == this.ANIMATION_TYPE_HIDE)
			{
				_currentAnimator.css('display', 'none');
				_buttonsAnimator.css('display', 'none');
				_currentAnimator.css('height', '');
				_buttonsAnimator.css('height', '');
			}
			else
			{
				_currentAnimator.css('height', '');
				_buttonsAnimator.css('height', '');
			}
			
			_currentAnimator = null;
			_buttonsAnimator = null;
			
			_animationType = null;
			_isAnimating = false;
		}
	};
	
	
	/***************************************************************************************************/
	/** Taskbar externe events																		  **/
	/***************************************************************************************************/
	
	/**
	 * Wordt opgeroepen op het ogenblik dat er gescrolled wordt.
	 * @param boolean isFlashVisible
	 */
	this.event_onPageScroll = function(isFlashVisible)
	{
		//mnm.console.trace('MNM_Taskbar.event_onPageScroll('+isFlashVisible+')');
		
		if (isFlashVisible == false)
		{
			this.show();
		}
		else
		{
			this.hide();
		}
	};
	
	/**
	 * Wordt opgeroepen door de tabs zelf wanneer ze geactiveerd willen worden.
	 * @param MNM_Taskbar_XTab instance
	 */
	this.event_onActivateTab = function(instance)
	{
		//mnm.console.trace('MNM_Taskbar.event_onActivateTab('+instance.name+')');
		
		// Toevoegen van de instance aan de queue
		_queue.enqueue(instance);
		
		// Is de taskbar volledig zichtbaar?
		if (_isVisible && !_isAnimating)
		{
			this.maximizeQueuedTabs();
		}
		else if(_isVisible && _isAnimating) // De taskbar is zichtbaar maar hij is aan het verdwijnen.
		{
			this.show();
		}
		else if (!_isVisible && !_isAnimating) // De taskbar is onzichtbaar
		{
			this.show();
		}
	};
	
	/**
	 * Wordt opgeroepen door de tabs zelf wanneer ze gedeactiveerd willen worden.
	 * @param MNM_Taskbar_XTab instance
	 */
	this.event_onDeactivateTab = function(instance)
	{
		//mnm.console.trace('MNM_Taskbar.event_onDeactivateTab('+instance.name+')');
		
		switch (instance.tab.state) 
		{
			case this.TAB_STATE_MAXIMIZED_ACTIVE:
				instance.tab.state = this.TAB_STATE_MINIMIZED_ACTIVE;
			break;
			
			case this.TAB_STATE_MAXIMIZED_IDLE:
				instance.tab.state = this.TAB_STATE_MINIMIZED_IDLE;
			break;
		}
		
		this.minimizeTab(instance.tab);
		instance.event_onMinimizeTab();
		
		// Verberg balk?
		var isFlashVisible = mnm.pagescroll.isFlashVisible();
		if (isFlashVisible == false)
		{
			this.show();
		}
		else
		{
			this.hide();
		}
	};
}
mnm.taskbar = new MNM_Taskbar();

/**
 * Aansturen van de audiospeler in de taskbar
 * @category MNM_Taskbar
 * @return MNM_Taskbar_Audioplayer
 */
function MNM_Taskbar_Audioplayer()
{
	this.tab = null; // Default-tab-settings
	this.name = 'audioplayer';
	
	this.song_number = 1;
	
	/**
	 * Custom acties indien deze tab geactiveerd werd. => Wordt opgeroepen als de taskbar getoond werd.
	 */
	this.event_onMaximizeTab = function()
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.event_onMaximizeTab()');
		this.play();
	};
	
	this.event_onMinimizeTab = function()
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.event_onMinimizeTab()');
	};
	
	this.STATE_IDLE = 'IDLE';
	this.STATE_PLAYING = 'PLAYING';
	this.STATE_PAUSED = 'PAUSED';
	this.STATE_COMPLETED = 'COMPLETED';
	
	var _state = this.STATE_IDLE;
	var _initialized = false;
	var _initialising = false;
	var _player = null;
	
	var _playlist_items = new Object;
	
	//var _queue = new Queue();
	
	/**
	 * Voeg een audiofragment toe aan de playlist
	 * @param string title
	 * @param string href
	 * @param string countername
	 */
	this.add = function(song_id, song_artist, song_title, song_picture, title, href, countername, add_onclick, featurings)
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.add()');

		if(this.alreadyInPlaylist({title: title, url: href, song_id: song_id}))
		{
			//alert("al aanwezig in de playlist");
		}
		else
		{
			if (countername && countername != null)
			{
				sitestat(nedstatURL + 'audioplayer.' + countername);
			}
			
			//voeg dit item toe aan de playlist
			var onclick_event = 'mnm.audioplayer.removeFromPlaylist(' + this.song_number + ', \'' + href + '\');';
			var close_button = '<img src="/frontend/themes/mnm/images/playlist_remove.jpg" alt="" />';
			
			//kolommen van de playlist maken
			var column_1_text = '<strong>' + HTMLentities(song_title) + '</strong>';
			
			if(song_artist != '')
			{
				column_1_text += ' - ' + HTMLentities(song_artist);
			}
			
			var column_1 = '<td class="audioplayer-playlist-song-placeholder" id="' + href + '">' + column_1_text + '</td>';
			var column_2 = '<td class="audioplayer-playlist-remove-placeholder" onclick="' + onclick_event + '">' + close_button + '</td>';
			
			var extra_class = 'audioplayer-playlist-even-row';
			
			if(this.song_number % 2 == 0)
			{
				extra_class = 'audioplayer-playlist-odd-row';
			}
			
			var tekst = '<tr id="playlist-row-' + this.song_number + '" class="' + extra_class + '">' + column_1 + column_2 + '</tr>';
			
			$('#audioplayer-playlist-table').append(tekst);
			
			//herinitialiseer de scrollpane van de playlist
			$("#audioplayer-playlist").jScrollPane();

			//herinitialiseer de drag en drop van de playlist en wijzig de achtergrond kleuren van de rij als ze versleept worden
			$("#audioplayer-playlist-table").tableDnD({
			    onDrop: function(table, row){
		            var rows = table.tBodies[0].rows;
		            for (var i=0; i<rows.length; i++)
			        {
			        	if (i%2 == 0)
			            {
			                $(rows[i]).css('background-color','#B9060C');
			            }
			            else
			            {
			                 $(rows[i]).css('background-color','transparent');
			            }
			        }
			    }
			});

			_playlist_items['playlist-row-' + this.song_number] = ({title: title, url: href, id: this.song_number, song_id: song_id, song_artist: song_artist, song_title: song_title, song_picture: song_picture, add_onclick: add_onclick, countername: countername, featurings: featurings});
			
			this.song_number += 1;
			
			mnm.taskbar.event_onActivateTab(this);
		}
	};
	
	/**
	 * Nakijken of dit liedje/fragment al in de playlist zit
	 */
	this.alreadyInPlaylist = function(element)
	{
		var found = false;
		
		for(var prop in _playlist_items)
		{
			if(_playlist_items[prop].url == element.url)
			{
				found = true;
			}
		}
		
		return found;
	};
	
	/**
	 * Ophalen van het eerste item in de playlist
	 */
	this.getFirstSongInPlaylist = function()
	{
		var row_id = null;
		var playlist_item = null;
		var found = false;
		
		$('tr', $('#audioplayer-playlist-table')).each(function()
		{
			//console.log(this);
			
			if(!found)
			{
				row_id = this.id;
				found = true;
			}
		});
		
		//haal de gegevens van dit item op
		if(row_id != null)
		{
			playlist_item = _playlist_items[row_id];
		}
		
		return playlist_item;
	};
	
	this.removeFromPlaylist = function(id_number)
	{
		//verwijderen uit de html
		var id = 'playlist-row-' + id_number;
		$("#" + id).remove();
		
		//verwijderen uit het playlist object
		delete _playlist_items[id];
		
		//herinitialiseer de scrollpane van de playlist
		$("#audioplayer-playlist").jScrollPane();
	};
	
	this.play = function()
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.play()');
		
		if (!_initialized && !_initialising)
		{
			this.writePlayer();
		}
		else if (_initialized)
		{
			if(_state == this.STATE_PLAYING || _state == this.STATE_PAUSED)
			{
				//nog niets voorlopig, de speler is een liedje aan het afspelen
			}
			else
			{
				var logo = '/frontend/themes/mnm/swf/jwtitel.swf?titel=';
				var file = this.getFirstSongInPlaylist();
				if (file != null)
				{
					var obj = {file: file.url, image: logo+file.title, type: 'sound'};
					
					//remove the song from the playlist
					this.removeFromPlaylist(file.id);
					
					//send the song to the flash to play
					_player.sendEvent('LOAD',obj);
					
					//change the song info for the playing item
					var new_info_html = '';
					var song_onclick = '';
					var song_link = '';
					var song_picture = '<img src="' + file.song_picture + '" alt="" height="60" width="60" />';
					
					//nakijken of er een onclick event moet zijn
					if(file.add_onclick == 1)
					{
						var song_title = file.song_title.substr(0, 6);
						
						song_onclick = ' onclick="mnm.mnmtheek.add(\'' + addslashes(file.song_title) + '\', \'' + addslashes(song_title) + '\', ' + file.song_id + ', \'song\', \'\', \'' + file.countername + '\'); return false;"';
						//artist_onclick = ' onclick="mnm.mnmtheek.add(\'' + file.song_artist + '\', \'' + file.song_artist + '\', \'' + file.song_id + '\', \'song\', \'\', \'' + file.countername + '\'); return false;';
						
						song_link = '<a href="/mnmtheek/song/' + file.song_id + '" title="' + file.song_title + '"' + song_onclick + '>' + file.song_title + '</a>';
						song_picture = '<a href="/mnmtheek/song/' + file.song_id + '" title="' + file.song_title + '"' + song_onclick + '>' + song_picture + '</a>';
					}
					else
					{
						song_link = file.song_title;
					}

					var artist_fullname = '';
					
					//bouw de artiestnaam op met alle links en featurings
					for(var item in file.featurings)
					{
						var song_artist = file.song_artist.substr(0, 6);
						
						var artist_onclick = ' onclick="mnm.mnmtheek.add(\'' + addslashes(file.song_artist) + '\', \'' + addslashes(song_artist) + '\', ' + file.featurings[item].artist_id + ', \'artist\', \'\', \'' + file.countername + '\'); return false;"';

						artist_fullname += '<a href="/mnmtheek/song/' + file.featurings[item].artist_id + '" title="' + HTMLentities(file.featurings[item].artist_name) + '"' + artist_onclick + '>' + HTMLentities(file.featurings[item].artist_name) + '</a>';
						
						if(file.featurings[item].featuring != '')
						{
							artist_fullname += file.featurings[item].featuring;
						}
					}

					new_info_html += '<div id="mediatheek-song-image">' + song_picture + '</div>';
					new_info_html += '<div id="mediatheek-song-info">';
					new_info_html += '	<div id="mediatheek-song-title">' + song_link + '</div>';
					new_info_html += '	<div id="mediatheek-song-artist">' + artist_fullname + '</div>';
					new_info_html += '</div>';
					
					//change the content of the song info
					$('#mediatheek-song-info-placeholder').html(new_info_html);
					
					$('#mediatheek-song-info-placeholder').attr('title', file.song_title);
					
					//add the onclick function for this song
					//var song_title = file.song_title.substr(0, 6);
					
					//verwijder het onclick event
					//$('#mediatheek-song-info-placeholder').unbind("click");
					
					//nakijken of er een onclick event moet zijn
					/*if(file.add_onclick == 1)
					{
						$('#mediatheek-song-info-placeholder').bind("click", function()
						{
							mnm.mnmtheek.add(song_title, file.song_id, 'song');
							mnm.taskbar.toggleTab(mnm.audioplayer);
						});
					}*/
					
					//mnm.taskbar.toggleTab(mnm.audioplayer);
				}
				else if(_state == this.STATE_COMPLETED)
				{
					_state = this.STATE_IDLE;
					
					this.song_number = 0;
					
					if (mnm.taskbar.isStateMaximized(this.tab.state))
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MAXIMIZED_IDLE;
					}
					else
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MINIMIZED_IDLE;
					}
					
					mnm.taskbar.event_onDeactivateTab(this);
				}
			}
		}
	};
	
	this.writePlayer = function()
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.writePlayer()');
		
		if (_initialized == false)
			{
			_initialising = true;
			
			var unique = new Date();
			unique = 'audioplayer'+unique.getTime();
			
			var so = new SWFObject('/frontend/themes/mnm/swf/jwplayer.swf', unique, 220, 18, '9', '');
			so.addVariable('autostart', 'true');
			so.addVariable('skin', '/frontend/themes/mnm/swf/jwmnmskin.swf');
			so.addVariable('playlist', 'none');
			so.addVariable('height', '18');
			so.addParam('allowfullscreen','false');
			so.addParam('allowscriptaccess','always');
			so.addParam('wmode', 'transparent');
			var written = so.write('audioplayer');
			
			if (written == false)
			{
				// TODO: Player NOT written
				alert('player not written');
			}
		}
	};
	
	this.event_onPlayNext = function()
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.event_onPlayNext()');
		
		var nextSong = this.getFirstSongInPlaylist();
		
		if (nextSong != null)
		{
			_state = this.STATE_COMPLETED;
			this.play();
		}
	};
	
	this.event_onPlayerReady = function(id, player)
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.event_onPlayerReady()');
		
		_initialising = false;
		_initialized = true;
		_player = player;
		
		_player.addModelListener('STATE','mnm.audioplayer.event_onPlayerChangedState');

		this.play();
	};
	
	/**
	 * De JWPlayer veranderde van state
	 * @param obj
	 */
	this.event_onPlayerChangedState = function(obj)
	{
		//mnm.console.trace('MNM_Taskbar_Audioplayer.event_onPlayerChangedState(newstate: '+obj.newstate+')');
		
		if (obj && obj.newstate)
		{
			switch (obj.newstate) 
			{
				// Fragment afgespeeld
				case 'COMPLETED':
					//_state = this.STATE_IDLE;
					_state = this.STATE_COMPLETED;
					
					// Wacht een seconde voor we naar het volgende nummer overschakelen in de playlist.
					setTimeout('mnm.audioplayer.play();', 1000);
				break;
				
				case 'IDLE':
					// Op 'stop' geklikt
					_state = this.STATE_IDLE;
					
					if (mnm.taskbar.isStateMaximized(this.tab.state))
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MAXIMIZED_IDLE;
					}
					else
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MINIMIZED_IDLE;
					}
				break;
				
				// Gestart met spelen
				case 'PLAYING':
					_state = this.STATE_PLAYING;
					
					if (mnm.taskbar.isStateMaximized(this.tab.state))
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MAXIMIZED_ACTIVE;
					}
					else
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MINIMIZED_ACTIVE;
					}
				break;
				
				// Gepauzeerd
				case 'PAUSED':
					_state = this.STATE_PAUSED;
					
					if (mnm.taskbar.isStateMaximized(this.tab.state))
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MAXIMIZED_ACTIVE;
					}
					else
					{
						this.tab.state = mnm.taskbar.TAB_STATE_MINIMIZED_ACTIVE;
					}
				break;
			}
		}
	};
}
mnm.audioplayer = new MNM_Taskbar_Audioplayer();
mnm.taskbar.addTab(mnm.audioplayer, {tabId:'button-audioplayer',contentId:'mediatheek',name:'audioplayer',type:mnm.taskbar.TAB_TYPE_TAB});

/**
 * Aansturen van de mnmtheek in de taskbar
 * @category MNM_Taskbar
 * @return MNM_Taskbar_MNMTheek
 */
function MNM_Taskbar_MNMTheek()
{
	this.tab = null; // Default-tab-settings
	this.name = 'mnmtheek';
	
	/**
	 * Custom acties indien deze tab geactiveerd werd. => Wordt opgeroepen als de taskbar getoond werd.
	 */
	this.event_onMaximizeTab = function()
	{
		//this.play();
	};
	
	this.event_onMinimizeTab = function()
	{

	};
	
	this.STATE_IDLE = 'IDLE';
	this.STATE_PLAYING = 'PLAYING';
	this.STATE_PAUSED = 'PAUSED';
	this.STATE_COMPLETED = 'COMPLETED';
	
	var _state = this.STATE_IDLE;
	var _initialized = false;
	var _initialising = false;
	var _player = null;
	
	var mnmtheek_content = new Array();
	
	/**
	 * Kijk na of een liedje/
	 * @param search_id
	 * @return
	 */
	this.tabExists = function(search_id)
	{
		var simpletab_id = null;
		
		for(i=0; i<mnmtheek_content.length; i++)
		{
			if(mnmtheek_content[i].item_id === search_id)
			{
				simpletab_id = mnmtheek_content[i].tab_id;
				
				return simpletab_id;
			}
		}
		   
		return simpletab_id;
	};
	
	/**
	 * Voeg een tab toe aan de mnmtheek
	 * @param string title
	 * @param string href
	 * @param string countername
	 */
	this.add = function(hover_title, title, id, type, href, countername)
	{
		if (countername && countername != null)
		{
			sitestat(nedstatURL + countername);
		}
		
		var tabs = $('.simpleTabs-tabs');
		var total_tabs = tabs.length;
		
		if(total_tabs < 6)
		{
			var thisTab = this.tabExists(id);
			
			if(thisTab != null)
			{
				this.event_onChangeContent(thisTab);
			}
			else
			{
				var nextTab = Math.ceil(10000*Math.random());
				
				// De tab toevoegen
				$("#simpleTabs-nav-list").append('<li id="simpleTabs-nav-' + nextTab + '" class="simpleTabs-tabs" title="' + hover_title + '"><div class="simpleTabs-title" onclick="mnm.mnmtheek.event_onClickTab(' + nextTab + ')">' + title + '</div><div id="simpleTabs-close-' + nextTab + '" class="close-tab-button" onclick="mnm.mnmtheek.event_onCloseTab(' + nextTab + ')">x</div></li>');
				
				this.event_onChangeContent(nextTab);
				
				if(type == 'artist') //de artiest info laden
				{
					this.load_artist_info(id, nextTab);
				}
				
				//de song info laden
				if(type == 'song') //de artiest info laden
				{
					this.load_song_info(id, nextTab);
				}
				
				var flash_object = '';
				flash_object += '<object width="130" height="20">';
				flash_object += '<param name="movie" value="/frontend/themes/mnm/swf/mnmtheekloading.swf">';
				flash_object += '<embed src="/frontend/themes/mnm/swf/mnmtheekloading.swf" width="130" height="20">';
				flash_object += '</embed>';
				flash_object += '</object>';
				
				// De content bij deze tab toevoegen
				$('#simpleTabs').append('<div id="simpleTabs-content-' + nextTab + '" class="simpleTabs-content"><div style="position: relative; height:247px; width: 554px; background-color: #faedef;"><div style="left: 215px; position: absolute; top: 110px;">' + flash_object + '</div></div></div>');
			
				mnmtheek_content[mnmtheek_content.length] = {item_id: id, tab_id: nextTab};
			}
			
			mnm.taskbar.event_onActivateTab(this);
		}
	};
	
	this.event_hideAll = function()
	{
		// Content verbergen
		$(".simpleTabs-content").hide();
	};
	
	this.event_onClickTab = function(id)
	{
		this.event_onChangeContent(id);
	};

	this.event_onChangeContent = function(numContent)
	{
		this.event_hideAll();
		
		//alle tabs deactiveren en de nieuwe acteif zetten en tonen
		$(".simpleTabs-nav li").removeClass("actif");
		$("#simpleTabs-nav-"+numContent).addClass("actif");
		//$("#simpleTabs-content-"+numContent).fadeIn("slow");
		$("#simpleTabs-content-"+numContent).show();
	};
	
	
	/******** LOAD ARTIST INFO ********/
	this.load_artist_info = function(id, nextTab)
	{
		var request = 
		{
			type: 'GET',
			url: '/mnmtheek/artist/'+id,
			data: {mode:'json'},
			success: this.event_onLoadArtistInfoSuccess,
			error: this.event_onLoadArtistInfoError,
			dataType: 'json',
			nextTab: nextTab
		};
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadArtistInfoSuccess = function(data, request)
	{
		mnm.mnmtheek.visualizeArtistInfo(data, request);
	};
	
	this.visualizeArtistInfo = function(data, request)
	{
		var nextTab = request.params.nextTab;
		var id = '#simpleTabs-content-' + nextTab;
		$(id).html(data.output);
		
		mnm.mnmtheek.addScrollPaneToImages(data.id);
		mnm.mnmtheek.addScrollPaneToBio(data.id);
		
		//setTimeout("mnm.mnmtheek.addScrollPaneToImages(" + data.id + ")", 10);
		//setTimeout("mnm.mnmtheek.addScrollPaneToBio(" + data.id + ")", 10);
	};
	
	this.event_onLoadArtistInfoError = function(object, message, request)
	{
		//alert("error");
	};
	

	/******** LOAD SONG INFO ********/
	this.load_song_info = function(id, nextTab)
	{
		var request = 
		{
			type: 'GET',
			url: '/mnmtheek/song/'+id,
			data: {mode:'json'},
			success: this.event_onLoadSongInfoSuccess,
			error: this.event_onLoadSongInfoError,
			dataType: 'json',
			nextTab: nextTab
		};
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadSongInfoSuccess = function(data, request)
	{
		mnm.mnmtheek.visualizeSongInfo(data, request);
	};
	
	this.visualizeSongInfo = function(data, request)
	{
		var nextTab = request.params.nextTab;
		var id = '#simpleTabs-content-' + nextTab;
		$(id).html(data.output);
		
		mnm.mnmtheek.addScrollPaneToImages(data.id);
		mnm.mnmtheek.addScrollPaneToBio(data.id);
		
		//setTimeout("mnm.mnmtheek.addScrollPaneToImages(" + data.id + ")", 500);
		//setTimeout("mnm.mnmtheek.addScrollPaneToBio(" + data.id + ")", 500);
	};
	
	this.event_onLoadSongInfoError = function(object, message, request)
	{
		//alert("error");
	};
	
	this.event_onCloseTab = function(id)
	{
		// Sluit een bepaalde tab
		$('#simpleTabs-nav-'+id).remove();
		
		var availableTabs = $('.simpleTabs-tabs');
		var tab_length = availableTabs.length;
		
		if(tab_length > 0)
		{
			//haal de id van de eerste tab op
			var tabId = availableTabs[tab_length-1].id;
			var tabId_array = tabId.split("-");
			var numContent = tabId_array[2];
			
			//maak de eerste tab actief
			this.event_onChangeContent(numContent);
			
			//de content van de te sluiten tab uit de code halen
			this.event_onDeleteContent(id);
			
			//verwijder het object uit de tabs array
			for(i=0; i<mnmtheek_content.length; i++)
			{
				if(mnmtheek_content[i].tab_id === id)
				{
					mnmtheek_content.splice(i, 1);
				}
			}
		}
		else
		{
			//de array met de tabs teruyg initialiseren
			mnmtheek_content = new Array();

			mnm.taskbar.toggleTab(mnm.mnmtheek);
			$('#simpleTabs-content-' + id).remove();
		}
		
		//alert("hier close");
	};
	
	this.addScrollPaneToImages = function(unique)
	{
		$("#mediatheek-mnm-images-" + unique).jScrollPane();
	};
	
	this.addScrollPaneToBio = function(unique)
	{
		$("#mediatheek-mnm-bio-" + unique).jScrollPane();
	};
	
	this.event_onDeleteContent = function(id)
	{
		$('#simpleTabs-content-'+id).remove();
	};
	
	this.event_onPaneReady = function(id, player)
	{
		
	};
}
mnm.mnmtheek = new MNM_Taskbar_MNMTheek();
mnm.taskbar.addTab(mnm.mnmtheek, {tabId:'button-mnmtheek',contentId:'mediatheek-mnm-placeholder',name:'mnmtheek',type:mnm.taskbar.TAB_TYPE_TAB});

/**
 * Ontvangt van JW-player het signaal dat de player klaar is om requests te ontvangen.
 * @param obj
 */
function playerReady(obj)
{
	//mnm.console.trace('playerReady');
	mnm.audioplayer.event_onPlayerReady(obj['id'], document.getElementById(obj['id']));
}

/**
 * Aansturen van de heartbeat in de taskbar
 * @category MNM_Taskbar
 * @return MNM_Taskbar_Heartbeat
 */
function MNM_Taskbar_Heartbeat()
{
	this.tab = null; // Default-tab-settings
	this.name = 'heartbeat';
	
	this.getTab = function()
	{
		return this.tab;
	};
	
	/**
	 * Custom acties indien deze tab geactiveerd werd. => Wordt opgeroepen als de taskbar getoond werd.
	 */
	this.event_onMaximizeTab = function()
	{
		//mnm.console.trace('MNM_Taskbar_Heartbeat.event_onMaximizeTab(_queueSize:'+_queueSize+')');
		
		if (_queueSize > 0)
		{
			_state = this.STATE_QUEUED;
			this.tab.state = mnm.taskbar.TAB_STATE_MAXIMIZED_ACTIVE;
			$('#pauze-bar-queue').html('+'+_queueSize);
			$('#'+this.tab.tabId).css('display', 'block');
			
		}
		else
		{
			_state = this.STATE_IDLE;
			mnm.taskbar.event_onDeactivateTab(this);
		}
	};
	
	/**
	 * Custom acties indien deze tab gedactiveerd werd. => Wordt opgeroepen als de taskbar verborgen werd. 
	 * @return
	 */
	this.event_onMinimizeTab = function()
	{
		//mnm.console.trace('MNM_Taskbar_Heartbeat.event_onMinimizeTab()');
		_state = this.STATE_IDLE;
		this.tab.state = mnm.taskbar.TAB_STATE_MINIMIZED_IDLE;
	};
	
	
	this.STATE_IDLE = 'state_idle'; // Geen items in de queue
	this.STATE_QUEUED = 'state_queued'; // Items in de queue die wachten om getoond te worden
	var _state = this.STATE_IDLE;
	
	var _queueSize = 0;
	
	/**
	 * Er was net een update van de Heartbeat en de flash is niet zichtbaar..
	 * @param int queueSize
	 */
	this.displayQueue = function(queueSize)
	{
		//mnm.console.trace('MNM_Taskbar_Heartbeat.displayQueue(queueSize:'+queueSize+')');
		
		_queueSize = queueSize;
		
		_state = this.STATE_QUEUED;
		mnm.taskbar.event_onActivateTab(this);
	};
	
	/**
	 * Wordt opgeroepen op het ogenblik dat er gescrolled wordt.
	 * @param boolean isFlashVisible
	 */
	this.event_onPageScroll = function(isFlashVisible)
	{
		//mnm.console.trace('MNM_Taskbar_Heartbeat.event_onPageScroll(isFlashVisible:'+isFlashVisible+')');
		
		if (_queueSize > 0 && isFlashVisible)
		{
			_state = this.STATE_IDLE;
			_queueSize = 0;
			mnm.heartbeat.visualizeQueue(true);
			
			$('#pauze-bar-queue').html('0');
			$('#'+this.tab.tabId).css('display', 'none');
			
			mnm.taskbar.event_onDeactivateTab(this);
		}
		else if (_queueSize > 0)
		{
			_state = this.STATE_QUEUED;
		}
	};
	
	/**
	 * De queue wordt leeggemaakt als de heartbeat op STATE_IDLE komt te staan.
	 * @return
	 */
	this.event_onEmptyQueue = function()
	{
		//mnm.console.trace('MNM_Taskbar_Heartbeat.event_onEmptyQueue()');
		
		_state = this.STATE_IDLE;
		_queueSize = 0;
		$('#pauze-bar-queue').html('0');
		$('#'+this.tab.tabId).css('display', 'none');
		
		mnm.heartbeat.queue = new Queue();
		
		mnm.taskbar.event_onDeactivateTab(this);
	};
	
	/**
	 * Wanneer we klikken op de teller van de HB, scroll naar boven en toon de nieuwe berichten.
	 * @return
	 */
	this.event_onClickCounter = function()
	{
		//mnm.console.trace('MNM_Taskbar_Heartbeat.event_onPageScroll(isFlashVisible:'+isFlashVisible+')');
		mnm.pagescroll.event_onScrollToTop();
	};
}
mnm.tb_heartbeat = new MNM_Taskbar_Heartbeat();
mnm.taskbar.addTab(mnm.tb_heartbeat, {tabId:'pauze-bar-queue',contentId:null,name:'heartbeat',type:mnm.taskbar.TAB_TYPE_CUSTOMTAB});


/**
 * HeartBeat functionaliteit
 * @category MNM
 * @return MNM_HeartBeat
 */
function MNM_HeartBeat()
{	
	this.STATE_IDLE = 'state_idle';
	this.STATE_ACTIVE = 'state_active';
	
	var _state = this.STATE_IDLE;
	this.queue = new Queue();
	var timerId = null;
	var isUpdating = false;
	
	var archiveIsEnabled = false;
	var isLoadingArchive = false;
	
	this.jsonHeartbeatIds = null; // Bevat de ingeladen nid's van de heartbeat
	
	this.setState = function(state)
	{	
		//mnm.console.trace('MNM_HeartBeat.setState(state:'+state+')');
		
		switch (state)
		{
			case this.STATE_ACTIVE:
				_state = state;
			break;
			
			case this.STATE_IDLE:
			default:
				// TODO: QUEUE legen + TASKBAR
				_state = this.STATE_IDLE;
			break;
		}
	};
	
	this.startTimer = function()
	{
		//mnm.console.trace('MNM_HeartBeat.startTimer()');
		
		if (timerId == null)
		{
			timerId = setTimeout('mnm.heartbeat.startAutoUpdate();', mnm.config.heartbeat.timeoutInterval);
		}
	};
	
	this.startAutoUpdate = function()
	{
		//mnm.console.trace('MNM_HeartBeat.startAutoUpdate()');
		
		if (timerId != null)
		{
			clearTimeout(timerId);
		}
		timerId = null;
		
		this.autoUpdate();
	};
	
	/**
	 * AutoUpdate de HB
	 */
	this.autoUpdate = function()
	{
		//mnm.console.trace('MNM_HeartBeat.autoUpdate()');
		
		if (_state == this.STATE_ACTIVE && timerId == null && isUpdating == false)
		{
			isUpdating = true;
			
			//sitestat(nedstatURL + 'homepage.herladen');
			
			var request = 
			{
				type: 'GET',
				url: '/',
				data: {mode:'json'},
				success: mnm.heartbeat.event_onAutoUpdateSuccess,
				error: mnm.heartbeat.event_onAutoUpdateError,
				dataType: 'json'
			};
			mnm.requests.doRequest(request);
		}
		else
		{
			this.startTimer();
		}
	};
	
	this.event_onAutoUpdateSuccess = function(data, request)
	{
		//mnm.console.trace('MNM_HeartBeat.event_onAutoUpdateSuccess()');
		
		try
		{
			mnm.heartbeat.handleAutoUpdate(data);
		}
		catch(e)
		{
			//mnm.console.trace('MNM_HeartBeat.event_onAutoUpdateSuccess() -- error');
			//mnm.console.trace(e);
		}
		finally
		{
			mnm.heartbeat.startTimer();
			isUpdating = false;
		}
	};
	
	this.event_onAutoUpdateError = function(object, message, request)
	{
		//mnm.console.trace('mnm.heartbeat.event_onAutoUpdateError('+message+')');
		
		mnm.heartbeat.startTimer();
		isUpdating = false;
	};
	
	this.handleAutoUpdate = function(data)
	{	
		//mnm.console.trace('MNM_HeartBeat.handleAutoUpdate()');
		
		// Nieuwe Queue-instance
		this.queue = new Queue();
		
		if (_state == this.STATE_ACTIVE)
		{	
			// Instellen van de 50 meest recente nid's
			this.jsonHeartbeatIds = new Object();
			
			// Vorige nid-id (zodat we de nieuwe items op de juiste plaats kunnen zetten)
			var previousNid = null;
			var previousPublished = null;
			
			// Overloop de items...
			for(var i=0; i<data.length; i++)
			{
				var nid = data[i].nid;
				var published = data[i].published;
				
				this.jsonHeartbeatIds['nid'+nid+'-'+published] = true;
				
				var commentCount = data[i].comment_count;
				var hb_li_id = 'hb-li-'+nid;
				var hb_item = $('#heartbeat li.'+hb_li_id);
				
				// Als het item bestaat, haal dan de timestamp op om te zien of dit item geherpubliceerd werd
				var republished = false;
				if (hb_item.length > 0)
				{
					if (!alreadyInList(nid, published, $('.hb-li-timestamp-'+nid)))
					{
						republished = true;
					}
				}
				
				// Het item is nieuw of werd geherpubliceerd
				if (hb_item.length == 0 || republished == true)
				{	
					data[i].previousNid = previousNid;
					data[i].previousPublished = previousPublished;
					this.queue.enqueue(data[i]);
				}
				else
				{
					// Het item bestaat al. -- update de comments-count
					if(commentCount>0)
					{
						var commentCountWrapper = $('#heartbeat li.'+hb_li_id+' .comment-count');
						if (commentCountWrapper.length==1)
						{
							commentCountWrapper.text(commentCount);
						}
					}
				}
				
				previousNid = nid;
				previousPublished = published;
			}
			
			//overloop de queue met nieuwe heartbeat items en ga de output ophalen via een ajax call
			new_items_size = this.queue.getSize();
			
			if(new_items_size > 0)
			{
				this.getItemTeasers();
			}
			else
			{
				mnm.heartbeat.finish_autoupdate();
			}
		}
	};
	
	/**
	 * Staat de node (met specifieke publishdate) al op het scherm?
	 * @param int nid
	 * @param int requested (gevraagde timestamp)
	 * @param array list
	 * @return boolean
	 */
	var alreadyInList = function(nid, requested, list)
	{
		//mnm.console.trace('MNM_HeartBeat.alreadyInList(nid:'+nid+',requested:'+requested+')');
		
		for(var i=0; i<list.length; i++)
		{
			var item = list[i];
			var timestamp = $(item).val()*1;
			if (timestamp == requested)
			{
				return true;
			}
		}
		return false;
	};
	
	/**
	 * Toevoegen van de nieuwe Heartbeat items (+ verwijderen van de bestaande id's)
	 * @param withEffects
	 * @return
	 */
	this.visualizeQueue = function(withEffects)
	{
		//mnm.console.trace('MNM_HeartBeat.visualizeQueue(withEffects:'+withEffects+')');
		
		// Bij pech kan this.jsonHeartbeatIds leeggemaakt worden.
		try
		{
			if (_state == this.STATE_ACTIVE)
			{
				var deletedItems = new Array();
				
				// Verwijder niet-bestaande items uit de lijst
				var currentItems = $('#heartbeat div.hb-content');
				for(var i=0; i<currentItems.length; i++) // TODO: < X-aantal geladen items!
				{
					var nid = this.parseHeartbeatId($(currentItems[i]).attr('id'));
					var published = this.parseHeartbeatContentPublished($(currentItems[i]).attr('id'));
					if (this.jsonHeartbeatIds['nid'+nid+'-'+published] == undefined)
					{
						var contentNid = $(currentItems[i]);
						contentNid = contentNid[0];
						
						// Indien het archief aanstaat, bewaar de nodes voorlopig.
						if (archiveIsEnabled == true)
						{
							deletedItems.push({index:i,node:$(contentNid.parentNode).clone(true),nid:nid,published:published});
							$(contentNid.parentNode).remove();
						}
						$(contentNid.parentNode).remove();
					}
				}
				this.jsonHeartbeatIds = null;
				
				// TODO: iets doen met de verwijderde items
				
				while(this.queue.getSize() > 0)
				{
					var hb_item = this.queue.dequeue();
					var reloadURL = null;
					
					// Staat dit al in de lijst? 
					var contentDiv = '#hb-content-'+hb_item.nid+'-'+hb_item.published;
					var contentParentDiv = $(contentDiv);
					
					if (contentParentDiv.length > 0)
					{
						contentParentDiv = contentParentDiv[0].parentNode;
					}
					else
					{
						contentParentDiv = null;
					}
					
					var exists = $(contentDiv);
					if (exists.length > 0)
					{
						// Dit staat al in de lijst. Verwijder het item (indien het opengeklapt was, laadt de inhoud opnieuw in)
						var state = $(contentDiv+' .hb-li-state-'+hb_item.nid).val();
						if (state == 'open')
						{
							reloadURL = $(contentDiv+' a.button-show-more-'+hb_item.nid).attr('href');
							if (reloadURL == undefined)
							{
								reloadURL = null;
							}
						}
						$(contentParentDiv).remove();
					}
					
					// Heeft het item een previous-nid meegekregen? Voeg het dan toe na deze node
					if (hb_item.previousNid != null)
					{
						var previousContentDiv = '#hb-content-'+hb_item.previousNid+'-'+hb_item.previousPublished;
						var previousParentDiv = $(previousContentDiv);
						if (previousParentDiv.length > 0)
						{
							$(previousParentDiv[0].parentNode).after(hb_item.output);
						}
					}
					else
					{
						$('#heartbeat').prepend(hb_item.output);
					}
					
					// Voeg effects toe
					if (withEffects)
					{
						contentParentDiv = $(contentDiv);
						if (contentParentDiv.length > 0)
						{
							contentParentDiv = contentParentDiv[0].parentNode;
							var item = $(contentParentDiv);
							item.css('display', 'none');
							item.fadeIn('slow');
						}
					}
					
					if (reloadURL != null)
					{
						mnm.heartbeat.getContent(reloadURL, hb_item.nid, hb_item.published);
					}
				}
				
				// Verwijder de laatste berichten
				$('#heartbeat li.hb-li:gt('+(mnm.config.heartbeat.itemCount-1)+')').fadeOut("slow", function(){$(this).remove();});
				
				// Er kan maar 1 item 'now-playing' zijn.
				$('#heartbeat li.hb-li.now-playing').removeClass('now-playing');
				
				// Is er geen now-playing geselecteerd? Selecteer de eerste!
				nowPlaying = $('#heartbeat .playlist:eq(0)');
				nowPlaying = nowPlaying[0];
				$(nowPlaying).addClass('now-playing');
					
				// Enkele globale acties die nodig zijn na het inladen van content
				mnm.helpers.event_onLoadContent();
			}
		}
		catch(e){}
	};
	
	/**
	 * Geef de nid terug van het heartbeat-item
	 * @param string id
	 * @return int
	 */
	this.parseHeartbeatId = function(id)
	{
		var idArray = id.split('-');
		var nid = idArray[2]*1;
		return nid;
	};
	
	/**
	 * Geeft published terug van het heartbeat-content-item
	 * @param contentId
	 * @return int
	 */
	this.parseHeartbeatContentPublished = function(contentId)
	{
		var idArray = contentId.split('-');
		var published = idArray[3]*1;
		return published;
	};
	
	/**
	 * Wordt opgeroepen als de home opnieuw ingeladen werd
	 */
	this.event_onReloaded = function()
	{
		//mnm.console.trace('mnm.heartbeat.event_onReloaded()');
		
		archiveIsEnabled = false;
		isLoadingArchive = false;
		
		this.setState(this.STATE_ACTIVE);
	};
	
	/**
	 * Wordt opgeroepen als de filter start met het inladen van de history
	 */
	this.event_onStartLoadHistory = function()
	{
		//mnm.console.trace('mnm.heartbeat.event_onStartLoadHistory()');
		
		isLoadingArchive = true;
		archiveIsEnabled = true;
	};
	
	/**
	 * Wordt opgeroepen als de filter met een archief ingeladen werd
	 */
	this.event_onLoadHistory = function()
	{
		//mnm.console.trace('mnm.heartbeat.event_onLoadHistory()');
		
		archiveIsEnabled = true;
		isLoadingArchive = false;
		
		this.setState(this.STATE_ACTIVE);
	};
	
	/**
	 * Inladen van een bericht
	 * @param string url
	 * @param int nid
	 * @param int published
	 */
	this.getContent = function(url, nid, published)
	{
		//mnm.console.trace('MNM_HeartBeat.getContent(url:'+url+', nid:'+nid+', published:'+published+')');
		
		var request = 
		{
			type: 'GET',
			url: url,
			data: {mode:'json'},
			success: mnm.heartbeat.event_onGetContentSuccess,
			error: mnm.heartbeat.event_onGetContentError,
			nid: nid,
			published: published,
			dataType: 'json'
		};
		mnm.requests.doRequest(request);
	};
	this.event_onGetContentSuccess = function(data, request)
	{
		//mnm.console.trace('MNM_HeartBeat.event_onGetContentSuccess()');
		
		sitestat(nedstatURL + data.nedstat);
		
		var divId = '#hb-content-'+request.params.nid+'-'+request.params.published;
		var content = $(divId+' .loaded-content').html(data.output);
		mnmComments.show(request.params.nid, request.params.published, data.comments, false);
		mnm.heartbeat.showMore(request.params.nid, request.params.published);
		
		mnm.helpers.event_onLoadContent();
		
		//vervang de title van deze pagina
		//mnm.heartbeat.changePageTitle(data.title);
	};
	this.event_onGetContentError = function(object, message, request)
	{
		//mnm.console.trace('MNM_HeartBeat.event_onLoginError('+message+')');
	};
	
	this.showMore = function(id, published)
	{
		//toevoeging van metriwebtag bij showMore (Bug #3239)
		metriwebTag("mnm", "MNM/OTHER/"+id, "nl");
		
		var contentId = '#hb-content-'+id+'-'+published;
		$(contentId + ' div.teaser-content').each( 
			function()
			{
				$(this).css('display', 'none');
			}
		);

		$(contentId + ' div.loaded-content').each( 
			function()
			{
				$(this).css('display', 'none');
				$(this).fadeIn('slow');
			}
		);
		
		$(contentId + ' div.comments .animation').each( 
			function()
			{
				$(this).slideDown('slow');
			}
		);
		
		$('#hb-content-'+id+'-'+published+' .hb-li-state-'+id).val('open');
		
		$(contentId+' a.button-show-less-' + id).css('display', 'block');
		$(contentId+' a.button-show-more-'+ id).css('display', 'none');
	};
	
	this.showLess = function(id, published)
	{	
		var contentId = '#hb-content-'+id+'-'+published;
		
		$(contentId+' div.mnm_node_media_placeholder').slideUp('medium');
		$(contentId+' div.article-buttons-placeholder').slideUp('fast');
		$(contentId+' div.facebook-share-article-div').fadeOut('fast');
		
		$(contentId+' div.loaded-content').slideUp(
			'slow', 
			function()
			{
				$(contentId+' div.teaser-content').each
				( 
					function()
					{
						$(this).fadeIn('fast');
					}
				);
			}
		);
		
		$(contentId + ' div.comments .animation').each( 
			function()
			{
				$(this).slideUp('slow', function()
					{
						$(contentId+' a.button-show-more-' + id).css('display', 'block');
						
						// Legen van de inhoud
						$(contentId+' .loaded-content').html('');
						$(contentId+' .comments-wrapper').html('');
					}
				);
			}
		);
		
		$(contentId+' a.button-show-less-' + id).css('display', 'none');
		$('#hb-content-'+id+'-'+published+' .hb-li-state-'+id).val('closed');
	};
	
	this.changePageTitle = function(title)
	{
		document.title = 'MNM - ' + title;
	};
	
	/**
	 * Haal de inhoud van de teasers van de items in de heartbeat queue op
	 * @return
	 */
	this.getItemTeasers = function()
	{
		//mnm.console.trace('MNM_HeartBeat.getTeaserContent(nid:'+nid+')');
		
		//var new_items = '';
		var data = new Object();
		
		var hb_queue = this.queue.getQueue();
		hb_queue_length = hb_queue.length;
		
		data.mode='json';
		data.type='update_hb_items';
		
		for(var i=0; i<hb_queue_length;i++)
		{
			data['item-'+i+'-nid'] = hb_queue[i].nid;
			data['item-'+i+'-published'] = hb_queue[i].published;
		}
		
		data['item-size'] = hb_queue_length;

		var request = 
		{
			type: 'GET',
			url: "/update_hb_items",
			data: data,
			success: mnm.heartbeat.event_onGetItemTeasersSuccess,
			error: mnm.heartbeat.event_onGetItemTeasersError,
			dataType: 'json'
		};
		
		mnm.requests.doRequest(request);
		
	};
	
	this.event_onGetItemTeasersSuccess = function(data, request)
	{
		//var hb_queue = this.queue.getQueue();
		var new_items_size = mnm.heartbeat.queue.getSize();
		
		//overloop de queue en voeg de output toe aan de items
		for(var i = 0; i < new_items_size; i++)
		{
			var hb_item = mnm.heartbeat.queue.dequeue();
			
			for(var j = 0; j < data.length; j++)
			{
				if(hb_item.nid == data[j].nid)
				{
					hb_item.output = data[j].output;
				}
			}
			
			mnm.heartbeat.queue.enqueue(hb_item);
		}
		
		mnm.heartbeat.finish_autoupdate();
	};
	
	this.finish_autoupdate = function()
	{
		// Mogen we direct op het scherm?
		var isFlashVisible = mnm.pagescroll.isFlashVisible();
		if (isFlashVisible)
		{
			this.visualizeQueue(true);
		}
		else
		{
			mnm.tb_heartbeat.displayQueue(this.queue.getSize());
		}
	};
}
mnm.heartbeat = new MNM_HeartBeat();

/**
 * Toon gefilterde inhoud in de heartbeat
 * @category MNM
 * @return MNM_Filter
 */
function MNM_Filter()
{
	// Types
	this.HOME = 'home';
	this.MUSIC_SEARCH= 'music_search';
	this.SEARCH = 'search';
	this.TAGS = 'tags';
	this.MUSIC_TAGS = 'music_tags';
	this.CAMPAIGNS = 'campaigns';

	this.MEDIA_PHOTO = 'media_photo';
	this.MEDIA_VIDEO = 'media_video';
	this.MEDIA_AUDIO = 'media_audio';
	
	// Object bevat de laatste request
	this.lastFilter = null;
	
	/**
	 * Pas een filter toe
	 * @param string filter
	 * @param object params
	 */
	this.load = function(filter, params)
	{
		//mnm.console.trace('MNM_Filter.load(filter:'+filter+')');
		
		// Disable alle ajax-requests
		mnm.requests.event_onCancelAll();
		
		// Disable de heartbeat (altijd!)
		mnm.heartbeat.setState(mnm.heartbeat.STATE_IDLE);
		
		// Maak altijd de heartbeat leeg
		mnm.tb_heartbeat.event_onEmptyQueue();
		
		// Verwijder de inhoud van de shows.
		mnm.shows.event_clearAll();
		
		this.isLoad = true;
		this.isLoadHistory = false;
		
		// Verberg de 'meer'-linken
		$('#older-block-heartbeat').fadeOut('slow');//('display', 'none');
		$('#older-block-filter').fadeOut('slow'); //('display', 'none');
		
		var data = null;
		var dataType = 'html';
		
		switch (filter)
		{
			case this.HOME:
				data = {mode:'content'};
				sitestat(nedstatURL + 'homepage');
				mnm.shows.loadShowsNav();
			break;
			
			case this.MUSIC_SEARCH:
				
				// Alle parameters ophalen uit het formulier
				var zoekterm = $('#zoekterm-textbox').val();
				var zoekdatum = $('#datum-textbox').val();
				var van_uur = $('#van-uur-select').val();
				var tot_uur = $('#tot-uur-select').val();
					
				//als het uur is ingevuld moet ook de datum gekozen zijn
				if(van_uur != '' || tot_uur != '')
				{
					van_uur = van_uur*1;
					tot_uur = tot_uur*1;
					
					//wissel van en tot uur indien van grote is dan tot
					if(van_uur > tot_uur)
					{	
						$('#van-uur-select').val(tot_uur);
						$('#tot-uur-select').val(van_uur);
						
						//waarden opnieuw ophalen
						van_uur = $('#van-uur-select').val();
						tot_uur = $('#tot-uur-select').val();
					}
					
					if(zoekdatum == '')
					{
						alert('Je hebt een uurblok gekozen maar geen datum.');
						return false;
					}
				}
				
				data = {mode:'json', song:zoekterm, date:zoekdatum, fromHour:van_uur, tillHour:tot_uur};
				dataType = 'json';
			break;
			
			case this.SEARCH:
				var zoekterm = $('#search_textbox').val();
				data = {mode:'json', searchstring:zoekterm};
				dataType = 'json';
			break;
			
			case this.TAGS:
				data = {mode:'json'};
				dataType = 'json';
			break;
			
			case this.MUSIC_TAGS:
				data = {mode:'json'};
				dataType = 'json';
			break;
			
			case this.CAMPAIGNS:
				data = {mode:'json'};
				dataType = 'json';
			break;
			
			default:
				data = {mode:'content'};
			break;
		}
		
		var request = 
		{
			type: 'GET',
			url: params.fileURL,
			data: data,
			success: mnm.filter.event_onLoadSuccess,
			error: mnm.filter.event_onLoadError,
			dataType: dataType,
			filter: filter,
			params: params
		};
		
		// Opslaan van de laatste request
		this.lastFilter = {params:params,filter:filter,data:data,url:request.url,request:request};
		
		mnm.requests.doRequest(request);
	};
	
	/**
	 * Bij het falen van een load-request, voer deze functie uit
	 */
	this.failedLoad = function()
	{
		mnm.console.trace('MNM_Filter.failedLoad()');
		
		this.load(this.lastFilter.filter, this.lastFilter.params);
	};
	
	
	/**
	 * Als het ophalen van de gefilterde items gelukt is dan worden ze getoond
	 * @param data
	 * @param request
	 */
	this.event_onLoadSuccess = function(data, request)
	{
		//mnm.console.trace('MNM_Filter.event_onLoadSuccess()');
		
		mnm.filter.errorTimes = 0;
		
		// Toon het resultaat
		mnm.filter.visualize(data, request);
	};
	
	/**
	 * Bij het ophalen van de gefiltrde items trad een fout op...
	 * @param object
	 * @param message
	 * @param request
	 */
	this.errorTimes = 0;
	this.isLoad = false;
	this.isLoadHistory = false;
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('MNM_Filter.event_onLoadError('+message+')');
		
		if (message != 'Request aborted')
		{
			mnm.filter.errorTimes++;
			
			if (mnm.filter.errorTimes > 3)
			{
				alert('Er trad een fout op bij het inladen van de gevraagde pagina. Probeer het (later) nog eens.');
				mnm.filter.errorTimes = 0;
			}
			else
			{
				// Herstart het inladen!
				if (mnm.filter.isLoadHistory)
				{
					mnm.filter.loadMore(null, null);
				}
				else
				{
					mnm.filter.failedLoad();
				}
			}
		}
	};
	
	this.visualize = function(data, request)
	{
		//mnm.console.trace('MNM_Filter.visualize()');
		
		if (request.params.filter == this.SEARCH)
		{
			sitestat(nedstatURL + 'zoek.resultaten&amp;ns_search_term=' + data.nedstat.searchterm + '&amp;ns_search_result=' + data.nedstat.results);
			
			//de data ophalen
			data = data.content;	
		}
		
		if (request.params.filter == this.MUSIC_SEARCH)
		{			
			sitestat(nedstatURL + 'muziek.zoek.resultaten&amp;ns_search_term=' + data.nedstat.musicsearch + '&amp;ns_search_result=' + data.nedstat.results);
			//de data ophalen
			data = data.content;	
		}
		
		if (request.params.filter == this.TAGS)
		{
			//de data ophalen
			data = data.content;
		}
		
		if (request.params.filter == this.MUSIC_TAGS)
		{
			//de data ophalen
			data = data.content;
		}
		
		if (request.params.filter == this.CAMPAIGNS)
		{
			//de data ophalen
			data = data.content;
		}
		
		var params = request.params.params;
		
		// Tel het aantal items in de heartbeat(-history)
		var heartbeatCount = $('#heartbeat li.hb-li').length;
		var historyCount = $('#heartbeat-history li.hb-li').length;
		
		// Er werd een timestamp meegegeven!
		if (params.timestamp)
		{
			if (request.params.filter == this.HOME)
			{
				// Append de data
				$('#heartbeat-history').append(data);
				
				// Mogen we de 'meer'-knop tonen?
				if (this.isShowMore(params) && Math.abs($('#heartbeat-history li.hb-li').length - historyCount) == mnm.config.heartbeat.itemCount)
				{
					var lastTimestamp = mnm.heartbeat.parseHeartbeatContentPublished($('#heartbeat-history li.hb-li:last .hb-content').attr('id'));
					
					this.removeShowMore(true);
					this.addShowMore(true, lastTimestamp, null);
					
					$('#older-block-heartbeat').css('display', 'block');
				}
				
				// Er werd informatie aan de heartbeat-history toegevoegd
				mnm.heartbeat.event_onLoadHistory();
			}
			else
			{
				$('#heartbeat-history').html('');
				
				// Append de data
				$('#heartbeat').append(data);
				
				// Mogen we de 'meer'-knop tonen?
				if (this.isShowMore(params) && Math.abs($('#heartbeat li.hb-li').length - heartbeatCount) == mnm.config.heartbeat.itemCount)
				{
					var lastTimestamp = mnm.heartbeat.parseHeartbeatContentPublished($('#heartbeat li.hb-li:last .hb-content').attr('id'));
					
					this.removeShowMore(false);
					this.addShowMore(false, lastTimestamp, params.fileURL);
					
					$('#older-block-filter').css('display', 'block');
				}
			}
		}
		// Er werd geen timestamp meegegeven
		else
		{
			$('#heartbeat-history').html('');
			
			if (request.params.filter == this.HOME)
			{
				// Place de data
				$('#heartbeat').html(data);
				
				// Mogen we de 'meer'-knop tonen?
				if (this.isShowMore(params) && $('#heartbeat li.hb-li').length == mnm.config.heartbeat.itemCount)
				{
					var lastTimestamp = mnm.heartbeat.parseHeartbeatContentPublished($('#heartbeat li.hb-li:last .hb-content').attr('id'));
					
					this.removeShowMore(true);
					this.addShowMore(true, lastTimestamp, null);
					
					$('#older-block-heartbeat').css('display', 'block');
				}
				
				// De heartbeat werd her-ingeladen
				mnm.heartbeat.event_onReloaded();
				// Er werd geen timestamp meegegeven. Dus wellicht niet automatisch
				// toevoeging van metriwebtag bij het ophalen van nieuwe content via het menu (Bug #3239)
				// taggen op homepage
				metriwebTag ("mnm-hp", "MNM/00HP", "nl");
			}
			else
			{
				// Place de data
				$('#heartbeat').html(data);
				
				// Mogen we de 'meer'-knop tonen?
				if (this.isShowMore(params) && $('#heartbeat li.hb-li').length == mnm.config.heartbeat.itemCount)
				{
					var lastTimestamp = mnm.heartbeat.parseHeartbeatContentPublished($('#heartbeat li.hb-li:last .hb-content').attr('id'));
					
					this.removeShowMore(false);
					this.addShowMore(false, lastTimestamp, params.fileURL);
					
					$('#older-block-filter').css('display', 'block');
				}
				// Er werd geen timestamp meegegeven. Dus wellicht niet automatisch
				// toevoeging van metriwebtag bij het ophalen van nieuwe content via het menu (Bug #3239)
				// taggen op OTHER zone
				metriwebTag ("mnm", "MNM/OTHER", "nl");
			}
		}
		
		// Nodige globale acties na het visualiseren van inhoud
		mnm.helpers.event_onLoadContent();
	};
	
	/**
	 * Werd er een parameter -showMore- meegegeven?
	 * @param object params
	 */
	this.isShowMore = function(params)
	{
		//mnm.console.trace('MNM_Filter.isShowMore()');
		if (params.showMore == undefined || params.showMore == null || params.showMore == false )
		{
			return false;
		}
		return true;
	};
	
	/**
	 * Voeg de toon-meer-oudere-link toe
	 * @param boolean isHome
	 * @param int timestamp
	 * @param null|string fileURL
	 */
	this.addShowMore = function(isHome, timestamp, fileURL)
	{
		//mnm.console.trace('MNM_Filter.addShowMore(isHome:'+isHome+',timestamp:'+timestamp+',fileURL:'+fileURL+')');
		
		var showMoreLink = '<a onclick="';
		if (isHome)
		{
			showMoreLink += 'mnm.filter.loadMore(\'/\', '+timestamp+'); return false;" href="/?timestamp=' + timestamp + '">'+mnm.config.heartbeat.moreText+'</a>';
			$('#older-block-heartbeat div:eq(0)').after(showMoreLink);
		}
		else
		{
			var href = fileURL;
			if (href.indexOf('?') == -1)
			{
				href += '?timestamp='+timestamp;
			}
			else
			{
				href += '&amp;timestamp='+timestamp;
			}
			showMoreLink += 'mnm.filter.loadMore(null,'+timestamp+'); return false;" href="'+href+'">'+mnm.config.filter.moreText+'</a>';
			$('#older-block-filter div:eq(0)').after(showMoreLink);
		}
	};
	
	this.removeShowMore = function(isHome)
	{
		//mnm.console.trace('MNM_Filter.removeShowMore(isHome:'+isHome+')');
		
		if (isHome)
		{
			$('#older-block-heartbeat a').remove();
		}
		else
		{
			$('#older-block-filter a').remove();
		}
	};
	
	/**
	 * Haal de volgende 50 items op
	 * @param int fromTimestamp
	 */
	this.loadMore = function(fileURL, fromTimestamp)
	{
		//mnm.console.trace('MNM_Filter.loadMore(fileURL:'+fileURL+',fromTimestamp:'+fromTimestamp+')');
		
		// Disable alle ajax-requests
		mnm.requests.event_onCancelAll();
		
		// Disable de heartbeat (altijd!)
		mnm.heartbeat.setState(mnm.heartbeat.STATE_IDLE);
		
		this.isLoad = false;
		this.isLoadHistory = true;
		
		// Verberg de 'meer'-linken
		$('#older-block-heartbeat').css('display', 'none');
		$('#older-block-filter').css('display', 'none');
		
		var params = null;
		var data = null;
		var filter = null;
		if (fileURL == null && this.lastFilter != null)
		{
			data = this.lastFilter.data;
			data.timestamp = fromTimestamp;
			params = this.lastFilter.params;
			params.timestamp = fromTimestamp;
			filter = this.lastFilter.filter;
		}
		else
		{
			data = {mode:'content'};
			params = new Object();
			
			data.timestamp = fromTimestamp;
			params.timestamp = fromTimestamp;
			params.fileURL = fileURL;
			params.showMore = true; // Default voor rechtstreekse loadMore-calls, omdat een artikel geen show-more knop heeft.
			filter = null;
			
			// Heartbeat!
			if (fileURL == '/')
			{
				filter = this.HOME;
			}
		}
		
		// Nedstat tagging voor load more en sommige types
		switch(filter)
		{
			case this.HOME:
				if (fileURL != '/')
				{
					sitestat(nedstatURL + 'homepage');
				}
				else 
				{
					sitestat(nedstatURL + 'homepage.meer');
				}
			break;
			
			case this.MEDIA_AUDIO:
				sitestat(nedstatURL + 'media.audio.meer');
			break;
			case this.MEDIA_PHOTO:
				sitestat(nedstatURL + 'media.foto.meer');
			break;
			case this.MEDIA_VIDEO:
				sitestat(nedstatURL + 'media.video.meer');
			break;
		}
		
		var dataTypeLastFilter = null;
		if (this.lastFilter)
		{
			dataTypeLastFilter = this.lastFilter.request.dataType;
		}
		
		var request = 
		{
			type: 'GET',
			url: params.fileURL,
			data: data,
			success: mnm.filter.event_onLoadSuccess,
			error: mnm.filter.event_onLoadError,
			dataType: dataTypeLastFilter,
			filter: filter,
			params: params
		};
		
		// Opslaan van de laatste request
		this.lastFilter = {params:params,filter:filter,data:data,url:request.url, request:request};
		
		// Is dit de heartbeat?
		if (filter == this.HOME)
		{
			mnm.heartbeat.event_onStartLoadHistory();
		}
		else
		{
			// Maak zeker de heartbeat leeg
			mnm.tb_heartbeat.event_onEmptyQueue();
		}
		
		mnm.requests.doRequest(request);
	};
}
mnm.filter = new MNM_Filter();

var first_load = true;
/**
 * Alle hoofdmenu/submenu functionaliteit
 * @category MNM
 * @return MNM_Menu
 */
function MNM_Menu()
{
	var activeMenu = null;
	var activeSubmenu = null;
	
	var menuArrow = '<div class="left-menu-active">'+
					'	<img src="/frontend/themes/mnm/images/menu_li.jpg" alt="pijltje" width="12" height="18" class="left-menu-active-image" />'+
					'</div>';
	var submenuArrow = 	'<div class="submenu-array">'+
						'	<img height="17" width="11" style="position: absolute; right: -11px; top: -19px;" alt="pijltje" src="/frontend/themes/mnm/images/li.jpg"/>'+
						'</div>';
	
	this.MENU_HOME = 'menu_home';
	this.MENU_MUSIC = 'menu_music';
	this.MENU_DJ = 'menu_dj';
	this.MENU_RECORDED = 'menu_recorded'; // Herbeluister
	this.MENU_CAMPAIGNS = 'menu_campaigns';
	this.MENU_HELPUS = 'menu_helpus'; // Gezocht
	this.MENU_BIGPARTY = 'menu_bigparty';
	this.MENU_MEDIA = 'menu_media';
	this.MENU_VERKEER = 'menu_verkeer';
	this.MENU_90ID = 'menu_90id';
	this.MENU_90LIJST = 'menu_90lijst';
	this.MENU_WEBSHOP = 'menu_webshop';
	this.MENU_MADONNAKUS = 'menu_madonnakus';
	this.MENU_MADONNA = 'menu_madonna';
	this.MENU_SHOWS = 'menu_shows';
	
	/**
	 * Er werd geklikt op een menu
	 * @param string menu
	 */
	this.event_onClick = function(menu, submenu)
	{
		//mnm.console.trace('MNM_Menu.event_onClick(menu:'+menu+',submenu:'+submenu+')');
		/* Per menu item kunnen de Pebble media advertenties (leaderboard en halfpage- opnieuw ingeladen worden */
		
		switch(menu)
		{
			case this.MENU_HOME:
				
				if(!first_load)
				{
					adRefreshAll("homepage");
				}
				
				this.activateMenu(menu, 'home-link', null, false);
				
				first_load = false;
			
			break;
			
			case this.MENU_MUSIC:
				adRefreshAll("others");
				this.activateMenu(menu, 'muziek-link', submenu, true);
			break;
			
			case this.MENU_BIGPARTY:
				
				adRefreshAll("others");				
				this.activateMenu(menu, 'bigparty-link', null, false);
				
			break;
			
			case this.MENU_DJ:
				adRefreshAll("others");
				if (submenu != null)
				{
					var id = submenu.split('-');
					if (id.length == 3)
					{
						id = id[2];
						sitestat(nedstatURL + 'dj.'+id+'.index');
					}
				}
				else
				{
					sitestat(nedstatURL + 'dj.index');
				}
				this.activateMenu(menu, 'presentator-link', submenu, true);
			break;
			
			case this.MENU_SHOWS:
				adRefreshAll("others");
				this.activateMenu(menu, 'shows-link', null, false);
			break;
			
			case this.MENU_RECORDED:
				adRefreshAll("others");
				sitestat(nedstatURL + 'herbeluister.index');
				this.activateMenu(menu, 'herbeluister-link', submenu, false);
			break;
			
			case this.MENU_CAMPAIGNS:
				/*if (submenu != null)
				{
					sitestat(nedstatURL + 'wedstrijden.index');
				}*/
				
				sitestat(nedstatURL + 'wedstrijden.index');
				
				adRefreshAll("others");
				
				this.activateMenu(menu, 'acties-link', submenu, false);
			break;
			
			case this.MENU_HELPUS:
				sitestat(nedstatURL + 'gezocht.index');
				
				adRefreshAll("others");
				
				this.activateMenu(menu, 'oproepen-link', submenu, false);
			break;
			
			case this.MENU_MEDIA:
				
				adRefreshAll("others");
				this.activateMenu(menu, 'media-link', submenu, true);
				
			break;
			
			case this.MENU_VERKEER:
				adRefreshAll("others");
				sitestat(nedstatURL + 'verkeer.index');
				this.activateMenu(menu, 'verkeer-link', submenu, false);
			break;
			
			case this.MENU_WEBSHOP:
				sitestat(nedstatURL + 'clickout.VAN.menu.NAAR.webshop.index');
				this.activateMenu(menu, 'webshop-link', submenu, false);
			break;
			
			case this.MENU_90ID:
				sitestat(nedstatURL + '90id.index');
				this.activateMenu(menu, '90id-link', submenu, false);
			break;
			
			case this.MENU_90LIJST:
				sitestat(nedstatURL + '90lijst.index');
				this.activateMenu(menu, '90lijst-link', submenu, false);
			break;
			
			case this.MENU_MADONNA:
				sitestat(nedstatURL + 'madonna.index');
				this.activateMenu(menu, 'madonna-link', null, false);
			break;
			
			case this.MENU_MADONNAKUS:
				sitestat(nedstatURL + 'madonnakus.index');
				this.activateMenu(menu, 'madonnakus-link', null, false);
			break;
			
			case null:
			default:
				adRefreshAll("others");
				this.activateMenu(null, null, null, false);
			break;
		}
	};
	
	/**
	 * Activeer een menu
	 * @param string menu
	 * @param string menuId
	 * @param string submenuId
	 * @param boolean hasSubitems
	 */
	this.activateMenu = function(menu, menuId, submenuId, hasSubitems)
	{
		//mnm.console.trace('MNM_Menu.activateMenu(menu:'+menu+', menuId:'+menuId+', submenuId:'+submenuId+')');
		
		var menuIsOpen = false;
		
		// Ophalen van de menu-div-id (is het submenu open/gesloten)
		var menuDivId = null;
		if (hasSubitems)
		{
			menuDivId = menuId.split('-');
			menuDivId = menuDivId[0]+'-menu';
			
			if ($('#'+menuDivId).css('display') != 'none')
			{
				menuIsOpen = true;
			}
		}
		
		// Selecteer het submenu
		if (submenuId != null)
		{
			// Deactiveer een geselecteerd submenu
			this.deactivateSubmenu();
			
			$('#'+submenuId).after(submenuArrow);
			$('#'+submenuId).parent().addClass('left-submenu-active');
		}
		
		// Het menu is niet open, en er is een submenu gevraagd
		if (!menuIsOpen && submenuId != null && hasSubitems)
		{
			// verberg het submenu pijltje, slide open, en toon het submenu pijltje
			this.hideSubmenuArrows();
			
			// slide open + callback
			$('#'+menuDivId).slideDown('slow', mnm.menu.showSubmenuArrows);
			
		}
		// Het menu is niet open, het heeft subitems en er is geen submenu gevraagd
		else if (!menuIsOpen && hasSubitems)
		{
			// slide open (en toon de huidige submenu arrow indien deze er is)
			$('#'+menuDivId).slideDown('slow', mnm.menu.showSubmenuArrows);
		}
		// Het menu is open, het heeft subitems en er is geen submenu gevraagd
		else if (menuIsOpen && hasSubitems && submenuId == null)
		{
			// slide dicht + verberg geselecteerde submenu's
			this.hideSubmenuArrows();
			
			// display: list-item zoadat in IE7 de tekst niet verspringt
			$('#'+menuDivId).css("display", "list-item");
			
			// menu dichtklappen
			$('#'+menuDivId).slideUp('slow');
		}
		// Het menu is open, het heeft subitems en er is een submenu gevraagd
		else if (menuIsOpen && hasSubitems && submenuId != null)
		{
			this.showSubmenuArrows();
		}
		
		if (browser_ie6 && submenuId == null)
		{
			if(menuId == 'home-link')
			{
				$('#home-link').css("color", "#d92037");
			}
			else
			{
				$('#home-link').css("color", "#a0c1a4");
			}
		}
		
		// Activeer het menu
		if (menu != activeMenu)
		{
			var setActive = true;
			// Als we enkel het submenu togglen (zonder een submenu aan te klikken), dan mag het hoofdmenu niet geselecteerd worden
			if (hasSubitems && submenuId == null)
			{
				setActive = false;
			}
			
			if (setActive)
			{
				// Verwijder het actieve menu
				$('#left-menu li.active').removeClass('active');
				$('#left-menu .left-menu-active').remove();
				
				if (menuId != null)
				{
					$('#'+menuId).after(menuArrow);
					$('#'+menuId).parent().addClass('active');
				}
				
				activeMenu = menu;
				
				if (submenuId == null)
				{
					// Deactiveer een geselecteerd submenu
					this.deactivateSubmenu();
				}
			}
		}
	};
	
	/**
	 * Deactiveer het huidige submenu
	 */
	this.deactivateSubmenu = function()
	{
		$('#left-menu .submenu-array').remove();
		$('#left-menu .left-submenu-active').removeClass('left-submenu-active');
	};
	
	/**
	 * Verberg de submenu-pijltjes
	 */
	this.hideSubmenuArrows = function()
	{
		$('#left-menu .submenu-array').css('display', 'none');
	};
	
	/**
	 * Toon de submenu-pijltjes
	 */
	this.showSubmenuArrows = function()
	{
		$('#left-menu .submenu-array').css('display', 'block');
	};
}
mnm.menu = new MNM_Menu();

/**
 * Deejay functionaliteit
 * @return Deejay
 */
function Deejay()
{
	this.load = function(djId)
	{
		var request = 
		{
			type: 'GET',
			url: '/dj/'+djId,
			data: {mode:'content'},
			success: this.event_onLoadSuccess,
			error: this.event_onLoadError,
			dataType: 'html'
		};
		
		mnm.requests.doRequest(request);
	};
	this.event_onLoadSuccess = function(data, request)
	{
		
	};
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('heartbeat.event_onAutoUpdateError('+message+')');
	};
}

/**
 * Acties functionaliteit
 * @return Action
 */
function MNMCampain()
{
	this.load = function(mnmCampainId)
	{
		var request = 
		{
			type: 'GET',
			url: '/artikel/'+mnmCampainId,
			data: {mode:'content'},
			success: mnmCampain.event_onLoadSuccess,
			error: mnmCampain.event_onLoadError,
			dataType: 'html'
		};
		
		mnm.requests.doRequest(request);
	};
	this.event_onLoadSuccess = function(data, request)
	{
		$('#heartbeat').html(data);
		mnm.helpers.event_onLoadContent();
	};
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('heartbeat.event_onAutoUpdateError('+message+')');
	};
}

/**
 * Comments by user functionaliteit
 * @return tekst
 */
function MNMUserComments()
{
	this.load = function(user_id)
	{
		var request = 
		{
			type: 'get',
			url: '/comments-by-user',
			data: {mode:'content', uid: user_id},
			success: mnmUserComments.event_onLoadSuccess,
			error: mnmUserComments.event_onLoadError,
			dataType: 'html'
		};
		
		mnm.requests.doRequest(request);
	};
	this.event_onLoadSuccess = function(data, request)
	{
		$('#comments-admin-placeholder').html(data);
		//mnm.helpers.event_onLoadContent();
	};
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('heartbeat.event_onAutoUpdateError('+message+')');
	};
}

/**
 * Comments by user functionaliteit
 * @return tekst
 */
function MNMDeleteComment()
{
	this.load = function(nid, cid, sid)
	{
		var data = new Object();
		data['comment['+nid+'][cid]'] = cid;
		data['comment['+nid+'][nid]'] = nid;
		data['comment['+nid+'][sid]'] = sid;

		var request = 
		{
			type: 'POST',
			url: '/admin_delete_comments',
			data: data,
			success: mnmDeleteComment.event_onLoadSuccess,
			error: mnmDeleteComment.event_onLoadError,
			dataType: 'html'
		};
		
		try
		{
			mnm.requests.doRequest(request);
		}
		catch(e)
		{
			alert(e.message);
		}
	};
	this.event_onLoadSuccess = function(data, request)
	{
		//$('#comments-admin-placeholder').html(data);
		document.location.replace(document.location.href); 
	};
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('heartbeat.event_onAutoUpdateError('+message+')');
	};
}

/**
 * herbeluister functionaliteit
 * @return Herbeluister pagina
 */
function Herbeluister()
{
	this.load = function(url)
	{
		var request = 
		{
			type: 'GET',
			url: url,
			data: {mode:'content'},
			success: this.event_onLoadSuccess,
			//error: event_onerror_filterHerbeluister,
			dataType: 'html'
		};
		
		mnm.requests.doRequest(request);
	};
	this.event_onLoadSuccess = function(data, request)
	{
		
	};
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('heartbeat.event_onAutoUpdateError('+message+')');
	};
}

/**
 * Article functionaliteit
 * @return Article
 */
function Article()
{
	this.loadFromFlash = function(url)
	{
		try
		{
			// ID ophalen indien aanwezig...
			var index = url.indexOf('http://' + document.location.hostname + '/dj/');
			if (index > -1 )
			{
				var id = url.split('http://' + document.location.hostname + '/dj/');
				this.load(id[1]);
			}
		}
		catch(e){}
	};
	
	this.load = function(id)
	{
		//alert(id);
		var request = 
		{
			type: 'GET',
			url: '/dj/'+id,
			data: {mode:'json'},
			success: heartBeat.event_onAutoUpdateSuccess,
			error: heartBeat.event_onAutoUpdateError,
			dataType: 'json'
		};
		mnm.requests.doRequest(request);
	};
	this.event_onLoadSuccess = function(data, request)
	{
		
	};
	this.event_onLoadError = function(object, message, request)
	{
		//mnm.console.trace('heartbeat.event_onAutoUpdateError('+message+')');
	};
	

}



function MNMComments()
{
	this.defaultText = 'Geef hier jouw opmerking';
	
	this.load = function(nid, published, timestamp)
	{
		//mnm.console.trace('MNMComments.load(nid:'+nid+',published:'+published+',timestamp:'+timestamp+')');
		
		data = {mode:'json'};
		/*if (timestamp != null)
		{
			data.timestamp = timestamp;
		}*/
		
		var request = 
		{
			type: 'GET',
			url: '/comments/'+nid,
			data: data,
			success: mnmComments.event_onLoadSuccess,
			error: mnmComments.event_onLoadError,
			nid: nid,
			published: published,
			//timestamp: timestamp,
			timestamp: null,
			dataType: 'json'
		};
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadSuccess = function(data, request)
	{
		//mnm.console.trace('MNMComments.event_onLoadSuccess()');
		/*var append = true;
		if (request.params.timestamp == null)
		{
			append = false;
		}*/
		var append = false;
		mnmComments.show(request.params.nid, request.params.published, data.output, append);
	};
	
	this.event_onLoadError = function(object, message, request)
	{
		
	};
	
	this.add = function(nid, published, url)
	{	
		var value = $('#comment-form-'+nid+'-'+published+' input[name:message]').val();
		if(value == this.defaultText)
		{
			alert("Gelieve een persoonlijk bericht in te vullen!");
		}
		else
		{
			var request = 
			{
				type: 'POST',
				url: url + '?mode=json',
				data: {comment: value},
				success: mnmComments.event_onAddSuccess,
				error: mnmComments.event_onAddError,
				nid: nid,
				published: published,
				dataType: 'json'
			};
			mnm.requests.doRequest(request);
		}
	};
	
	this.event_onAddSuccess = function(data, request)
	{
		if (data.status == 'ok')
		{
			var unique = request.params.nid+'-'+request.params.published;
			$('#comment-add-'+unique).val(mnmComments.defaultText);
			
			$('#hb-content-'+unique+' .comments-wrapper').append(data.output);
			var commentCount = $('#hb-content-'+unique+' .comment-count').html();
			if (commentCount == '+')
			{
				commentCount = 0;
			}
			commentCount = parseInt(commentCount);
			$('#hb-content-'+unique+' .comment-count').html(commentCount + 1);
		}
		else
		{
//			if (data.action)
//			{
//				if (data.action = 'logon')
//				{
//					alert('login of registreer!');
//				}
//			}
//			else
//			{
				alert(data.message);
//			}
		}
	};
	
	this.event_onAddError = function(object, message, request)
	{
		// TODO
	};
	
	this.event_onFocusField = function(fieldId)
	{
		this.textfield_makeTypeReady($('#'+fieldId), this.defaultText);
	};
	
	this.event_onClickField = function(fieldId)
	{
		this.textfield_makeTypeReady($('#'+fieldId), this.defaultText);
	};
	
	this.event_onBlurField = function(fieldId)
	{
		var textfield = $('#'+fieldId);
		if (textfield.val() == '')
		{
			textfield.val(this.defaultText);
		}
	};
	this.textfield_makeTypeReady = function(textfield, defaultMessage)
	{
		if (textfield.val() == defaultMessage)
		{
			textfield.val('');
		}
	};
	
	/**
	 * Toon de reacties
	 * @param int nid
	 */
	this.show = function(nid, published, comments, append)
	{
		//mnm.console.trace('MNMComments.show(nid:'+nid+',published:'+published+',append:'+append+')');
		
		var divId = '#hb-content-'+nid+'-'+published;
		var animation = $(divId+' .comments .animation');
		
		if (append == false)
		{
			animation.css('display', 'none');
			$(divId+' .comments .comments-wrapper').html(comments);
			$(divId+' .comments .animation').fadeIn('slow');
		}
		else
		{
			$(divId+' .comments .comments-wrapper .comment-show-all').remove();
			var currentComments = $(divId+' .comments .comments-wrapper .comment').length;
			
			$(divId+' .comments .comments-wrapper').append(comments);
			
			var totalComments = $(divId+' .comments .comments-wrapper .comment').length;
			var nieuweComments = totalComments-currentComments;
			var divIdNewComments = divId+' .comments .comments-wrapper .comment:gt(' + (totalComments-nieuweComments) +')';
			
			$(divIdNewComments).css('display', 'none');
			$(divIdNewComments).fadeIn('slow');
		}
	};
	
	/**
	 * Ophalen van de publicatiedatum van de te openen node (want deze kan gewijzigd zijn ondertussen)
	 * @param object aTag
	 * @return int
	 */
	this.getNodePublished = function(aTag)
	{
		//mnm.console.trace('MNMComments.getNodePublished()');
		var id = $(aTag).parent().parent().parent().parent().parent().attr('id');
		return mnm.heartbeat.parseHeartbeatContentPublished(id);
	};
}


/**
 * MNM-Profile-Controller
 * @category MNM
 * @return MNM_Profile
 */
function MNM_Profile()
{
	this.isAdmin = false;
	this.isLoggedOn = false;
	
	
	/**
	 * Ophalen van de profielbox of het aanmeldscherm.
	 */
	this.getLoginProfileBox = function(fileURL)
	{
		//mnm.console.trace('MNM_Profile.getLoginProfileBox(fileURL:'+fileURL+')');
		
		var request = 
		{
			type: 'GET',
			url: fileURL,
			data: {mode:'json', unique:new Date().getTime()},
			success: mnm.profile.event_onLoginProfileBoxSuccess,
			error: mnm.profile.event_onLoginProfileBoxError,
			dataType: 'json',
			isCancellable: false
		};
		mnm.requests.doRequest(request);
	};
	this.event_onLoginProfileBoxSuccess = function(data, request)
	{
		//mnm.console.trace('MNM_Profile.event_onLoginProfileBoxSuccess()');
		
		if (data.UID)
		{
			mnm.profile.isLoggedOn = true;
		}
		
		mnm.profile.validateRole(data);
		mnm.helpers.event_onLoadContent();
		
		data = data.OUTPUT;
		$('#right-menu').prepend(data);
		
		mnm.helpers.event_onLoadContent();
	};
	this.event_onLoginProfileBoxError = function(object, message, request)
	{
		//mnm.console.trace('MNM_Profile.event_onLoginProfileBoxError('+message+')');
	};
	
	/**
	 * Aanmelden
	 */
	this.logon = function(fileURL, user, password, options)
	{
		//mnm.console.trace('MNM_Profile.logon(fileURL:'+fileURL+')');
		
		if (user == '' || password == '')
		{
			if (options != null && (options && !options.errorHandler))
			{
				alert('Gelieve een gebruikersnaam én een wachtwoord op te geven!');
			}
			else if (options && options.errorHandler)
			{
				options.errorHandler(null, 'Gelieve een gebruikersnaam én een wachtwoord op te geven!', null);
			}
		}
		else
		{
			var request = 
			{
				type: 'POST',
				url: fileURL + '?mode=json&unique=' + new Date().getTime(),
				data: {name:user,pass:password},
				success: mnm.profile.event_onLoginSuccess,
				error: mnm.profile.event_onLoginError,
				dataType: 'json',
				isCancellable: false
			};
			
			if (options != null)
			{
				request.options = options;
			}
			mnm.requests.doRequest(request);
		}
	};
	this.event_onLoginSuccess = function(data, request)
	{
		//mnm.console.trace('MNM_Profile.event_onLoginSuccess()');
		
		var options = null;
		if (request.params.options)
		{
			options = request.params.options;
		}
		
		// Als successHandler werd meegegeven, toon geen error melding. (de applicatie kan dan deze foutmelding afhandelen op zijn eigen manier)
		if (data.STATUS == 'FAILED' && (options == null || (options != null && !options.successHandler)))
		{
			alert('Oeps... Het aanmelden is mislukt. Probeer het opnieuw.');
			$('#edit-name').focus();
		}
		else if (data.STATUS != 'FAILED')
		{
			mnm.profile.validateRole(data);
			mnm.profile.isLoggedOn = true;
			
			$('#mnm_profile_placeholder').fadeOut('slow', function()
				{
					$('#mnm_profile_placeholder').remove();
					$('#right-menu').prepend(data.OUTPUT);
					$('#mnm_profile_placeholder').fadeIn('slow', function(){mnm.helpers.event_onLoadContent();});
				}
			);
		}
		
		if (options != null && options.successHandler)
		{
			options.successHandler(data, request);
		}
	};
	this.event_onLoginError = function(object, message, request)
	{
		//mnm.console.trace('MNM_Profile.event_onLoginError('+message+')');
		mnm.profile.isLoggedOn = false;
		
		var options = null;
		if (request.params.options)
		{
			options = request.params.options;
		}
		
		if (options != null && options.errorHandler)
		{
			options.errorHandler(object, message, request);
		}
	};
	
	/**
	 * Valideert de rol van de gebruiker.
	 */
	this.validateRole = function(data)
	{
		//mnm.console.trace('MNM_Profile.validateRole()');
		
		if (data.isAdmin && data.isAdmin == true)
		{
			this.isAdmin = true;
		}
	};
	
	/**
	 * Afmelden
	 */
	this.logout = function(fileURL)
	{
		//mnm.console.trace('MNM_Profile.logout(fileURL:'+fileURL+')');
		
		var request = 
		{
			type: 'GET',
			url: fileURL,
			data: {mode:'json', unique:new Date().getTime()},
			success: mnm.profile.event_onLogoutSuccess,
			error: mnm.profile.event_onLogoutError,
			dataType: 'json',
			isCancellable: false
		};
		mnm.requests.doRequest(request);
	};
	
	/**
	 * Bij het afmelden
	 * @param Object data
	 * @param Object request
	 */
	this.event_onLogoutSuccess = function(data, request)
	{
		//mnm.console.trace('MNM_Profile.event_onLogoutSuccess()');
		
		if (data.status == 'error')
		{
			alert(data.message);
		}
		else if (data.status == 'ok')
		{
			$('#mnm_profile_placeholder').fadeOut('slow', function()
				{
					$('#mnm_profile_placeholder').remove();
					$('#right-menu').prepend(data.output);
					$('#mnm_profile_placeholder').fadeIn('slow', function(){mnm.helpers.event_onLoadContent();});
				}
			);
			
			mnm.profile.isAdmin = false;
			mnm.profile.isLoggedOn = false;
		}
		
		mnm.helpers.event_onLoadContent();
	};
	this.event_onLogoutError = function(object, message, request)
	{
		//mnm.console.trace('MNM_Profile.event_onLogoutError('+message+')');
	};
}
mnm.profile = new MNM_Profile();

function MNM_Helpers()
{
	/**
	 * Wanneer nieuwe inhoud geladen werd, roep deze functie aan.
	 */
	this.event_onLoadContent = function()
	{
		//mnm.console.trace('MNM_Helpers.event_onLoadContent()');
		
		mnm.helpers.tickboxRestart();
		
		$('.comment-count').unbind('click');
		$('.comment-count').css('cursor', 'auto');
		
		if (mnm.profile.isAdmin)
		{
			
			$('.comment-count').css('cursor', 'pointer');
			$('.comment-count').click(
				function()
				{
					var contentDivId = $(this).parent().parent().parent().attr('id');
					var nid = mnm.heartbeat.parseHeartbeatId(contentDivId);
					showAdminDeleteCommentsByNode(nid, 'ASC');
					//mnm.console.trace(nid);
				}
			);
		}
	};
	
	/**
	 * Thickbox reset
	 */
	var tickboxInitiated = false;
	this.tickboxRestart = function()
	{
		//mnm.console.trace('MNM_Helpers.tickboxRestart()');
		
		if (tickboxInitiated)
		{
			//tb_remove();
			tb_removeFromDom('a.thickbox');
			tb_removeFromDom('a.thickbox-gallery');
		}
		else
		{
			imgLoader = new Image(); 
			imgLoader.src = '/frontend/themes/mnm/images/loadingAnimation.gif';
			//imgLoader.src = '/frontend/themes/mnm/images/loadingThickbox.gif';
			tickboxInitiated = true;
		}
		tb_init('a.thickbox', false);
		tb_init('a.thickbox-gallery', true);
	};
	
	/**
	 * Thickbox gallery starten
	 */
	this.loadThickboxGallery = function(title, url, imageGroup, nedstat_countername)
	{
		//mnm.console.trace('MNM_Helpers.loadThickbox()');
		
		nedstat_countername = nedstatURL + nedstat_countername;
		
		//zend de data naar sitestat
		sitestat(nedstat_countername + '1');
		
		//open de thickbox overlay
		tb_show(title, url, imageGroup, nedstat_countername);
	};
	
	/**
	 * Open radiospeler om een fragment te beluisteren
	 */
	this.playInExternalplayer = function(filename)
	{
		var url = 'http://internetradio.vrt.be/player_detection.html?qsbrand=55&qsODfile=/internetradio_master/productiesysteem2/programma_od/'+filename;
		var u = new Date();
		window.open(url, 'vrtwindow'+u.getTime(),'resizable=0,toolbar=0,scrollbars=0,location=0,status=0,menubar=0,width=787,height=433,left=301,top=232');
		return false;
	};
	
	/**
	 * Op de MNM50
	 */
	var mnm50URL = null;
	this.initMNM50 = function(url)
	{
		this.mnm50URL = url;
	};
	this.showMNM50 = function()
	{
		tb_show(null, this.mnm50URL, false);
	};
	
	/**
	 * Ultratop50
	 */
	var ultratop50URL = null;
	this.initUltratop50 = function(url)
	{
		this.ultratop50URL = url;
	};
	this.showUltratop50 = function()
	{
		tb_show(null, this.ultratop50URL, false);
	};
	
	/**
	 * Programmaschema
	 */
	var programSchemeURL = null;
	this.initProgramScheme = function(url)
	{
		this.programSchemeURL = url;
	};
	this.showProgramSheme = function()
	{
		tb_show('mnm_programscheme_title', this.programSchemeURL, false);
	};
	this.event_onClickProgramSchemeDj = function(fileURL, djId)
	{
		//mnm.console.trace('MNM_Helpers.event_onClickProgramSchemeItem()');
		
		// De fout moet opgevangen worden (indien fout -> volgen we de link)
		try
		{
			mnm.menu.event_onClick(mnm.menu.MENU_DJ, 'submenu-dj-'+djId);
			mnm.filter.load(null, {fileURL:fileURL,showMore:true});
			
			tb_remove();
			
			return false;
		}
		catch(e)
		{
			return true;
		}
	};
	this.event_onClickProgramSchemeMixmatch = function(fileURL)
	{
		//mnm.console.trace('MNM_Helpers.event_onClickProgramSchemeMixmatch()');
		
		// De fout moet opgevangen worden (indien fout -> volgen we de link)
		try
		{
			mnm.filter.load(null, {fileURL:fileURL}); 
			mnm.menu.event_onClick(mnm.menu.MENU_MUSIC, 'muziek-submenu-mixmatch'); 
			sitestat(nedstatURL + 'muziek.mixmatch.index' );
			
			tb_remove();
			
			return false;
		}
		catch(e)
		{
			return true;
		}
	};
	
	/**
	 * Faq
	 */
	var faqURL = null;
	this.initFaq = function(url)
	{
		this.faqURL = url;
	};
	this.showFaq = function()
	{
		tb_show('mnm_faq_title', this.faqURL, false);
	};
	
	/**
	 * RSS
	 */
	this.showRSS = function()
	{
		mnm.menu.event_onClick(null, null);
		mnm.filter.load(null, {fileURL:'/rss'});
	};
	
	/**
	 * Contact
	 */
	var contactURL = null;
	this.initContact = function(url)
	{
		this.contactURL = url;
	};
	this.showContact = function()
	{
		tb_show('mnm_contact_title', this.contactURL, false);
	};
	
	/**
	 * Luister live!
	 */
	var listenLiveURL = null;
	this.initListenLive = function(url)
	{
		this.listenLiveURL = url;
	};
	this.showListenLive = function()
	{
		day = new Date();
		id = day.getTime();
		window.open(this.listenLiveURL, 'radiospeler'+id,'resizable=1,toolbar=0,scrollbars=0,location=0,status=0,menubar=0,width=787,height=433,left=301,top=232');
	};
	
	/**
	 * Webcam
	 */
	var webcamURL = null;
	this.initWebcam = function(url)
	{
		this.webcamURL = url;
	};
	this.showWebcam = function()
	{
		day = new Date();
		id = day.getTime();
		window.open(this.webcamURL, 'vrtwindow'+id,'resizable=0,toolbar=0,scrollbars=0,location=0,status=0,menubar=0,width=787,height=433,left=301,top=232');
		sitestat(nedstatURL + 'clickout.VAN.flashheader.NAAR.webcam.videostream');
	};
	
	/**
	 * Toogle het webcam menu
	 * @return
	 */
	this.toggleWebcamMenu = function()
	{
		if ($('#flash-webcam-menu-placeholder').css('display') == 'none')
		{
			$('#flash-webcam-menu-placeholder').fadeIn('fast');
		}
		else
		{
			$('#flash-webcam-menu-placeholder').fadeOut('slow');
		}
	};
	
	/**
	 * Statische webcam
	 */
	var staticWebcamURL = null;
	this.initStaticWebcam = function(url)
	{
		this.staticWebcamURL = url;
	};
	this.showStaticWebcam = function()
	{
		day = new Date();
		id = day.getTime();
		window.open(this.staticWebcamURL, 'mnm_webcam', 'resizable=0,toolbar=0,scrollbars=0,location=0,status=0,menubar=0,width=787,height=433,left=301,top=232');
		sitestat(nedstatURL + 'clickout.VAN.flashheader.NAAR.internetradiospeler-be.webcam');
	};
	
	/**
	 * Functie vanuit flash - toon de homepage
	 */
	this.showHomepage = function()
	{
		mnm.filter.load(mnm.filter.HOME, {fileURL:'/',showMore:true});
		mnm.menu.event_onClick(mnm.menu.MENU_HOME, null);
	};
	
	/**
	 * Reset het muziek-zoek-formulier
	 */
	this.resetMusicSearch = function()
	{
		$('#zoekterm-textbox').val('');
		$('#datum-textbox').val('');
		$('#searchForm select[@name=\'fromHour\'] option:first').attr('selected','selected');
		$('#searchForm select[@name=\'tillHour\'] option:first').attr('selected','selected');
	};
	
	/**
	 * Neem de zoekterm van het muziek-zoek-formulier en doe een zoekopdracht op de gehele website
	 */
	this.launchWebsiteSearchFromMusicSearch = function()
	{
		var searchstring = $('#zoekterm-textbox').val();
		
		//de zoek textbox invullen
		$('#search_textbox').val(searchstring);
		
		//trigger het click event van de search knop
		$('#search-button').click();
		adRefreshAll('others');
	};
	
	/**
	 * Neem de zoekterm van de gehele site en doe de zoekopdracht doorheen de muziek
	 */
	this.launchMusicSearchFromWebsiteSearch = function()
	{
		var searchstring = $('#search_textbox').val();
		
		//de zoek textbox invullen
		$('#zoekterm-textbox').val(searchstring);
		
		//trigger het click event van de search knop
		$('#music-submit-button').click();
		adRefreshAll('others');
	};
	
	/**
	 * Neem de zoekterm van de tagcloud en doe een zoekopdracht op de gehele website
	 */
	this.launchWebsiteSearchFromTagcloud = function(searchstring)
	{
		//de zoek textbox invullen
		$('#search_textbox').val(searchstring);
		
		//trigger het click event van de search knop
		$('#search-button').click();
		//adRefreshAll('others'); > wordt al gedaan
	};
	
	this.loadStatic = function(fileURL)
	{
		var request = 
		{
			type: 'GET',
			url: fileURL,
			success: mnm.helpers.event_onload_static,
			error: mnm.helpers.event_onerror_static,
			dataType: 'html'
		};
		
		mnm.requests.doRequest(request);
	};
	this.event_onload_static = function(data, request)
	{
		//mnm.console.trace('mnm.helpers.event_onAutoUpdateError('+message+')');
		$('#heartbeat').html(data);
	};
	this.event_onerror_static = function(object, message, request)
	{
		//mnm.console.trace('mnm.helpers.event_onerror_static('+message+')');
	};
	
	/**
	 * Check of de mnmtheek moet geopend worden a.d.h.v. de url
	 * @return
	 */
	this.check_open_mnmtheek = function()
	{
		var element = document.location.hash;   
		
		var result = check_if_string_starts_with(element, "#mnmtheek");

		if(result == true)
		{
			//haal het type en de id uit de url
			var mnmtheek_array = element.split("-");
			
			if(mnmtheek_array.length == 3)
			{
				var type = mnmtheek_array[1];
				var info_id = mnmtheek_array[2];
				
				if(type == 'artist')
				{
					//haal de info van de artiest op
					mnm.helpers.loadArtistInfo(info_id);
				}
				else
				{
					if(type == 'song')
					{
						//haal de info van deze song op
						mnm.helpers.loadSongInfo(info_id);
					}
				}
				
				sitestat(nedstatURL + 'clickout.VAN.extern.NAAR.mnmtheek');
			}
		}
	};
	
	/**
	 * ajax call om de info van het lied op te halen
	 * @param song_id
	 * @return
	 */
	this.loadSongInfo = function(song_id)
	{
		var request = 
		{
			type: 'GET',
			url: '/mnmtheek/song_info/'+song_id,
			data: {mode:'json'},
			success: this.event_onLoadSongInfoSuccess,
			error: this.event_onLoadSongInfoError,
			dataType: 'json'
		};
		
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadSongInfoSuccess = function(data, request)
	{
		//open de mnmtheek
		mnm.mnmtheek.add(data.hover_title, data.mnmtheek_title, data.song_id, data.type, data.href, data.countername);
	};
	
	this.event_onLoadSongInfoError = function(object, message, request)
	{
		
	};
	
	/**
	 * ajax call om de info van de artiest op te halen
	 * @param artist_id
	 * @return
	 */
	this.loadArtistInfo = function(artist_id)
	{
		var request = 
		{
			type: 'GET',
			url: '/mnmtheek/artist_info/'+artist_id,
			data: {mode:'json'},
			success: this.event_onLoadArtistInfoSuccess,
			error: this.event_onLoadArtistInfoError,
			dataType: 'json'
		};
		
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadArtistInfoSuccess = function(data, request)
	{
		//open de mnmtheek
		mnm.mnmtheek.add(data.hover_title, data.mnmtheek_title, data.artist_id, data.type, data.href, data.countername);
	};
	
	this.event_onLoadArtistInfoError = function(object, message, request)
	{
		
	};
}
mnm.helpers = new MNM_Helpers();
mnmHelpers = mnm.helpers; // TODO: DEPRECATED
heartBeat = mnm.heartbeat; // TODO: DEPRECATED
requestHandler = mnm.requests; // TODO DEPRECATED
mnmProfile = mnm.profile; // TODO DEPRECATED

mnmArticle = new Article();
//deejay = new Deejay();
mnmCampain = new MNMCampain();
mnmUserComments = new MNMUserComments();
mnmDeleteComment = new MNMDeleteComment();
herbeluister = new Herbeluister();
mnmComments = new MNMComments();

function MNM_Shows()
{
	/**
	 * Inladen van een pagina
	 * @param string show
	 * @param string page
	 * @param object options
	 */
	this.loadPage = function(show, page, options)
	{	
		// Disable alle ajax-requests
		mnm.requests.event_onCancelAll();
		
		// Disable de heartbeat (altijd!)
		mnm.heartbeat.setState(mnm.heartbeat.STATE_IDLE);
		
		// Maak altijd de heartbeat leeg
		mnm.tb_heartbeat.event_onEmptyQueue();
		
		$("#heartbeat").html("");
		$("#heartbeat-history").html("");
		$("#older-block-heartbeat").html("");
		$("#older-block-filter").html("");
		
		if (page == null)
		{
			page = "index";
		}
		
		var request = null;
		if (show == null)
		{
			sitestat(nedstatURL + "shows.index");
			request = 
			{
				type: 'GET',
				url: '/shows/',
				data: {mode:'json'},
				success: mnm.shows.event_onLoadPageSuccess,
				error: mnm.shows.event_onLoadPageError,
				dataType: 'json'
			};
		}
		else
		{
			sitestat(nedstatURL + "shows." + show + "." + page);
			request = 
			{
				type: 'GET',
				url: '/shows/' + show + '/' + page,
				data: {mode:'json'},
				success: mnm.shows.event_onLoadPageSuccess,
				error: mnm.shows.event_onLoadPageError,
				isCancellable: false,
				dataType: 'json'
			};
		}
		
		mnm.requests.doRequest(request);
		
		if (options)
		{
			if (options.tagFilter)
			{
				mnm.filter.load(mnm.filter.TAGS, {fileURL:options.tagFilter,showMore:false});
			}
			else if (options.djFilter)
			{
				mnm.filter.load(null, {fileURL:options.djFilter,showMore:false});				
			}
			else if (options.filter)
			{
				mnm.filter.load(null, {fileURL:options.filter,showMore:false});
			}
		}
	};
	
	this.event_onLoadPageSuccess = function(data, request)
	{
		$('#showContent').html(data.data.content);
		
		if (!data.data.status)
		{
			$('#showNavigation').html(data.data.nav);
		}
		
		$('#showContent').css("display", "block");
		$('#showNavigation').css("display", "block");
		
		//// Nodige globale acties na het visualiseren van inhoud
		//mnm.helpers.event_onLoadContent();
	};
	
	this.event_onLoadPageError = function(object, message, request)
	{
		
	};
	
	/**
	 * Inladen van een artikel
	 * @param int id
	 * @param object options
	 */
	this.loadArticle = function(id, options)
	{	
		// Disable alle ajax-requests
		mnm.requests.event_onCancelAll();
		
		// Disable de heartbeat (altijd!)
		mnm.heartbeat.setState(mnm.heartbeat.STATE_IDLE);
		
		// Maak altijd de heartbeat leeg
		mnm.tb_heartbeat.event_onEmptyQueue();
		
		$("#heartbeat").html("");
		$("#heartbeat-history").html("");
		$("#older-block-heartbeat").html("");
		$("#older-block-filter").html("");
		$('#showContent').html("");
		$('#showContent').css("display", "none");
		$('#showNavigation').css("display", "block");
		
		sitestat(nedstatURL + "clickthrough.VAN.shows.navigatie.NAAR.artikel." + id);
		var request = 
		{
			type: 'GET',
			url: '/artikel/' + id,
			data: {mode:'content'},
			success: mnm.shows.event_onLoadArticleSuccess,
			error: mnm.shows.event_onLoadArticleError,
			dataType: 'html'
		};
		
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadArticleSuccess = function(data, request)
	{
		$('#heartbeat').html(data);
		
		// Nodige globale acties na het visualiseren van inhoud
		mnm.helpers.event_onLoadContent();
	};
	
	this.event_onLoadArticleError = function(object, message, request)
	{
		
	};
	
	/**
	 * Inladen van de navigatie
	 * @param string show
	 * @param object options
	 */
	this.loadNav= function(show, options)
	{	
		var request = 
		{
			type: 'GET',
			url: '/shows/' + show + '/nav',
			data: {mode:'json'},
			success: mnm.shows.event_onLoadNavSuccess,
			error: mnm.shows.event_onLoadNavError,
			dataType: 'json'
		};
		
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadNavSuccess = function(data, request)
	{
		$('#showNavigation').html(data.data.nav);
		$('#showNavigation').css("display", "block");
	};
	
	this.event_onLoadNavError = function(object, message, request)
	{
		
	};
	
	this.event_clearAll = function()
	{
		$('#showContent').html("");
		$('#showNavigation').html("");
		$('#showContent').css("display", "none");
		$('#showNavigation').css("display", "none");
	};
	
	/**
	 * Inladen van de shows navigatie
	 */
	this.loadShowsNav= function()
	{	
		var request = 
		{
			type: 'GET',
			url: '/shows/',
			data: {mode:'json'},
			success: mnm.shows.event_onLoadShowsNavSuccess,
			error: mnm.shows.event_onLoadShowsNavError,
			isCancellable: false,
			dataType: 'json'
		};
		
		mnm.requests.doRequest(request);
	};
	
	this.event_onLoadShowsNavSuccess = function(data, request)
	{
		$('#showNavigation').html(data.data.nav);
		$('#showNavigation').css("display", "block");
	};
	
	this.event_onLoadShowsNavError = function(object, message, request)
	{
		
	};
}
mnm.shows = new MNM_Shows();

/**********************************************************************************************************************/
//EXTERAL
/**********************************************************************************************************************/
/**
* Queue functionaliteit
*/
function Queue(){
	// the list of elements, initialised to the empty array
	var queue = [];
	
	// the amount of space at the front of the queue, initialised to zero
	var queueSpace = 0;

	/**
	 * Returns the size of this Queue. The size of a Queue is equal to the number
	 * of elements that have been enqueued minus the number of elements that have
	 * been dequeued.
	 *
	 */
	this.getSize = function(){
		// return the number of elements in the queue
		return queue.length - queueSpace;
	};

	/**
	 * Returns true if this Queue is empty, and false otherwise. A Queue is empty
	 * if the number of elements that have been enqueued equals the number of
	 * elements that have been dequeued.
	 */
	this.isEmpty = function(){
		// return true if the queue is empty, and false otherwise
		return (queue.length == 0);
	};

	//Enqueues the specified element in this Queue. The parameter is: element - the element to enqueue
	this.enqueue = function(element){
		queue.push(element);
	};

	/**
	 * Dequeues an element from this Queue. The oldest element in this Queue is
	 * removed and returned. If this Queue is empty then null is returned.
	 */
	this.dequeue = function(){
		// initialise the element to return to be undefined
		var element = null;

		// check whether the queue is empty
		if (queue.length){

			// fetch the oldest element in the queue
			//element = queue[queueSpace];
			element = queue[queueSpace];

			// update the amount of space and check whether a shift should occur
			if (++queueSpace * 2 >= queue.length){

				// set the queue equal to the non-empty portion of the queue
				queue = queue.slice(queueSpace);

				// reset the amount of space at the front of the queue
				queueSpace=0;
			}
		}

		// return the removed element
		return element;
	};

	/** Returns the oldest element in this Queue. If this Queue is empty then
	 * undefined is returned. This function returns the same value as the dequeue
	 * function, but does not remove the returned element from this Queue.
	 */
	this.getOldestElement = function(){
		// initialise the element to return to be undefined
		var element = undefined;

		// if the queue is not element then fetch the oldest element in the queue
		if (queue.length) element = queue[queueSpace];

		// return the oldest element
		return element;
	};
	
	//Checks if the specified element is already in this Queue. The parameter is: element - the element to check
	this.alreadyInQueue = function(element){
		var existsInQueue = false;
		for(i=0;i<queue.length;i++)
		{
			if(queue[i].nid == element.nid)
			{
				existsInQueue = true;
			}
		}
		
		return existsInQueue;
	};
	
	/**
	 * remove a certain item from the queue
	 */
	this.removeFromQueue = function(element){
		// check whether the queue is empty
		if(queue.length)
		{
			for(i=0;i<queue.length;i++)
			{
				if(queue[i].url == element.url)
				{
					//remove the item from the queue
					queue = queue.splice(i+1);
				}
			}
		}
	};
	
	this.getQueue = function()
	{
		return queue;
	};
}

/**
 * TEMP
 */
var mediatheek = new Object();
mediatheek.playFile = function(value){};
mediatheek.createAudioFile = function(title, href)
{
	mnm.audioplayer.add(title, href, null);
	return true;
};



function pebbleScrollTop() {
	
  var scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    scrOfY = window.pageYOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    scrOfY = document.body.scrollTop;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    scrOfY = document.documentElement.scrollTop;
  }

  return scrOfY 
  
}
