// http://encosia.com/2009/07/21/simplify-calling-asp-net-ajax-services-from-jquery/
// http://encosia.com/2008/03/27/using-jquery-to-consume-aspnet-json-web-services/
// http://encosia.com/2008/06/05/3-mistakes-to-avoid-when-using-jquery-with-aspnet-ajax/
// http://www.sogeti-phoenix.com/Blogs/post/2009/05/MVC-ndash3b-Using-AntiForgeryToken-over-AJAX.aspx

//var isDotNet = document.URLUnencoded.match(/\.htm$/m) ? serviceName + ".htm" : "AJAX/";
//var isDotNet = (document.URLUnencoded.match(/^http:\/\/localhost/m) != undefined);
var isDotNet = (document.location.href.match(/^http:\/\/localhost/m) != undefined);

$.ajaxSetup({
	type: isDotNet ? "POST" : "GET",
	//contentType: "application/json; charset=utf-8", // MVC fails to pass function parameters if this is set
	data: "{}",
	//dataType: "json", // not! It will cause primitive return values like string and int to return an error
	dataFilter: function(data) {
		var msg;

		if (typeof (JSON) !== 'undefined' && typeof (JSON.parse) === 'function')
			msg = JSON.parse(data);
		else
			msg = eval('(' + data + ')');

		if (msg.hasOwnProperty('d'))
			return msg.d;
		else
			return msg;
	}
})

$.service = function (serviceName, /* method, */jsonInput, successCallback, failureCallback)
{
	var token = getTokenFieldValue();
	var d = new Date();
	$.ajax({
		url: (isDotNet ? "AJAX/" + serviceName : "/AJAX/" + serviceName + ".asp?timer=" + d.getTime()),
		type: "POST",
		data: $.extend(jsonInput, { "__RequestVerificationToken": token }),
		success: successCallback,
		error: failureCallback
	});
}

$.htmlEncode = function(s) {
	// TODO: Debug. It has not been unit-tested yet.
	return s.replace("<", "&lt;").replace(">", "$gt;").replace("\"", "&quot;");
}

function getTokenFieldValue()
{
	return $('input[name=__RequestVerificationToken]').val();
}
