function ajaxCall(url, type, data)
{

	$.ajax({
		url: url,
		type: type,
		data: data,
		success: jsonHandler
	});

}

function jsonHandler(data, status, obj){

	$('#loader').hide();

	if (typeof data.messages == 'object') {

		$.each(data.messages, function(key, message){

			showMessage(message.message, message.type);

		});

	}

	if (typeof data.functions == 'object' && data.functions != null) {

		$.each(data.functions, function(key, func){

			window[func.name](func.args);

		});		


	}

}

function showMessage(message, type){
	
	alert(message);
	
	/*
		var select = '#messages';

		$.doTimeout( 'messages');

		$(select).fadeOut(100, function(){

			$(select).html(message);

			if (type == 'error') {

				$(select).addClass('error');

			}
			else{

				$(select).removeClass('error');

			}

			$(select).fadeIn(400, function(){

				$(select).css({'opacity':'1'});

				$.doTimeout('messages', 5000, function(){

					$(select).fadeOut(800, function() {

						$(select).hide();

					});

				});

			});

		});*/
	

}

function showWorking(){

	$('#loader').show();

};

function errorHandler(x, e){

	$('#loader').hide();

	if(x.status==0){

		showMessage('You appear to be offline', 'error');

	}else if(x.status==404){

		showMessage('The link could not be found', 'error');

	}else if(x.status==500){

		showMessage('There was an unknown server error', 'error');

	}else if(e=='parsererror'){

		showMessage('There was an unknown server error (parser error)', 'error');

	}else if(e=='timeout'){

		showMessage('Request timeout', 'error');

	}else {

		showMessage('An error occurred: ' + x.responseText, 'error');

	}

}

function redirect(url)
{

	window.location = url;

}

function formErrors(data)
{

	var formId = '#' + data.id;

	clearFormErrors(formId);

	$.each(data.errors, function(name, error){

		if (name == '-tags-') {

			$('<label class="error" for="' + name + '" generated="true">' + error + '</label>').insertBefore(formId + ' #track-tags');

		}
		else
		{

			$('<label class="error" for="' + name + '" generated="true">' + error + '</label>').insertAfter(formId + ' [name="' + name + '"]');

		}

	});
	
	formInit();
	
}

function clearFormErrors(selector)
{
	
	$(selector + ' label').map(function(){

		if ($(this).attr('generated')) {

			$(this).remove();

		};

	});
	
}

function showItem(selector)
{

	$(selector).show();

}

function hideItem(selector)
{

	$(selector).hide();

}

function replaceElement(args)
{

	$(args.selector).replaceWith(args.html);

}

function replaceHtml(args)
{

	$(args.selector).html(args.html);

}

function clickOn(selector)
{

	$(selector).trigger('click');

}

function runAfterTimeout(args)
{

	$.doTimeout(parseInt(args.time), function(){

		window[args.func.name](args.func.args);

	});

}

$(document).ready(function(){

	//Set Defaults

	$.ajaxSetup({
		cache: false,
		method: 'GET',
		error: errorHandler,
		beforeSend: showWorking,
		timeout:10000,
		success: jsonHandler
	});

	$.validator.setDefaults({
		onfocusout: false,
		onkeyup: false
	});


	$('button.ajaxcall').live('click', function(e){
		
		e.preventDefault();
		
		var url = $(this).attr('url');

		ajaxCall(url);

	});

	$('a.ajaxcall').live('click', function(e){

		e.preventDefault();

		var url = $(this).attr('href');

		ajaxCall(url);

	});

	$('input.ajaxcall').live('click', function(){

		var url = $(this).attr('url');

		ajaxCall(url);

	});


});

