/**
 * #FW_TitolFormulariAssistents
 * #FW_DescripcioFormulariAssistents
 * #FW_CosFormulariAssistents
 * 
 * #FW_BotoAnterior Boto Anterior
 * #FW_BotoContinua Boto Continua
 * 
 * #FW_FormulariEntitat1 Block de entitat1
 * #FW_FormulariEntitat2 Block de entitat2
 * #es_entitat
 * 
 * #formulari01
 * #FW_FormulariEntitatTitol
 * 
 * #FW_TitolFormulariDates
 * #FW_DescripcioFormulariDates
 * #FW_CosFormulariDates
 * 
 * #FW_EliminaDataAlternativa
 *  
 */
var allowedDates = new Array();
var notallowedDates = new Array();
var visitesPath = '../../../js/visites/visites.xml';

/**
 * Inicialitzem el formulari 
 */
document.observe("dom:loaded", function() {
									
	
									//Amaguem el formulari de assistents
									//$('FW_TitolFormulariAssistents').hide();
									//$('FW_DescripcioFormulariAssistents').hide();
									$('FW_CosFormulariAssistents').hide();
									
									//Mostrem el boto de continua
									$('FW_BotoContinua').show();
									//Afegim l'event al boto Continua									
									$('FW_BotoContinua').observe('click', function(event) {
																			continua(event);
																		  });
									//Mostrem el boto Anterior								
									$('FW_BotoAnterior').show();
									//Afegum el event al boto Anterior
									$('FW_BotoAnterior').observe('click', function(event) {
																			anterior(event);
									  									  });
									
									$('FW_EliminaDataAlternativa').show();
									$('FW_EliminaDataAlternativa').observe('click', function (event) {
																						Event.stop(event);
																						Form.Element.clear($('dataInf2'));
																					});
									
									
									//Check/Uncheck es_entitat
									$('es_entitat').observe('click', function() {
																		toggleEntitat();
																	 });
									
									//Canviem (treiem) el missatge de dades obligatories de la entitat
									//<strong>Entitat</strong>
			                        //<br />
									var titolEntitat = new Element('strong').update(MSG_FORMULARI_ENTITAT_TITOL);
									$('FW_FormulariEntitatTitol').update(titolEntitat);
																		
																		
									//Afegim els asteriscos de obligatorietat
									setObligatorisEntitat();
																		
									
									//Posem els camps de data amb readOnly
									$('dataInf1').writeAttribute('readonly', 'true');
									$('dataInf2').writeAttribute('readonly', 'true');
									
									
									
									new Ajax.Request(visitesPath, 
											{ method:'get',
										      onSuccess: 	function(transport){
																var response = transport.responseXML;
																var xmlDoc = new XMLElement(response);
																
																var p1 = xmlDoc.getChild('DatesVisites');
																var dd = p1.getChild('DesactivarDates');
																if (dd) {																		
																	var desD = dd.getChildren("Data");
																	for (i = 0; i < desD.length; i++) {
																		notallowedDates.push(desD[i].getText());
																	}																				
																}
																var ed = p1.getChild('ActivarDates');
																if (ed) {																		
																	var enaD = ed.getChildren("Data");
																	for (i = 0; i < enaD.length; i++) {
																		allowedDates.push(enaD[i].getText());
																	}																				
																}																
															}
											});									
									//Activem nomes els dies que necessitem
									datePickerController.onupdate = function(dp) {updateData(dp);};
									
								});


/**
 * 
 */
function toggleEntitat() {
	//Si no tenim el de entitat checkejat
	if ($('es_entitat').checked) {
		$('FW_FormulariEntitat1').show();
		$('FW_FormulariEntitat2').show();
	}else{
		$('FW_FormulariEntitat1').hide();
		$('FW_FormulariEntitat2').hide();
	}
}


/**
 * 
 */
function setObligatorisEntitat() {
	$$('label[for=nomentit]')[0].insert({'after': '&nbsp;*'});
	$$('label[for=adreentit]')[0].insert({'after': '&nbsp;*'});
	$$('label[for=poblentit]')[0].insert({'after': '&nbsp;*'});
	$$('label[for=correuentit]')[0].insert({'after': '&nbsp;*'});
	$$('label[for=telfentit]')[0].insert({'after': '&nbsp;*'});
	$$('label[for=codipostalentit]')[0].insert({'after': '&nbsp;*'});	
}

/**
 * Hem posat les dates. Si son valides mostrem el formulari de assistents
 * @return
 */
function continua(event) {
	
	//Parem el event per evitar el submit
	Event.stop(event);
	
	//Validem les dates
		
	//
	toggleEntitat();
	//Amaguem el formulari de dates
	$('FW_CosFormulariDates').hide();
	
	//Mostrem el formulari de assistents
	$('FW_CosFormulariAssistents').show();
}

/**
 * 
 */
function anterior(event) {
	//Parem el event per evitar el submit
	Event.stop(event);

	//Amaguem el formulari de assistents
	$('FW_CosFormulariAssistents').hide();
	
	//Mostrem el formulari de dates
	$('FW_CosFormulariDates').show();
}

//Funcio auxiliar per saber si un element es troba en una llista
function inArray(elem, objarray) {	
	var found = false;
	
	if (objarray.length) {	
		var i = 0;
	
		while (i < objarray.length && !found) {
			found =  (objarray[i] == elem); 
			i++;
		}
	}
	return found;
}


/**
 * Marquem els caps de setmana valids o invalids per a fer les visites
 */
function updateData(dp) {
	
    //Index de mes
    var dataAux = new Date(); 
    dataAux.setYear(dp.date.getFullYear());
    dataAux.setMonth(dp.date.getMonth());
    dataAux.setDate(1); //Anem al dia 1

    var diesMes = daysInMonth(dataAux.getMonth(), dataAux.getYear());
    var enabledDates = new Array();
    
    
    //Calculem les dates valides. 2on i 4rt cap de setmana de cada mes.
    //Ens posicionem al primer cap de setmana
    //Busquem el primer cap de setmana
    if (dataAux.getDay() > 0) {
    	dataAux.setDate(7 - dataAux.getDay());
    }    
    
    //2on cap de setmana
    //Pot passar que el 1er cap de setmana sigui diumenge
    if (dataAux.getDay() == 0) {
    	dataAux.setDate(dataAux.getDate()+6);
    }else{
    	dataAux.setDate(dataAux.getDate()+7);
    }
    d1 = formatDate(dataAux, "yyyyMMdd");
    enabledDates.push(d1);
    dataAux.setDate(dataAux.getDate()+1);
    d1 = formatDate(dataAux, "yyyyMMdd");
    enabledDates.push(d1);
    
    //4rt cap de setmana
    dataAux.setDate(dataAux.getDate()+13);
    d1 = formatDate(dataAux, "yyyyMMdd");
    enabledDates.push(d1);
    dataAux.setDate(dataAux.getDate()+1);
    d1 = formatDate(dataAux, "yyyyMMdd");
    enabledDates.push(d1);
    
    
    //Afegim els possibles dates del XML.
	if (allowedDates.length) {
		for (i = 0; i < allowedDates.length; i++) {			
			enabledDates.push(allowedDates[i]);
		}
	}
    
    //Desactivem totes les dates excepte les valides (naturalment)
	var daysDisabled = new Array();
    for (i = 1; i <= diesMes; i++) {
    	dataAux.setDate(i);
    	d1 = formatDate(dataAux, "yyyyMMdd");
    	if (!inArray(d1, enabledDates)) {
    		daysDisabled.push(d1);
    	}
    }
    
    //Afegim els possibles dates 'dolentes' del XML.
	if (notallowedDates.length) {
		for (i = 0; i < notallowedDates.length; i++) {			
			daysDisabled.push(notallowedDates[i]);
		}
	}    
    
    dp.setDisabledDates(daysDisabled);
}


function daysInMonth(iMonth, iYear) {
	return 32 - new Date(iYear, iMonth, 32).getDate();
}



//Funcio auxiliar per al format de dates
function addZero(vNumber){
    return ((vNumber < 10) ? "0" : "") + vNumber
}
//Formateig de dates
/*
dd for Date of the month
MM for month
yy or yyyy for Year
hh for hours
mm for minutes
ss for seconds
*/
function formatDate(vDate, vFormat){
    var vDay              = addZero(vDate.getDate());
    var vMonth            = addZero(vDate.getMonth()+1);
    var vYearLong         = addZero(vDate.getFullYear());
    var vYearShort        = addZero(vDate.getFullYear().toString().substring(3,4));
    var vYear             = (vFormat.indexOf("yyyy")>-1?vYearLong:vYearShort)
    var vHour             = addZero(vDate.getHours());
    var vMinute           = addZero(vDate.getMinutes());
    var vSecond           = addZero(vDate.getSeconds());
    var vDateString       = vFormat.replace(/dd/g, vDay).replace(/MM/g, vMonth).replace(/y{1,4}/g, vYear)
    vDateString           = vDateString.replace(/hh/g, vHour).replace(/mm/g, vMinute).replace(/ss/g, vSecond)
    return vDateString
}

function parseDate(vStr, vFormat) {
	d = new Date();
	var ih = vFormat.indexOf('hh');
	var fh = ih+'hh'.length;
	var hores = parseInt(vStr.substring(ih,fh), 10);
	var im = vFormat.indexOf('mm');
	var fm = im+'mm'.length
	var minuts = parseInt(vStr.substring(im,fm), 10);
	var id = vFormat.indexOf('dd');
	var fd = id+'dd'.length;
	var dia = parseInt(vStr.substring(id,fd), 10);
	var iM = vFormat.indexOf('MM');
	var fM = iM+'MM'.length;
	var mes = parseInt(vStr.substring(iM,fM), 10);
	var iy = vFormat.indexOf('yyyy');
	var fy = iy+'yyyy'.length;
	var any = parseInt(vStr.substring(iy,fy), 10);
	d.setHours(hores,minuts);
	d.setDate(dia);
	d.setMonth(mes-1);
	d.setFullYear(any);
	return d;
}

/**
 * Si no som una entitat netegem les dades de la entitat
 * 
 */
function submitForm(event) {
	//Parem el submit, ja el farem nosaltres
	Event.stop(event);
	
	if (!$('es_entitat').checked) {
		//Netegem els camps de la entitat
		Form.Element.clear($('nomentit'));
		Form.Element.clear($('adreentit'));
		Form.Element.clear($('poblentit'));
		Form.Element.clear($('codipostalentit'));
	}
	
	//Si la data_2 te el format inicial dd/mm/yyyy la esborrem
	if ($('dataInf2').value == 'dd/mm/aaaa') {
		$('dataInf2').value = '';
	}
	
	if (validaFormulari()) {
		$('formulari01').submit();
		return true;
	}
	return false;
}

/**
 * validem el formulari
 */
function validaFormulari()  {
	
	var errorMsgs = new Array();
	
	//asistents 1 - 30
	if (!validaRange($('asistents').value, 1, 30)) {
		errorMsgs.push(MSG_ASSISTENTS_RANGE);
	}
	
	//Dates
	if (isEmpty($('dataInf1').value)) {
		errorMsgs.push(MSG_DATAVISITA_REQUIRED);		
	} else {
		if (isDate($('dataInf1').value, /^([0-9]{1,2})[\/]([0-9]{1,2})[\/]([0-9]{1,4})$/, {d: 1, m: 2, y: 3}) != 0) {
			errorMsgs.push(MSG_DATAVISITA_FORMAT);
		}
	}
	//No es obligatori
	if (!isEmpty($('dataInf2').value)) {
		if (isDate($('dataInf2').value, /^([0-9]{1,2})[\/]([0-9]{1,2})[\/]([0-9]{1,4})$/, {d: 1, m: 2, y: 3}) != 0) {
			errorMsgs.push(MSG_DATAPREFERENT_FORMAT);
		}
	}
		
	//validem Responsable de la visita
	if (isEmpty($('nom').value)) {
		errorMsgs.push(MSG_NOMRESPONSABLE_REQUIRED);
	}
	if (isEmpty($('nif').value)) {
		errorMsgs.push(MSG_NIFRESPONSABLE_REQUIRED);
	}/*else{ //no validem el format per permetre altres formats de documents de identificacio
		if (valida_nif_cif_nie($('nif').value) <= 0) {
			errorMsgs.push(MSG_NIFRESPONSABLE_FORMAT);
		}
	}*/
	if (isEmpty($('correu').value)) {
		errorMsgs.push(MSG_CORREURESPONSABLE_REQUIRED);
	}else {
		if (!checkEmail($('correu').value)) {
			errorMsgs.push(MSG_CORREURESPONSABLE_FORMAT);
		}
	}
	if (isEmpty($('telf').value)) {
		errorMsgs.push(MSG_TELRESPONSABLE_REQUIRED);
	}else{
		if (!validaTel($('telf').value)) {
			errorMsgs.push(MSG_TELRESPONSABLE_FORMAT);
		}
	}
	
	//Si es entitat
	if ($('es_entitat').checked) {
		if (isEmpty($('nomentit').value)) {
			errorMsgs.push(MSG_NOMENTITAT_REQUIRED);
		}
		if (isEmpty($('adreentit').value)) {
			errorMsgs.push(MSG_ADRECAENTITAT_REQUIRED);
		}
		if (isEmpty($('poblentit').value)) {
			errorMsgs.push(MSG_POBLACIOENTITAT_REQUIRED);
		}
		if (isEmpty($('correuentit').value)) {
			errorMsgs.push(MSG_CORREUENTITAT_REQUIRED);
		}else{
			if (!checkEmail($('correuentit').value)) {
				errorMsgs.push(MSG_CORREUENTITAT_FORMAT);
			}
		}
		if (isEmpty($('telfentit').value)) {
			errorMsgs.push(MSG_TELENTITAT_REQUIRED);
		}else{
			if (!validaTel($('telfentit').value)) {
				errorMsgs.push(MSG_TELENTITAT_FORMAT);
			}
		}
		if (isEmpty($('codipostalentit').value)) {
			errorMsgs.push(MSG_CPENTITAT_REQUIRED);
		}else{
			if (!validaCodiPostal($('codipostalentit').value)) {
				errorMsgs.push(MSG_CPENTITAT_FORMAT);
			}
		}
	}
	if (errorMsgs.length > 0) {
		var msg0 = MSG_ERROR_TITOL +' \n\n';
		errorMsgs.each(function(item) {
			msg0+=item+'\n';
		});
				
		alert(msg0);
		
		return false;
	}
	return true;
}


function isEmpty(inputStr) { 
	if ( null == inputStr || "" == inputStr ) { 
		return true; 
	} 
	return false; 
}


function validaRange(valor, rangeLow, rangeHigh) {
	if (!isNaN(valor)) {
		return (valor <= rangeHigh && valor >=rangeLow);
	}
	return false;
}


function isDate(y, m, d){ //v1.0
    if(typeof y == "string" && m instanceof RegExp && d){
        if(!m.test(y)) return 1;
        y = RegExp["$" + d.y], m = RegExp["$" + d.m], d = RegExp["$" + d.d];
    }
    d = Math.abs(d) || 0, m = Math.abs(m) || 0, y = Math.abs(y) || 0;
    return arguments.length != 3 ? 1 : d < 1 || d > 31 ? 2 : m < 1 || m > 12 ? 3 : /4|6|9|11/.test(m) && d == 31 ? 4
    : m == 2 && (d > ((y = !(y % 4) && (y % 1e2) || !(y % 4e2)) ? 29 : 28)) ? 5 + !!y : 0;
}

getDateMsg = function(x){
    return x == 0 ? "Valid Date"
    : x == 1 ? "Invalid date format"
    : x == 2 ? "Invalid day"
    : x == 3 ? "Invalid month"
    : x == 4 ? "In April, June, September and November there's no 31 day"
    : x == 5 ? "February has only 28 days"
    : x == 6 ? "In leap years, February has 29 days": "nothing =]";
};


function checkEmail(email) {
	var filter = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
	if (!filter.test(email)) {		
		return false;
	}
	return true;
}

//Retorna: 1 = NIF ok, 2 = CIF ok, 3 = NIE ok, -1 = NIF error, -2 = CIF error, -3 = NIE error, 0 = ??? error
function valida_nif_cif_nie(a) {
	var temp=a.toUpperCase();
	var cadenadni="TRWAGMYFPDXBNJZSQVHLCKE";
 
	if (temp!==''){
		//si no tiene un formato valido devuelve error
		if ((!/^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$/.test(temp) && !/^[T]{1}[A-Z0-9]{8}$/.test(temp)) && !/^[0-9]{8}[A-Z]{1}$/.test(temp))
		{
			return 0;
		}
 
		//comprobacion de NIFs estandar
		if (/^[0-9]{8}[A-Z]{1}$/.test(temp))
		{
			posicion = a.substring(8,0) % 23;
			letra = cadenadni.charAt(posicion);
			var letradni=temp.charAt(8);
			if (letra == letradni)
			{
			   	return 1;
			}
			else
			{
				return -1;
			}
		}
 
		//algoritmo para comprobacion de codigos tipo CIF
		suma = parseInt(a[2])+parseInt(a[4])+parseInt(a[6]);
		for (i = 1; i < 8; i += 2)
		{
			temp1 = 2 * parseInt(a[i]);
			temp1 += '';
			temp1 = temp1.substring(0,1);
			temp2 = 2 * parseInt(a[i]);
			temp2 += '';
			temp2 = temp2.substring(1,2);
			if (temp2 == '')
			{
				temp2 = '0';
			}
 
			suma += (parseInt(temp1) + parseInt(temp2));
		}
		suma += '';
		n = 10 - parseInt(suma.substring(suma.length-1, suma.length));
 
		//comprobacion de NIFs especiales (se calculan como CIFs)
		if (/^[KLM]{1}/.test(temp))
		{
			if (a[8] == String.fromCharCode(64 + n))
			{
				return 1;
			}
			else
			{
				return -1;
			}
		}
 
		//comprobacion de CIFs
		if (/^[ABCDEFGHJNPQRSUVW]{1}/.test(temp))
		{
			temp = n + '';
			if (a[8] == String.fromCharCode(64 + n) || a[8] == parseInt(temp.substring(temp.length-1, temp.length)))
			{
				return 2;
			}
			else
			{
				return -2;
			}
		}
 
		//comprobacion de NIEs
		//T
		if (/^[T]{1}/.test(temp))
		{
			if (a[8] == /^[T]{1}[A-Z0-9]{8}$/.test(temp))
			{
				return 3;
			}
			else
			{
				return -3;
			}
		}
 
		//XYZ
		if (/^[XYZ]{1}/.test(temp))
		{
			pos = str_replace(['X', 'Y', 'Z'], ['0','1','2'], temp).substring(0, 8) % 23;
			if (a[8] == cadenadni.substring(pos, pos + 1))
			{
				return 3;
			}
			else
			{
				return -3;
			}
		}
	}
 
	return 0;
}


function validaTel (phone) {
	if((/^[0-9]{8,}$/).exec(phone)==null){ 
		return false; 
	}
	return true;
} 

function validaCodiPostal(cp) {
	var er_cp = /(^([0-9]{5,5})|^)$/
	
	if(er_cp.exec(cp) == null) {   	 
		return false;
	}
	return true;
}




///-- OBJECT XMLELEMENT --///
/**
 * Utilitat per a manegar mes facilment els XML
 * Quan al fer la peticio ens retornen el XML:
 * xmlDoc = http.responseXML;
 * var totXML = new XMLElement(xmlDoc.documentElement);
 *
 */
function XMLElement(element, namespace) {
	this.element = element;
	this.ns = new Array();
	if (namespace) {
		for (j = 0; j < namespace.length; j++) {
			this.ns.push(namespace[j]);
		}
	}
	//Busquem els possibles namespaces
	if (this.element.attributes) {
		for (iat = 0; iat < this.element.attributes.length; iat++) {
			if (this.element.attributes.item(iat).prefix == 'xmlns') {
				var s = this.element.attributes.item(iat).nodeName;
				var nspace = s.substring('xmlns:'.length, s.length);
				this.ns.push(nspace);
			}
		}
	}

	this.getChildren = getChildren;
	this.getChild = getChild;
	this.getChildText = getChildText;
	this.getText = getText;
	this.getAttribute = getAttribute;
}

function getChildren(elementName) {
	var elementNS = false;
	//Sense ns
	var elementPTg = this.element.getElementsByTagName(elementName);
	if (elementPTg.length == 0) {
		for (inss = 0; inss < this.ns.length; inss++) {
			var ctgName = this.ns[inss]+':'+elementName;
			if (this.element.getElementsByTagName(ctgName).length > 0) {
				elementPTg = this.element.getElementsByTagName(ctgName);
				break;
			}
		}
	}
	var elementPTgElements = new Array();
	for (i = 0; i < elementPTg.length; i++) {
		elementPTgElements[i] = new XMLElement(elementPTg[i], this.ns);
	}
	return elementPTgElements;
}

function getChild(elementName) {
	if (this.element.getElementsByTagName(elementName).length > 0) {
		return new XMLElement(this.element.getElementsByTagName(elementName)[0], this.ns);
	}else{
		if (this.ns.length > 0) {
			for (iinss = 0; iinss < this.ns.length;iinss++) {
				if (this.element.getElementsByTagName(this.ns[iinss]+":"+elementName).length > 0) {
					return new XMLElement(this.element.getElementsByTagName(this.ns[iinss]+":"+elementName)[0], this.ns);
				}
			}
		}
	}
	return false;
}

function getChildText(elementName) {
	if (this.element.getElementsByTagName(elementName).length > 0) {
		if (this.element.getElementsByTagName(elementName)[0].firstChild) {
			return this.element.getElementsByTagName(elementName)[0].firstChild.data;;
		}
	}else{
		if (this.ns.length > 0) {
			for (iinss = 0; iinss < this.ns.length;iinss++) {
				var ctgn = this.ns[iinss]+":"+elementName;
				if (this.element.getElementsByTagName(ctgn).length > 0) {
					return this.element.getElementsByTagName(ctgn)[0].firstChild.data;
				}
			}
		}
	}
	return false;
}

function getText() {
	if (this.element.firstChild) {
		return this.element.firstChild.data;
	}
	return false;
}

function getAttribute(attrName) {
	return this.element.getAttribute(attrName);
}
///-- OBJECT XMLELEMENT --///
