﻿if (typeof(Prototype) == "undefined" || parseFloat(Prototype.Version) < 1.6)
	alert("Уеб форми се поддържа от prototype 1.6+");

var webforms2 = {};

document.observe("dom:loaded", function() {
	var testelement = $(new Element("input", { type: "text" })).setStyle({ display: "none" });

	Object.extend(webforms2, {
		date: testelement.writeAttribute("type", "date").type == "date",
		email: testelement.writeAttribute("type", "email").type == "email",
		pattern: testelement.writeAttribute("pattern", "pattern").pattern == "pattern" && !Prototype.Browser.IE,
		placeholder: testelement.writeAttribute("placeholder", "placeholder").placeholder == "placeholder" && !Prototype.Browser.IE,
		required: testelement.writeAttribute("required", "required").required !== undefined && !Prototype.Browser.IE
	});
	testelement = null;
	webforms2.form = $$("form")[0];

	if (!webforms2.form)
		return;

	if (!webforms2.placeholder) {
		$$("textarea[placeholder],input[placeholder]").each(function(placeholder) {
			placeholderMethods.addPlaceholder(placeholder);
		});
		
		$$("form").each(function(form)	{
			form.observe("submit", function(event)	{
				event.element().select("input[placeholder],textarea[placeholder]").each(function(input)	{
					placeholderMethods.removeText(input);
				});
			});
		});
	}

	if (!webforms2.required) {
		$$("input[required]").each(function(required) {
			inputExtension.required.call(required);
			required.validate = webforms2.validate;
			Validation.add.call(required, Validation.required);
		});
	}

	if (!webforms2.date) {
		$$("input[type=date]").each(function(date) {
			inputExtension.date.call(date);
			date.validate = webforms2.validate;
			Validation.add.call(date, Validation.pattern);
		});
	}
	if (!webforms2.email) {
		$$("input[type=email]").each(function(email) {
			inputExtension.email.call(email);
			email.validate = webforms2.validate;
			Validation.add.call(email, Validation.pattern);
		});
	}
	if (!webforms2.pattern) {
		$$("input[pattern]").each(function(pattern) {
			inputExtension.pattern.call(pattern);
			pattern.validate = webforms2.validate;
			Validation.add.call(pattern, Validation.pattern);
		});
	}

	if (!webforms2.required) {
		webforms2.form.observe("submit", function(event) {
			var form = event.element();

			var inputs = form.getInputs();

			var valid = true;

			for (var i = 0; i < inputs.length; i++) {
				var input = inputs[i];

				if (input.validate) {
					if (!input.validate()) {
						event.stop();
						return false;
					}
				}

				if (input.getAttribute("placeholder") == input.value)
					input.value = "";
			}

			var passwords = webforms2.form.select("input[type=password]");

			if (passwords.length == 2 && passwords[0].value != passwords[1].value) {
				var errorMessage = passwords[1].getAttribute("message");
				if (errorMessage)
					Validation.showError.call(passwords[1], errorMessage);
				event.stop();
				return false;
			}
		});
	}
	else {
		webforms2.form.observe("submit", function(event) {
			var passwords = webforms2.form.select("input[type=password]");

			if (passwords.length == 2 && passwords[0].value != passwords[1].value) {
				if (webforms2.pattern) {
					passwords[1].pattern = passwords[0].value;
					passwords[1].checkValidity();
				}
				else {

				}

				event.stop();
				return false;
			}
			return true;
		});

		webforms2.form.observe("invalid", function(event) { opera.postError(event.element().id); say.call(event.element()); });
	}

	document.observe("click", clearError);
});

Event.observe(window, "unload", function() {
	webforms2.element = null;
	webforms2.form = null;
});

var inputExtension = {
	date: function() {
		var calendar = new Element("img", { src: "_img/calendar.gif", alt: "Календар" });
		calendar.observe("click", showCalendar.bind(window, this.id, "%Y-%m-%d"));
		Element.insert(this, { after: calendar });
		this.patterns = /^\d{4}-\d{2}-\d{2}$/;
	},
	email: function() {
		this.patterns = new RegExp(/^[\w\-]+\.*[\w\-]+@[\w\-]+\.[a-zA-Z]+$/);
	},
	required: function() {
		this.required = true;
	},
	pattern: function() {
		this.patterns = new RegExp(this.getAttribute("pattern"));
	}
}

var Validation = {
	required: function(nomessage) {
		var valid = false;
		
		switch(this.type)
		{
			case "checkbox":
				valid = this.checked;
				break;
			case "select-one":
				valid = this.value != "0";
				break;
			default:
				valid = placeholderMethods.getValue(this) != "";
				break;
		}

		if (!valid && !nomessage)
			Validation.showError.call(this, "Моля, попълнете полето");

		return valid;
	},
	pattern: function(nomessage) {
		var valid = this.patterns.test(this.value);

		if (!valid && !nomessage)
			Validation.showError.call(this, this.getAttribute("message"));

		return valid;
	},
	showError: function(message) {
		var pos = this.cumulativeOffset();
		pos[1] += this.offsetHeight;

		var error = new Element("div", { id: "error" }).update(message);
		error.style.position = "absolute";
		error.style.left = pos[0] + "px";
		error.style.top = pos[1] + "px";
		$$("body")[0].insert(error);
	},
	add: function(method) {
		if (this.validator === undefined)
			this.validator = [];

		this.validator.push(method);
	}
};

webforms2.validate = function(nomessage) {
	if (this.validator !== undefined) {
		for (var i = 0; i < this.validator.length; i++) {
			if (!this.validator[i].call(this, nomessage))
				return false;
		}
	}

	return true;
}
function extendToEmailInput(email) {
	inputExtension.email.call(email);
	email.validate = webforms2.validate;
	Validation.add.call(email, Validation.pattern);
	
	return email;
}
function extendRequiredInput(required) {
	inputExtension.required.call(required);
	required.validate = webforms2.validate;
	Validation.add.call(required, Validation.required);
	
	return required;
}

placeholderMethods = {
	addText: function(element)	{
		if ($(element).value == "") {
			element.addClassName("placeholder");
			element.value = element.getAttribute("placeholder"); ;
		}
	},
	removeText: function(element)	{
		var text = $(element).getAttribute("placeholder");
		if (element.value == text) {
			element.removeClassName("placeholder");
			element.value = "";
		}
	},
	addPlaceholder: function(element)	{
		if(!webforms2.placeholder)
			this.customPlaceholder(element);
			
		return element;
	},
	customPlaceholder: function(element)	{
		placeholderMethods.addText($(element));
						
		element.observe("focus", function(event) {
			placeholderMethods.removeText(event.element());
		});
		element.observe("blur", function(event) {
			placeholderMethods.addText(event.element());
		});
	},
	updatePlaceholder: function(element, text)	{
		element.setAttribute("placeholder", text);
		if(!webforms2.placeholder && element.hasClassName("placeholder"))
			element.value = text;
	},
	updateValue: function(element, value)	{
		element.value = value;
		if(element.getAttribute("placeholder") != "")	{
			if(element.value == "")
				placeholderMethods.addText(element);
			else
				element.removeClassName("placeholder");
		}
	},
	getValue: function(element)	{
		var value = $(element).value;
		if(!webforms2.placeholder && value == element.getAttribute("placeholder"))
			value = "";
			
		return value;
	}
};

function clearError() {
	var error = $("error");
	if (error)
		error.remove();
}

function say() {
	var message = this.validationMessage;

	if (this.validity.valueMissing) {
		this.setCustomValidity("Моля, въведете стойност");
	}
	else if (this.validity.typeMismatch) {
		this.setCustomValidity(this.getAttribute("message"));
	}
	else if (this.validity.patternMismatch) {
		this.setCustomValidity(this.getAttribute("message"));
	}
	else/* if (this.validity.customValidity)*/{
		this.setCustomValidity(/*message*/"");
	}
}
