/*
 * Transforms an XML form to an HTML form
 */

var formxslt = new Object();
formxslt.init = function(dom) {


	var html = [];
	var dom = $(dom);
	var sections = $(dom).children('sections').children();
	html = html.concat(['<form ', 
						XML.util.attrAsAttr(dom, "name"), 
						XML.util.attrAsAttr(dom, "enctype"),
						'><div class="FormAction Ok"></div><div class="FormAction Error"></div><div class="Form"><div class="Title">', XML.util.getTitle(dom), '</div>']);
	
	for(var i = 0; i < sections.length; i++)
		html = html.concat(formxslt.parseSection(sections[i]));
	
	var actions = dom.find('actions').children();
	
	html.push('<div class="FormActions">');
	
	for(var i = 0; i < actions.length; i++) {
		
		html = html.concat(['<div class="Action"', XML.util.attrAsData(actions[i], "type"), '>']);
		
		var params = $(actions[i]).children('actionparam');
		for(var j = 0; j < params.length; j++) {
			html = html.concat(['<div class="ActionParam" ', XML.util.attrAsData(params[j], "name"), '>', escape(params[j].childNodes[0].nodeValue), '</div>']);		
		}
		html.push('</div>');
	}
	
	
	html = html.concat(['</div></form>']);
	
	return html.join("");
}

formxslt.parseSection = function(dom, options) {
		
	var dom = $(dom);
	var html = [];
	var sectionTitle = XML.util.getTitle(dom);
	html = html.concat(['<div class="SubTitle">', XML.util.getTitle(dom), '</div>']);
	html.push('<table cellpadding="0" cellspacing="0" class="FormXML">');
	var fields = dom.children('field');
	
	var totalSpan = XML.util.attr(dom, "colspan");
	var currentSpan = 0;
	
	for(var i = 0; i < fields.length; i++) {
		
		if(currentSpan == 0)
			html.push('<tr class="FormFieldXML field" ' + XML.util.attrAsData(fields[i], "type") + XML.util.attrAsData(fields[i], "name") + '>');
		
		var colspan = XML.util.attr(fields[i], "colspan");
		if(colspan == 0)
			colspan = 1;
		currentSpan += parseInt(colspan);
		html = html.concat(formxslt.parseField(fields[i]));
		
		if(currentSpan >= totalSpan) {
			currentSpan = 0;
			html.push('</tr>');
		}
	}
	html.push('</table>');
	return html;
}


formxslt.parseField = function(field) {
	
	var html = [];
	var field = $(field);
	var fieldDom = [];
	var fieldValue = [];
	
	var val;
	if((val = XML.util.attr(field, "value")) != null)
		fieldValue.push(val);
	else {
		field.children('values').children().each(function() {
			fieldValue.push($(this.text()));
		});
	}
	
	switch(XML.util.attr(field, "type")) {
		
		case "email":
		case "string":
			fieldDom = fieldDom.concat(['<input class="FormElement" type="text"', XML.util.attrAsAttr(field, "name"), 'value="', fieldValue[0], '" />']);
		break;
		
		case "text":
			fieldDom = fieldDom.concat(['<textarea class="FormElement"', XML.util.attrAsAttr(field, "name"), '>', fieldValue[0], '</textarea>']);
		break;
		
		case "captcha":
			fieldDom = fieldDom.concat(['<img class="captcha" /><input type="text" ', XML.util.attrAsAttr(field, "name"), ' class="FormElement"><a class="reloadCaptcha">Nouvelle image</a>']);
		break;
		
		case 'submit':
			fieldDom = fieldDom.concat(['<input class="FormElement" type="submit" ', XML.util.attrAsAttr(field, "value"), ' value="', XML.util.getLabel(field), '" />']);
		break;
		
		case 'checkbox':
		
			
			var options = field.children('options').children('option');
			for(var i = 0; i < options.length; i++) {
				var option = options[i];
				var optionValue = XML.util.attr(option, "value");
				var optionLabel = XML.util.getLabel(option);
				fieldDom = fieldDom.concat(['<div class="FormElementCheckbox FormElement"><input type="checkbox" name="', XML.util.attr(field, "name"), '[', optionValue, ']"> ', optionLabel, '</div>']);	
			}  

		break;
	}
	
	html = html.concat(['<td class="FormFieldLabel"', XML.util.attrAsAttr(field, "colspan"), '>', (XML.util.attr(field, 'hide-label') == 1 ? '' : XML.util.getLabel(field)), '</td><td>', fieldDom.join("")]);
	var validations = [];
	field.children('validations').children().each(function() {
		validations = validations.concat(['<div class="Validation" ', XML.util.attrAsData(this, "type"), XML.util.attrAsData(this, "value"), '>', XML.util.getLabel(this), '</div>']);
	});
	
	html.push('<div class="FormFieldError"></div>');
	html.push('<div class="FormFieldValidations">');
	html = html.concat(validations);
	html.push('</div></td>');
	
	return html;
}

/*
 * XML functions
 */

XML = new Object();
XML.util = new Object();
XML.lang = 'fr';

XML.util.attr = function(dom, name) {
	return (name = $(dom).attr(name)) != undefined ? name : "";
} 

XML.util.attrAsData = function(dom, name, forcedname) {
	var val = XML.util.attrAsAttr(dom, name, forcedname);
	if(val == "")
		return "";
	return ['data-', val].join("");
}

XML.util.attrAsAttr = function(dom, name, forcedname) {
	var attrname = name;
	if(forcedname)
		attrname = forcedname;
	var val = XML.util.attr(dom, name);
	if(val == "")
		return "";
		
	return [attrname, '="', val, '" '].join("");
}

XML.util.getTitle = function(dom) {
	return XML.util.getLabel($(dom).children('title'));
}

XML.util.getLabel = function(dom) {
	return $(dom).children('label').children(XML.lang).text();
}

XML.util.xmlToString = function(data) {
	
	var xml;
	if ( window.ActiveXObject ) { // IE6+
			//xml = new ActiveXObject( "Microsoft.XMLDOM" );
			//xml.async = "false";
			//xml.loadXML(data);
			return data.xml;
			
		} else { // Standard
			return (new XMLSerializer()).serializeToString(data);					
		}
		
	return xml;
}
