Source: temp/jsdocinputdirs/cercalia.widget.poilist.js

/**
 * POIs overlay widget constructor
 * @class
 * @constructor
 * @param {cercaliax.widget.PoiListOptions} options PoiList options
 */
cercalia.widget.PoiList = function (options) {
	
	/**
	 * Class name
	 * @private
	 * @type {string}
	 */
	this.CLASS_NAME_ = "cercalia.widget.PoiList";
	
	/* SERVICIOS Y WIDGETS DE CERCALIA */
	
	/**
	 * Countries list
	 * @private
	 * @type {cercalia.service.Data}
	 */
	this.data_ = new cercalia.service.Data();
	
	/* OPTIONS */
	
	/**
	 * Container DIV Id.
	 * @private
	 * @type {string}
	 */
	this.divId_ = options.div ? options.div : null;
	
	/**
	 * Menú height, value and units. Ex.: 300px.
	 * @private
	 * @type {string}
	 */
	this.heightMenu_ = options.heightMenu ? options.heightMenu : "auto";
	
	/**
	 * Call function on click on a submenu item.
	 * @private
	 * @type {Function}
	 */
	this.callbackClickElementList_ = options.clickElementList ? options.clickElementList : null;

	/**
	 * List of categories and subcategories to display in menu.
	 * @private
	 * @type {Object}
	 */
	//this.categoryList_ = (typeof(options.categoryList) !== "undefined" && options.categoryList !== null && options.categoryList != "" && !cercalia.jQuery.isEmptyObject(options.categoryList)) ? options.categoryList : this.data_.getCategories();
	this.categoryList_ = null;

	if ( typeof(options.categoryList) !== "undefined" && options.categoryList !== null && options.categoryList != "" && !cercalia.jQuery.isEmptyObject(options.categoryList)){
		this.categoryList_ = options.categoryList;
		this.initialize_();
	} else {
		var self = this;
		this.data_.getCategories(function(categoryList){
			self.categoryList_ = categoryList;
			self.initialize_();
		});
	}

};

/**
 * Initializes element.
 * @private
 */
cercalia.widget.PoiList.prototype.initialize_ = function () {
	
	if( ! this.divId_ ) {
		cercalia.Exception(cercalia.i18n._('WIDGET_ERR_NO_DIV "%"', this.CLASS_NAME_));
	} else {
			
		var element = cercalia.jQuery("#" + this.divId_).addClass("cercalia-widget cercalia-widget-poilist");
		var self = this;
		
		// Texto ayda del listado
		cercalia.jQuery("<i />").html("<a>" + cercalia.i18n._("POILIST_HELP_TEXT") + "</a>").appendTo(element);
		
		// Menu
		var menu = cercalia.jQuery("<div />").addClass("cercalia-widget-poilist-menu").appendTo(element).css({"max-height": this.heightMenu_, "overflow-x": "hidden", "overflow-y": "auto"});

		for(var i = 0; i < this.categoryList_.length; i++) {
			var cat = this.categoryList_[i];
			var catElem = null;

			// Miramos si la categoria tiene subcategorias para añadir el sub menu o añadir funcion de click al menu
			if(cat.subcats && cat.subcats.length > 0) {
				
				// elemento del menu
				catElem = cercalia.jQuery("<h3 />")
					.addClass("cercalia-widget-poilist-item-header")
					.appendTo(menu)
					.html(cat.name)
					.append(
						cercalia.jQuery("<span />")
							.addClass("cercalia-widget-poilist-item-count")
							.html(" (0/" + cat.subcats.length + ")")
				);
				
				// Submenu
				var accordion = cercalia.jQuery("<div />").appendTo(menu).addClass("cercalia-widget-poilist-item-content");
				var subCatElem = cercalia.jQuery("<ul />").addClass("cercalia-widget-poilist-submenu").appendTo(accordion);
				
				for(var j = 0; j < cat.subcats.length; j++) {
					var subCat = cat.subcats[j];
					var menuItem = this.addMenuItem_(subCatElem, subCat.name, "", {"iconLeft": "ui-icon cercalia-icon cercalia-icon-check-disabled cercalia-widget-poilist-menu-check"}, this.clickSubMenu_).attr("data-cat", i).attr("data-subcat", j);
					cercalia.jQuery("<span />").addClass("cercalia-widget-poilist-menu-img ui-icon cercalia-icon cercalia-icon-category " + subCat.img).appendTo(menuItem.find("a"));
					//.html(subCat.name);
					subCat.domElement = menuItem;
				}
			} else {
				// Elemento del menu
				catElem = this.addMenuItem_(menu, cat.name, "", {"iconRight": "ui-icon ui-icon-triangle-1-e"}, this.clickMenu_).attr("data-cat", i);
			}
			
			cat.domElement = catElem;

		}

		// Creamos menu
		menu.accordion({ 
			heightStyle: "content",
			active: false,
			collapsible: true
		});
		cercalia.jQuery("<a />").addClass("cercalia-widget-poilist-uncheck").css("cursor", "pointer").html(cercalia.i18n._("POILIST_UNCHECK_ALL")).appendTo(element).click(function (ev) { self.uncheckAll_(self, ev); });
	}
};

/**
 * Add an item in the specified menu
 * @param {Object} parent DOM element where add the item 
 * @param {string} textNode Item text
 * @param {string} classes Class string to add in item
 * @param {Object.<string, string>} icons Icons can be placed on the item. Two left, one right. {iconLeft, iconRight}
 * @param {Function} clickfunction Function on click element
 * @return {Object}
 * @private
 */
cercalia.widget.PoiList.prototype.addMenuItem_ = function (parent, textNode, classes, icons, clickfunction) {
	
	var menuItem = cercalia.jQuery("<li />")
		.addClass(classes)
		.addClass("cercalia-widget-poilist-menu-item")
		.appendTo(parent)
		.mouseenter(function () {
			cercalia.jQuery(this).addClass("ui-state-focus");
		}).mouseleave(function () {
			cercalia.jQuery(this).removeClass("ui-state-focus");
		});
	
	var menuItemA = cercalia.jQuery("<a />")
		.attr("href", '#')
		.attr("data-selected", "false")
		.html(textNode)
	.appendTo(menuItem);
	
	// Contadores
	cercalia.jQuery("<span />").addClass("cercalia-widget-poilist-item-count").appendTo(menuItemA);
	
	// Imagenes
	if(icons && icons.iconLeft){
		cercalia.jQuery("<span />").addClass("cercalia-widget-poilist-itemImg-left").addClass(icons.iconLeft).appendTo(menuItemA);	
	}
	if(icons && icons.iconRight) {
		cercalia.jQuery("<span />").addClass("cercalia-widget-poilist-itemImg-right").addClass(icons.iconRight).appendTo(menuItemA);
	} 
	
	// Click function
	var self = this;
	if(typeof(clickfunction) === "function") { 
		menuItemA.click(function () {
			var element = cercalia.jQuery(this);
			if(typeof(clickfunction) === "function") {
				clickfunction(self, element);
			}
		});
	}
	
	return menuItem;
};

/**
 * Function on click submenu element
 * @param {cercalia.widget.PoiList} context this
 * @param {Object} element Dom element clicked 
 * @private
 */
cercalia.widget.PoiList.prototype.clickMenu_ = function (context, element) {};

/**
 * Function on click submenu element
 * @param {cercalia.widget.PoiList} context this
 * @param {Object} element Dom element clicked  
 * @private
 */
cercalia.widget.PoiList.prototype.clickSubMenu_ = function (context, element) {
	
	// Canviamos imagen del check y actualizamos object
	if(element.attr("data-selected") === "true") {
		element.attr("data-selected", "false").removeClass("cercalia-widget-poilist-item-selected");
		element.find(".cercalia-widget-poilist-menu-check").removeClass("cercalia-icon-check-enabled").addClass("cercalia-icon-check-disabled");
	} else {
		element.attr("data-selected", "true").addClass("cercalia-widget-poilist-item-selected");
		element.find(".cercalia-widget-poilist-menu-check").removeClass("cercalia-icon-check-disabled").addClass("cercalia-icon-check-enabled");
	}
	context.categoryList_[element.parent().attr("data-cat")].subcats[element.parent().attr("data-subcat")].selected = element.attr("data-selected") === "true";
	
	// Modificamos el contador del header
	var list = context.getSelected(element.parent().attr("data-cat"));
	for(var i = 0; i < list.length; i++) {
		var category = list[i];
		cercalia.jQuery(category.domElement).find(".cercalia-widget-poilist-item-count").html(" (" + category.subcatsTrue.length + "/" + category.subcats.length + ")");
	}
	
	// Evento custom click
	if(context.callbackClickElementList_ !== null) {
		context.callbackClickElementList_();
	}
};

/**
 * Deselect all element function.
 * @private
 * @param {cercalia.widget.PoiList} context this
 * @param {Object} event 
 */
cercalia.widget.PoiList.prototype.uncheckAll_ = function (context, event) {
	// Importante hacerlo con un for para que la ultima llamada borre todos los wms activos.
	var selectedElements = cercalia.jQuery("#" + context.divId_).find(".cercalia-widget-poilist-item-selected");
	for(var i = 0; i < selectedElements.length; i++) {
		cercalia.jQuery(selectedElements[i]).click();
	}
};


/**
 * Returns the selected subcategories of all categories or indicated by parameter
 * @param {number|undefined} cat Active subcategories from a category. If it not indicated returns all.
 * @return {Array.<Object>}
 */
cercalia.widget.PoiList.prototype.getSelected = function (cat) {
	cat = cat ? cat : null;
	var response = [];
	
	if(cat === null) {
		for(var i = 0 ; i < this.categoryList_.length; i++) {
			var category = this.categoryList_[i];
			var responseCats = {"id": cat, name: category.name, domElement: category.domElement, subcats: category.subcats, subcatsTrue: [], subcatsFalse: []};
			
			for(var j = 0; j < category.subcats.length; j++) {
				var subcat = category.subcats[j];
				if(subcat.selected) {
					responseCats.subcatsTrue.push(subcat);
				} else {
					responseCats.subcatsFalse.push(subcat);
				} 
			}
			
			if(responseCats.subcats.length > 0) {
				response.push(responseCats);
			}
		}
	} else {
		var category = this.categoryList_[cat];
		var responseCats = {"id": cat, name: category.name, domElement: category.domElement, subcats: category.subcats, subcatsTrue: [], subcatsFalse: []};
		
		for(var j = 0 ; j < category.subcats.length; j++) {
			var subcat = category.subcats[j];
			if(subcat.selected) {
				responseCats.subcatsTrue.push(subcat);	
			} else {
				responseCats.subcatsFalse.push(subcat);
			} 
		}
		
		response.push(responseCats);
	}
	
	return response;
};


/**
 * Returns the selected subcategories of all categories or indicated by parameter
 * @param {number|undefined} cat Active subcategories from a category. If it not indicated returns all.
 * @return {Array.<string>}
 */
cercalia.widget.PoiList.prototype.getSelectedId = function (cat) {
	cat = cat ? cat : null;
	var responseList = [];
	var list = this.getSelected(cat);
	
	for(var i = 0 ; i < list.length; i++) {
		var category = list[i];
		
		for(var j = 0; j < category.subcatsTrue.length; j++) {
			var subcat = category.subcatsTrue[j];
			responseList.push(subcat.id);
		}
	}
	
	return responseList;
};

/**
* Returns the type of the object.
* @return {string}
*/
cercalia.widget.PoiList.prototype.getClass = function(){
	return this.CLASS_NAME_;
};