﻿var SubmitAction = { None:0, Submit:1, Upload:2, Confirm:3, FullSubmit:4 };
var SuccessAction = { Display:0, Redirect:1, Reset:2, Refresh:3, Back:4, Custom:5 };
var FailureAction = { Display:0, Redirect:1, Reset:2, Refresh:3, Back:4 };

var TinyMCEOptions =
{
	script_url: '/Content/JS/tiny_mce/tiny_mce.js',
	theme: "advanced",
	plugins: "fullscreen,inlinepopups,preview",
	convert_urls: false,
	relative_urls: false,
	remove_script_host: false,
	theme_advanced_buttons1: "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,formatselect,fontselect,fontsizeselect",
	theme_advanced_buttons2: "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,image,|,forecolor,backcolor,|,charmap,hr,|,code,preview,fullscreen",
	theme_advanced_buttons3: "",
	theme_advanced_toolbar_location: "top",
	theme_advanced_toolbar_align: "left",
	theme_advanced_statusbar_location: "none"
};

var ValidationTypes = 
{
	None:{Expression:null,Length:-1},
	Number:{Expression:/^-?[0-9]*(\.)?[0-9]*$/,Length:-1},
	Integer:{Expression:/^[0-9]*$/,Length:-1},
	Name:{Expression:/^[\w,. -]*$/,Length:128},
	Identifier:{Expression:/^[\w@#$%^&*=+| ,\.;:?! -]*$/,Length:128},
	Email:{Expression:/^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]{2,4}$/,Length:128},
	Password:{Expression:/^\S{5,}$/,Length:64},
	URL:{Expression:/(^https?:\/\/[-:\d\w\.]+)?(\/[-\w\.]*)*$/,Length:256},
	Subdomain:{Expression:/^[A-Za-z0-9_-]+$/,Length:64},
	Phone:{Expression:/^[A-Za-z0-9() -]+$/,Length:64},
	Street:{Expression:/^[\w# ,\. -]+$/,Length:256},
	City:{Expression:/^[\w# ,\. -]+$/,Length:256},
	State:{Expression:/^[\w# ,\. -]+$/,Length:64},
	PostalCode:{Expression:/^[\w# ,\. -]+$/,Length:32},
	CreditCard:{Expression:/^[0-9]{15,16}$/,Length:32},
	Color:{Expression:/^#[ABCDEFabcdef0-9]{6}$/,Length:8}
};

var ValidationErrors =
{
	Required:"You must enter a value for {0}.",
	Length:"The value for {0} is too long.",
	Expression:"The value for {0} is not in the correct format."
};

jQuery.fn.selectAll = function(selector)
{
	this.change(function()
	{
		var checkboxes = $(selector);
		if (this.checked)
			checkboxes.attr("checked", "checked");
		else
			checkboxes.removeAttr("checked");
	});

	return this;
};

jQuery.fn.imageSelector = function(text)
{
	this.change(function()
	{
		if (this.value == "UPLOAD")
		{
			location = "/Images/Add.aspx"
			return;
		}

		text.val(this.value);
	});
};

var _colorPicker = null;

jQuery.fn.colorPicker = function()
{
	var input = this;
    $('<div/>').farbtastic(this).remove();

    this.click(function()
    {
        if (_colorPicker)
            _colorPicker.remove();

        _colorPicker = $('<div id="FarbtasticPicker" class="farbtasticPicker"></div>');
        _colorPicker.click(function()
        {
            return false;
        });

        $(this).after(_colorPicker);
        _colorPicker.farbtastic($(this));

        return false;
    });

    $('body').click(function ()
    {
        if (_colorPicker)
            _colorPicker.remove();

		input._validate();
        _colorPicker = null;
    });
};

jQuery.fn.submitButton = function(form, submitOnEnter)
{
	this.data("form", form);
	this.data("inputs", []);
	
	this.click(function()
	{
		$(this)._submit();
		return false;
	});

	if (submitOnEnter)
	{
		var button = this;
		form.keypress(function(event)
		{
			var key = event.which ? event.which : event.keyCode;
			if (key == 13)
			{
				button._submit();
				event.preventDefault();
				return false;
			}

			return true;
		});
	}

	return this;
};

jQuery.fn.setSubmitAction = function(submitAction, submitData)
{
	this.data("submitAction", submitAction);
	this.data("submitData", submitData);
	return this;
};

jQuery.fn.setSuccessAction = function(successAction, successData)
{
	this.data("successAction", successAction);
	this.data("successData", successData);
	return this;
};

jQuery.fn.setFailureAction = function(failureAction, failureData)
{
	this.data("failureAction", failureAction);
	this.data("failureData", failureData);
	return this;
};

jQuery.fn.addInput = function(input, validationType, required, displayName)
{
	if (!validationType)
		validationType = ValidationTypes.None;

	this.data("inputs").push(input);
	input.data("validationType", validationType);
	input.data("required", required);
	input.data("displayName", displayName);
	input.change(function()
	{
		$(this)._validate();
	});
	
	return this;
};

jQuery.fn._submit = function()
{
	var data = this.data();

	if (data.submitAction != SubmitAction.None)
	{
		var valid = true;
		for (var i = 0; i < data.inputs.length; i++)
		{
			if (!$(data.inputs[i])._validate())
				valid = false;
		}

		if (!valid)
			return;
	}
		
	this.attr("disabled", "disabled");
	this.addClass("processingButton");
	if (this.attr("type") == "image")
	{
		this.data("previousImage", this.attr("src"));
		this.attr("src", "/Content/Image/processing.gif");
	}

	switch (data.submitAction)
	{
		case SubmitAction.None:
			this._submitComplete(true, "");
			break;

		case SubmitAction.FullSubmit:
			this._doFullSubmit(data.form);
			break;

		case SubmitAction.Submit:
			this._doSubmit(data.form);
			break;
			
		case SubmitAction.Upload:
			this._doUpload(data.form);
			break;
			
		case SubmitAction.Confirm:
			this._doConfirm(data.submitData, data.successData);
			break;
	}
};

jQuery.fn._doConfirm = function(selector, confirmURL)
{
	var ids = [];
	$(selector + ":checked").each(function()
	{
		ids.push(this.value);
	});

	document.location = confirmURL + "?" + $.param({"ids":ids});
};

jQuery.fn._doFullSubmit = function(form)
{
	form.submit();
	
	this.removeAttr("disabled");
	this.removeClass("processingButton");
}

jQuery.fn._doSubmit = function()
{
	var form = this.data("form");
	var callback = this.data("submitData");
	if (callback && (typeof(callback) == "function"))
		callback();

	var button = this;

	$.ajax({
		type: form.attr("method"),
		url: form.attr("action"),
		data: form.serialize(),
		dataType: "json",
		cache: false,
		success: function(data, status, request)
		{
			button._submitComplete(data.status, data.result);
		},
		error: function(request, error, exception)
		{
			button._submitComplete(false, error);
		}
	});
};

jQuery.fn._submitComplete = function(status, result)
{
	if (status)
		this._submitSuccess(result);
	else
		this._submitFailure(result);

	if (!status || (this.data("successAction") != SuccessAction.Redirect))
	{
		this.removeAttr("disabled");
		this.removeClass("processingButton");
		
		if (this.attr("type") == "image")
		{
			this.attr("src", this.data("previousImage"));
		}
	}
};

jQuery.fn._submitSuccess = function(result)
{
	var data = this.data();
	switch (data.successAction)
	{
		case SuccessAction.Display:
			data.successData._setMessage(true, result);
			break;

		case SuccessAction.Redirect:
			location = data.successData.replace("{0}", result);
			break;

		case SuccessAction.Reset:
			if (data.successData)
				data.successData._setMessage(true, result);

			data.form[0].reset();
			break;

		case SuccessAction.Refresh:
			location = data.successData;
			window.location.reload(true);
			break;

		case SuccessAction.Back:
			history.back();
			break;

		case SuccessAction.Custom:
			data.successData(this, result);
			break;
	}
};

jQuery.fn._submitFailure = function(result)
{
	var failureAction = this.data("failureAction");
	var failureData = this.data("failureData");

	switch (failureAction)
	{
		case FailureAction.Display:
			failureData._setMessage(false, result);
			break;

		case FailureAction.Redirect:
			location = failureData.replace("{0}", result);
			break;

		case FailureAction.Reset:
			form.reset();
			failureData._setMessage(false, result);
			break;
	}

	var resultDisplay = this.data("resultDisplay");
	if (resultDisplay)
		resultDisplay._setMessage(false, result);
};

jQuery.fn._setMessage = function(success, message)
{
	this.addClass(success ? "successResult" : "errorResult");
	this.html(message);
};

jQuery.fn._doUpload = function()
{
	var form = this.data("form");
	var uploadForm = this.data("submitData");
	var children = uploadForm.find("input");
	var value = children.val();
	if (!value)
	{
		this._doSubmit();
		return;
	}

	uploadForm.data("button", this);
	uploadForm.data("form", form);

	var div = document.createElement('div');
	div.innerHTML = '<iframe name="UploadFrame"></iframe>';
	var frame = div.firstChild;
	div.removeChild(frame);

	frame.setAttribute('id', "UploadFrame");
	frame.style.display = 'none';
	document.body.appendChild(frame);

	div.innerHTML = '<input type="hidden" name="url" />';
	var field = div.firstChild;
	div.removeChild(field);

	form[0].appendChild(field);

	uploadForm.attr("target", frame.name);

	$(frame)._startUpload(field, this, uploadForm);
};

jQuery.fn._startUpload = function(field, button, uploadForm)
{
	this.data("field", field);
	this.data("button", button);

	uploadForm[0].submit();
};

jQuery.fn._finishUpload = function(filename)
{
	var data = this.data();
	data.field.value = filename;
	data.button._doSubmit();
	$(data.field).remove();
	this.remove();
};

jQuery.fn._validate = function()
{
	var data = this.data();
	if (!data)
		return true;

	var error = this.siblings(".error");
	error.css("visibility", "hidden");
	
	var value = this.val();

	if (data.required && !value)
	{
		error.css("visibility", "visible").html(ValidationErrors.Required.replace("{0}", data.displayName));
		return false;
	}

	if ((data.validationType.Length >= 0) && value && (value.length > data.validationType.Length.length))
	{
		error.css("visibility", "visible").html(ValidationErrors.Length.replace("{0}", data.displayName));
		return false;
	}

	if (data.validationType.Expression && value && !data.validationType.Expression.test(value))
	{
		error.css("visibility", "visible").html(ValidationErrors.Expression.replace("{0}", data.displayName));
		return false;
	}

	return true;
};

jQuery.fn.repeatedTextInput = function(existing, description, name, remove)
{
	this.click(function()
	{
		var deleteLink = $("<a href='#' class='deleteRepeatedLink'>" + remove + "</a>");
		deleteLink.click(function()
		{
			$(this).removeRepeatedItem();
			return false;
		});

		var div = $("<div class='field'></div>");
		div.append("<span class='label'>" + description + "</span><input type='text' name='" + name + "' />");
		div.append(deleteLink);
		div.append("<span class='error'></span></div>");

		$(this).closest("div").append(div);
		return false;
	});

	existing.click(function()
	{
		$(this).removeRepeatedItem();
		return false;
	});
};

jQuery.fn.removeRepeatedItem = function()
{
	this.closest("div").remove();
};

jQuery.fn.repeatedDoubleTextInput = function(existing, description1, description2, name1, name2, remove)
{
	this.click(function()
	{
		var deleteLink = $("<a href='#' class='deleteRepeatedLink'>" + remove + "</a>");
		deleteLink.click(function()
		{
			$(this).removeRepeatedDoubleItem();
			return false;
		});

		var div1 = $("<div class='field'></div>");
		div1.append("<span class='label'>" + description1 + "</span><input type='text' name='" + name1 + "' />");
		
		var div2 = $("<div class='field'></div>");
		div2.append("<span class='label'>" + description2 + "</span><input type='text' name='" + name2 + "' />");
		div2.append("<span class='error'></span></div>");
		
		var repeater = $("<div class='repeater'></div>");
		repeater.append(deleteLink);
		repeater.append(div1);
		repeater.append(div2);

		$(this).closest(".container").append(repeater);
		return false;
	});

	existing.click(function()
	{
		$(this).removeRepeatedItem();
		return false;
	});
};

jQuery.fn.repeatedTextTextAreaInput = function(existing, description1, description2, name1, name2, remove)
{
	this.click(function()
	{
		var deleteLink = $("<a href='#' class='deleteRepeatedLink'>" + remove + "</a>");
		deleteLink.click(function()
		{
			$(this).removeRepeatedDoubleItem();
			return false;
		});

		var div1 = $("<div class='field'></div>");
		div1.append("<span class='label'>" + description1 + "</span><input type='text' name='" + name1 + "' />");
		
		var div2 = $("<div class='field'></div>");
		div2.append("<span class='label'>" + description2 + "</span><textarea rows='10' cols='40' name='" + name2 + "'></textarea>");
		div2.append("<span class='error'></span></div>");
		
		var repeater = $("<div class='repeater'></div>");
		repeater.append(deleteLink);
		repeater.append(div1);
		repeater.append(div2);

		$(this).closest(".container").append(repeater);
		return false;
	});

	existing.click(function()
	{
		$(this).removeRepeatedItem();
		return false;
	});
};

jQuery.fn.removeRepeatedDoubleItem = function()
{
	this.closest(".repeater").remove();
};

jQuery.fn.repeatedTextCheckTextAreaInput = function(existing, description1, description2, description3, name1, name2, name3, remove)
{
	this.click(function()
	{
		var deleteLink = $("<a href='#' class='deleteRepeatedLink'>" + remove + "</a>");
		deleteLink.click(function()
		{
			$(this).removeRepeatedDoubleItem();
			return false;
		});

		var div1 = $("<div class='field'></div>");
		div1.append("<span class='label'>" + description1 + "</span><input type='text' name='" + name1 + "' />");
		
		var div2 = $("<div class='field'></div>");
		div2.append("<span class='label'>" + description3 + "</span><textarea rows='5' cols='40' name='" + name3 + "'></textarea>");
		div2.append("<span class='error'></span>");
		
		var div3 = $("<div class='field'></div>");
		div3.append("<span class='label'></span><input type='hidden' name='" + name2 + "' value='false' /><input type='checkbox' onchange='$(this).prev().val(this.checked);' /><label>" + description2 + "</label>");
		
		var repeater = $("<div class='repeater'></div>");
		repeater.append(deleteLink);
		repeater.append(div1);
		repeater.append(div3);
		repeater.append(div2);

		$(this).closest(".container").append(repeater);
		return false;
	});

	existing.click(function()
	{
		$(this).removeRepeatedItem();
		return false;
	});
};

jQuery.fn.removeRepeatedDoubleItem = function()
{
	this.closest(".repeater").remove();
};
