/*
 * Created on 05/10/2006 by Alan Lois
 * Version 1.0 on 05/10/2006 by Alan Lois
 */

	/**
	* Constructor del objeto de javascript
	*/
	function Cookie(timeToExp, path, id){
	
	   //DEFINIMOS PROPIEDADES Y METODOS DEL OBJETO:
		//propiedades
		this.names=new Array();
		this.values=new Array();
		this.path="/"; //path de las paginas que leen y escriben en la cookie
		this.timeToExpire=370000000000;	//valor por defecto para que no expire "nunca" (en milisegundos)
		this.id="";  //Un identificador para registrar d que
					 // formulario (o cualquier otra cosa) son los datos a
					 // guardar. No es necesario que sea el id del formulario
					 // real, puede ser cualquier cosa que queramos poner que
					 // identifique univocamente al conjunto de datos a guardar.
		this.separator = "#";	//separador que se usa para guardar varios valores en grupo
								//con un unico nombre para todo el grupo
		this.namesSeparator = "_";	//separador que se usa para separar el id del name en
									// el nombre de la cookie
		this.valuesSeparator = "*";	//separador que para guardar varias variables dentro
									//de un subgrupo (dentro del grupo de valores guardados en la cookie).
		
		//metodos
		this.setNames=setNames;
		this.getNames=getNames;
		this.setName=setName;
		this.addName=addName;
		
		this.setValues=setValues;
		this.getValues=getValues;
		this.setValue=setValue;
		this.addValue=addValue;
		
		this.setPath=setPath;
		this.getPath=getPath;
		this.setTimeToExpire=setTimeToExpire;
		this.getTimeToExpire=getTimeToExpire;
		
		this.setId=setId;
		this.getId=getId;
		this.setSeparator=setSeparator;
		this.getSeparator=getSeparator;
		this.setNamesSeparator=setNamesSeparator;
		this.getNamesSeparator=getNamesSeparator;
		this.setValuesSeparator=setValuesSeparator;
		this.getValuesSeparator=getValuesSeparator;
				
		this.clear=clear;
		this.write=write;
		this.read=read;
		this._processPair=_processPair;
		
		//metodos que se usan para meter datos y pedir datos:
		this.addNameAndValue=addNameAndValue;		
		this.getValueByName=getValueByName;
		//metodos para pedir y guardar array de values con un unico name:
		this.addNameAndValuesArray=addNameAndValuesArray;		
		this.getValuesArrayByName=getValuesArrayByName;
		this.getValuesArrayByNameAndPrefix=getValuesArrayByNameAndPrefix;
		
		//establecemos valores de los parametros del constuctor
		if(timeToExp !=null && timeToExp!="" && timeToExp>0){
			this.timeToExpire=timeToExp;
			//alert("this.timeToExpire = " + this.timeToExpire);
		}		
		if(path!=null) this.path=path;
		if(id!=null) this.id=id;
	}
	
	/**
	* Borra los datos que tiene la cookie
	*
	*/
	function clear(){
		this.names=new Array();
		this.values=new Array();
	}
	
	/**
	*Funcion que carga el array names con los nombres
	*de las variables de la busqueda que se guardaran
	*en la cookie
	*/	
	function setNames(namesArray){
		this.names = namesArray;		
	}
	
	/**
	*Devuelve el array con los nombres de las variables que se
	*guardaran en la cookie
	*/
	function getNames(){
		return this.names;
	}
	
	/**
	*Establece un valor en la posicion dada del array names
	*/	
	function setName(pos,name){
		if(this.names==null){
			this.names = new Array();
		}
		this.names[pos-1]= name;
	}
	
	/**
	*Aņade un valor al final del array names
	*/	
	function addName(name){
		if(this.names==null){
			this.names = new Array();
		}
		//this.names[this.names.length]= name;	//aņade al final del array (esto hace lo mismo que el push)
		this.names.push(name);	//aņade al final del array
	}

	/**
	*Funcion que carga el array values con los valores 
	*de las variables de la busqueda que se guardaran
	*en la cookie
	*/	
	function setValues(valuesArray){
		this.values= valuesArray;
	}

	/**
	*Devuelve el array con los valores de las variables que se
	*guardaran en la cookie
	*/
	function getValues(){
		return this.values;
	}
	
	/**
	*Establece un valor en la posicion dada del array names
	*/	
	function setValue(pos,value){
		if(this.values==null){
			this.values = new Array();
		}
		this.values[pos]= value;		
	}
	
	/**
	*Aņade un valor al final del array values
	*/	
	function addValue(value){
		if(this.values==null){
			this.values = new Array();
		}
		
		this.values.push(value);	//aņade al final del array
	}

	/**
	*Establece el path (ruta) de la cookie
	*/
	function setPath(newPath){
		this.path=newPath;
	}
	
	/**
	*Devuleve el path (ruta) de la cookie
	*/
	function getPath(){
		return this.path;
	}

	/**
	*Establece el tiempo de expiracion de la cookie
	*/
	function setTimeToExpire(time){
		this.timeToExpire=time;
	}
	
	/**
	*Devuleve el tiempo de expiracion de la cookie
	*/
	function getTimeToExpire(){
		return this.timeToExpire;
	}
	
	/**
	*Establece el id que identifica al conjunto de valores
	*guardados en la cookie
	*/
	function setId(newId){
		this.id=newId;
	}
	
	/**
	*Devuleve el id que identifica al conjunto de valores
	*guardados en la cookie
	*/
	function getId(){
		return this.id;
	}
	
	/**
	*Establece el separador que se usara para concatenar
	*values para guardarlos en grupo (con un unico name)
	*/
	function setSeparator(newSeparator){
		this.separator=newSeparator;
	}
	
	/**
	*Devuelve el separador que se usara para concatenar
	*values para guardarlos en grupo (con un unico name)
	*/
	function getSeparator(){
		return this.separator;
	}
	
	/**
	*Establece el namesSeparator que se usara para concatenar
	*el id y el variableName en el nombre de la cookie
	*/
	function setNamesSeparator(newNamesSeparator){
		this.namesSeparator=newNamesSeparator;
	}
	
	/**
	*Devuelve el namesSeparator que se usara para concatenar
	*el id y el variableName en el nombre de la cookie
	*/
	function getNamesSeparator(){
		return this.namesSeparator;
	}
	
	
	
	/**
	*Establece el valuesSeparator que se usara para concatenar
	*values para guardarlos en subgrupo
	*/
	function setValuesSeparator(newValuesSeparator){
		this.valuesSeparator=newValuesSeparator;
	}
	
	/**
	*Devuelve el valuesSeparator que se usara para concatenar
	*values para guardarlos en subgrupo
	*/
	function getValuesSeparator(){
		return this.valuesSeparator;
	}
	
	/**
	*Funcion que crea la cadena que se guardara en la cookie.
	*Dicha cadena contiene los pares name=value (sacados de
	*names y de values) y ademas una fecha de 
	*expiracion de la cookie muy lejana para que no 
	*expire "nunca".
	*
	*@param id (Opcional) Un identificador para registrar d que
	* formulario (o cualquier otra cosa) son los datos a
	* guardar. No es necesario que sea el id del formulario
	* real, puede ser cualquier cosa que queramos poner que
	* identifique univocamente al conjunto de datos a guardar.
	*@param time (Opcional) Tiempo de expiracion de la cookie
	*/
	function write(id, path, time){
			//alert("dentro del write()");
/*		if(id != null) this.setId(id);	//por defecto "", pero si nos pasan algo lo asignamos
		if(path != null) this.setPath(path);	//por defecto "", pero si nos pasan algo lo asignamos
		if(time!=null && time!="" && time>0){
			//si nos han pasado un timeToExpire -> lo asignamos (en milisegundos)
			this.setTimeToExpire(time);
		}		
*/

		//Cargamos los parametro de las cookies.
		//Si no nos pasan nada usamos el que se haya pasado en el constructor o su valor por defecto
		if(id==null) id = this.getId();	//parametro nuestro 
		if(path==null) path = this.getPath();	//parametro propio de javascript
		if(time==null || time =="") time = this.getTimeToExpire(); //parametro propio de javascript
		
		
		//Construimos el path si hay que aņadirlo (si hay algun valor para el path)
		var pathString ="";
		if(path!=null && path!="") pathString = "; path=" + path;
		
		//Construimos cadena con el tiempo de expiracion, que 
		//debe ser una cadena en formato GMTString:
		//expires=Sun, 21-Aug-50 11:11:11 GMT;
		var cookieExpires = new Date();
		cookieExpires.setTime(cookieExpires.getTime() + time); 
		cookieExpires = "expires=" + cookieExpires.toGMTString() + "; ";
		//var cookieExpires = "expires=Sun, 21-Aug-50 11:11:11 GMT; "; // Es una fecha cualquiera para que no expire "nunca"
		
		//Guardamos en la cookie todos los datos del array: values
		//alert("this.getNames().length = " + this.getNames().length + " ; this.getValues().length = " + this.getValues().length);
		for(var i=0 ; i<this.getValues().length ; i++){
			if(this.getNames()[i].indexOf("JSESSIONID")==-1){ //Evitamos que guarde sessionID que no debe guardar este metodo
				document.cookie= id + "_" + escape(this.getNames()[i]) + "=" + escape(this.getValues()[i])+ pathString + "; " + cookieExpires;
			}
		}
		
		//******* para comprobaciones ********
			//alert("datos guardados con exito en la cookie :" +"\r\n" +"\r\n" + document.cookie);
		//************************************
		
	}
		
	/**
	*Funcion que lee la cookie y guarda los pares name=value
	*en los arrays names y values
	*
	*@param id (Opcional) Un identificador para registrar d que
	* formulario (o cualquier otra cosa) son los datos a
	* guardar. No es necesario que sea el id del formulario
	* real, puede ser cualquier cosa que queramos poner que
	* identifique univocamente al conjunto de datos a guardar.
	*/
	function read(id){
			//alert("dentro del read(): \r\n" + document.cookie);
		this.clear();
		
		var cookiePairs = null;		//todos los pares: name=value		
		cookiePairs = document.cookie.split("; "); //Aqui leemos la cookie y dividimos en pares name=value

		//alert("despues de leer cookie. cookiePairs.length = " + cookiePairs.length);
		for(var i=0;i<cookiePairs.length;i++){
			this._processPair(cookiePairs[i], i, id);
			//alert("this.getNames()[" +i+ "]: " + this.getNames()[i] + " ; " + "this.getValues()[" +i+ "]: " + this.getValues()[i]);	
		}
	}
	
	/**
	*Guarda el name y el value de cookiePair en los arrays
	*de la cookie (names y values) si contiene el id buscado
	*
	*--Metodo privado-- Solo se usa aqui 
	*/
	function _processPair(cookiePair, pos, id){
		//Cargamos los parametro de las cookies.
		//Si no nos pasan nada usamos el que se haya pasado en el constructor o su valor por defecto
		if(id==null) id = this.getId();	//parametro nuestro 
		var namesSeparator = this.getNamesSeparator();
		
		var cookiePairData = unescape(cookiePair).split("=");
		
		//si el name contiene el id, entonces es uno de los datos buscados, asi que lo procesamos
		var cookiePairName = cookiePairData[0].split(namesSeparator);
		if(cookiePairName[0] == id){			
			//metemos en el array el name SIN el id de la cookie 
			this.addNameAndValue(cookiePairName[1], cookiePairData[1]);
				//alert(pos + ": " + cookiePairName[1] + " -> " + cookiePairData[1]);	
		}
		
		/*
		//si el name contiene el id, entonces es uno de los datos buscados, asi que lo procesamos
		if(cookiePairData[0].indexOf(id) != -1){
			var startPos = cookiePairData[0].indexOf("_")+1 ;
			
			//metemos en el array el name SIN el id de la cookie (para ello hacemos un substring
			//desde el caracter siguiente al "_" hasta el final del name)
			this.addNameAndValue(cookiePairData[0].substring(startPos), cookiePairData[1]);
			//alert(pos + ": " + cookiePairData[0].substring(startPos)+" -> " + cookiePairData[1]);	
		}
		*/
	}
	

	/**
	*Aņade el par (name,value) a los array names y values
	*/
	function addNameAndValue(name, value){
		this.addName(name);
		this.addValue(value);
	}
		
	/**
	*Funcion que nos devuelve (de la cookie) el valor de una variable
	*a partir del nombre de la variable
	*
	*Si no encuentra la variable buscada: devuelve null	
	*/
	function getValueByName(variableName){
		//Si hay algun valor en los arrays q tienen los datos de la cookie:
		if(this.getNames()[0]!= "" && this.getNames()[0]!=null && this.getValues()[0]!= "" && this.getValues()[0]!=null){ 
			for(var i=0;i<this.getNames().length;i++){
				if(this.getNames()[i] == variableName){ 
					//Si esta posicion del array contiene la variable buscada
					// devolvemos el value asociado a ese name:
					return this.getValues()[i];
				}
			}
		}

		//si no se ha encontrado el nombre de variable (variableName)
		// buscado o la cookie no tiene datos, devolvemos null
		return null;
	}

	/**
	*Aņade el par (name,value) a los array names y values
	*donde value es la concatenacion de los elementos
	*del array values usando como separador lo que devuelve: this.getSeparator()
	*/
	function addNameAndValuesArray(name, aValues){
		var value = "";
	
		for(var i=0;i<aValues.length;i++){
			value += aValues[i] + this.getSeparator();
		}
		value = value.substring(0,value.lastIndexOf(this.getSeparator()));	//quitamos el ultimo separador porque no debe estar
		
			/*alert("addNameAndValuesArray:" + "\r\n"
				 	+ "value = " + value
				 );
			*/
		
		this.addName(name);
		this.addValue(value);
	}
	
	/**
	*Funcion que nos devuelve(de nuestro objeto cookie) un
	*array de valores que se habian guardado asociados a un
	*unico nombre de cookie
	*
	*@param variableName nombre del conjunto de datos buscado
	*
	*@return array de valores. Si no encuentra la variable
	*	 buscada: devuelve null	
	*/
	function getValuesArrayByName(variableName){
		
		//cogemos la cadena de valores concatenados usando el separador
		var aValues = this.getValueByName(variableName);
				
		if(aValues != null){
			return aValues.split(this.getSeparator());
		}
		
		return null;
	}
	
	/**
	*Si encontramos el prefijo en un elemento del array de datos
	*le hacemos un split para separar los values contenidos en el elemento
	*y devolvemos un array con esos values(donde el primer elemento es
	*el prefijo buscado) o null si no se ha encontrado
	*
	*@param dataArray array con los datos donde se buscara
	*@prefix prefijo del conjunto de values buscados
	*@param valuesSeparator separador de valores dentro de un
	*		subgrupo dentro del valor de la cookie
	*
	*return array de values (el primer elemento del array es el prefijo)
	*		o null si no se ha encontrado
	*/
	function getValuesArrayByNameAndPrefix(variableName, prefix, valuesSeparator){
		//TODO:En proxima version se descomentaria esto y se meteria
		//tambien metodos para guardar datos en la cookie a nivel de "prefix"
		//Esto de momento lo quitamos para obligar a que se pase el separador a usar. 
		//if(valuesSeparator ==null) valuesSeparator = this.getValuesSeparator;
	
		//cogemos el array de datos con ese nombre:variableName
		var dataArray = this.getValuesArrayByName(variableName);
	
		if(dataArray!=null){
			for(var i=0;i<dataArray.length;i++){
				//si encontramos el prefijo en este elemento del array de datos
				//le hacemos un split para separar los values contenidos en el elemento
				//y devolvemos un array con esos values(donde el primer elemento es
				//el prefijo buscado)
				var subDataArray = dataArray[i].split(valuesSeparator);
				
				if(subDataArray[0] == prefix){
					/*alert("dentro de getValuesArrayByPrefix" + "\r\n"
							+ "prefix = " + prefix + "\r\n"
							+ "subDataArray = " + subDataArray
						);
					*/
					return subDataArray;
				}
			}
		}
		
		return null;
	}
	