$.fn.heartBeat = function ()
{
// 1. Get JSON from server
$.ajax({
  url: "/livetool_hr/heartbeat",
  cache: false,
  dataType: "json",
  success:
	function(data)
	{
		$.each(data, function(i)
		{	
			// 2. Check tool status
			if (data.status == 'off')
			{
				// 2.1 Redirect to offline-page, if tool isn't active
				location.replace('offline.php');
			}
		});
		// 3. Set base-url, check modules
		var baseUrl = "/livetool_hr/refresh";
		refresh = new Array();
		$.each(data.modules, function(i,module)
		{
		// alert(module.name + " " + "" + previous[i].timestamp + " " + module.lastchange + " " + module.active);
			// 3.1 Set refresh-url for every module
			//eval("" + module.name + " = 'no_refresh';");
			refresh[module.name] = 'no_refresh';
			var refreshUrl = baseUrl+"/"+module.name;
			// 3.2 check for module active state
			if (module.active == 'no')
			{
			    // 3.2.1 Module inactive
    		    if (previous[i].active == 'yes')
    		    {
    		    	// 3.2.1.1 Module was active in previous check
    		    	// Set visibility -> fade out module
    		    	$('#'+module.name).load(refreshUrl).hide(500);
    		    }
    		    else
    		    {	
    		    	// 3.2.1.2 Module was inactive in previous check
    		    	// Set display none (keep the element hidden)
    		    	$('#'+module.name).css({display: "none"});	
    		    }
    		}
    		else {
    		    // 3.2.2 Module active
    		    if (previous[i].active == 'no')
    		    {
    		    	// 3.2.2.1 Module was inactive in previous check
    		    	// Set visibility -> fade in module
    		    	$('#'+module.name).load(refreshUrl).show(500);
    		    	// Set refreshed variable -> needed for reload of animation JavaScript
    		    	refreshed = 'yes';
    		    	refresh[module.name] = 'refreshed';
    		    }
    		    
    		    // 3.2.2.2 Module was active in previous check
    		    if (module.lastchange > previous[i].timestamp)
    		    {	
    		    	// 3.2.2.2.1 Module was changed since last check
    		    	// Reload module
    		    	$('#'+module.name).load(refreshUrl);
    		    	// Set refreshed variable -> needed for reload of animation JavaScript
    		    	refreshed = 'yes';
    		    	refresh[module.name] = 'refreshed';
    		    }
    		    	
    		}
    		// 3.3 Write actual active state and timestamp into object for next round of checks
    		previous[i] = new Object();
			previous[i]["timestamp"] = module.lastchange;
    		previous[i]["active"] = module.active;
    	});
    	// 4. Check if something was refreshed
    	// yes -> something was refreshed within the last heartbeat round
    	// 0 -> first beat of that heart, refresh needed - coming from config.js      	  
    	
    		if (refreshed == 'yes' || refreshed == '0')
    		{
    		// 4.1 Retard the JavaScript refresh a bit to make sure everythig is loaded before animations are started
    		
    			// 4.1.1 Reload all animation JavaScripts
    			$('body').heartBeatReloadAll();		
    			// 4.1.2 Set refreshed to done so it's not yes the next time -> avoid uneeded refreshing		
    			// refreshed = 'done';
    		}
    }});
};
