/*
	FORM<->XML tools javascript library
	copyright 2007 by Sandro Rossetti - sandro.rossetti@gmail.com
	
	Can be freely used and distibuted as long as this comment in included unchanged
*/

function lookupSimpleElement(name, elements) {
	for ( nnn=0; nnn<elements.length; nnn++ ) {
		if ( elements[nnn].getAttribute("name") == name )
			return elements[nnn];
	}
	return null;
}

function lookupCheckboxElement(name, value, elements) {
	for ( nnn=0; nnn<elements.length; nnn++ ) {
		if ( elements[nnn].getAttribute("name") == name && elements[nnn].getAttribute("value") == value )
			return elements[nnn];
	}
	return null;
}

function lookupOptionElement(value, select) {
	if ( select == null )
		return null;
	var options = XML.getElementChildren(select);
	for ( nnn=0; nnn<options.length; nnn++ ) {
		if ( options[nnn].getAttribute("value") == value )
			return options[nnn];
	}
	return null;
}

function documentToForm(frm, formElement) {
	var formname = frm.name;
	if ( formname == null || formname.length == 0 )
		formname = frm.id;
		
	if ( formname == null || formname.length == 0 ) {
		alert("Attenzione, il metodo documentToForm non è compatibile con una unnamed form");
		return;
	}

	//var formElement = doc.documentElement; //XML.getFirstChildByName( doc.documentElement, "form" );
	var elements = XML.getElementChildren(formElement);
	
	{
		var f = formElement.getAttribute("name");
		if ( f == null || f.length == 0 ) {
			alert("Attenizone, documentToForm non è compatibile con una form di destinazione unnamed");
			return;
		}
		
		if ( f != formname ) {
			alert("Attenzione, la form di destinazione: "+formname+" non corrisponde al set di dati del form "+f);
			return;
		}
	}
	
		var n = frm.length;
		for (i = 0; i < n; i++)	{
			if ( typeof frm[i] == 'undefined' )
				continue;
			e 	    = frm[i].name;
			var fieldValue  = frm[i].value;
			var fieldType   = frm[i].type;

			var value = null;
			
			switch ( fieldType ) {
				case 'hidden':			
				case 'text':
				case 'select-one':		
				case 'textarea':		var element = lookupSimpleElement(e, elements);
										if ( element != null )
											frm.elements[i].value = element.getAttribute("formvalue");
										else
											frm.elements[i].value = "";
										break;
				case 'checkbox':		var element = lookupCheckboxElement(e, fieldValue, elements);
										frm.elements[i].checked = element!=null && element.getAttribute("formvalue") == "1";
										break;
				case 'select-multiple': var select = lookupSimpleElement(e, elements);
										var options = frm.elements[i].options;
										for ( h=0; h<options.length; h++ ) {
											var element = lookupOptionElement(options[h].value, select);
											options[h].selected = element!=null && element.getAttribute("formvalue") == "1";
										}
										if ( typeof frm.elements[i].onchange != 'undefined' )
											frm.elements[i].onchange();
										break;
				case 'button':
				case 'submit':			
										break;
				case 'radio':			var element = lookupCheckboxElement(e, fieldValue, elements);
										frm.elements[i].checked = element!=null && element.getAttribute("formvalue") == "1";
										if ( typeof frm.elements[i].onclick != 'undefined'  && frm.elements[i].checked )
											frm.elements[i].onclick();
										break; 
				default:				alert("Attenzione il tipo di campo: "+fieldType+" non è gestito!");
			}
		}
	return;
}



function formToDocument(frm) {
	if ( frm == null )
		return null;
		
		var formname = frm.name;
		if ( formname == null || formname.length == 0 )
			formname = frm.id;
			
		if ( formname == null || formname.length == 0 ) {
			alert("Attenzione, il metodo formToDocument non e compatibile con una unnamed form");
			return;
		}

		var doc = dojo.dom.createDocument();
		var formElement = XML.createNode("form", false, false, doc);
		doc.appendChild(formElement);
		
//		doc.documentElement.appendChild(formElement);
		formElement.setAttribute("name",formname);

		var n = frm.length;
		for (i = 0; i < n; i++)	{
			if ( typeof frm[i] == 'undefined' || typeof frm[i].type == 'undefined')
				continue;
			e 	    = frm[i].name;
			var fieldValue  = frm[i].value;
			var fieldType   = frm[i].type;

			var element = XML.createNode(fieldType, false, false, doc);
			element.setAttribute("name", e);
									
			//alert(e);
			//alert(fieldType);
			//alert(fieldValue);
			
			var value = null;
			
			switch ( fieldType ) {
				case 'textarea':		if ( frm.elements[e] != null ) {
											value = frm.elements[e].value.length > 0?frm.elements[e].value:null;
											value = value.replace(/[\n]/g, '<br/>');
										}
										break;
				case 'hidden':			
				case 'text':
				case 'select-one':		if ( frm.elements[e] != null ) {
											value = frm.elements[e].value.length > 0?frm.elements[e].value:null;
										}
										break;
										
				case 'checkbox':		element.setAttribute("value", fieldValue);
										value = frm.elements[i].checked==true?"1":null;
										break;	
				case 'select-multiple': {
											var options = frm.elements[i].options;
											for ( o=0; o<options.length; o++ ) {
												var opt = options[o];
												var option = XML.createNode("option", false, false, doc);
												element.appendChild(option);
												option.setAttribute("value", opt.value);													
												option.setAttribute("formvalue", opt.selected?"1":"");													
											}
											formElement.appendChild(element);
										}
				case 'button':
				case 'submit':			break;
										
				case 'radio':			element.setAttribute("value", fieldValue);
										value = frm.elements[i].checked==true?"1":null;
										break;
										/*
										for (x=0; x < frm.elements[e].length; x++) {
											if (frm.elements[e][x].checked)
											{
											index = x
											}
										}
										string = string + index + "\|";
										*/ 
				default:				alert("Attenzione il tipo di campo: "+fieldType+" non è gestito!");
			}
			
			if ( value != null ) {
				element.setAttribute("formvalue", value);
				formElement.appendChild(element);
			}
		}

//alert(XML.serialize(doc));
return formElement;
}

