/**
 * Objeto especial para manipular los datos del historial
 * 
 * @author Monoku Team <http://www.monoku.com>
 */
var HManager = {
	
	/**
	 * Cache de categorias agregadas
	 */
	categories : {},
	
	/**
	 * Pagina actual
	 */
	page : 1,
	
	/**
	 * Indicador de carga de documento
	 */
	loaded : false,	
	
	/**
	 * Separador de las variables
	 */
	separator: '+',
	
	/**
	 * URL Local Cache
	 */
	hash: location.hash,
	
	/**
	 * Modos en que no se ejecuta la accion por defecto
	 * Es decir, envia el query vacio para listar todos los registros
	 */
	excModes: {
		'proyectos-de-ley': true,
		'votaciones': true,
		'citaciones': true,
		'agora': true
	},
	
	/**
	 * Almacena la forma en que se van a ingresar los resultados al listado
	 */
	appendMode : (typeof pushToList !== 'undefined' && pushToList.REPLACE) || '',
	
	
	avaliablePages: 0,
	
	/**
	 * Verifica si existe el valor en la URL
	 * 
	 * @param String value Valor a verificar
	 * @return bool Se encuentra ya el valor?
	 */
	has: function( value ){
		var hash = this.getVar('q');
		
		value = slugify(value);
		
		for(var i = 0, n = hash.length; i < n; i++){
			if(value === hash[i]){
				return true;
			}
		}
		return false;
	},
	
	
	/**
	 * Agrega un valor a la variable q
	 * 
	 * @param String value Valor a agregar
	 */
	add: function(value){
		// Cargamos el valor actual de la variable
		var q = this.getVar('q') || [];
		//quitamos la berruga del valor a agregar si existiese
		value = slugify( value.replace("%7E+", "") );
		//agregamos el valor a la URL
		q.push(value);
		this.setVar('q', q.join(this.separator));
		
		return this;
	},
	
	
	/**
	 * Agrega o modifica una variable del hash
	 * 
	 * @param String name Nombre de la variable
	 * @param String value Valor de la variable
	 */
	setVar: function(name, value){
		//parseamos las variables
		var vars = this.parse();
		//limpiando el nombre por seguridad
		name = slugify(name);		
		
		//Esta parte no debería ser así
		if(name !== 'q' && vars['q'] && vars['q'].constructor !== String ){
			vars['q'] = vars['q'].join(this.separator);
		}
		
		if( vars[name] ){
			vars[name] = value;
			this.hash = this.makeQuery(vars);
			return this;
		}
		
		//guardando el hash
		vars[name] = value;
		this.hash = this.makeQuery(vars);
		return this;
	},
	
	
	/**
	 * Crea un QueryString desde un objeto
	 * 
	 * @param Object obj Objecto a convertir
	 * @return String QueryString
	 */
	makeQuery: function(obj){
		var query = [];
		for(var i in obj){
			query.push(i +'='+ obj[i]);
		}
		
		return query.join('&');	
	},
	
	
	/**
	 * Carga el valor de una variable en el hash
	 * 
	 * @param String name Nombre de la variable
	 * @return String Valor de la variable en el hash
	 */
	getVar: function(name){
		var vars = this.parse();
		name = slugify(name);
		
		return vars[name] || '';
	},
	
	/**
	 * Borra una variable del hash
	 * 
	 * @param String name Nombre de la variable
	 */
	disposeVar: function(name){
		var vars = this.parse();
		
		name = slugify(name);
		vars[name] && delete vars[name];
		
		//Esta parte no debería ser así
		if(vars['q'] && vars['q'].constructor !== String ){
			vars['q'] = vars['q'].join(this.separator);
		}
		
		this.hash = this.makeQuery(vars);
		return this;
	},
	
	
	/**
	 * Borra un item de la Query
	 * 
	 * @param String value Valor a borrar de la Query
	 */
	dispose: function(value){ 
		var q = this.getVar('q'),
			newHash = [];
		
		value = slugify(value);
		
		for(var i = 0, n = q.length; i < n; i++){
			if( q[i] != value ){
				newHash.push( q[i] );
			}
		}
		
		if( newHash.length > 0 ){
			this.setVar('q', newHash.join(this.separator) );
		}
		else{
			this.disposeVar('q');
			this.disposeVar('page');
		}
		
		return this;
	},
	
	
	parse: function(){
		var hash = HManager.hash.split('&'),
			hashBits = null,
			vars = {};
		
		for(var i = 0, n = hash.length; i < n; i++){
			if(hash[i] !== ''){
				hashBits = hash[i].split('=');
				if(hashBits[0] == 'q'){
					hashBits[1] = hashBits[1].split(this.separator);
				}
				
				vars[ hashBits[0] ] = hashBits[1];
			}
		}
		
		return vars;
	}
};

