/**

Author			: Fabio Bonacina
Version			: 1.1.22
Created			: 21/08/2008
Last Modified	: 07/10/2009
Description		: 
	- function to check the response (XML formatted)
	- XML, boolean and string functions
	- form creation
Modifications	: 
	- added field swapping (show/hide) functionality to input[type=checkbox]
	- added date field
	- added new button for the form: 'Done'
	- added cancel_upload option to upload()
	- upload() and gallery() extradata can be functions
	- added maxlength options for input()
	- swapper field can execute functions (toshow and tohide)
	- fixed older calls to xml_* functions
	- fixed select(): it can be chainable even if no items are supplied
	- fixed collectField(): <br /> cut out from textareas
ToDo			: 

**/
function response_check(data){
	/*if(data.documentElement.getElementsByTagName("errors").length>=1 && data.documentElement.getElementsByTagName("extraxml").length>=1){
		return true
	}else{return false}*/
	return ($(data).find('errors').length==1 && $(data).find('extraxml').length==1);
}
function response_extraxml(data){
	if(response_check(data)){
		if($(data.documentElement).find("extraxml").attr("read")==1){
			return data.documentElement.getElementsByTagName("extraxml")[0]
		}
		return null
	}else{
		throw new Error("Formato della risposta del server errata: manca una sezione")
	}
}
function response_errors(data){
	var errors={
		 description: ""
		,level: ""
		,code: 0
	};
	try{
		if(response_check(data)){			
			if($(data.documentElement).find("errors").attr("read")==1){
				errors.description=$(data.documentElement).find("errors > description").text();
				errors.level=$(data.documentElement).find("errors > level").text();
				var found=errors.level.match(/\([0-9]*\)/gi);
				errors.code=found[0].replace(/[\(\)]/gi,"");
				log.info(response_errors.caller===login_verifyCallback);
				if(!isNaN(errors.code)){
					errors.code=Number(errors.code);
					log.debug(errors.code);
				}else{
					errors.code=0;
				}
				if(errors.code==127 && !(response_errors.caller===login_verifyCallback)){
					log.warn("User not logged in");
					return login_logoutDone(data)
				}else{
					log.info("Login")
				}
				return errors
			}
			return null
		}else{
			throw new Error("Formato della risposta del server errata: manca una sezione")
		}
	}catch(e){
		log.error(e.message);
		return {
			 description: e.message
			,level: "JS: response_errors()"
			,code: -999
		}
	}/**/
}

function string_htmlify(text){
	text=text.replace(String.fromCharCode(224),"&agrave;");
	text=text.replace(String.fromCharCode(232),"&egrave;");
	text=text.replace(String.fromCharCode(236),"&igrave;");
	text=text.replace(String.fromCharCode(242),"&ograve;");
	text=text.replace(String.fromCharCode(249),"&ugrave;");
	text=text.replace(String.fromCharCode(39),"&#39;");/**/
	return text
}
function string_2XML(text){
	var q=null;
	if(document.implementation.createDocument){
		q=(new DOMParser()).parseFromString(text,"text/xml");
	}else if(window.ActiveXObject){
		q=new ActiveXObject("Microsoft.XMLDOM")
		q.async="false";
		q.loadXML(text);
	}
	return q;
}
function string_multi(text,element,separator){
	separator=(separator!=null)?separator:"|";
	var tmpArray=new String(text).split(separator);
	switch(typeof element){
		case "string":
			for(var i=0;i<tmpArray.length;i++)
				if(tmpArray[i].indexOf(element)>=0)
					return tmpArray[i];
			break;
		case "number":
			if(element<=tmpArray.length)
				return tmpArray[element];
			break;
		default:
			return tmpArray[0];
	}
	return tmpArray[0];
}


function boolean_check(value){
	if(value==null || value=="undefined")return false;
	if(isNaN(value)){
		switch(typeof value){
			case "string":
				return (value.toLowerCase()!="false")?true:false;break;
			case "boolean":
				return value;break;
			default: return true
		}
	}else{
		return Number(value);
	}	
}

/*
	Funzionalità per l'aggiunta di campi all'editor
*/
function phForm(container,res,languages){
	if(container==null)throw new Error("phForm()::Constructor()\nIl parametro 'container' non può essere null");
	if(res==null)throw new Error("phForm()::Constructor()\nIl parametro 'res' non può essere null");
	this.$container= container;
	this.$column1= null;
	this.$column2= null;
	this.$iframe= null;
	this.$wysiwygs= {};
	this.$multipleselects= {};
	this.wysiwyg= null;
	this.res= res;
	this.uselanguages= (languages!=null)?languages:false;
	return this.Init();
}
phForm.prototype.Init=function(){
	this.$container.empty();
	this.$column1=$("<div></div>").attr({
		 id: "editor_column1"
	}).appendTo(this.$container);
	this.$column2=$("<div></div>").attr({
		 id: "editor_column2"
	}).appendTo(this.$container);
	if(this.uselanguages)this.languages();
	this.input({id: this.res+"_id",type: "hidden",value: 0});
	this.input({id: "iddel",type: "hidden",value: 0});
	this.input({id: "act",type: "hidden",value: 0});
	return this;
}
phForm.prototype.collectFields=function(){
	var values=new Array();
	var currentRadio="";
	$(".collect-me",this.$column1).each(function(){
		switch(this.tagName.toLowerCase()){
			case "input":
				switch(this.type){
					case "checkbox":
						values[this.id]=this.checked?1:0;
						break;
					case "radio":
						if(this.checked){
							currentRadio=this.name;
							values[currentRadio]=this.value;
						}
						break;
					default:
						values[this.id]=this.value;
				}
				break;
			case "textarea":
				values[this.id]=this.value.replace(/<br \/>$|<br\/>$|<br>$/gi,"");
				break;
			case "select":
				var ids="";		
				if(boolean_check($(this).attr("multi"))){
					$(this).children("option").each(function(){
						if(this.selected)ids+=(ids.length>0?",":"")+$(this).attr("value");
					});
				}else{
					ids=this.value;
				}
				values[this.id]=ids;
				break;
			default:break;
		}
	});
	return values;
}
// non appende
phForm.prototype.fieldset=function(params){
	var fieldset=$("<fieldset></fieldset>").attr({id:"f_"+params.id}).addClass("grey");
	$("<label></label>").attr({"for":params.id}).html((params.label!=null)?string_htmlify(params.label):"").appendTo(fieldset);
	$("<p></p>").appendTo(fieldset);
	$("<span></span>").html((params.hint!=null)?string_htmlify(params.hint):"").appendTo(fieldset);
	return fieldset
}
// appende
phForm.prototype.input=function(params){
	var opt={
		 id: null
		,type: "hidden"
		,forceP: false
		,classname: ""
		,readonly: false
		,disabled: false
		,label: null
		,hint: null
		,value: null
		,required: false
		,language: false /* if true create as many input as many languages are active */
		,swap: null /* {"0":['',''], "1":['','']} */
		,maxlength: 0
	}
	opt=$.extend(opt,params);
	if(opt.languages && opt.type=="text"){
		if(this.uselanguages==false)throw new Error("phForm()::input()\nIl form non è stato settato per l'utilizzo delle lingue (uselanguages==false)")
		var inputs=[];
		for(var s in Configuration.languages){
			var tmpID=opt.id+"_"+s;
			var tmpOPT=$.extend([],opt);
			tmpOPT.id=tmpID;
			tmpOPT.hint=opt.hint.replace('[DESCRIPTION]',Configuration.languages[s]);
			inputs[tmpID]=$("<input type='"+tmpOPT.type+"'></input>").attr({
				 id : tmpID
				,value : tmpOPT.value
			})
			.addClass("collect-me")
			.addClass(tmpOPT.classname)
			.addClass(s.toLowerCase());
			if(opt.maxlength){
				inputs[tmpID].attr("maxlength",opt.maxlength);
			}
			switch(typeof tmpOPT.required){
				case "object": if(tmpOPT.required.toString().indexOf(s)>=0)inputs[tmpID].addClass("required");break;
				case "boolean": if(tmpOPT.required)inputs[tmpID].addClass("required");break;
				default: inputs[tmpID].addClass("required");
			}
			if(tmpOPT.readonly)inputs[tmpID].attr({readonly:"true"});
			if(tmpOPT.disabled)inputs[tmpID].attr({disabled:"true"});
			inputs[tmpID].appendTo(this.fieldset(tmpOPT).appendTo(this.$column1).children("p:first"));
		}
		return inputs;			
	}else{
		var input=$("<input type='"+opt.type+"'></input>").attr({
			 id : opt.id
			,value : opt.value
		}).addClass("collect-me").addClass((opt.required)?"required":"").addClass(opt.classname);
		if(opt.readonly)input.attr({readonly:"true"});
		if(opt.disabled)input.attr({disabled:"true"});
		if(opt.maxlength)input.attr("maxlength",opt.maxlength);
		if(opt.type=="checkbox"){
			var fs=this.fieldset(opt).appendTo(this.$column1);
			fs.children("p").remove();
			input.insertAfter(fs.children("label:first"));
			// check if is a swapper field
			if(opt.swap!=null){
				input.bind("click check",function(){
					var toshow=(this.checked)?opt.swap[1]:opt.swap[0];
					var tohide=(this.checked)?opt.swap[0]:opt.swap[1];
					for(var s in toshow){
						if(typeof toshow[s]=="function"){toshow[s]()}else{$('#f_'+toshow[s]).show();}
					}
					for(var s in tohide){
						if(typeof tohide[s]=="function"){tohide[s]()}else{$('#f_'+tohide[s]).hide();}
					}
					
				})
			}
		}else{
			input.appendTo((opt.type=="hidden" && !opt.forceP)?this.$column1:this.fieldset(opt).appendTo(this.$column1).children("p:first"));
		}
		return input;
	}
}

phForm.prototype.languages=function(classname){
	var langs="";
	for(var s in Configuration.languages)langs+=((langs.length>0)?",":"")+s;
	this.input({
		 id: ((classname!=null)?classname:this.res)+"_languages"
		,type: "hidden"
		,value: langs
	});
	this.uselanguages=true;
}
//appende
phForm.prototype.radio=function(params){
	var opt={
		 id: null
		,classname: ""
		,type: "radio"
		,readonly: false
		,disabled: false
		,label: null
		,hint: null
		,values: null
	}
	opt=$.extend(opt,params);
	if(!opt || opt.length<1) return null;
	var container=$("<ul>").addClass("radio").appendTo(this.fieldset(opt).appendTo(this.$column1).children("p:first"));
	var selected=0;
	for(var j in opt.values){
		var _count=0;
		var li=$("<li>").appendTo(container);
		var input=$("<input type=\"radio\" name=\""+opt.id+"\"/>")
			.attr({
				 value: opt.values[j].value
				,checked: opt.values[j].checked
			}).addClass("radio collect-me").appendTo(li);
		li.append(opt.values[j].description);
	}
	return container;
}
// appende
phForm.prototype.textarea=function(params){
	var opt={
		 id 		: null
		,type 		: "normal"
		,classname	: ""
		,label 		: null
		,hint 		: null
		,value		: null
		,required	: false
		,languages	: false
		,buttons	: []
	}
	opt=$.extend(opt,params);
	if(!opt.languages){
		var fs=this.fieldset(opt).appendTo(this.$column1);
		var ta=$("<textarea></textarea>").attr({id:opt.id})
				.addClass("collect-me")
				.addClass((opt.required)?"required":"")
				.insertAfter(fs.children("label:first"));
		ta.attr({"wysiwyg":(opt.type=="wysiwyg"?true:false)});
		if(opt.type=="wysiwyg"){
			var buttons=['bold','italic','underline','strikeThrough','ul'];
			for(var a in opt.buttons){
				buttons.push(opt.buttons[a]);
			}
			
			if(this.$wysiwygs==null){
				this.$wysiwygs=[];
			}
			this.$wysiwygs[opt.id]=new nicEditor({buttonList : buttons}).panelInstance(opt.id);
			fs.children("div:first").css("margin-left","3px");
			fs.children("div:last").css("margin-left","3px");
			var editorMain=$(".nicEdit-main",fs);
			editorMain.addClass(opt.classname).width(editorMain.width()-20);
			/* con IE7 non si può utilizzare nessun editor all'interno di p */
			//fs.children("div:first").wrap("<p class='up'></p>");
			//fs.children("div:last").wrap("<p class='down'></p>");
		}
		return true;
	}else{
		if(this.uselanguages==false)throw new Error("phForm()::input()\nIl form non è stato settato per l'utilizzo delle lingue (uselanguages==false)")
		for(var s in Configuration.languages){
			var tmpID=opt.id+"_"+s;
			var tmpOPT=$.extend([],opt);			
			tmpOPT.id=tmpID;
			tmpOPT.hint=opt.hint.replace('[DESCRIPTION]',Configuration.languages[s]);
			var fs=this.fieldset(tmpOPT).appendTo(this.$column1);
			var ta=$("<textarea></textarea>").attr({id:tmpID})
					.addClass("collect-me")
					.insertAfter(fs.children("label:first"));
			switch(typeof tmpOPT.required){
				case "object": if(tmpOPT.required.toString().indexOf(s)>=0)ta.addClass("required");break;
				case "boolean": if(tmpOPT.required)ta.addClass("required");break;
				default: ta.addClass("required");
			}
			ta.attr({"wysiwyg":(tmpOPT.type=="wysiwyg"?true:false)});
			if(tmpOPT.type=="wysiwyg"){
				var buttons=['bold','italic','underline','strikeThrough','ul'];
				for(var a in tmpOPT.buttons){
					buttons.push(tmpOPT.buttons[a]);
				}
				
				if(this.$wysiwygs==null){
					this.$wysiwygs=[];
				}
				this.$wysiwygs[tmpID]=new nicEditor({buttonList : buttons}).panelInstance(tmpID);
				fs.children("div:first").css("margin-left","3px");
				fs.children("div:last").css("margin-left","3px");
				var editorMain=$(".nicEdit-main",fs);
				editorMain.addClass(tmpOPT.classname)
					.addClass(s.toLowerCase())
					.width(editorMain.width()-20);
			}
		}
		return true;
	}
}
// appende
phForm.prototype.select_optionsLoaded=function(data,status,that,loadoptions){
	var errors=response_errors(data);
	var extraXML=response_extraxml(data);
	if(errors==null){
		
		loadoptions.idField=(loadoptions.idField)?loadoptions.idField:"id";
		loadoptions.descriptionField=((loadoptions.descriptionField)?loadoptions.descriptionField:"description").split(";");
		var items=extraXML.firstChild.childNodes;
		for(var i=0;i<items.length;i++){
			var option=$("<option></option>").attr({
				 value: $(items[i]).find(loadoptions.idField+":first").text()
			}).html(
				(loadoptions.descriptionField.length==1)
					?$(items[i]).find(loadoptions.descriptionField[0]+":first").text()
					:$(items[i]).find(loadoptions.descriptionField[0]+" > language[id="+loadoptions.descriptionField[1].toUpperCase()+"]").text()
				).appendTo(that);
			if(loadoptions.extraFields){
				for(var j in loadoptions.extraFields){
					var value=loadoptions.extraFields[j].value.split(";");
					option.attr(
						loadoptions.extraFields[j].attribute,(value.length==1)
						?$(items[i]).find(value[0]).text()
						:$(items[i]).find(value[0]+' > language[id='+value[1]+']').text()
					);
				}
			}
		}
	}else{
		alert(errors.description+"\n"+errors.level);
	}
}

// types allowed:  normal, multiple, chainable
// load can contain:
//	- data: used to send more data to the page used to retrieve data
//	- idField: XML node used to fill the value attribute
//	- descriptionField: XML node used to fill the description of the option
//					 if it's a language node you can specify wich one to pick (i.e.  description;ita)
//	- extraFields: an array of {attribute,value} that will be added to the option
phForm.prototype.select=function(params){
	var opt={
		 id: null
		,type: "normal"
		,classname: ""
		,label: null
		,hint: null
		,values: null
		,required: false
		,language: false
		,load: null
		,parentId: null
		,parentAttribute: "parent"
		,childAttribute: "value"
	}
	opt=$.extend(opt,params);
	var fs=this.fieldset(opt).appendTo(this.$column1);
	var sel=$("<select></select>")
				.attr({
					 id: opt.id
					,"multi": (opt.type=="multiple"?true:false)
				})
				.addClass("collect-me")
				.addClass((opt.required)?"required":"")
				.appendTo(fs.children("p:first"));		
	if(opt.values!=null && typeof opt.values=="object"){
		for(var i=0;i<opt.values.length;i++){
			$("<option></option>").attr({
				 value: opt.values[i].value
			}).html(opt.values[i].displayValue).appendTo(sel)
		}
		if(opt.type=="chainable")
			sel.selectChain({
				 parentId: opt.parentId
				,parentAttribute: opt.parentAttribute
				,childAttribute: opt.childAttribute
				,onParentChange: opt.onParentChange
			});
	}
	var that=this;
	if(opt.load!=null){
		Configuration.activityMessage+=opt.load.message+" in corso..";
		$.ajax({
			 async: false
			,data: $.extend({
				 session:User.session
				,res:Sections.currentSection.res},opt.load.data)
			,url: opt.load.page
			,type: "post"
			,dataType: "xml"
			,success: function(data,status){
					that.select_optionsLoaded(data,status,sel,opt.load);
					if(opt.type=="chainable")
						sel.selectChain({
							 parentId: opt.parentId
							,parentAttribute: opt.parentAttribute
							,childAttribute: opt.childAttribute
							,onParentChange: opt.onParentChange
						});
				}
		});
	}
	if(opt.load == null && opt.values == null && opt.type == 'chainable'){
		sel.selectChain({
			 parentId: opt.parentId
			,parentAttribute: opt.parentAttribute
			,childAttribute: opt.childAttribute
			,onParentChange: opt.onParentChange
		});
	}
	if(opt.type=="multiple"){
		sel.attr("multiple","multiple").asmSelect({
			 listClass: "asmList container grey"
			,listContainer: this.$column2
			,listDescription: "Elenco degli elementi selezionati. Cliccare su 'remove' per deselezionare."
			,keepAligned: "top"
			/*,debugMode: true*/
		});
		this.$multipleselects[opt.id]=sel;
		this.multipleselect=true;
	}
}
phForm.prototype.upload=function(params){
	var opt={
		 id : null
		,type : "image"
		,extradata : null
		,classname : ""
		,value : 0
		,label : null
		,hint : null
		,required : false
		,url: ""
		,callback: null
		,cancel_upload: true
	}
	opt=$.extend(opt,params);
	if(opt.extradata==null)return null;
	//var fs=this.fieldset(opt).appendTo(this.$column1);
	var input=this.input({
		 id: opt.id
		,type: "hidden"
		,value: opt.value 
		,classname: (opt.required && opt.type=="image")?"numeric_id":""
		,forceP: true
		,required: opt.required
		,label: opt.label
		,hint: opt.hint
	});
	var fs=input.parents("fieldset:first");
	var info=$("<div></div>").insertBefore(fs.children("p:first"));
	if(opt.type=="image"){
		info.css({
			 "height":"65px"
			,"margin-top":"5px"
		});
		$("<img>").attr({
			 id: opt.id+"_showuploaded"
			,src: (opt.url.length>0)?opt.url:"skin/noimage.jpg"
		}).css({
			 "border": "1px solid #808080"
			,"width": "60px"
			,"height": "60px"
		})
		.appendTo(info);
	}else{
		info.attr({id: opt.id+"_showuploaded"})
			.css({
				"height":"25px"
				,"margin-top":"5px"
			}).html((opt.url.length>0)?opt.url:"Nessun file caricato");
	}
	var bc=$("<div></div>")
		.css({
			 "height":"30px"
			,"margin":"5px 0 0 5px"
		})
		.insertAfter(fs.children("p:first"));
	//build new iframe
	var iframe=$("<iframe></iframe>").attr({
		 src: "upload.aspx"
		,id: opt.id+"_frame"
	}).css({
		"height": "22px"
		,"width":"100%"
	}).addClass("border1").appendTo(fs.children("p:first"));
	this.$iframe=iframe;
	$("<button></button>").attr({id : opt.id+"_submit"})
		.addClass("button grey left")
		.appendTo(bc)
		.data("options",opt)
		.click(function(){
			//$.activityShow("Upload del documento in corso..");			
			var mid=$.activityAddMessage("Upload del documento in corso..");
			var q=document.getElementById(iframe.attr("id"));
			var qs="";//dati aggiuntivi per il trattamento dell'immagine/limitazione dimensione file/extradati per la risorsa
			for(items in $(this).data("options").extradata){
				qs+=(qs.indexOf("?") != -1 ? "&" : "?")+items+"="+((typeof $(this).data("options").extradata[items] == 'function')?$(this).data("options").extradata[items]():escape($(this).data("options").extradata[items]))
				//qs+=(qs.indexOf("?") != -1 ? "&" : "?")+items+"="+escape($(this).data("options").extradata[items])
			}
			qs+="&session="+User.session+"&callback="+$(this).data("options").callback
			q.contentWindow.send(
				 qs
				,function(){
					//$.activityHide();
					$.activityRemoveMessage(mid);
					alert("Selezionare un documento da caricare.");
				}
			);
			return false;/**/
		}).html((opt.type=="image"?"Carica immagine":"Carica documento"));
	if(opt.cancel_upload){
		$("<button></button>").attr({id : "upload_cancel"})
			.addClass("button grey right")
			.appendTo(bc)
			.click(function(e){
				if(confirm("Sei sicuro di voler eliminare il documento precedentemente caricato ?")){
					if(opt.type=="image"){
						$("#"+opt.id+"_showuploaded").attr({"src":"skin/noimage.jpg"});
					}else{
						$("#"+opt.id+"_showuploaded").html("Nessun documento caricato");
					}
					$("#"+opt.id).val((opt.type=="image"?0:""));
				}
				return false;
			})
			.html((opt.type=="image"?"Nessuna immagine":"Nessun documento"));
	}
	$("<div class='clear'>&nbsp;</div>").appendTo(bc);
	return fs;
}
phForm.prototype.gallery=function(params){
	var opt={
		 id : null
		,type : "image"
		,extradata : null
		,classname : ""
		,value : 0
		,label : null
		,hint : null
		,required : false
		,url: ""
		,callback: null
	}
	opt=$.extend(opt,params);
	if(opt.extradata==null)return null;
	var input=this.input({
		 id: opt.id+"_itemid"
		,type: "hidden"
		,value: opt.value 
		,classname: ""
		,forceP: true
		,required: opt.required
		,label: opt.label
		,hint: opt.hint
	});
	var fs=input.parents("fieldset:first");
	var ul=$("<ul></ul>").attr("id",opt.id+"_list").appendTo(fs.children("p:first"));
	ul.addClass("gallery");
	var bContainer=$("<div></div>").addClass("commands").insertAfter(fs.children("p:first"));
	var iContainer=$("<div></div>").addClass("commands").insertAfter(fs.children("p:first"));

	//creo un nuovo iframe
	var iframe=$("<iframe></iframe>").attr({
		 src: "upload.aspx"
		,id: opt.id+"_frame"
	}).css({
		"height": "22px"		
	}).appendTo(iContainer);
	this.$iframe=iframe;
	$("<button></button>").attr({id : opt.id+"_submit"})
		.addClass("button grey left")
		.appendTo(bContainer)
		.data("options",opt)
		.click(function(){
			//$.activityShow("Upload dell&#39;immagine in corso..");			
			var mid=$.activityAddMessage("Upload immagine in corso..")
			var q=document.getElementById(iframe.attr("id"));
			var qs="";//dati aggiuntivi per il trattamento dell'immagine/limitazione dimensione file/extradati per la risorsa
			for(items in $(this).data("options").extradata){
				qs+=(qs.indexOf("?") != -1 ? "&" : "?")+items+"="+((typeof $(this).data("options").extradata[items] == 'function')?$(this).data("options").extradata[items]():escape($(this).data("options").extradata[items]))
				//qs+=(qs.indexOf("?") != -1 ? "&" : "?")+items+"="+escape($(this).data("options").extradata[items])
			}
			//	parametri extra per gestire la gallery
			qs+="&gallery=1&gallery_item_id="+$("#"+opt.id+"_itemid").val();
			//
			qs+="&session="+User.session+"&callback="+$(this).data("options").callback;
			q.contentWindow.send(
				 qs
				,function(){
					//$.activityHide();
					$.activityRemoveMessage(mid);
					alert("Selezionare un&#39;immagine da caricare.");
				}
			);
			return false;/**/
		}).html("Carica immagine");
	return ul;
}
// set extradata.res => resource to query
phForm.prototype.correlations=function(params){
	var opt={
		 id : null
		,extradata : null
		,type: "suggest"
		,classname : ""
		,value : 0
		,label : null
		,hint : null
		,required : false
		,url: ""
		,callback: null
	}
	opt=$.extend(opt,params);
	if(opt.extradata==null)return null;
	// creating container for 
	var input=this.input({
		 id: opt.id+"_itemid"
		,type: "hidden"
		,value: opt.value 
		,classname: ""
		,forceP: true
		,label: opt.label
		,hint: opt.hint
		,disabled: opt.disa
	});
	var fs=input.parents("fieldset:first");
	var ul=$("<ul></ul>").attr("id",opt.id+"_list").appendTo(fs.children("p:first"));
	ul.addClass("multi_items");
	var iContainer=$("<div></div>").addClass("commands").insertAfter(fs.children("p:first"));
	//appending suggest box
	//cache and subsetmatching disabled. TODO: modify matchSubset in autocomplete.js
	var suggest=$("<input type='text'></input>")
		.attr({
			 id : opt.id+"_suggest"
			,disabled : opt.disabled
		})
		.autocomplete(
			"provider.aspx",{
			extraParams : {res: opt.extradata.res, req: opt.extradata.req}
			,formatResult : opt.extradata.formatResult
			,formatMatch : opt.extradata.formatMatch
			,formatItem : opt.extradata.formatItem/**/
			,cacheLenght: 1
			,matchSubset: false
			,dataType: "json"/**/
		}).result(function(event, data, formatted){if(opt.extradata.result) opt.extradata.result(event, data, formatted);})
		.appendTo($("<p>").appendTo(iContainer));
	return ul;
}
phForm.prototype.date_and_time=function(params){
	var opt={
		 id : null
		,type: "date"
		,classname : ""
		,value : 0
		,label : null
		,hint : null
		,required : false
		,callback: null
	}
	opt=$.extend(opt,params);
	var real_input=this.input({
		 id: opt.id
		,type: "hidden"
		,value: opt.value 
		,classname: "date"
		,forceP: true
		,required: opt.required
		,label: opt.label
		,hint: opt.hint
	});
	var fs=real_input.parents("fieldset:first");
	var input=$("<input type='text'></input>").attr("id",opt.id+"_masked").appendTo(fs.children("p:first"));
	//input.val(""+(day<10?"0"+day:day)+(month<10?"0"+month:month)+year);
	input.mask("99/99/9999");
	input.bind("masked.blur",function(event,a){
		//real_input.val(a.replace(/\//g,"")+"0000");
		var d=a.replace(/\//g,"");
		real_input.val(d.substr(4,4)+d.substr(2,2)+d.substr(0,2)+"0000");
		real_input.blur();
	});

}

phForm.prototype.clean=function(){
	Area.$editor.detachValidator();
	for(ta in this.$wysiwygs){
		this.$wysiwygs[ta].removeInstance(ta);
		this.$wysiwygs[ta]=null;
	}
	this.$wysiwygs=null;/**/
}
phForm.prototype.checkColumns=function(){
	this.$column2.css({
		height:this.$column1.height()+"px"
	});
	this.$container.scrollTop(0);
}
phForm.prototype.commands=function(confirm_callback,cancel_callback){
	var fieldset=$("<fieldset></fieldset>").attr({id:"f_buttons"}).addClass("button").appendTo(this.$column1);
	$("<input type='submit'></input>").attr({
		 id : "input_submit"
		,value : "Invia"
	}).addClass("button blue left").appendTo(fieldset).click(function(e){
		if(typeof confirm_callback=="function")confirm_callback(e);
	})/*.data("form_obj",this)*/;
	$("<input type='button'></input>").attr({
		 id : "input_cancel"
		,value : "Annulla"
	}).addClass("button blue right").appendTo(fieldset).click(function(e){
		if(typeof cancel_callback=="function")cancel_callback(e);
	})/*.data("form_obj",this)*/;
	return fieldset;
}
phForm.prototype.command_done=function(text, done_callback){
	var fieldset=$("<fieldset></fieldset>").attr({id:"f_buttons"}).addClass("button").appendTo(this.$column1);
	$("<input type='button'></input>").attr({
		 id : "input_done"
		,value : (text==null)?"Fatto":text
	}).addClass("button blue right").appendTo(fieldset).click(function(e){
		if(typeof done_callback=="function")done_callback(e);
	});
	return fieldset;
}
phForm.prototype.errors=function(){
	$form=this.$container;
	var __container=$("<div></div>").attr({id:"editor_messages"}).css({display:"none"}).addClass("container messageyellow").appendTo(this.$column2);
	$("<div></div>").addClass("content yeld").appendTo(__container);
	__container.bind("show",function(event,message){
		$this=$(this);
		$(".content:first",$this).html(message);
		$this.css({
			 "position": "relative"
			,"top": $form.scrollTop()
		}).slideDown(100);
	});
	$form.bind("scroll",function(){
		if(__container.css("display")!="none"){
			__container.animate({
				"top": $(this).scrollTop()
			},100)
		}
	});
	return __container;
}
