var GQ_URL_DATOS = '/AjaxWrapperSkoda/recibirEncuesta.html';

// Esta funcion genera una encuesta en formato XML, la envia al GQ, obtiene el resultado de 
// la grabacion y con dicho resultado ejecuta la funcion pasada para el tratamiento del mismo
function GQ_enviarDatos(form, funcionErrores, funcionOk){
    var xml = GQ_generarEncuesta(form);
    //alert(xml);
    GQ_sendXml(xml, funcionErrores, funcionOk);
}


// RBB.
// Aquesta funció agafa el parametre de la URL cas que estigui informat
// Es fa servir per recuperar i passar aquest valor des de el formulari

function get_par ( name ){
	var regexS = "[\\?&]"+name+"=([^&#]*)";
	var regex = new RegExp ( regexS );
	var tmpURL = window.location.href;
	var results = regex.exec( tmpURL );
	if( results == null )
		return "";
	else
		return results[1];
}

// Esta funcion genera un XML con el formato de encuesta, con los datos del formulario
// Parametro: form -> el elemento DOM que representa el formulario que contiene los datos a enviar
// No se envian los elementos HTML en estado 'disabled'
function GQ_generarEncuesta(form) {
    var xml = "<?xml version='1.0' encoding='utf-8'?>";
           
    var fecha = new Date();
    var mes = "" + (fecha.getMonth() + 1);
    var dia = "" + fecha.getDate();
	    
    if (mes.length == 1)
      	mes = "0" + mes;
    if (dia.length == 1)
      	dia = "0" + dia;
    
    // La fecha debe estar en formato yyyymmdd 
    xml += "<encuesta token=\"" + form.id + "\" idContacto=\"" + document.getElementsByName("idContacto")[0].value + "\" fecha=\"" + fecha.getFullYear() + mes + dia + "\" formatVersion=\"1\">";
	      
    for (i=0; i<form.length; i++) {
    	if(form.elements[i].disabled == false){
        if (form.elements[i].type == "select-multiple") {
            var sel = form.elements[i];
            var opt_selected = new Array();
            var index = 0;
            for (var j=0; j < sel.options.length;j++){
                if (sel.options[j].selected){
                    xml += "<" + form.elements[i].name + " numContestacion=\"" + index + "\">" + sel.options[j].value + "</" + form.elements[i].name + ">";
                    index++;
                }
            }
        } else {
            if (form.elements[i].type == "text" || form.elements[i].type == "textarea") {
                if (form.elements[i].value != null && form.elements[i].value.length > 0)
                    xml += "<" + form.elements[i].name + ">" + getCDataValue(form.elements[i].value) + "</" + form.elements[i].name + ">";
            } else if ((form.elements[i].type == "checkbox" || form.elements[i].type == "radio") && form.elements[i].checked) {
                xml += "<" + form.elements[i].name + ">" + form.elements[i].value + "</" + form.elements[i].name + ">";
            } else if (form.elements[i].type == "select-one") {
                var sel = form.elements[i];
                if (sel.selectedIndex > -1 && sel.options[sel.selectedIndex].value.length > 0){
                    xml += "<" + form.elements[i].name + ">" + sel.options[sel.selectedIndex].value + "</" + form.elements[i].name + ">";
                } 
            }
        }
    	}
    }
	
    xml += "</encuesta>";
    return xml;
	
}


// Esta funcion envia asincronamente el XML con la encuesta y obtiene la respuesta del 
// GQ.
// Parametros: xml -> variable de cadena de texto conteniendo el XML con la encuesta
//			   tratamientoErrores -> nombre de la funcion que analizara la respuesta
//									 del GQ tras intentar guardar la encuesta
function GQ_sendXml(xml, funcionErrores, funcionOk){
    var objHttp = GQ_getAjax();
    if(objHttp)
    {
        if (objHttp.readyState==0 || objHttp.readyState==4)
        {
            objHttp.open("POST", GQ_URL_DATOS, true);
            objHttp.setRequestHeader("Content-Type", "text/xml");	      	      
            objHttp.onreadystatechange=
                function()
            {
	      	if(objHttp.readyState==4){	
                    if(objHttp.status == 200){
                        var respuesta = objHttp.responseText;                        
                        if(reset)	resetStyles();
                        
                        GQ_parseErrores(respuesta, funcionErrores, funcionOk)
                    } 
		}
            }
            objHttp.send(xml);
        }
    }
}


// Esta funcion obtiene, si el navegador lo permite, el objeto HttpRequest
// que nos permitira realizar peticiones asincronas (AJAX)
function GQ_getAjax()
{	var ajax;
    if (window.XMLHttpRequest) { // IE7, Mozilla, Safari,...
        ajax = new XMLHttpRequest();
        if (ajax.overrideMimeType) {
            ajax.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try {
            ajax = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                ajax = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {}
        }
    }
    return ajax;
}

//  Afegiex el CData si tenim al String un dels valors: <, >, &.
function getCDataValue(str){

	if(str.indexOf("<")!=-1 || str.indexOf(">")!=-1 || str.indexOf("&")!=-1){
		return "<![CDATA[" + str + "]]>";
	}else{
		return str;
	}
}

// Esta funcion es un ejemplo de tratamiento de la respuesta del GQ tras una peticion
// para guardar una encuesta
// Parametros: errores -> variable de cadena de texto conteniendo el XML con la respuesta del GQ
function GQ_parseErrores(errores, funcionErrores, funcionOk){

    // Codigo para IE
    if (window.ActiveXObject){
        var doc=new ActiveXObject("Microsoft.XMLDOM");
        doc.async="false";
        doc.loadXML(errores);
    } else {
        // Codigo para Mozilla, Firefox, Opera, etc.
        var parser=new DOMParser();
        var doc=parser.parseFromString(errores,"text/xml");
    }
	
    var x = doc.documentElement;
    var token = x.attributes.getNamedItem("token").nodeValue;
    var status = x.attributes.getNamedItem("status").nodeValue;
    
		
    var aliases = new Array();

    if (status == 'OK'){
    	var idEncuesta = x.attributes.getNamedItem("idEncuesta").nodeValue;
        // La encuesta se ha guardado correctamente
        if (funcionOk){
            funcionOk(idEncuesta);
        }
    } else {
        if (funcionErrores){
            funcionErrores(doc, token);
        }
    }
}


function GQ_funcionErrores(doc, token){
	
    // El intento de grabacion del cuestionario ha generado errores
    var cuestionario  = doc.getElementsByTagName("errorCuestionario");
    var dominio       = doc.getElementsByTagName("errorValidacionRespuestaDominio");
    var cuestion      = doc.getElementsByTagName("errorValidacionCuestionDesconocida");
    var errorLibre    = doc.getElementsByTagName("errorValidacionContestacionLibre");			
    var longitud      = doc.getElementsByTagName("errorLongitudContestacionLibre");
    var multiplicidad = doc.getElementsByTagName("errorValidacionNumeroRespuestas");		
		
    if (cuestionario.length > 0 || dominio.length > 0 || cuestion.length > 0 || errorLibre.length > 0 || longitud.length > 0 || multiplicidad.length > 0){
		alert("Error en alguno de los campos del formulario (marcados en rojo).");
              //document.getElementById("boton_enviar").style.display = "block";
	}
	
	GQ_procesarErrores(cuestionario, token, "Error en la definiciò¬Ÿ¤el cuestionario");
    GQ_procesarErrores(dominio, token, "Error en los dominios de respuesta");
    GQ_procesarErrores(cuestion, token, "Error de cuestion desconocida");
    GQ_procesarErrores(errorLibre, token, "Error de formato del texto");
    GQ_procesarErrores(longitud, token, "Error de longitud del texto");
    GQ_procesarErrores(multiplicidad, token, "Error de numero de respuestas validas");
}


// Esta funcion, a partir de una lista errores en nodos DOM, obtiene el elemento del formulario
// en el que se encuentra la causa del error
// Parametros: errores -> Array de elementos DOM conteniendo un error de algun tipo de los definidos
//var global pel control d'estils amb els errors
var elementStyles = new Object();
var reset = false;
function GQ_procesarErrores(errores, token, texto){
	
    if (errores.length > 0){
        
        for (i = 0; i < errores.length; i++){
            var error = errores[i];
            var alias = error.getElementsByTagName("alias");
						
            if (alias != null && alias.length > 0){
				
                var nombreCampo = alias[0].firstChild.nodeValue;
                var elemento = document.getElementById(token).elements[nombreCampo];
				
								//alert("ERROR\nTEXT="+texto+"\nELEM="+nombreCampo);
				
                // Funci?n definida para cada entorno //
                // Recibe el input que da el error //
                cambiarFormatoError(elemento);
            }
        }
    }

}

// Funci?n para obtener el dominio asociado de una respuesta
// dada en un campo de el formulario
function obtenerDominioAsociado(source,dest) {
		obtenerDominioAsociado(source,dest,null);
}


// Funci?n para obtener el dominio asociado de una respuesta
// dada en un campo de el formulario
// listener es una funciò¬Ÿ±ue serï¿½lamada justo antes de generar cada option
// listener sirve para modificar o formatear el option que se estï¿½reando
function obtenerDominioAsociado(source,dest,listener)
{
    var objHttp = GQ_getAjax();
    
    if(objHttp && source.value.length > 0)
    {
        if (objHttp.readyState==0 || objHttp.readyState==4)
        {
            // Con el id de la respuesta, obtendremos el id del grupo asociado
            // del cual devoler las lista de respuestas
            objHttp.open("GET","/AjaxWrapperSkoda/obtenerDominioAsociado.html?idRespuesta="+source.value);
            objHttp.onreadystatechange=
                function()
            {
                if(objHttp.readyState==4)
                {
                    var returnElements=objHttp.responseText.split("||");
                    // Vaciamos la lista actual
                    document.getElementById(dest).options.length = 0;
                    // Agregamos la opcion inicial
                    document.getElementById(dest).options[0] = new Option("--Seleccione--","");
                    // Agregamos las opciones devueltas por el servidor	
                    for ( var i=0; i<returnElements.length; i++ ){
                        if (returnElements[i] != null && returnElements[i] != undefined){
                            var valueLabelPair = returnElements[i].split("|");
                            if (valueLabelPair[0].length > 0 && valueLabelPair[1]!="---") {
                            	       if (listener != null) {
                    	  	  							newValueLabelPair = listener(valueLabelPair);
                    	  	  							document.getElementById(dest).options[i+1] = new Option(newValueLabelPair [1], newValueLabelPair [0]);
                            					} else
                                					document.getElementById(dest).options[i+1] = new Option(valueLabelPair[1], valueLabelPair[0]);
                                
                              }
                        }
                    }
                }
            }
            objHttp.send(null);
        }
    }else{
  	document.getElementById(dest).options.length = 1;
    }
}





// Funci?n para obtener las respuestas de un dominio

function obtenerRespuestasDominio(source, dest)
{
    var objHttp = GQ_getAjax();
    
    if(objHttp && source.length > 0)
    {
        if (objHttp.readyState==0 || objHttp.readyState==4)
        {
            // Con el id de la respuesta, obtendremos el id del grupo asociado
            // del cual devoler las lista de respuestas
            objHttp.open("GET","/AjaxWrapperSkoda/obtenerRespuestasDominio.html?idDominio="+source);
            objHttp.onreadystatechange=
                function()
            {
                if(objHttp.readyState==4)
                {
                    var returnElements=objHttp.responseText.split("||");
                    // Vaciamos la lista actual
			dest.options.length = 0;
                    //document.getElementById(dest).options.length = 0;
                    // Agregamos la opcion inicial
			dest.options[0] = new Option("--Seleccione--","");
                    //document.getElementById(dest).options[0] = new Option("--Seleccione--","");
                    // Agregamos las opciones devueltas por el servidor	
                    for ( var i=0; i<returnElements.length; i++ ){
                        if (returnElements[i] != null && returnElements[i] != undefined){
                            var valueLabelPair = returnElements[i].split("|");
                            if (valueLabelPair[0].length > 0)
				dest.options[i+1] = new Option(valueLabelPair[1], valueLabelPair[0]);
                                //document.getElementById(dest).options[i+1] = new Option(valueLabelPair[1], valueLabelPair[0]);
                        }
                    }
                }
            }
            objHttp.send(null);
        }
    }else{
	dest.options.length = 1;
  	//document.getElementById(dest).options.length = 1;
    }
}

/************	[START: obtenerRespuestasDominio()]	***************************
*	Carreguem les respostes de tots els dominis de la pï¿½na automï¿½cament
*	Es una crida a "obtenerRespuestasDominioXML()" per cada input del codi
*/

var control = null;
var index = 0;

function obtenerTodasRespuestasDominioXML(){
	var form = document.getElementsByTagName('form');	
	var elems = document.getElementsByTagName('select');	
	
	control = new Array(elems.length);
	//for(var j = 0; j < elems.length; j++)	control [j]=0;
	
	for(var i = 0; i < elems.length; i++){
		var xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
          + "<dominio token='" + form[0].id + "'>"
          + "<alias>" + elems[i].name + "</alias>"
          + "</dominio>";
		
		// Atenció, amb últimes versions de navegadors
		// s'arriva a col·lapsar el servidor web, per això aquest delay
		// delay(250); 20101213 provem amb menys temps ara que hem actualitzat el servidor web
		obtenerRespuestasDominioXML(xml, elems[i]);
		control[i] = 0;
	}
	
	/*  Si volem intentar fer la cï¿½ega dels tipus <INPUT/>
	elems = document.getElementsByTagName('input');	
	for(var i = 0; i < elems.length; i++){
		obtenerRespuestasDominioXML(xml, elems[i]);
	}
	*/
}

function delay(millis) 
{
	var dini = new Date();
	var curdate = null;
	do {curdate = new Date();}
	while(curdate - dini < millis);

}

function obtenerRespuestasDominioXML(xml, dest)
{
    var objHttp = GQ_getAjax();
    
    if(objHttp)
    {
        if (objHttp.readyState==0 || objHttp.readyState==4)
        {
            // Con el id de la respuesta, obtendremos el id del grupo asociado
            // del cual devoler las lista de respuestas
            objHttp.open("POST", '/AjaxWrapperSkoda/obtenerRespuestasDominioXML.html', true);
            objHttp.onreadystatechange=
                function()
            {
                if(objHttp.readyState==4){
                  if(objHttp.status == 200){
                      var respuesta = objHttp.responseText;
                      var xmlDoc;
                      
                      if(respuesta!=null && respuesta!=""){
	                      try //Internet Explorer
												  {
												  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
												  xmlDoc.async="false";
												  xmlDoc.loadXML(respuesta);
												}catch(e){
												  try //Firefox, Mozilla, Opera, etc.
												    {
												    parser=new DOMParser();
												    xmlDoc=parser.parseFromString(respuesta,"text/xml");
												  }catch(e) {alert(e.message)}
												}													
													
												// Carreguem les OPTIONS als seus combos
												renderOptions(xmlDoc, dest.id);
												control[index] = 1;
												index++;
													  
                    	}// FI respuesta!=NULL

                  }
              }
            }
            objHttp.send(xml);
        }
    }else{
			dest.options.length = 1;
  		//document.getElementById(dest).options.length = 1;
    }
}


function renderOptions(xmlDoc, idSelect)
{
  var valueOption, textOption, optionNode;
  var newopc, selectTag;
  var loptions, option;
  var nodeVal, nodeDesc;
  var idSelect_d;
  
    var selectTag = document.getElementById(idSelect);
    while (selectTag.firstChild) selectTag.removeChild(selectTag.firstChild);
    

    if (selectTag != null)
    {
    		newopc = document.createElement("option");
        newopc.setAttribute("value", "");
        optionNode = document.createTextNode("--Seleccione--");
        newopc.appendChild(optionNode);
        selectTag.appendChild(newopc);
    	
      loptions = xmlDoc.getElementsByTagName("opcion");
      
      for (ind=0; ind < loptions.length; ind++)
      {
        option = loptions[ind];

        nodeVal = option.childNodes[0];   //-- valor
        valueOption = nodeVal.childNodes[0];
        nodeDesc = option.childNodes[1];   //-- description
        textOption = nodeDesc.childNodes[0];

        newopc = document.createElement("option");
        newopc.setAttribute("value", valueOption.nodeValue);
        optionNode = document.createTextNode(textOption.nodeValue)
        newopc.appendChild(optionNode);
        selectTag.appendChild(newopc);
        
        if (idSelect_d == null)
        	idSelect_d = preselectFunction(idSelect, newopc);
        
      }
      disable_options(idSelect_d);  
    } else
      alert("No existe Content: " + id);
} //-- renderOptions

/***********  [END: obtenerRespuestasDominio()] ************************/
//per cadasqun dels optionId passats per paràmetres, comprovar si es igual al id_resp_quest passat per paràmetre

function preselectFunction(selectId, opption)  {
	var id_resp_quest = getparameters(); 
	
	if (opption.value == id_resp_quest) {
		opption.selected =true;
		return selectId;	
	} 
	//document.getElementById(selectId).disabled = true;
}

function  disable_options (selectId) {
	var selectTag = null;
	
		
	if (selectId != null) {
		selectTag = document.getElementById(selectId);
      		for (i=0;i<selectTag.options.length;i++ ) {
      			if (!selectTag.options[i].selected ){
      				selectTag.options[i].disabled="disabled";
 			}     	
 		}
      	}	
}
function getparameters(){
		var url = window.location.href;
		var params = url.split("?");
		var uri = params[0];
		var valor = null;
	try{	
		if(params[1] != null){
			querystring = params[1];
		
			var campos = params[1].split("&");

			for(var i = 0; i < campos.length; i++) {
				var elem = campos[i].split("=");
								
				switch(elem[0]) {
					case 'id_resp_cuest':
						valor = elem[1];
						break;
					default:;
				} // switch
			} // for
		}
 	}
 	catch (ex) {
	}
	return valor;			
} // 
