/**
* 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_;
};