function onFocusAutoNamedTextField(f)
{
	if (f.className.match("campNoEditat"))
	{
		f.className=f.className.replace(/campNoEditat/, "campEditat");
		f.value="";
	}
}

function onBlurAutoNamedTextField(f, nom)
{
	if (f.value.replace(/\s+/g, "").length==0)
	{
		f.className=f.className.replace(/campEditat/, "campNoEditat");
		f.value=nom;
	}
}

var SearchResultsObjectsByField = new Array();
function SearchResults(fieldId, activationTimeout, idFieldId, searchURL, searchType, resCallback, showResPane)
{
	// Temps d'activació de la cerca en milisegons, des de l'ultim onRelease 
	var actTimeout=activationTimeout;
	// Camp de text amb el que estem tractant
	var id=fieldId;
	// Camp de text o hidden que conte l'ID
	var idField=idFieldId;
	// URL del punt de servei AJAX
	var url=searchURL;
	// Tipus de cerca: indica transaccio a sol·licitar via AJAX. p.e. "user", "partialName"... (depen del punt de servei).
	var type=searchType;
	// Funcio per fer el render d'un resultat
	var resultsCallback = resCallback;

	// Interficie AJAX per fer "la feina bruta" :)
	var ajax=newAjaxInterface();
	// Temps de l'ultim onrelease
	var lastOnRelease;
	
	// Id de la ultima request (ID del setTimeout)
	var lastRequestId=-1;
	
	// AJAX de l'ultima request, per si se n'inicia una de nova
	var lastRequestAJAX=null;
	
	// Contenidor de resultats
	var resContainer=null;
	
	// Permet amagar per event blur
	var allowBlur=true;
	
	// Indica si s'ha de mostrar el panell de resultats
	var showResultsPane=showResPane;
	// Per defecte es true
	if (showResultsPane!=false)
		showResultsPane=true;
	
	SearchResultsObjectsByField[fieldId]=this;

	this.runSearch = function (searchString)
	{
		lastRequestId = -1;

		if (lastRequestAJAX!=null)
			lastRequestAJAX.abort();

//		var ss = decodeURIComponent(searchString);
//		alert("runSearch: " + ss + " on field " + id);

		// Eliminem cerques anteriors
		this.clearResults();
		
		// Construim el Post
		var post="service="+type+"&searchValue="+searchString;
		lastRequestAJAX=ajaxPost(url, post, "application/x-www-form-urlencoded", "SearchResultsObjectsByField['"+id+"'].showResults", true);
		if (getObj(id).className.match(/[a-zA-Z]*Cerca/)!=null)
			getObj(id).style.backgroundImage="url('/img/srchprog.gif')";
		}

	this.clearResults = function()
	{
		if (resContainer!=null)
		{
			var body=document.getElementsByTagName("body");
			body[0].removeChild(resContainer);
			resContainer=null;
		}
		else
		{
			resContainer=getObj(id+"Results");
			if (resContainer!=null)
			{
				body[0].removeChild(resContainer);
				resContainer=null;
			}
		}		
	}

	this.showResults = function (ajax)
	{
//		alert(ajax.responseText);

		lastRequestAJAX=null;
		
		var body=document.getElementsByTagName("body");

		resContainer=getObj(id+"Results");
		if (resContainer!=null)
		{
			body[0].removeChild(resContainer);
			resContainer=null;
		}
		
		var pos=getAbsolutePosition(id);
		
		resContainer = document.createElement("div");
		resContainer.id = id+"Results";
		resContainer.className = "textEstandar";
		resContainer.style.border = "solid 1px #545454";
		resContainer.style.backgroundColor = "#b0c5fa";
		resContainer.style.zIndex = "100";
		resContainer.style.width = (ow(id))+"px";
		resContainer.style.height = (oh(id)*5)+"px";
		resContainer.style.float = "left";
		resContainer.style.position = "absolute";
		resContainer.style.left = pos["x"]+"px"; // x(id)+"px";
		resContainer.style.top = (pos["y"]+oh(id))+"px"; // (y(id)+oh(id))+"px";
		resContainer.style.overflow = "auto";

		var xml = new XML(ajax.responseXML);
		resultsCallback(xml, resContainer, id);
		
		if (showResultsPane==true)
			body[0].appendChild(resContainer);
		else
			resContainer=null;

		if (getObj(id).className.match(/[a-zA-Z]*Cerca/)!=null)
			getObj(id).style.backgroundImage="url('/img/lupa.png')";
	}

	this.onFocus = function()
	{
		if (resContainer!=null && showResultsPane==true)
			resContainer.style.visibility = "visible";
	}

	this.onChange = function()
	{
		if (idField!=null)
			getObj(idField).value="-1";
	}

	this.onBlur = function()
	{
		if (resContainer!=null && allowBlur==true)
			resContainer.style.visibility = "hidden";
	}

	this.onKeyPress = function()
	{
		if (lastRequestId!=-1)
			clearTimeout(lastRequestId);
	}

	this.onKeyRelease = function()
	{
		lastOnRelease=new Date();
				
		if (lastRequestId!=-1)
			clearTimeout(lastRequestId);

		var searchString=getObj(id).value.trim();
		if (searchString.length > 0)
		{
			this.onFocus();
			lastRequestId = setTimeout("SearchResultsObjectsByField['"+id+"'].runSearch(\""+encodeURIComponent(searchString)+"\")", actTimeout);
		}
		else
			this.onBlur();
	}
	
	this.setAllowBlur = function(val)
	{
		allowBlur=val;
	}
}

function MultiPartFormData()
{
	var d=new Date();
	var boundary="GalaSolucionesMultiPartFormData_"+d.getTime();
	var postData="";

	this.getBoundary = function()
	{
		return boundary;
	}
	
	this.addVariable = function(name, value)
	{
		postData+="--"+boundary+"\nContent-Disposition: form-data; name=\""+name+"\"\n\n"+value+"\n";
	}
	
	this.finish = function()
	{
		postData+="--"+boundary+"--\n";
	}
	
	this.getData = function()
	{
		return postData;
	}
}

function labelTextField(id, name, label, overrideClass, defValue, extraAttribs, helpText)
{
	var showHelp=false;
	if (helpText!=null && helpText.length>0)
		showHelp=true;

	var div=document.createElement("div");
	div.className="labelFieldContainer"+(showHelp?"WithHelp":"");

	var divLeft=document.createElement("div");
	divLeft.className="labelFieldContainerLeftElem";

	var leftLabel=document.createElement("label");
	leftLabel.appendChild(document.createTextNode(label));
	
	divLeft.appendChild(leftLabel);

	var divRight=document.createElement("div");
	divRight.className="labelFieldContainerRightElem";
	divRight.id=id+"Container";
	
	var rightInput=document.createElement("input");
	rightInput.className=(overrideClass!=null?overrideClass:"campDeText campEditat");
	rightInput.type="text";
	rightInput.id=id;
	rightInput.name=name;
	
	if (defValue!=null)
		rightInput.value=defValue;
		
	setExtraAttribs(rightInput, extraAttribs);

	divRight.appendChild(rightInput);

	if (showHelp)
	{
		var brHelp=document.createElement("br");
		var spanHelp=document.createElement("span");
		spanHelp.className="labelFieldHelpText";
		var spanHelpText=document.createTextNode(helpText);
		
		spanHelp.appendChild(spanHelpText);
		
		divRight.appendChild(brHelp);
		divRight.appendChild(spanHelp);
	}
	
	div.appendChild(divLeft);
	div.appendChild(divRight);
	
	return div;
}

function labelSelectBox(id, name, label, multipleHeight, data, overrideClass, selValue, extraAttribs, enabled)
{
	var div=document.createElement("div");
	div.className="labelFieldContainer";
	if (multipleHeight>0)
		div.style.height=multipleHeight+"px";

	var divLeft=document.createElement("div");
	divLeft.className="labelFieldContainerLeftElem";

	var leftLabel=document.createElement("label");
	leftLabel.appendChild(document.createTextNode(label));
	
	divLeft.appendChild(leftLabel);

	var divRight=document.createElement("div");
	divRight.className="labelFieldContainerRightElem";
	divRight.id=id+"Container";
	
	var rightInput=document.createElement("select");
	rightInput.className=(overrideClass!=null?overrideClass:"selectBox campEditat");
	rightInput.id=id;
	rightInput.name=name;
	
	if (enabled!=null && enabled==false)
		rightInput.setAttribute("disabled", "disabled");
	
	if (multipleHeight>0)
	{
		rightInput.multiple="multiple";
		rightInput.style.height=multipleHeight+"px";
		rightInput.size=Math.round(multipleHeight/18.0)+"px";
	}
	
	setExtraAttribs(rightInput, extraAttribs);
	
	if (is_array(data))
	{
		for (var d in data)
		{
			var opt=new Option(data[d]["text"], data[d]["id"]);
			if (is_array(selValue))
			{
				if (array_search(selValue, data[d]["id"])!=false)
					opt.selected=true;
				else
					opt.selected=false;
			}
			else
			{
				if (data[d]["id"]==selValue)
				{
					opt.selected=true;
				}
				else
					opt.selected=false;
			}
	
			if (data[d]["overrideClass"]!=null)
				opt.className=data[d]["overrideClass"];
	
			var l=rightInput.options.length;
			rightInput.options[l]=opt;
		}
	}
	
	divRight.appendChild(rightInput);
	
	div.appendChild(divLeft);
	div.appendChild(divRight);

	return div;
}

function labelSelectBoxWithNewTextField(label, selectBox, textField)
{
	// selectBox => {id, name, multipleHeight, data => [{id, text} ...], overrideClass, selValue, extraAttribs, enabled}
	// textField => {id, name, overrideClass, defValue, extraAttribs, helpText}

	var showHelp=false;
	if (textField["helpText"]!=null && textField["helpText"].length>0)
		showHelp=true;

	var div=document.createElement("div");
	div.className="labelFieldContainer";

	if (selectBox["multipleHeight"]>0)
		div.style.height=((showHelp==true?40:35)+selectBox["multipleHeight"])+"px";
	else
		div.style.height=((showHelp==true?40:35)+25)+"px";

	var select=labelSelectBox(selectBox["id"], selectBox["name"], label, selectBox["multipleHeight"], selectBox["data"], 
								selectBox["overrideClass"], selectBox["selValue"], selectBox["extraAttribs"], selectBox["enabled"]);
	var field=labelTextField(textField["id"], textField["name"], "", textField["overrideClass"], textField["defValue"],
								textField["extraAttribs"], textField["helpText"]);

	div.appendChild(select);
	div.appendChild(field);
	
	return div;
}

function hiddenField(id, name, defValue, extraAttribs)
{
	var input=document.createElement("input");
	input.type="hidden";
	input.id=id;
	input.name=name;
	
	if (defValue!=null)
		input.value=defValue;
		
	setExtraAttribs(input, extraAttribs);
	
	return input;
}

function setFieldsReadonlyByIds(rdonly, camps)
{
	for (var c in camps)
	{
		var camp=getObj(camps[c]);
		// L'ordre del set importa :P		
		if (camp!=null)
		{	
			if (!rdonly) camp.setAttribute("readonly", "");
			camp.readOnly=rdonly;
			if (rdonly) camp.setAttribute("readonly", "readonly");
		}
	}
}


function disableFieldsByIds(camps)
{
	for (var c in camps)
	{
		var camp=getObj(camps[c]);
		if (camp!=null)
		{
			camp.disabled=true;
			camp.setAttribute("disabled", "disabled");
		}
	}
}

function enableFieldsByIds(camps)
{
	for (var c in camps)
	{
		var camp=getObj(camps[c]);
		if (camp!=null)
		{
			camp.setAttribute("disabled", "");
			camp.disabled=false;
		}
	}
}

function runFieldNormalization(fieldId, normalization)
{
	var valField=getObj(fieldId);
	valField.value=normalization(valField.value);
}

function runFieldValidation(fieldId, validation)
{
	var valField=getObj(fieldId);
	if (validation(valField.value))
	{
		valField.style.color="#008000";
		valField.style.backgroundColor="#d0f0d0";
		return true;
	}
	else
	{
		valField.style.color="#800000";
		valField.style.backgroundColor="#f0d0d0";
		return false;
	}
}

function setExtraAttribs(input, extraAttribs)
{
	if (extraAttribs!=null && is_array(extraAttribs))
	{
		for (var e in extraAttribs)
		{
			if (e=="onmousedown") input.onmousedown=extraAttribs[e];
			else if (e=="onmouseup") input.onmouseup=extraAttribs[e];
			else if (e=="onclick") input.onclick=extraAttribs[e];
			else if (e=="ondblclick") input.ondblclick=extraAttribs[e];
			else if (e=="onmouseover") input.onmouseover=extraAttribs[e];
			else if (e=="onmouseout") input.onmouseout=extraAttribs[e];
			else if (e=="onmousemove") input.onmousemove=extraAttribs[e];
			else if (e=="oncontextmenu") input.oncontextmenu=extraAttribs[e];
			else if (e=="onkeydown") input.onkeydown=extraAttribs[e];
			else if (e=="onkeyup") input.onkeyup=extraAttribs[e];
			else if (e=="onkeypress") input.onkeypress=extraAttribs[e];
			else if (e=="onfocus") input.onfocus=extraAttribs[e];
			else if (e=="onblur") input.onblur=extraAttribs[e];
			else if (e=="onload") input.onload=extraAttribs[e];
			else if (e=="onunload") input.onunload=extraAttribs[e];
			else if (e=="onabort") input.onabort=extraAttribs[e];
			else if (e=="onerror") input.onerror=extraAttribs[e];
			else if (e=="onsubmit") input.onsubmit=extraAttribs[e];
			else if (e=="onreset") input.onreset=extraAttribs[e];
			else if (e=="onchange") input.onchange=extraAttribs[e];
			else if (e=="onselect") input.onselect=extraAttribs[e];
			else if (e=="oninput") input.oninput=extraAttribs[e];
			else if (e=="onpaint") input.onpaint=extraAttribs[e];
			else if (e=="ontext") input.ontext=extraAttribs[e];
			else if (e=="onpopupShowing") input.onpopupShowing=extraAttribs[e];
			else if (e=="onpopupShown") input.onpopupShown=extraAttribs[e];
			else if (e=="onpopupHiding") input.onpopupHiding=extraAttribs[e];
			else if (e=="onpopupHidden") input.onpopupHidden=extraAttribs[e];
			else if (e=="onclose") input.onclose=extraAttribs[e];
			else if (e=="oncommand") input.oncommand=extraAttribs[e];
			else if (e=="onbroadcast") input.onbroadcast=extraAttribs[e];
			else if (e=="oncommandupdate") input.oncommandupdate=extraAttribs[e];
			else if (e=="ondragenter") input.ondragenter=extraAttribs[e];
			else if (e=="ondragover") input.ondragover=extraAttribs[e];
			else if (e=="ondragexit") input.ondragexit=extraAttribs[e];
			else if (e=="ondragdrop") input.ondragdrop=extraAttribs[e];
			else if (e=="ondraggesture") input.ondraggesture=extraAttribs[e];
			else if (e=="onresize") input.onresize=extraAttribs[e];
			else if (e=="onscroll") input.onscroll=extraAttribs[e];
			else if (e=="onoverflow") input.onoverflow=extraAttribs[e];
			else if (e=="onunderflow") input.onunderflow=extraAttribs[e];
			else if (e=="onoverflowchanged") input.onoverflowchanged=extraAttribs[e];
			else if (e=="onsubtreemodified") input.onsubtreemodified=extraAttribs[e];
			else if (e=="onnodeinserted") input.onnodeinserted=extraAttribs[e];
			else if (e=="onnoderemoved") input.onnoderemoved=extraAttribs[e];
			else if (e=="onnoderemovedfromdocument") input.onnoderemovedfromdocument=extraAttribs[e];
			else if (e=="onnodeinsertedintodocument") input.onnodeinsertedintodocument=extraAttribs[e];
			else if (e=="onattrmodified") input.onattrmodified=extraAttribs[e];
			else if (e=="oncharacterdatamodified") input.oncharacterdatamodified=extraAttribs[e];
			else input.setAttribute(e, extraAttribs[e]);
		}
	}
}


function Forms()
{
}

Forms.normalizeNIFNIE = function(field)
{
	field.value=field.value.toUpperCase();
	runFieldNormalization(field.id, normalizeNIF);
	field.focus();
	field.onkeydown();
	field.onkeyup();
	field.onchange();
}

Forms.validateNIFNIE = function(field)
{
	field.value=field.value.toUpperCase();
	return runFieldValidation(field.id, checkNIF);
}

Forms.validateCIF = function(field)
{
	field.value=field.value.toUpperCase();
	return runFieldValidation(field.id, checkCIF);
}

Forms.normalizeCCC = function(field)
{
	runFieldNormalization(field.id, normalizeBancCCC);
	field.focus();
	field.onkeydown();
	field.onkeyup();
	field.onchange();
}

Forms.validateCCC = function(field)
{
	return runFieldValidation(field.id, bancCheckDC);
}

Forms.validateTelfSpain = function(field)
{
	return runFieldValidation(field.id, checkTelfSpain);
}

Forms.validateDMY = function(field)
{
	
}

Forms.confirmAndEditReadOnly = function(field, message)
{
	if (field.getAttribute("readonly")!="readonly" && field.readOnly==false)
		return;
	
	if (!confirm(message))
		return;
		
	setFieldsReadonlyByIds(false, [field.id]);
	field.focus();
	field.select();
}

