// JavaScript file

if(typeof PiCom == 'undefined')
	PiCom = {};
	
PiCom.form = {};
PiCom.form._IMPL = {};

PiCom.form._IMPL.defaults = {
	url: null,
	dom: null,
	hideSections: [],
	hideFields: [],
	onFieldClick: null,
	onFieldChange: null,
	onFormSubmit: null,
	useXslt: true
}


PiCom.form.create = function(options) {

	var form = {};
	form.options = $.extend(true, {}, PiCom.form._IMPL.defaults, options);
	if(options.dom == null && options.url != null) {
		
		$.ajax({
			
			url: options.url,
			type: "get",
			dataType: "xml",
			success: function(content, message, xhr) {
				
			form.dom = $(content).children();
			
			/*if(xhr.responseXML)
				form.dom = xhr.responseXML.firstChild;
			else
				form.dom = content;
				*/
			PiCom.form._IMPL.init(form);
		}});
		
	} else if(options.dom != null) {
		form.dom = options.dom;
		PiCom.form._IMPL.init(form);
	}

	return form;
}

PiCom.form._IMPL.init = function(form) {
	
	form.fields = [];

	if(form.options.useXslt)
		form.dom = $(formxslt.init(form.dom));
		
	form.fields = [];
	$(form.dom).find(".field").each(function() {
		
		var field = {};
		form.fields.push(field);
		
		var fieldtype = $(this).data('type');
		field.type = fieldtype;
		field.name = $(this).data('name');
		field.dom = $(this);
		
		if(fieldtype == undefined)
			return;
			
		if(PiCom.form._IMPL.types[fieldtype] !== undefined)
			field.impl = PiCom.form._IMPL.types[fieldtype];
		
		field.validation = [];
		$(this).find('.Validation').each(function() {
			field.validation.push({
				type: $(this).data('type'),
				value: $(this).data('value'),
				message: $(this).text()
			});
		});
		field.error = $(this).find('.FormFieldError')
		field.el = $(this).find('.FormElement');
	});
	
	if(typeof form.options.onLoad == 'function')
		form.options.onLoad.call(form);
		
	$(form.dom).submit(function(event) {
		event.preventDefault();
		PiCom.form._IMPL.getFormValidation.call(form);
		return false;
	});
}


PiCom.form._IMPL.getFormValidation = function() {

	var error = false;
	for(var i in this.fields) {
		if(!PiCom.form._IMPL.getFieldValidation.call(this, this.fields[i]))
			error = true;
	}
	
	if(!error)
		PiCom.form._IMPL.performAction.call(this);
}

PiCom.form._IMPL.getFieldValidation = function(field) {
	
	var error = PiCom.form._IMPL.getFieldError.call(this, field);
	
	if(!error)
		field.dom.removeClass("FieldError");
	else {
		field.dom.addClass("FieldError");
		field.error.text(error);
		return false;	
	}

	return true;
}

PiCom.form._IMPL.getFieldError = function(field) {
	
	for(var i = 0; i < field.validation.length; i++) {
		
		if(field.validation[i].type == null && field.el.val() == "")
			return field.validation[i].message;
		
		if(field.validation[i].type == 'regex' && ! new Regex(field.validation[i].value).match(field.el.val())) 
			return field.validation[i].message;
			
		if(field.validation[i].type == 'format' && ! new Regex(field.impl.format).match(field.el.val()))
			return field.validation[i].message;
	}

	return false;
}

PiCom.form._IMPL.performAction = function() {
	
	var form = this;
	var actions = this.dom.find('div.Action');

	for(var i = 0; i < actions.length; i++) {
		
		var action = $(actions[i]);
		var actionType = action.data("type");
		
		switch(actionType) {
			
			case "email":
			
				var emails = [],
					subject,
					email,
					success,
					error;
				
				var params = action.children('div.ActionParam');
				
				for(var j = 0; j < params.length; j++) {
					var param = $(params[j]);
					var paramName = param.data("name");
					
					


					switch(paramName) {
						
						
						case 'email':
							emails.push(unescape(param.get(0).childNodes[0].nodeValue));
						break;
						
						case 'subject':
							subject = unescape(param.get(0).childNodes[0].nodeValue);
						break;
						
						case 'template':
						
							email = unescape(param.get(0).childNodes[0].nodeValue);
						
							for(var i = 0; i < form.fields.length; i++) {
								var name = form.fields[i].name;
								var value = form.fields[i].el.val();
								
								if(form.fields[i].type == 'checkbox') {
									
									value = [];
									form.fields[i].dom.find('input[type="checkbox"]:checked').each(function() {
										value.push($(this).parent().text());
									});
									
									value = value.join(", ");
								}
								
								email = email.replace("%" + name, value);
							}
						break;
						
						case 'success':
							form.dom.find(".Form").hide();
							success = unescape(param.get(0).childNodes[0].nodeValue);
						break;
						
						case 'error':
							error = unescape(param.get(0).childNodes[0].nodeValue);
						break;

					}
				}

				$.ajax({
					url: './libs/forms/formimpl.php',
					data: { type: 'email', emails: emails, subject: subject, email: email },
					type: "post",
					success: function(data) {
						//if(success != null)
						
							form.dom.find('.FormAction.Ok').show().html(success);
					},
					
					error: function(data) {
					//	if(error != null)
							form.dom.find('.FormAction.Error').show().html(error);
					}
				});
			
			break;
			
			
			
			
		}
		
		
		
	}
	
}

PiCom.form._IMPL.types = []; 

