﻿function Mx() { }

Mx.ValidEmailRegEx = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
Mx.ValidNameRegEx = /^[ A-Za-z0-9.]+$/;
Mx.ValidUsernameRegEx =  /^([A-Za-z_\.\-0-9]{2,64})$/;
Mx.ValidPasswordRegEx = /^([\w\.!£\$%\^&*\(\)\-_\+\\\|<>,\?/:;@#~'\[\]"=\{\}]{2,64})$/;
Mx.ValidInviteCode = /^([A-Za-z0-9]{3,999})$/;


Mx.initTextBox = function(jqSel, options) {
	var options = options || {};

	var jq = $(jqSel);

	options.isValid = function() {
		return !options.validRegex || jq.val().match(options.validRegex);
	};

	jq.focus(function() {
		jq.addClass("el-active");
		jq.removeClass("el-default");
		if (options.defaultText) {
			if (jq.val() == options.defaultText) jq.val("");
		}
	});

	jq.blur(function() {
		jq.removeClass("el-active");
		if (options.defaultText) {
			if (jq.val() == "") {
				jq.val(options.defaultText);
				jq.addClass("el-default");
			}
		}
	});

	if (options.onSubmit) {
			jq.keypress(function(e) {
			var code = (e.keyCode ? e.keyCode : e.which);
			var enterKey = 13;
			if (code == enterKey) {
				if (options.isValid()) {
					options.onSubmit(jq);
					return true;
				}
				return false;
			}
		});
	}

	if (options.onValidTest) {
		jq.keyup(CheckChange);
		jq.bind('paste', function(e) {
			window.setTimeout(CheckChange, 50)
		});
	}

	function CheckField(ajaxUrl, fieldName, fieldValue) {
		$.ajax({
			url: ajaxUrl,
			cache: false,
			data: {
				field: fieldName,
				value: fieldValue
			},
			dataType: 'json',
			success: function(json) {
				$(options.errorSpan + ' img').css('display', 'none');
				AddTooltip(options.errorSpan, '');
				options.onValidTest(json.IsValid, jq);			    						
				
				var errorMessage = '';
				if(!json.IsValid) {
					errorMessage = json.ErrorMessage;
					AddTooltip(options.errorSpan, errorMessage);
				}
				
			},
			beforeSend: function() {
				$(options.errorSpan + ' img').attr('src', options.loaderUrl);
				$(options.errorSpan + ' img').css('display', 'inline');
			}
		});
	}


	function CheckChange() {
		if (options.validRegex && options.ajaxValidationUrl) {
			// Check using both regular expressions then ajax
			var isValid = jq.val().match(options.validRegex);

			if (!isValid)
				options.onValidTest(isValid, jq);
			else {
				CheckAjax();
			}
		}
		else if (options.validRegex) {
			// Check using only regular expressions
			CheckRegex();
		}
		else if (options.ajaxValidationUrl) {
			// Check using only ajax
			CheckAjax();
		}
	}

	function CheckRegex() {
		var isValid = jq.val().match(options.validRegex);
		options.onValidTest(isValid, jq);
	}

	function CheckAjax() {
		typewatch(function() {
			CheckField(options.ajaxValidationUrl, options.fieldName, jq.val());
		}, 500);
	}
	

	var typewatch = function() {
		var timer = 0;  // store the timer id
		return function(callback, ms) {
			clearTimeout(timer);  // if the function is called before the timeout
			timer = setTimeout(callback, ms); // clear the timer and start it over
		}
	} ();

	if (options.text) {
		jq.val(options.text);
		CheckChange();
	}
	else if (options.defaultText) {
		jq.val(options.defaultText);
		jq.addClass("el-default");
	}
}

Mx.initButton = function(jqSel, options)
{
	var options = options || {};

	var jq = $(jqSel);
	if (options.onSubmit)
	{
		jq.click(function()
		{
			options.onSubmit(jq);
		});
	}

	if (options.disabled)
	{
		jq.attr('disabled', 'disabled');
	}
}

function ValidResult(result, errorMessage)
{
	this.IsValid = !errorMessage;
	this.Result = result;
	this.ErrorMessage = errorMessage;
}
ValidResult.prototype.isValid = function()
{
	return this.IsValid;
}
ValidResult.prototype.getResult = function()
{
	return this.Result;
}
ValidResult.prototype.getError = function()
{
	return this.ErrorMessage;
}

function MflowGateway() { }
var G = MflowGateway;
G.getJson = function(url, onSuccessFn, onErrorFn)
{
	$.ajax(
	{
		url: url,
		type: "GET",
		dataType: "json",
		success: onSuccessFn,
		error: function(xhr, message, ex)
		{
			onErrorFn(message);
		}
	});
};
G.postJson = function(url, onSuccessFn, options)
{
	var options = options || {};
	$.ajax(
	{
		url: url,
		type: "POST",
		contentType: "application/x-www-form-urlencoded",
		dataType: "json",
		data: options.data,
		success: onSuccessFn,
		error: function(xhr, message, ex)
		{
			if (options.onError) onError(message);
		}
	});
};

G.getValidResult = function(url, onSuccessFn, onErrorFn)
{
	G.getJson(url, 
		function(json)
		{
			onSuccessFn(new ValidResult(json.Result, json.ErrorMessage));
		},
		onErrorFn
	);
}

G.isValid = function(url, onSuccessFn, onErrorFn)
{
	G.getValidResult(url,
		function(validResult)
		{
			if (validResult.isValid())
				onSuccessFn();
			else
				onErrorFn(validResult.getError());
		},
		onErrorFn
	);
}