var CURRENT_VIEW = '';
var CURRENT_PATH = location.pathname.replace('/banco/online/', '');
CURRENT_PATH = CURRENT_PATH[CURRENT_PATH.length-1] == '/' ? CURRENT_PATH.slice(0, CURRENT_PATH.length-1) : CURRENT_PATH;

$(document).ready(function() {
  pilar = typeof pilar != "undefined" ? pilar : '';
  rubro = typeof rubro != "undefined" ? rubro : '';
  if (pilar != '') {
    catalogo = new Catalogo(pilar, rubro);
  }else{
    $('[data-comp="resultados"]').html('');
    $('[data-comp="filtros"]').hide();
  }
});

//config
var catalogoConfig = {
  crawlerURL: '/banco/contenthandler/searchfeed/search?',
  repositories: {
    catalogo: 'search_service_portal::/aplicaciones/tsr/collections/catalogo',
    autocomplete: 'search_service_portal::/aplicaciones/tsr/collections/autocomplete'
  },
  maxResults: 12
};

// biblioteca parametros
var parameters = {
  page: 'pagina',
  category : 'rubro',
  query: 'buscar',
};

var Catalogo = function(category, subcategory) {
  var _ = this;
  
  _.el           = '[data-comp="beneficiosLista"]';
  _.$el          = $(_.el);
  
  _.category = category; // viene cuando creo el catálogo
  _.subcategory = subcategory;
  _.facets = undefined; // todas las facetas
  
  this.init = function() {
    //listeners
    document.addEventListener('onPageChange', _.onPageChange);
    document.addEventListener('onFiltersChange', _.onFiltersChange);
    document.addEventListener('onStateChange', function(e){_.onStateChange(e.detail);});
    document.addEventListener('doSearch', _.doSearch);
    
    //elements
    _.$filters     = $(_.el + ' [data-comp="filtros"]');
    _.$categoryNav = $('[data-comp="beneficioNavegacion"]');
    _.$categoryNavOverflow = _.$categoryNav.find('.overflow');
    _.$results     = $(_.el + ' [data-comp="resultados"]');
    _.$categories  = $(_.el + ' [data-comp="categoria"]');
    
    //helpers
    _.helper     = new CatalogoHelper();
    _.templates  = new CatalogoTemplates();
    _.pagination = new CatalogoPagination(_.el + ' [data-comp="paginador"]');
    _.filters    = new CatalogoFilters(_.$filters);
    _.navigation = new CatalogoNavigation(_.filters);
    
    // scroll
    _.scroll();
    $window.scroll(_.scroll);
    
    // resize
    $window.resize(_.resize);
    
    // inicio
    _.getData();
  };
  
  /**
   * resize
   */
  this.resize = function() {
    _.scroll();
  };
  
  /**
   * scroll
   */
  this.scroll = function() {
    
    // global scroll
    var globalScroll = $window.scrollTop();
    
    // offsets
    var categoryH;
    if (_.$categoryNav.length) {
      if (_.$categoryNav.hasClass('mobileTitleOn')) {
        if (WW>767) {
          categoryH = _.$categoryNavOverflow.height();
        } else {
          categoryH = 0;
        }
      } else {
        categoryH = _.$categoryNavOverflow.height();
      }
    } else {
      categoryH = 0;
    }
    
    if($html.hasClass('ios-uiwebview') || $html.hasClass('ios-standalone')){
      var HeaderSize = 0;
    } else {
      var HeaderSize = HH;
    }
    
    var filtrosOT = _.$filters.offset().top - (HeaderSize+categoryH);
    var filtrosOB = (_.$el.offset().top + _.$el.height() - (HeaderSize+categoryH)) - _.$filters.height();
    
    // ---
    
    // filters pined
    if (globalScroll <= filtrosOT) {
      $body.removeClass('filtersPined filtersPinedHidden');
    } else if (globalScroll > filtrosOT && globalScroll < filtrosOB) {
      $body.removeClass('filtersPinedHidden');
      $body.addClass('filtersPined');
    } else if (globalScroll >= filtrosOB) {
      $body.addClass('filtersPined filtersPinedHidden');
    }
    
  };
  
  /**
   * Se piden los datos para armar los filtros
   */
  this.getData = function() {
    //console.log('data: get');
    // pido facetas
    var params = {
      facet: [
        JSON.stringify({
          "id": "zona",
          "count": "ALL",
          "sortOrder": "DESC"
        }),
        JSON.stringify({
          "id": "rubro",
          "count": "ALL",
          "sortOrder": "DESC"
        }),
        JSON.stringify({
          "id": "medios",
          "count": "ALL",
          "sortOrder": "DESC"
        }),
        JSON.stringify({
          "id": "tipodebeneficio",
          "count": "ALL",
          "sortOrder": "DESC"
        })
      ],
      start: 0,
      results: 1
    };
    
    //filtro por categoría
    if (typeof _.category != "undefined") {
      params['constraint'] = JSON.stringify({
        "type": "category",
        "id": "rubro",
        "values": [_.category]
      });
    }
    
    _.helper
      .searchData(params)
      .done(_.onGetData)
      .fail(function(error) {});
  };
  
  /**
   * Callback getData
   */
  this.onGetData = function(data) {
    //console.log('data: loaded');
    
    // seteo categorías
    _.setFacets(data.facets);
    //ready
    _.onReady();
  };
  
  this.onReady = function() {
    //console.log('catalogo: ready');
    
    history.pushState(null, null, window.location.href);
    _.navigation.popstate({originalEvent:true});
  };
  
  /**
   * Busqueda en base a los filtros activos y 
   * la pagina que vienen de detail
   */
  this.doSearch = function(data){
    //console.log('do search');
    var params = _.filters.getFilters();
    params['start'] = _.pagination.getStart(data.detail[parameters.page]);
    
    _.getBenefits(params);
  };
  
  /**
   * Seteo la faceta actual y armo filtros
   */
  this.setFacets = function(facets){
    _.facets = facets;
    
    if($.isEmptyObject(_.facets)){
      _.$filters.hide();
    }else{
      _.$filters.show();
    }
    
    if(typeof _.facets.rubro != "undefined"){
      for (var i = 0; i < _.facets.rubro.length; i++) {
        var rubro = _.facets.rubro[i];
        var sub =_.facets.rubro[i];
        if(_.category == rubro.name){
          for (var j = 0; j < rubro.values.length; j++) {
            if(rubro.values[j].name == _.subcategory){
              sub = rubro.values[j];
            }
          }
          _.filters.setFilter(rubro, sub);
          break;
        }
      }
    }
    _.filters.setAdvancedFilters({
      zona: typeof facets.zona != "undefined" ? facets.zona : [],
      medios: typeof facets.medios != "undefined" ? facets.medios : [],
      tipodebeneficio: typeof facets.tipodebeneficio != "undefined" ? facets.tipodebeneficio : [],
      dias: [
        {id: 'lunes', name: 'Lunes'},
        {id: 'martes', name: 'Martes'},
        {id: 'miercoles', name: 'Miércoles'},
        {id: 'jueves', name: 'Jueves'},
        {id: 'viernes', name: 'Viernes'},
        {id: 'sabado', name: 'Sábado'},
        {id: 'domingo', name: 'Domingo'},
      ]
    });
  };
  
  this.getBenefits = function(params) {
    
    var search_params = $.extend({}, params);
  
    var constraint = [];
    
    if (typeof search_params[parameters.query] != "undefined") {
      search_params.query = search_params[parameters.query];
      delete search_params[parameters.query];
    }
    
    //filtro por categoría
    if (typeof search_params[parameters.category] != "undefined") {
      constraint.push(
        JSON.stringify({
          "type": "category",
          "id": "rubro",
          "values": [search_params[parameters.category]]
        })
      );
      delete search_params[parameters.category];
    }
    
    if (typeof search_params.tipodebeneficio != "undefined") {
      constraint.push(
        JSON.stringify({
          "type": "category",
          "id": "tipodebeneficio",
          "values": [search_params.tipodebeneficio]
        })
      );
      delete search_params.tipodebeneficio;
    }
    
    if (typeof search_params.dia != "undefined") {
      constraint.push(
        JSON.stringify({
          "type": "field",
          "id": "dia",
          "values": search_params.dia
        })
      );
      delete search_params.dia;
    }
    
    if (typeof search_params.medios != "undefined") {
      constraint.push(
        JSON.stringify({
          "type": "category",
          "id": "medios",
          "values": search_params.medios
        })
      );
      delete search_params.medios;
    }
    
    if (typeof search_params.zona != "undefined") {
      constraint.push(
        JSON.stringify({
          "type": "category",
          "id": "zona",
          "values": [search_params.zona]
        })
      );
      delete search_params.zona;
    }
    
    if(constraint.length){
      search_params.constraint = constraint;
    }
    
    _.startLoading();
    
    _.helper
      .searchBenefits(search_params)
      .done(_.loadResults)
      .fail(_.emptyResults);
  };

  /**
   * Busco beneficios en el cambio de página
   */
  this.onPageChange = function(data){
    
    var detail = $.extend({}, data.detail);
    
    // offsets
    var categoryH;
    if (_.$categoryNav.length) {
      if (_.$categoryNav.hasClass('mobileTitleOn')) {
        if (WW>767) {
          categoryH = _.$categoryNavOverflow.height();
        } else {
          categoryH = 0;
        }
      } else {
        categoryH = _.$categoryNavOverflow.height();
      }
    } else {
      categoryH = 0;
    }
    
    // obtengo filtros actuales
    var params = _.filters.getFilters();

    // cambio de posición
    params.start = detail.start;
    params.results = detail.results;
    
    // búsqueda
    _.getBenefits(params);
    
    //scroll
    scrollTo({
      val: Number(_.$filters.offset().top - (HH + categoryH)),
      speed: 0
    });
    
  };
  
  /**
   * Busco beneficios en el cambio de filtros
   */
  this.onFiltersChange = function(data){
    var params = $.extend({}, data.detail.filters);
    
    params.start = 0;
    
    // offsets
    var categoryH;
    if (_.$categoryNav.length) {
      if (_.$categoryNav.hasClass('mobileTitleOn')) {
        if (WW>767) {
          categoryH = _.$categoryNavOverflow.height();
        } else {
          categoryH = 0;
        }
      } else {
        categoryH = _.$categoryNavOverflow.height();
      }
    } else {
      categoryH = 0;
    }
    
    //búsqueda
    _.getBenefits(params);
    
    //scroll  
    scrollTo({
      val: Number(_.$filters.offset().top - (HH + categoryH)),
      speed: 0
    });
    
  };
  
  /**
   * Escucho los cambios de estado del history
   */
  this.onStateChange = function(url_params){
    //console.log('on state change');
    var PREV_VIEW = CURRENT_VIEW;
    CURRENT_VIEW = "catalogo";
    if(PREV_VIEW == 'beneficio'){
      return false;
    }
    // update de la ui
    document.dispatchEvent(new CustomEvent('updateFilters', {detail: url_params}));
    // busqueda
    document.dispatchEvent(new CustomEvent('doSearch', {detail: url_params}));
  };
  
  /**
   * Render de los resultados
   */
  this.loadResults = function(results) {
    //console.log('load results from page ' + catalogo.pagination.current);
    
    if(results.data.length){
      _.$results.html(_.templates.benefits(results.data));
    }else{
      _.$results.html(_.templates.benefitsNoResults());
    }
    
    // se rearma el paginador
    _.pagination.render(results.page);
    
    _.stopLoading();
  };

  this.emptyResults = function(error) {
    _.stopLoading();
    _.$results.html(_.templates.benefitsError());
  };
  
  /**
   * Loading
   */
  this.startLoading = function() {
    //console.log('loading: start');
    $body.addClass('catalogoLoading');
    $body.removeClass('catalogoReady');
    _.$results.html(_.templates.benefitsLoading());
  };

  this.stopLoading = function() {
    //console.log('loading: stop');
    $body.removeClass('catalogoLoading');
    $body.addClass('catalogoReady');
  };
  
  if(_.$el.length){
    _.init();
  }
};

/**
 * Paginador del catálogo
 */
var CatalogoPagination = function(el){
  var _ = this;
  
  // elementos
  _.el = el;
  
  // variables de paginación
  _.total    = 1; //total results
  _.current  = 1; //current page
  _.pages    = 1; //total pages
  _.index    = 0; //desde que posición empieza
  _.per_page = 1; //results per page
  
  this.init = function(){
    _.templates = new CatalogoTemplates();
    _.per_page = catalogoConfig.maxResults;
    // events
    _.setEvents();
  };
  
  /* { totalResults, startIndex, itemsPerPage} */
  this.render = function(page) {
    if (typeof page == "undefined") {
      return false;
    }
    
    //cantidad total de resultados
    _.total = typeof page.totalResults ? page.totalResults : _.total;
    _.per_page = typeof page.itemsPerPage ? page.itemsPerPage : _.per_page;
    _.index = typeof page.sdatartIndex ? page.startIndex : _.index;
    
    _.pages = Math.ceil(_.total/_.per_page);
    _.current = ( _.index/_.per_page ) + 1;
    
    _.$el = $(_.el);
    if (!_.$el.length) {
      return false;
    }
    
    _.$pager = _.$el.find('.pager');
    if (!_.$pager.length) {
      return false;
    }

    // render
    _.$pager.html(_.templates.pager(_.pages));
    // ui
    _.update();
  
  };
  
  this.setEvents = function(){
    
    $body.on('click', _.el+' [data-nav]', function(e) {
      e.preventDefault();
      var $this = $(this);
      var dir = $this.data('nav');
      var inactive = $this.hasClass('inactive');
      if (inactive) {
        return false;
      }
      var page = 1;
      if (dir == 'next') {
        page =  _.current+1;
      } else
      if (dir == 'prev') {
        page =  _.current-1;
      }
      _.goToPage(page);
    });

    $body.on('click', _.el+' [data-page]', function(e) {
      e.preventDefault();
      var $this = $(this);
      var page = parseInt($this.data('page'));
      var current = $this.hasClass('current');
      if (current) {
        return false;
      }
      _.goToPage(page);
    });
  };
  
  this.goToPage = function(page) {
    var page = typeof page != 'undefined' ? page : 1;
    var start = _.getStart(page);
    //console.log('go to page: ' + page);
    //set current
    _.current = page;
    // ui
    _.update();
  	// event
    document.dispatchEvent(new CustomEvent('onPageChange', {
      detail: {
        start: start,
        results: _.per_page,
        page: _.current
      }
    }));
  };
  
  /**
    * helper para obtener la posición inicial en base a la página
    */
  this.getStart = function(page){
    var page = typeof page != 'undefined' || page > 0 ? page : 1;
    var start = _.per_page * (page - 1);
    return start;
  };
  
  this.update = function() {
    // next prev
    if (_.current == 1) {
      $(_.el+' [data-nav=prev]').addClass('inactive');
      $(_.el+' [data-nav=next]').removeClass('inactive');
    } else if (_.current == _.pages) {
      $(_.el+' [data-nav=prev]').removeClass('inactive');
      $(_.el+' [data-nav=next]').addClass('inactive');
    }
    //current
    $(_.el+' [data-page]').removeClass('current');
    $(_.el+' [data-page="' + _.current + '"]').addClass('current');
    if ($(_.el + ' [data-page]').length <= 1) {
      $(_.el).hide();
    } else {
      $(_.el).show();
    }
  };
  
  _.init();
  
};

/**
 * Navegación del Catálogo con history
 */
var CatalogoNavigation = function(filters) {
  var _ = this;
  
  this.init = function(){
    // listeners
    document.addEventListener('onPageChange', _.changePage);
    document.addEventListener('onQueryChange', _.changeQuery);
    document.addEventListener('onFiltersChange', _.changeFilters);
    
    // url inicial
    _.base_url = window.location.href.split('?')[0];
    
    // pop state
    $window.on('popstate', _.popstate);
  };
  
  /**
   * Escucho el cambio de página
   */
  this.changePage = function(data){
    var detail = $.extend({}, data.detail);
    // obtengo url actual
    var url_params = _.getUrlParams();
    // cambio la página
    url_params[parameters.page] = detail.page;
    // armo url futura
    var url_query = _.getUrlQuery(url_params);
    // pusheo nuevo estado
    history.pushState(null, null, _.base_url+url_query);
    // trackeo
    trackBuscador('Beneficios', 'Paginación', CURRENT_PATH+'?pagina='+detail.page);
  };
  
  /**
   * Escucho el keyup del input de query
   */
  this.changeQuery = function(data){
   var detail = $.extend({}, data.detail);
    // obtengo url actual
    var url_params = _.getUrlParams();
    // reemplazo valores
    url_params[parameters.query] = detail.query;
    url_params[parameters.page] = '';
    // armo url futura
    var url_query = _.getUrlQuery(url_params);
    // reemplazo el estado
    history.replaceState(null, null, _.base_url+url_query);
  };
  
  /**
   * Escucho el cambio de cualquier filtro:
   * simple, query o avanzado
   */
  this.changeFilters = function(data){
    var url_params = $.extend({}, data.detail.filters);
    //saco el pilar de la url
    if (typeof url_params[parameters.category] != "undefined") {
      if (url_params[parameters.category] == pilar) {
        delete url_params[parameters.category];
      }
    }
    // obtengo url actual
    var url_query = _.getUrlQuery(url_params);
    if(data.detail.query_changed){
      history.replaceState(null, null, _.base_url+url_query);
    }else{
      // pusheo nuevo estado
      history.pushState(null, null, _.base_url+url_query);
    }
    // trackeo
    trackBuscador('Buscador beneficios ' + catalogo.category, 'Selector Categoria', url_params[parameters.category]);
  };
  
  /**
    * escucho back, forward y start del navegador
    */
  this.popstate = function(event) {
    if (typeof event.originalEvent == "undefined") {
      return false;
    }
    var benefitUrl = '';
    if(!!history.state){
      benefitUrl = history.state.benefitUrl;
    }
    // obtengo url actual
    var url_params = _.getUrlParams();
    // dispatch de la url
    if(!benefitUrl){
      if(typeof filters != "undefined"){
        filters.hideAdvancedFilters();
      }
      document.dispatchEvent(new CustomEvent('onStateChange', {detail:url_params}));
    }
  };
  
  /**
   * Devuelve un objeto con la url parametrizada
   */
  this.getUrlParams = function() {
    var params = {};
    if (location.search) {
      var pairs = location.search.slice(1).split('&');
      var result = {};
      for (var i = 0; i < pairs.length; i++) {
        var pair = pairs[i];
        pair = pair.split('=');
        val = decodeURIComponent(pair[1] || '');
        if (pair[0].indexOf('[]') != -1) {
          arr = pair[0].split('[]');
          if (typeof result[arr[0]] == "undefined") {
            result[arr[0]] = [];
          }
          result[arr[0]].push(val.replace(/\+/g, ' '));
        } else {
          result[pair[0]] = val.replace(/\+/g, ' ');
        }
      }
      params = result;
    }
    return params;
  };
  
  /**
   * Convierte un objeto en una query string
   */
  this.getUrlQuery = function(obj){
    var obj = typeof obj != 'undefined' ? obj : {};
    var url_query = "";
    
    for (var i in obj) {
      if (obj[i] != ""){
        if(typeof obj[i] == 'object'){
          for (var j in obj[i]) {
            if (url_query != "") {
              url_query += "&";
            }
            url_query += i + "[]=" + encodeURIComponent(obj[i][j]);
          }
        }else{
          if (url_query != "") {
            url_query += "&";
          }
          url_query += i + "=" + encodeURIComponent(obj[i]);
        }
      }
    }
    
    url_query = url_query ? '?'+url_query : '';
    
    return url_query;
  };
  
  _.init();

};

/**
 * Filtros del catálogo
 */
var CatalogoFilters = function(el) {

  // class
  var _ = this;

  // elementos
  _.el               = el;
  _.$filters         = $(_.el);
  _.$category        = _.$filters.find('[data-comp="categoria"]');
  
  _.$categoryHtml        = _.$filters.find('[data-comp="categoriaHtml"]');
  _.$categoryHtmlTitle = _.$categoryHtml.find('[data-comp="title"]');
  _.$categoryHtmlArrow = _.$categoryHtml.find('[data-comp="arrow"]');
  _.$categoryHtmlResults = _.$categoryHtml.find('[data-comp="results"]');
  
  _.$search          = _.$filters.find('[data-comp="busqueda"]');
  _.$query           = _.$search.find('[data-comp="query"]');
  _.$advancedButton  = _.$search.find('[data-comp="avanzada"]');
  _.$advancedCounter = _.$advancedButton.find('[data-comp="counter"]');
  
  // components
  _.advancedFiltersStack = new Stack({id: 'busquedaAvanzada'});
  
  // datasets para el render
  _.query = '';
  _.category = {};
  _.advanced_filters = {};
  
  // memoria
  _.stack_filters = []; // se guardan los filtros avanzados
  
  // ---
  
  var orden_tarjetas = [
    "Tarjeta Santander Río Advance Débito",
    "Tarjeta Santander Río Débito",
    "Tarjeta Santander Río Débito Gold",
    "Tarjeta Santander Río Débito Platinum",
    "Tarjeta Santander Río Débito Black",
    "Tarjeta Santander Río Débito Global Select",
    "Tarjeta Santander Río Débito Universidades",
    "Tarjeta Santander Río Visa",
    "Tarjeta Santander Río Visa Gold",
    "Tarjeta Santander Río Visa Platinum",
    "Tarjeta Santander Río Visa Black",
    "Tarjeta Santander Río Visa Universidades",
    "Tarjeta Santander Río Visa Agro",
    "Tarjeta Women Visa",
    "Tarjeta Santander Río American Express",
    "Tarjeta Santander Río American Express Gold",
    "Tarjeta Santander Río American Express Platinum",
    "Tarjeta Santander Río American Express Black",
    "Tarjeta Women Amex",
    "Tarjeta Mastercard",
    "Tarjeta Mastercard Gold",
    "Tarjeta Mastercard Platinum",
    "Tarjeta Mastercard Black",
    "Tarjeta Women Mastercard",
    "Tarjeta Santander Río Recargable",
    "Tarjeta Monedero"
  ];
  
  // init
  this.init = function(){
    //listeners
    document.addEventListener('updateFilters', _.updateFilters);
    
    _.templates = new CatalogoTemplates();
    
    // categoria
    _.$category.on('change',function() {
      // reseteo query
      _.query = '';
      _.$query.val(_.query);
      _.pushFilters();
    });
    
    // ---
    
    _.$categoryHtml.click(function(e){
      e.stopPropagation();
    });
    
    $body.click(function(e){
      if (_.$categoryHtml.hasClass('open')) {
        e.preventDefault();
        e.stopPropagation();
        _.$categoryHtml.removeClass('open');
      }
    });
    
    _.$categoryHtmlTitle.click(function(e){
      e.preventDefault();
      e.stopPropagation();
      if (_.$categoryHtml.hasClass('open')) {
        _.$categoryHtml.removeClass('open');
      } else {
        _.$categoryHtml.addClass('open');
      }
    });
    
    _.$categoryHtmlArrow.click(function(e){
      e.preventDefault();
      e.stopPropagation();
      if (_.$categoryHtml.hasClass('open')) {
        _.$categoryHtml.removeClass('open');
      } else {
        _.$categoryHtml.addClass('open');
      }
    });
    
    _.$categoryHtmlResults.on('click','a',function(e){
      e.preventDefault();
      e.stopPropagation();
      var val = $(this).attr('data-val');
      _.$category.val(val).trigger('change');
    });
    
    // ---
    
    // busqueda query
		/*_.$query.on('keypress', function(e) {
      var query = $(this).val();
      // check if enter and input changed
      if(e.which == "13" && _.query != query){
        //reseteo categoría
        _.$category.val(_.$category.find('option').first().val());
        _.query = query;
  			_.pushFilters();
      }
		});*/
    
    _.$query.on('keyup', function() {
      var query = $(this).val();
      // check if changed
      if(_.query == query){
        return false;
      }
      //reseteo categoría
      _.$category.val(_.$category.find('option').first().val());
      // dispatch
      document.dispatchEvent(new CustomEvent('onQueryChange', {
        detail: { query: query }
      }));
      if (query == '') {
        _.query = '';
        _.pushFilters({query_changed: true});
      } else {
        clearTimeout(_.searchTimer);
        _.searchTimer = setTimeout(function() {
          // filter
          _.query = query;
          _.pushFilters({query_changed: true});
          // trackeo
          trackBuscador('Buscador beneficios ' + catalogo.category, 'Búsqueda', _.query);
        },500);
      }
    });
    
    _.$query.on('keydown', function() {
      clearTimeout(_.searchTimer);
    });
    
    // ---
    
    // busqueda avanzada
    _.$advancedButton.click(function(e){
      e.preventDefault();
      _.showAdvancedFilters();
    });
    
  };

  // ---
  
  // filter category
  this.setFilter = function(category, initial_category){
    if (typeof category == 'undefined'){
      return false;
    }
    _.category = category;
    _.initial_category = typeof initial_category != 'undefined' ? initial_category : category;
    _.category.values.sort(sortByName);
    _.$query.attr('placeholder', 'Buscar en '+category.name);
    _.$category.html(_.templates.categoriesFilter(_.category));
    _.$categoryHtmlResults.html(_.templates.categoriesHtmlFilter(_.category));
  };
  
  // advanced filters 
  this.setAdvancedFilters = function(advanced_filters){
    if (typeof advanced_filters == 'undefined'){
      return false;
    }
    _.advanced_filters = advanced_filters;
    
    if(typeof _.advanced_filters.zona != "undefined"){
      
      //paises
      for (var i in _.advanced_filters.zona) {
        // ordeno provincias
        _.advanced_filters.zona[i].values.sort(sortByName);
        // recorro provincias
        for (var j in _.advanced_filters.zona[i].values) {
          // ordeno localidades
          _.advanced_filters.zona[i].values[j].values.sort(sortByName);
          
          if(_.advanced_filters.zona[i].id == "Argentina"){
            var prov = _.advanced_filters.zona[i].values[j];
            if(prov.id == "Argentina_Buenos Aires"){
              bsas = prov;
              _.advanced_filters.zona[i].values.splice(j, 1);
            }
            if(prov.id == "Argentina_Gran Buenos Aires"){
              gbsas = prov;
              _.advanced_filters.zona[i].values.splice(j, 1);
            }
            if(prov.id == "Argentina_Cdad Bs As"){
              cbsas = prov;
              _.advanced_filters.zona[i].values.splice(j, 1);
            }
          }
        }
        
        if(_.advanced_filters.zona[i].id == "Argentina"){
          if(typeof bsas != "undefined"){
            _.advanced_filters.zona[i].values.unshift(bsas);
          }
          if(typeof gbsas != "undefined"){
            _.advanced_filters.zona[i].values.unshift(gbsas);
          }
          if(typeof cbsas != "undefined"){
            _.advanced_filters.zona[i].values.unshift(cbsas);
          }
        }
      } 
    }
    
    if(typeof _.advanced_filters.medios != "undefined"){
      _.advanced_filters.medios.sort(function(a, b){
        return orden_tarjetas.indexOf(a.name) - orden_tarjetas.indexOf(b.name);
      });
    }
    
    if(typeof _.advanced_filters.tipodebeneficio != "undefined"){
      _.advanced_filters.tipodebeneficio.sort(sortByName);
    }
  };
  
  this.setCategoryHtmlActive = function(val) {
    var $activeOption = _.$categoryHtmlResults.find('a[data-val="'+val+'"]');
    var activeOptionTitle = $activeOption.text();
    _.$categoryHtml.removeClass('open');
    _.$categoryHtmlResults.find('a').removeClass('active');
    $activeOption.addClass('active');
    _.$categoryHtmlTitle.text(activeOptionTitle);
  };
  
  /**
   * agrego el stack
   */
  this.showAdvancedFilters = function() {
    _.advancedFiltersStack.add({
      htmlTemplate: _.templates.advancedFilters(_.advanced_filters),
      onReady: _.readyAdvancedFilters
    });
  };
  
  /**
   * oculto el stack
   */
  this.hideAdvancedFilters = function() {
    _.advancedFiltersStack.remove();
  };
  
  /**
   * ready del stack
   */
  this.readyAdvancedFilters = function(data) {
    
    // elements
    _.$stack  = data.el;
    _.$form   = _.$stack.find('form');
    _.$select = _.$stack.find('select');
    _.$submit = _.$stack.find('[data-comp=submit]');
    _.$reset  = _.$stack.find('[data-comp=reset]');
    
    var data_provincias = [];
    for (var i in _.advanced_filters.zona) {
      var pais = _.advanced_filters.zona[i];
      if(pais.id == "Argentina"){
        for (var j in pais.values) {
          data_provincias.push(pais.values[j]);
        }
      }
    }
    
    _.multiSelects = {
      medios: _.$stack.find('#selectMedios').magicSuggest({
        name: 'medios',
        placeholder: 'Cualquier medio de pago',
        data: _.advanced_filters.medios,
        displayField: 'name',
        valueField: 'id',
        expandOnFocus: true,
        editable: false
      }),
      dias: _.$stack.find('#selectDia').magicSuggest({
        name: 'dia',
        placeholder: 'Cualquier dia',
        data: _.advanced_filters.dias,
        displayField: 'name',
        valueField: 'id',
        expandOnFocus: true,
        editable: false
      }),
      tipodebeneficio: _.$stack.find('#selectTipoDeBeneficio').magicSuggest({
        name: 'tipodebeneficio',
        placeholder: 'Todos',
        data: _.advanced_filters.tipodebeneficio,
        displayField: 'name',
        valueField: 'id',
        expandOnFocus: true,
        editable: false,
        maxSelection: 1
      }),
      provincia: _.$stack.find('#selectProvincia').magicSuggest({
        name: 'provincia',
        placeholder: 'Cualquier provincia',
        data: data_provincias,
        displayField: 'name',
        valueField: 'id',
        expandOnFocus: true,
        editable: false,
        maxSelection: 1
      }),
      localidad: _.$stack.find('#selectLocalidad').magicSuggest({
        name: 'localidad',
        placeholder: 'Cualquier localidad',
        data: [],
        displayField: 'name',
        valueField: 'id',
        expandOnFocus: true,
        editable: false,
        maxSelection: 1
      }),
      
    };
    
    if(_.advanced_filters.medios.length){
      _.$stack.find('[for="selectMedios"]').enableElement();
      _.$stack.find('#selectMedios').enableElement();
    }else{
      _.$stack.find('[for="selectMedios"]').disableElement();
      _.$stack.find('#selectMedios').disableElement();
    }
    
    if(_.advanced_filters.tipodebeneficio.length){
      _.$stack.find('[for="selectTipoDeBeneficio"]').enableElement();
      _.$stack.find('#selectTipoDeBeneficio').enableElement();
    }else{
      _.$stack.find('[for="selectTipoDeBeneficio"]').disableElement();
      _.$stack.find('#selectTipoDeBeneficio').disableElement();
    }
    
    if(data_provincias){
      _.$stack.find('[for="selectProvincia"]').enableElement();
      _.$stack.find('#selectProvincia').enableElement();
    }else{
      _.$stack.find('[for="selectProvincia"]').disableElement();
      _.$stack.find('#selectProvincia').disableElement();
    }
    
    _.$stack.find('[for="selectLocalidad"]').disableElement();
    _.$stack.find('#selectLocalidad').disableElement();
    
    
    for (var k in _.multiSelects) {
      $(_.multiSelects[k]).on('selectionchange', function() {
        var sn = this.getName();
        if (sn.split('[')[0] == 'provincia') {
          var selection = this.getSelection();
          var value = "";
          if (selection.length) {
            value = selection[0].id;
          }
          _.setLocalidades(value);
        }
        _.checkAdvancedFilters();
      });
    }
    
    _.$form.submit(function(e) {
      e.preventDefault();
      if (_.filtersOn) {
        _.pushFilters();
        _.hideAdvancedFilters();
      }
    });
    
		_.$reset.click(function(e){
			e.preventDefault();
			_.resetAdvancedFilters();
		});
    
    // init
    _.updateAdvancedFilters();
    
  };
  
  /**
   * update y render en base a _.stack_filters
   */
  this.updateAdvancedFilters = function(){
    
    // limpio multiselects
    for (var i in _.multiSelects) {
      _.multiSelects[i].clear();
      _.multiSelects[i].collapse();
    }
    
    // recorro filtros activos
    for (var j = 0; j < _.stack_filters.length; j++) {
      var stack_filter = _.stack_filters[j];
      var name = stack_filter.name;
      var value = stack_filter.value;
    
      if(name == 'provincia'){
        _.multiSelects.provincia.setSelection(value);
      }
      
      if(name == 'localidad'){
        _.multiSelects.localidad.setSelection(value);
      }
      
      //activo multisiselects
      if(name == 'medios'){
        _.multiSelects.medios.setSelection(value);
      }
      
      if(name == 'dia'){
        _.multiSelects.dias.setSelection(value);
      }
      
      if(name == 'tipodebeneficio'){
        _.multiSelects.tipodebeneficio.setSelection(value);
      }
      
    }
    
    _.checkAdvancedFilters();

  };
  
  /**
   * update ui de los filtros en base a parametros
   */
  this.updateFilters = function(data){
    //console.log('filters: update');
    var update_filter = $.extend({}, data.detail);
    
    if(typeof update_filter[parameters.category] != 'undefined'){
      _.$category.val(decodeURIComponent(update_filter[parameters.category]));
      _.setCategoryHtmlActive(decodeURIComponent(update_filter[parameters.category]));
    }else{
      if(typeof _.initial_category != "undefined"){
        _.$category.val(_.initial_category.id);
        _.setCategoryHtmlActive(_.initial_category.id);
      }
    }
    
    if(typeof update_filter[parameters.query] != 'undefined'){
      _.query = decodeURIComponent(update_filter[parameters.query]);
    }else{
      _.query = '';
    }
    _.$query.val(_.query);
    
    _.stack_filters = [];
    
    if(typeof update_filter.tipodebeneficio != 'undefined'){
      var tipodebeneficio = [];
      for (var m = 0; m < _.advanced_filters.tipodebeneficio.length; m++) {
        if(_.advanced_filters.tipodebeneficio[m].id == update_filter.tipodebeneficio){
          tipodebeneficio.push(_.advanced_filters.tipodebeneficio[m]);
        }
      }
      _.stack_filters.push({
        name: 'tipodebeneficio',
        value: tipodebeneficio
      });
    }
    
    if(typeof update_filter.dia != 'undefined'){
      var dias = [];
      for (var k = 0; k < update_filter.dia.length; k++) {
        for (var l = 0; l < _.advanced_filters.dias.length; l++) {
          if(_.advanced_filters.dias[l].id == update_filter.dia[k]){
            dias.push(_.advanced_filters.dias[l]);
          }
        }
      }
      _.stack_filters.push({
        name: 'dia',
        value: dias
      });
    }
    
    if(typeof update_filter.medios != 'undefined'){
      var medios = [];
      for (var i = 0; i < update_filter.medios.length; i++) {
        for (var j = 0; j < _.advanced_filters.medios.length; j++) {
          if(_.advanced_filters.medios[j].id == update_filter.medios[i]){
            medios.push(_.advanced_filters.medios[j]);
          }
        }
      }
      _.stack_filters.push({
        name: 'medios',
        value: medios
      });
    }
    
    if(typeof update_filter.zona != 'undefined'){
      var zona = update_filter.zona.split('_');
      var provincia = [];
      var localidad = [];
      
      if(typeof zona[1] != 'undefined'){
        for (var i in _.advanced_filters.zona) {
          for (var j in _.advanced_filters.zona[i].values) {
            if(_.advanced_filters.zona[i].values[j].id == zona[0]+'_'+zona[1]){
              provincia.push(_.advanced_filters.zona[i].values[j]);
            }
            if(typeof zona[2] != 'undefined'){
              for (var k in _.advanced_filters.zona[i].values[j].values) {
                if(_.advanced_filters.zona[i].values[j].values[k].id == zona[0]+'_'+zona[1]+'_'+zona[2]){
                  localidad.push(_.advanced_filters.zona[i].values[j].values[k]);
                }
              }
            }
          }
        }
      }
      
      if(provincia.length){
        _.stack_filters.push({
          name: 'provincia',
          value: provincia
        });
      }
      
      if(localidad.length){
        _.stack_filters.push({
          name: 'localidad',
          value: localidad
        });
      }
      
    }
    
    _.setAdvancedCounter(_.stack_filters);
  
  };
  
  /**
   * update localidades
   */
  this.setLocalidades = function(prov){
    var localidades = [];
    if(typeof _.advanced_filters.zona == "undefined"){
      return false;
    }
    for (var i in _.advanced_filters.zona) {
      var pais = _.advanced_filters.zona[i];
      for (var j in pais.values) {
        var provincia = pais.values[j];
        if(provincia.id == prov){
          localidades = provincia.values;
        }
      }
    }
    
    // limpio
    _.multiSelects.localidad.clear();
    _.multiSelects.localidad.collapse();
    // cargo
    _.multiSelects.localidad.setData(localidades);
    
    if(localidades.length > 0){
      _.$stack.find('[for="selectLocalidad"]').enableElement();
      _.$stack.find('#selectLocalidad').enableElement();
    }else{
      _.$stack.find('[for="selectLocalidad"]').disableElement();
      _.$stack.find('#selectLocalidad').disableElement();
    }
  };
  
  /**
   * compruebo si hay filtros avanzados
   * seleccionados para prender o apagar el submit
   */
  this.checkAdvancedFilters = function() {
    
    // get active filters
    var advanced_filters = _.getAdvancedFilters();

    // ---

    // si no hay filtros en ui ni en memoria, saco el submit
    if (advanced_filters.length > 0 || _.stack_filters.length > 0) {
      _.$submit.addClass('active');
      _.filtersOn = true;
    } else {
      _.$submit.removeClass('active');
      _.filtersOn = false;
    }
    
    //si no hay filtros en la ui, saco el reset
    if (advanced_filters.length > 0) {
      _.$reset.addClass('active');
    } else {
      _.$reset.removeClass('active');
    }

  };
  
  /**
   * devuelve los filtros avanzados activos
   */
  this.getAdvancedFilters = function() {

    // refresh filtros stack
    var advanced_filters = [];
    
    if(typeof _.$select != 'undefined'){
      // get selects values
      _.$select.each(function() {
        // info
        var $select = $(this);
        var value = $select.val();
        var name = $select.attr('name');
        
        // push filtros stack
        if (value && value.length > 0) {
          advanced_filters.push({
            name: name,
            value: value
          });
        }

      });
    }
    
    if(typeof _.multiSelects != 'undefined'){
      // get multiselects
      for (var i in _.multiSelects) {
        var selection =  _.multiSelects[i].getSelection();
        if (selection.length > 0) {
          var sn = _.multiSelects[i].getName();
          advanced_filters.push({
            name: sn.split('[')[0],
            value: selection
          });
        }
      }
    }
    
    return advanced_filters;
  };
  
  /**
   * se limpian los filtros y se hace submit sin cerrar
   */
  this.resetAdvancedFilters = function() {
    //console.log('reset advanced filters');

    // refresh filtros stack
    _.stack_filters = [];
    
    _.updateAdvancedFilters();
    
    // push filters (submit)
    _.pushFilters();

  };
  
  this.setAdvancedCounter = function(data) {
    var count = (typeof data != "undefined") ? data.length : 0;
    _.$advancedCounter.text(count);
    if (count) {
      _.$advancedCounter.addClass('active');
    } else {
      _.$advancedCounter.removeClass('active');
    }
  };
  
  // ---
  
  this.getFilters = function(){
    
    // reset filters
    var filters = {};
    
    // set category
    if (_.$category.val() != '') {
      filters[parameters.category] = _.$category.val();
    } 
    
    // set query
    if (_.query != '') {
      filters[parameters.query] = _.query;
    }
    
    // set avanzado
    if (_.stack_filters.length) {
    
      var provincia = '';
      var localidad = '';
      
      for (var i = 0; i < _.stack_filters.length; i++) {
        var stack_filter = _.stack_filters[i];
        
        if (stack_filter.name == 'provincia') {
          provincia = stack_filter.value[0].id;
        } else
        if (stack_filter.name == 'localidad') {
          localidad = stack_filter.value[0].id;
        } else
        if (stack_filter.name == 'tipodebeneficio') {
          filters[stack_filter.name] = stack_filter.value[0].id;
        } else
        if(typeof stack_filter.value == 'object'){
          filters[stack_filter.name] = [];
          for (var j = 0; j < stack_filter.value.length; j++) {
            filters[stack_filter.name].push(stack_filter.value[j].id);
          }
        }else{
          filters[stack_filter.name] = stack_filter.value;
        }
      
      }
      
      var zona = localidad ? localidad : provincia;
      if (zona) {
        filters.zona = zona;
      }
    
    }
    
    return filters;
  };
  
  // push filters
  this.pushFilters = function(opts) {
    var def = { query_changed: false, prevent_search: false};
  	var options = $.extend({}, def, opts);
    
    _.stack_filters = _.getAdvancedFilters();
    
    options.filters = _.getFilters();
    
    // dispatch filters
    document.dispatchEvent(new CustomEvent('onFiltersChange', {detail: options}));
    
    _.setCategoryHtmlActive(options.filters.rubro);
    
    // ---
    
    // set avanzados counter
    _.setAdvancedCounter(_.stack_filters);
    
    // trackeo
    for (var i in options.filters) {
      if (options.filters.hasOwnProperty(i)) {
        if(i != 'rubro'){
          trackBuscador('Buscador beneficios ' + catalogo.category, 'Filtro - ' + i , options.filters[i]);
        }
      }
    }
  };
  
  // ---

  // init
  if(_.$filters.length){
    _.init();
  }

};

/**
 * Templates del catálogo
 */
var CatalogoTemplates = function(){
  
  var _ = this;
  
  this.init = function(){
    _.helper  = new CatalogoHelper();
  };
  
  this.pager = function(pages) {
    var html = '';
    //prev page
    html += '<a href="#" data-nav="prev" title="Enlazar a la página anterior">';
      html += '<span class="previous_link"><i class="fa fa-angle-left" aria-hidden="true"></i></span>';
    html += '</a>';
    //pages
    for (var p = 1; p <= pages; p++) {
      html += '<a href="#" data-page="' + p + '" title="Enlazar a la página ' + p + '">' + p + '</a>';
    }
    //next page
    html += '<a href="#" data-nav="next" title="Enlazar a la página siguiente">';
      html += '<span class="next_link"><i class="fa fa-angle-right" aria-hidden="true"></i></span>';
    html += '</a>';
  
    return html;
  };
  
  this.categoriesFilter = function(data) {
    var html = '';
    
    html += '<option value="' + data.id + '">Todo '+ data.name +'</option>';
    for (var i in data.values) {
      var category = data.values[i];
      html += '<option value="' + category.id + '">' + category.name + '</option>';
    }
    
    return html;
  };
  
  this.categoriesHtmlFilter = function(data) {
    var html = '';
    
    html += '<ul>';
      
      html += '<li><a href="#" data-val="' + data.id + '">Todo '+ data.name +'</a></li>';
      for (var i in data.values) {
        var category = data.values[i];
        html += '<li><a href="#" data-val="' + category.id + '">' + category.name + '</a></li>';
      }
      
    html += '</ul>';
    
    return html;
  };
  
  this.advancedFilters = function(data) {
    var html = '';
    
    html += '<div class="stackContent cajerosStack stackFilter">';
      html += '<div class="header">';
        html += '<div class="table">';
          html += '<div class="cell middle left pos-1">';
            html += '<a href="#" class="back" data-comp="close"><i class="icon-SR_flecha"></i>Volver</a>';
          html += '</div>';
          html += '<div class="cell middle right pos-2">';
            html += '<a href="#" class="close" data-comp="close"><i class="icon-SR_cerrar"></i></a>';
          html += '</div>';
        html += '</div>';
      html += '</div>';
      html += '<div class="content">';
        html += '<div class="fullScroll">';
          html += '<div class="table">';
           html += '<div class="cell top">';
            html += '<div class="fullMessage">';
              html += '<h3>Encontrá el beneficio<br> que buscas</h3>';
            html += '</div>';
            html += '<form class="formContainer">';
              html += '<label for="selectTipoDeBeneficio">Tipo de Beneficio:</label>';
              html += '<div id="selectTipoDeBeneficio"></div>';
              html += '<label>Día de la semana:</label>';
              html += '<div id="selectDia"></div>';
              html += '<label>Medio de pago:</label>';
              html += '<div id="selectMedios"></div>';
              /*html += '<label>País:</label>';
              html += '<select name="pais" data-rel="provincia" placeholder="Cualquier país">';
                html += '<option value=""></option>';
                for (var i in data.zona) {
                  var pais = data.zona[i];
                  html += '<option value="' + pais.id + '">' + pais.name + '</option>';
                }
              html += '</select>';*/
              html += '<label for="selectProvincia">Provincia:</label>';
              html += '<div id="selectProvincia"></div>';
              
              /*
              html += '<select id="selectProvincia" name="provincia" placeholder="Cualquier provincia">';
                html += '<option value="">Todas</option>';
                for (var i in data.zona) {
                  var pais = data.zona[i];
                  for (var j in pais.values) {
                    var provincia = pais.values[j];
                    html += '<option value="' + provincia.id + '">' + provincia.name + '</option>';
                  }
                }
              html += '</select>';
              */
              html += '<label for="selectLocalidad">Localidad:</label>';
              html += '<div id="selectLocalidad"></div>';
              /*
              html += '<select id="selectLocalidad" name="localidad" placeholder="Cualquier localidad">';
                html += '<option value=""></option>';
              html += '</select>';
              */
              html += '<input type="submit" class="bttn" name="filtros" value="Aplicar filtros" data-comp="submit">';
              html += '<input type="submit" class="bttn border clean" name="filtros" value="Limpiar filtros" data-comp="reset">';
              html += '</form>';
            html += '</div>';
          html += '</div>';
        html += '</div>';
      html += '</div>';
    html += '</div>';
    
    return html;
  };
  
  this.localidadFilter = function(locs){
    var html = '';
    
    html += '<option value="">Todas</option>';
    for(var i in locs){
      var loc = locs[i];
      html += '<option value="' + loc.id + '">' + loc.name + '</option>';  
    }
    
    return html;
  };
  
  this.benefits = function(data) {
    var html = '';
  
    html += '<div class="lista">';
      html += '<ul>';
        for (var i in data) {
          html += _.benefit(data[i]);
        }
      html += '</ul>';
    html += '</div>';
    
    html += '<div class="lista mobile">';
      html += '<div class="left">';
        html += '<ul>';
          for (var j in data) {
            if(j%2==0){
              html += _.benefit(data[j]);
            }
          }
        html += '</ul>';
      html += '</div>';
      html += '<div class="right">';
        html += '<ul>';
          for (var k in data) {
            if(k%2!=0){
              html += _.benefit(data[k]);
            }
          }
        html += '</ul>';
      html += '</div>';
    html += '</div>';
    
    return html;
  };
  
  this.benefit = function(benefit) {
    var html = '';
    
    html += '<li>';
      html += '<a href="' + _.helper.getBenefitUrl(benefit) + '" class="beneficioItem" data-comp="beneficioItem" data-title="' + benefit.title + '">';
        html += '<div class="poster">';
          html += '<img src="' + benefit.imagenxsell + '" class="cover-image">';
        html += '</div>';
        html += '<div class="description">';
          html += '<div class="table">';
            html += '<div class="cell top">';
              if(benefit.labelresultado){
                html += '<label class="tag ' + benefit.labelresultado_class + '">' + benefit.labelresultado + '</label>';
              }
              html += '<h2>' + benefit.empresa + '</h2>';
              if (benefit.infobeneficiolinea1) {
                html += '<p>' + benefit.infobeneficiolinea1 + '</p>';
              }
              if (benefit.infobeneficiolinea2) {
                html += '<p class="linea_2">' + benefit.infobeneficiolinea2 + '</p>';
              }
            html += '</div>';
          html += '</div>';
        html += '</div>';
        html += '<div class="action">';
          html += '<ul>';
          if (benefit.diabox) {
            html += '<li>' + benefit.diabox + '</li>';
          }
          if (benefit.legalbox) {
            html += '<li>' + benefit.legalbox + '</li>';
          }
          html += '</ul>';
        html += '</div>';
      html += '</a>';
    html += '</li>';
    
    return html;
  };
  
  this.benefitsLoading = function() {
    var html = '';
  
    html += '<div class="mensaje">';
      html += '<p class="loading">Cargando</p>';
    html += '</div>';
  
    return html;
  };
  
  this.benefitsNoResults = function() {
    var html = '';
    
    html += '<div class="mensaje">';
      html += '<h2>Úps!<br> No encontramos nada para<br> tu busqueda esta vez</h2>';
      html += '<p>Intentalo de nuevo desde el selector<br> o el buscador de texto libre.</p>';
    html += '</div>';
  
    return html;
  };
  
  this.benefitsError = function() {
    var html = '';
      html += '<div class="mensaje">';
        html += '<h2>No se encontraron<br> beneficios</h2>';
        html += '<a href="#" class="bttn border" data-comp="refresh">Volver a buscar</a>';
      html += '</div>';
    return html;
  };
  
  _.init();
  
};

/**
 * Helpers para realizar las búsquedas
 * en el catálogo
 */
var CatalogoHelper = function() {

  var _ = this;

  this.init = function() {

  };

  /**
   * Funcion para realizar busquedas en el motor
   * de portal, por el momento solo es necesario
   * el index para modificar la coleccion de busqueda.
   */
  this.search = function(parse, index, params) {
    var _ = this;

    var deferred = $.Deferred();

    //params
    var params = typeof params != 'undefined' ? params : {};
    if (typeof params.query == 'undefined' || !params.query) {
      params.query = '*';
    }else{
      params.query = params.query+'*';
    }
    if (typeof params.sortOrder == 'undefined') {
      params.sortOrder = 'asc';
    }
    if (typeof params.sortKey == 'undefined') {
      params.sortKey = 'sortdestdefault';
    }
    if (typeof params.start == 'undefined') {
      params.start = '0';
    }
    if (typeof params.results == 'undefined') {
      params.results = catalogoConfig.maxResults;
    }

    var url = catalogoConfig.crawlerURL;
    var parameters = 'index=' + index;

    parameters += '&' + _.serializeParams(params);

    url += parameters;
    
    console.log(location.origin+url);
    
    $.ajax({
      url: url,
      method: "GET",
      contentType: "application/atom+xml; charset=UTF-8",
    })
    .always(function(response, status, xhr){
      if(status == "success"){
        var json = xmlToJson(response);
        if(typeof json.error != "undefined"){
          console.error('data error');
          deferred.reject(json.error.message);
        }else{
          var results = parse(json);
          deferred.resolve(results);
        }
      }else{
        console.error('ajax error');
        deferred.reject(status);
      }
    });

    return deferred.promise();
  };

  /**
   * Invoca al metodo search, y retorna una promesa
   * la cual es invocada cuando se resuelve internamente
   * la funcion de _.search.
   */
  this.searchBenefits = function(params) {
    var _ = this;

    var parse = _.parseBenefits.bind(_);
    var config = catalogoConfig.repositories.catalogo;

    return _.search(parse, config, params);
  };

  /**
   * Serializa los parámetros
   * de la búsqueda
   */
  this.serializeParams = function(obj) {
    var str = [];
    for (var p in obj)
      if (obj.hasOwnProperty(p)) {
        if (Array.isArray(obj[p])) {
          for (var o in obj[p]) {
            str.push(p + "=" + encodeURIComponent(obj[p][o]));
          }
        } else {
          str.push(p + "=" + encodeURIComponent(obj[p]));
        }
      }
    return str.join("&");
  };

  /**
   * Invoca al metodo search, y retorna una promesa
   * la cual es invocada cuando se resuelve internamente
   * la funcion de _.search.
   */
  this.searchData = function(params) {
    
    var _ = this;

    var parse = _.parseData.bind(_);
    var config = catalogoConfig.repositories.catalogo;

    return _.search(parse, config, params);
  };

  /**
   * parsea todos los resultados de la búsqueda
   * y los separa por tipo
   */
  this.parseSearch = function(data) {
    
    var catalogoHelper = this;

    var results = {
      benefits: undefined,
      facets: undefined
    };
    
    if ($(data).find('atom\\:entry').length){
      results.benefits = this.parseBenefits(data);
    }
    
    if ($(data).find('ibmsc\\:facet').length){
      results.facets = this.parseData(data);
    }
    
    return results;
  };
  
  /**
   * Recorre el resultado de la busuqeda
   * y arma un objeto json para ser presentado en la UI.
   */
   this.parseBenefits = function(data) {
     var catalogoHelper = this;
     
     var feed = data["atom:feed"];
     
     var page = {
       totalResults: parseInt(feed["opensearch:totalResults"]["#text"]),
       startIndex: parseInt(feed["opensearch:startIndex"]),
       itemsPerPage: parseInt(feed["opensearch:itemsPerPage"])
     };
     
     var entries = [];
     
     var feed_entry = [];
     
     if (typeof feed["atom:entry"] != "undefined") {
       if (Array.isArray(feed["atom:entry"])) {
         feed_entry = feed["atom:entry"];
       } else {
         feed_entry.push(feed["atom:entry"]);
       }
     }
     
     for (var i = 0; i < feed_entry.length; i++) {
       var _ = catalogoHelper;
       
       var entry = feed_entry[i];
       var feed_entry_field = entry["wplc:field"];
       
       var benefit = new _.BenefitClass();
       
       benefit.id = entry["atom:id"];
       
       for (var j = 0; j < feed_entry_field.length; j++) {
         var entry_field = feed_entry_field[j];
         var id = entry_field.id;
         var text = '';
         if(typeof entry_field['#text'] != "undefined"){
           text+= entry_field['#text'];
         }
         if(typeof entry_field['#cdata-section'] != "undefined"){
           text+= entry_field['#cdata-section'];
         }
         
         if(id == 'canonico'){
           text = JSON.parse(text);
         }
         if (typeof(benefit[id]) != "undefined") {
           benefit[id] = text;
         }
       }
       
       entries.push(benefit);
     }
     
     var results = {
       data: entries,
       page: page
     };
     
     return results;
   };

  /**
   * Recorre el resultado de la busuqeda
   * y arma un objeto json para ser presentado en la UI.
   */
   this.parseData = function(data) {
     var catalogoHelper = this;
     
     var feed = data["atom:feed"];
     
     var page = {
       totalResults: parseInt(feed["opensearch:totalResults"]["#text"]),
       startIndex: parseInt(feed["opensearch:startIndex"]),
       itemsPerPage: parseInt(feed["opensearch:itemsPerPage"])
     };
     
     var facets = {};
     
     if(typeof(feed["ibmsc:facets"]["ibmsc:facet"]) != "undefined"){
       for (var i = 0; i < feed["ibmsc:facets"]["ibmsc:facet"].length; i++) {
         var feed_facet = feed["ibmsc:facets"]["ibmsc:facet"][i];
         var feed_facet_value = feed_facet["ibmsc:facetValue"];
         if(!Array.isArray(feed_facet_value)){
           feed_facet_value = [feed_facet_value];
         }
         
         var _ = catalogoHelper;
         
         var facet = feed_facet.id;
   
         var current_facet = [];
         
         for (var j = 0; j < feed_facet_value.length; j++) {
           var facetValue = feed_facet_value[j];
           
           var facetId = facetValue.id;
           var parts = facetId.split("/");
           facet = parts[0];

           //me fijo si existen categorías
           if (typeof parts[1] == "undefined") {
             return true;
           }
   
           var levels = parts[1].split("_");
           var position = [];
           for (var k in levels) {
             position.push(-1);
           }
           
           // si existe parent
           if (typeof levels[0] != "undefined") {
             // me fijo si el parent existe en el array
             for (var l in current_facet) {
               if (levels[0] == current_facet[l].name) {
                 position[0] = l; //guardo posicion
               }
             }
             //si no existe, lo creo
             if (position[0] == -1) {
               current_facet.push({
                 id: levels[0],
                 name: levels[0],
                 values: []
               }); //parent
               position[0] = current_facet.length - 1; //guardo posicion
             }
           }
   
           // si existe child
           if (typeof levels[1] != "undefined") {
             // me fijo si el child existe en el parent
             for (var m in current_facet[position[0]].values) {
               if (levels[1] == current_facet[position[0]].values[m].name) {
                 position[1] = m; //guardo posicion
               }
             }
             //si no existe, lo creo
             if (position[1] == -1) {
               current_facet[position[0]].values.push({
                 id: levels[0]+'_'+levels[1],
                 name: levels[1],
                 values: []
               }); //child
               position[1] = current_facet[position[0]].values.length - 1; //guardo posicion
             }
           }
   
           // si existe grandchild
           if (typeof levels[2] != "undefined") {
             // me fijo si el grandchilde existe en el parent
             for (var n in current_facet[position[0]].values[position[1]].values) {
               if (levels[2] == current_facet[position[0]].values[position[1]].values[n].name) {
                 position[2] = n; //guardo posicion
               }
             }
             //si no existe, lo creo
             if (position[2] == -1) {
               current_facet[position[0]].values[position[1]].values.push({
                 id: levels[0]+'_'+levels[1]+'_'+levels[2],
                 name: levels[2],
                 values: []
               }); //grandchild
               position[2] = current_facet[position[0]].values[position[1]].values.length - 1; //guardo posicion
             }
           }
         }  
         
         facets[facet] = current_facet;
       
       }
     }
     
     var response = {
       page: page,
       facets: facets
     };
     
     return response;
   };
   
  /**
   * Instancia un nuevo Beneficio.
   */
  this.BenefitClass = function() {
    return {
      type: 'beneficio',
      id: '',
      name: '',
      title: '',
      summary: '',
      creation_date: 0,
      update_date: 0,
      expirationdate: 0,
      effectivedate: 0,
      legalbox: '',
      diabox: '',
      infobeneficiolinea1: '',
      infobeneficiolinea2: '',
      description: '',
      imagenxsell: '',
      contentpath: '',
      portalcontextpath: '',
      canonico: {},
      empresa: '',
      labelresultado: '',
      labelresultado_class: '',
    };
  };

  this.getBenefitUrl = function(benefit){
    return benefit.portalcontextpath +benefit.canonico.path;
  };
  
  _.init();
};

function sortByName(a,b){
  return a.name>b.name?1:a.name<b.name?-1:0;
}

jQuery.fn.extend({
  enableElement: function() {
    return this.each(function() {
        $(this).removeClass('disabled');
    });
  },
  disableElement: function() {
    return this.each(function() {
      $(this).addClass('disabled');
    });
  }
});


/**
 * Originally from http://davidwalsh.name/convert-xml-json
 * This is a version that provides a JSON object without the attributes and places textNodes as values
 * rather than an object with the textNode in it.
 * 27/11/2012
 * Ben Chidgey
 *
 * @param xml
  @return {}
 */
function xmlToJson(xml) {

  // Create the return object
  var obj = {};
  
  // text node
  if (4 === xml.nodeType) {
    obj = xml.nodeValue;
  } else if (xml.attributes) {
    for (var i = 0; i < xml.attributes.length; i++) {
      obj[xml.attributes[i].nodeName] = xml.attributes[i].nodeValue;
    }
  }

  if (xml.hasChildNodes()) {
    for (var i = 0; i < xml.childNodes.length; i++) {
      var TEXT_NODE_TYPE_NAME = '#text',
        CDATA_NODE_TYPE_NAME = '#cdata-section',
        item = xml.childNodes.item(i),
        nodeName = item.nodeName,
        content;

      if (xml.childNodes.length == 1 && xml.attributes && xml.attributes.length == 0 && (TEXT_NODE_TYPE_NAME === nodeName || CDATA_NODE_TYPE_NAME === nodeName)) {
        //single textNode or next sibling has a different name
        if ((null === xml.nextSibling) || (xml.localName !== xml.nextSibling.localName)) {
          if (xml.textContent) {
            content = xml.textContent;
          } else if (xml.text) {
            content = xml.text;
          }
        } else if ((null === xml.nextSibling) || (xml.tagName !== xml.nextSibling.tagName)) { // IE8
          content = xml.text;
          //we have a sibling with the same name
        } else if (xml.localName === xml.nextSibling.localName) {
          //if it is the first node of its parents childNodes, send it back as an array
          if (xml.parentElement) {
            content = (xml.parentElement.childNodes[0] === xml) ? [xml.textContent] : xml.textContent;
          } else if (xml.parentNode) { // IE8
            content = (xml.parentNode.childNodes[0] === xml) ? [xml.text] : xml.text;
          }
        }
        return content;
      } else {
        if ('undefined' === typeof(obj[nodeName])) {
          obj[nodeName] = xmlToJson(item);
        } else {
          if ('undefined' === typeof(obj[nodeName].length)) {
            var old = obj[nodeName];
            obj[nodeName] = [];
            obj[nodeName].push(old);
          }
          if (obj[nodeName].push) {
            obj[nodeName].push(xmlToJson(item));
          }
        }
      }
    }
  } else if (3 === xml.nodeType) {
    obj = xml.nodeValue;
  }
  return obj;
}

CURRENT_VIEW = typeof CURRENT_VIEW!= "undefined" ? CURRENT_VIEW : '';

$(document).ready(function() {
  // init detalle
  beneficiosDetalle = new BeneficiosListaDetalle();
});

// beneficios lista detalle
var BeneficiosListaDetalle = function() {

  // class
  var _ = this;

  // components
  _.detail = new Stack({id: 'beneficiosDetalle'});
  _.stores = new Stack({id: 'beneficiosLocalesAdheridos'});
  _.stores_map = {
    gmap: undefined,
    bounds: undefined,
    options: {
      zoom: 14,
      center: {lat: -34.6068431, lng: -58.3734237},
      disableDefaultUI: true
    },
    markers: [],
    user_marker: undefined,
  	infoBubbles: [],
  };
  _.user_position = false;
  _.locations = [];
  
  _.doHistoryBack = true;
  
  // ---
  
  // cach back and forward
  // window.addEventListener('popstate', function(e) {
  //   var state = e.state;
  //   if (state == null) {
  //     _.hideDetail();
  //   } else {
  //     _.showDetail(state.detail);
  //   }
  // });
  
  // ---
  
  // init
  this.init = function() {
    
    document.addEventListener('openBenefit', function(e){_.openBenefit(e.detail);});
    document.addEventListener('closeBenefit', _.closeBenefit);
    
    // if stack is already printed
		_.detail.printed({
			onReady: _.onReadyDetail
		});
    
    
    // beneficio detalle
    //if ($('[data-comp="beneficiosLista"]').length == 0) {
      $body.on('click', '[data-comp="beneficioItem"]', function(e) {
        e.preventDefault();
        var benefitUrl = $(this).attr('href');
        var benefitTitle = $(this).attr('data-title');
        _.openBenefit(benefitUrl);
        history.pushState({benefitUrl: benefitUrl}, null, benefitUrl);
        // trackeo
        trackBuscador('Buscador beneficios ' + catalogo.category, 'Sugerencias - Clic', benefitTitle);
      });
    //}
    
    // pop state
    $window.on('popstate', _.popstate);
    
  };
  
  this.popstate = function(event) {
    if (typeof event.originalEvent == "undefined") {
      return false;
    }
    var benefitUrl = '';
    if(!!history.state){
      benefitUrl = history.state.benefitUrl;
    }
    // dispatch de la url
    if(benefitUrl){
      document.dispatchEvent(new CustomEvent('openBenefit', {detail:benefitUrl}));
    }else{
      document.dispatchEvent(new CustomEvent('closeBenefit'));
    }
  };
  
  this.closeBenefit = function(url){
    _.doHistoryBack = false;
    _.hideDetail();
  };
  
  this.openBenefit = function(url){
    CURRENT_VIEW = "beneficio";
    beneficiosDetalle.showDetail(url);
  };
  
  this.sortLocations = function(tmp_locations){
    // ordeno
    tmp_locations.sort(function(a,b) {
      if (a.provincia === b.provincia) {
        if (a.localidad === b.localidad) {
          return (a.direccion < b.direccion) ? -1 : (a.direccion > b.direccion) ? 1 : 0;
       } else {
         return (a.localidad < b.localidad) ? -1 : 1;
       }
     } else {
       return (a.provincia < b.provincia) ? -1 : 1;
     }
    });
    
    //separo
    var cbsas = [];
    var bsas = [];
    var ind = [];
    for (var i in tmp_locations) {
      var loc = tmp_locations[i];
      if(loc.provincia == "Cdad Bs As"){
        cbsas.push(loc);
        ind.push(i);
      }else
      if(loc.provincia == "Buenos Aires"){
        bsas.push(loc);
        ind.push(i);
      }
    }
    
    // borro
    for (var j in ind) {
      tmp_locations.splice(ind, 1);
    }
    
    // merge
    return cbsas.concat(bsas).concat(tmp_locations);
    
  };
  
  // ---
  
  // DETAIL
  
  // show detail
  this.showDetail = function(url){
    
    _.doHistoryBack = true;
    // set new url
    _.url = url;
    
    // show ajax
    _.detail.add({
      ajax: _.url + '#beneficiosDetalle',
      ajaxHeader: false,
      onReady: _.onReadyDetail,
      onRemove: _.onRemoveDetail
    });
    
    
  };
  
  // hide detail
  this.hideDetail = function(){
    _.detail.remove();
    _.stores.remove();
  };
  
  // on ready detail
  this.onReadyDetail = function(data) {
    
    
    // elements
    _.$stack = data.el;
    _.$localesAdheridos = _.$stack.find('[data-comp="showLocalesAdheridos"]');
    
    // ---
    
    // locales adheridos
    _.$localesAdheridos.click(function(e){
      e.preventDefault();
      _.showStores();
    });
    
    // ---
      
    // close all
		// $('#stacksContainer').on('click',function(e) {
		// 	e.preventDefault();
    //   history.back();
		// 	_.hideDetail();
		// });
		
		// close
		// _.$stack.on('click','[data-comp=close]',function(e) {
		// 	e.preventDefault();
    //   _.hideDetail();
		// });
      
    // if is ajax
    // if (data.isAjax == true) {
    //   // _.setDetailUrl();
    // }
    
  };
  
  this.onRemoveDetail = function(data){
    if(_.doHistoryBack){
      history.back();
    }
  };
  
  // set detail url
  this.setDetailUrl = function() {
    var cleanUrl = _.url.split('#')[0];
    history.pushState({detail:cleanUrl}, '', cleanUrl);
  };
  
  // ---
  
  // STORES
  
  // show stores
  this.showStores = function() {
    
    _.locations = _.sortLocations(localesAdheridos.slice());
    
    _.stores.add({
      htmlTemplate: _.storesTPL(_.locations),
      onReady: _.onReadyStores
    });
  };
  
  // hide stores
  this.hideStores = function() {
    _.stores.remove();
  };
  
  // on ready stores
  this.onReadyStores = function(data) {
    
    // elements
    _.$stackLocales = data.el;
    _.$stackLocalesMap = _.$stackLocales.find('[data-comp=mapCanvas]');
    _.$stackLocalesMapPosition = _.$stackLocales.find('[data-comp=mapCanvasPosition]');
    _.$stackLocalesMapPositionSuggest = _.$stackLocales.find('.suggest');
    _.$locationsMarkers = _.$stackLocales.find('[data-comp=locations] .markers');
    _.$locations = _.$stackLocales.find('[data-comp=marker-item]');
    _.$noLocations = _.$stackLocales.find('[data-comp=noLocations]');
    _.$showAllLocations = _.$stackLocales.find('[data-comp=showAll]');
    
    _.$locations.hide();
    _.$noLocations.hide();
    _.$showAllLocations.hide();
    //_.hideIconPosition();
    
    _.storesMap();
    
  };
  
  this.storesMap = function() {

    _.stores_map.gmap = new google.maps.Map(_.$stackLocalesMap[0], _.stores_map.options);
    _.stores_map.bounds = new google.maps.LatLngBounds();

    google.maps.event.addListenerOnce(_.stores_map.gmap, 'idle', function() {
      _.onReadyStoresMap(_.renderStoresMap);
    });

    google.maps.event.addListener(_.stores_map.gmap, 'drag', function() {
      stackManager.isDraggingMap = true;
    });

    google.maps.event.addListener(_.stores_map.gmap, 'dragend', function() {
      setTimeout(function() {
        stackManager.isDraggingMap = false;
        _.onMovedStoresMap();
      }, 100);
    });
    
    google.maps.event.addListener(_.stores_map.gmap, 'zoom_changed', function() {
      setTimeout(function() {
        _.onMovedStoresMap();
      }, 500);
    });
    
  };
  
  this.onReadyStoresMap = function(callback){
    
    // geolocalizao al usuario
    if (navigator.geolocation) {
      
      navigator.geolocation.getCurrentPosition (
        function(success) {
          _.user_position = {
            lat: success.coords.latitude,
            lng: success.coords.longitude
          };
          callback();
        },
        function(error) {
          _.user_position = false;
          callback();
        }
      );
      
      // ie 11
      if($body.hasClass('v11')){
        setTimeout(function(){ 
          callback();
        }, 2000);
      }
      
    } else {
      callback();
    }
    
    _.$stackLocalesMapPosition.click(function(e) {
      e.preventDefault();
      if(_.user_position == false){
        _.hideIconPosition();
        return false;
      }
      _.renderStoresMap();
    });
  };
  
  this.renderStoresMap = function(all){
    
    var all = typeof all == 'undefined' ? false : all;
    
    // limpio mapa
    while(_.stores_map.markers.length) {
      _.stores_map.markers.pop().setMap(null);
    }
    while(_.stores_map.infoBubbles.length) {
      _.stores_map.infoBubbles.pop().close();
    }
    if(typeof _.stores_map.user_marker != "undefined"){
      _.stores_map.user_marker.setMap(null);
      _.stores_map.user_marker = undefined;
    }
    
    // agrego marcadores
    for(var i in _.locations){
      var location = _.locations[i];
      var position = {lat: parseFloat(location.latitud), lng: parseFloat(location.longitud)};
       _.locations[i].distance = false;
       
      if(_.user_position){
        var distance = _.getDistance(_.user_position, position);
         _.locations[i].distance = distance;
      }
      
      var marker_position = _.stores_map.markers.length;
      //agrego marcador
      _.stores_map.markers[marker_position] = new google.maps.Marker({
        map: _.stores_map.gmap,
        position: position,
        data: location,
        visible: all,
        icon: '/banco/contenthandler/dav/fs-type1/themes/SRP9Theme/images/layout/map/sucursal.png'
      });
      
      _.stores_map.bounds.extend(position);
      
      // click marcador
      google.maps.event.addListener(_.stores_map.markers[marker_position], 'click', function(){
        //scroll top
        _.$stackLocales.find('.fullScroll').animate({
          scrollTop: 0
        }, 200);
        
        // cierro infobubbles
        for(var i in _.stores_map.infoBubbles){
          _.stores_map.infoBubbles[i].close();
        }
        
        // creo infoBubble
        var infoBubble = new InfoBubble(
          {
            map: _.stores_map.gmap,
            content: _.infoBubbleTPL(this.data),
        		padding: 0,
        		borderRadius: 0,
        		borderWidth: 0,
        		shadowStyle: 0
          }
        );
        _.stores_map.infoBubbles.push(infoBubble);
        // abro infoBubble
        infoBubble.open(_.stores_map.gmap, this);
        // zoom
        _.stores_map.gmap.setZoom(_.stores_map.options.zoom);
      });
      
    }
    
    //zoom
    _.stores_map.gmap.setZoom(_.stores_map.options.zoom);
    
    // resize
    google.maps.event.trigger(_.stores_map.gmap , 'resize');
    
    // agrego icono usuario
    if(_.user_position != false){
      _.stores_map.user_marker = new google.maps.Marker({
        position: _.user_position,
        map: _.stores_map.gmap,
        color: 'FFFFFF',
      });
      _.showIconPosition();
    }else{
      _.hideIconPosition();
    }
    
    if(all){
      _.stores_map.gmap.fitBounds(_.stores_map.bounds);
      if(_.stores_map.markers.length == 1){
        _.stores_map.gmap.setZoom(_.stores_map.options.zoom);
      }
    }else{
      // centro
      if(_.user_position != false){
        _.stores_map.gmap.setCenter(_.user_position);
      }else{
        _.stores_map.gmap.setCenter(_.stores_map.options.center);
      }
    }
    
    // abro infobubble en click lista
    _.$locations.off().on('click', function(e){
      e.preventDefault();
      var $this = $(this);
      var id = $this.data('id');
      
      // busco marcador
      for(var j in _.stores_map.markers){
        var marker = _.stores_map.markers[j];
        if(marker.data.id === id){
          // abro infobubble
          google.maps.event.trigger(marker, 'click');
          break;
        }
      }
    });
    
    _.$showAllLocations.on('click', function(e){
      e.preventDefault();
      
      //scroll top
      _.$stackLocales.find('.fullScroll').animate({
        scrollTop: 0
      }, 200);
      
      _.renderStoresMap(true);
    });
  
  };    
  
  this.onMovedStoresMap = function(){
    
    var mapBounds = _.stores_map.gmap.getBounds();
    
    var visible_items = [];
    // me fijo si está el pin está en el area visible
    for (var i in _.stores_map.markers) {
      var marker = _.stores_map.markers[i];
      var visible = mapBounds.contains(marker.getPosition());
      marker.setVisible(visible);
      if(visible){
        visible_items.push(marker.data);
      }
    }
    
    if(_.user_position){
      // ordeno por distancia
      visible_items.sort(function(a, b){return a.distance - b.distance;});	
    }
    
    _.$locationsMarkers.html(_.htmlLocationsTPL(visible_items));
    
    // muestro/oculto containers
    _.$showAllLocations.hide();
    _.$noLocations.hide();
    
    if(visible_items.length){
      if(visible_items.length != _.stores_map.markers.length){
        _.$showAllLocations.show();
      }
    }else{
      _.$noLocations.show();
      _.$showAllLocations.show();
    }
    
    // resize
    google.maps.event.trigger(_.stores_map.gmap , 'resize');
    
  };
  
  this.showIconPosition = function() {
    _.$stackLocalesMapPosition.addClass('active');
    _.$stackLocalesMapPositionSuggest.hide();
  };

  this.hideIconPosition = function() {
    _.$stackLocalesMapPosition.removeClass('active');
    _.$stackLocalesMapPositionSuggest.show();
  };
  
  /**
	 * Retorna la distancia entre dos puntos,
	 * siempre y cuando se encuentre localizado.
	 */
   this.getDistance = function(p1, p2) {
    
    var distance = _.haversine(p1.lat, p1.lng, p2.lat, p2.lng);
  
		return distance;
  };

  /**
   * Aux Radianes.
   */
  this.rad = function(x) {
    return x * Math.PI / 180;
  };

  /**
   * Algoritmo de Haversine
   * Esta funcion devuelve la distancia entre dos puntos en KM.
   */
  this.haversine = function(lat1, lon1, lat2, lon2) {

    var radio = 6378.137; //Radio de la tierra en km
    var dLat = _.rad(lat2 - lat1);
    var dLong = _.rad(lon2 - lon1);
    var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.cos(_.rad(lat1)) * Math.cos(_.rad(lat2)) * Math.sin(dLong / 2) * Math.sin(dLong / 2);
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
    var d = radio * c;

    //Algo fallo.
    return parseFloat(d.toFixed(2)); //Retorna tres decimales
  };
  
  /**
	 * Puede retonar mts o kms segun sea la distancia
	 * pasada por parametro, por default si la distancia
	 * es menor a 1 km se pasa a mts.
	 */
	this.formatDistance = function(distance) {
		var unidad = "kms";
		if (distance < 1) {
			unidad = "mts";
			distance = distance * 1000;
		}

		return distance.toString() + unidad;
	};
  
  // ---
  
  // templates
  this.detailTPL = function() {
    var html = '';
    html += '<div class="stackContent beneficioDetalle">';
      
      html += '<div class="header solapado">';
        html += '<div class="table">';
          html += '<div class="cell middle left pos-1">';
            html += '<a href="#" class="back" data-comp="close"><i class="icon-SR_flecha"></i>Volver</a>';
          html += '</div>';
          html += '<div class="cell middle left pos-center">hola</div>';
          html += '<div class="cell middle right pos-2">';
            html += '<a href="#" class="close" data-comp="close"><i class="icon-SR_cerrar"></i></a>';
          html += '</div>';
        html += '</div>';
      html += '</div>';
      
      html += '<div class="footer">';
        html += '<div class="table">';
          html += '<div class="cell middle center">';
            html += '<a href="#" data-comp="localesAdheridos" class="bttn border">Ver locales adheridos</a>';
          html += '</div>';
        html += '</div>';
      html += '</div>';
      
      html += '<div class="content">';
        html += '<div class="fullScroll">';
        
          html += '<div class="beneficioPoster">';
            html += '<div class="image" style="background-image: url(img/tsr/shakira.jpg);"></div>';
          html += '</div>';
          
          html += '<div class="preventa">';
            html += '<p>Preventa exclusiva del 21/05/2018 al 27/05/2018 (2)</p>';
          html += '</div>';
          
          html += '<div class="beneficioTitulo">';
            html += '<h2>Template</h2>';
            html += '<h3>25 de Octubre Estadio<br> Velez Sarsfield</h3>';
            html += '<p>Por ser Cliente Santander Río, disfrutá de los siguientes beneficios:</p>';
          html += '</div>';
          
          html += '<div class="beneficioBox">';
            html += '<div class="titulo">';
              html += '<h2>Por ser Cliente Santander Río, disfrutá de los siguientes beneficios:</h2>';
              html += '<p>Sin Tope de Reintegro</p>';
            html += '</div>';
            html += '<div class="aplica">';
              html += '<h3>Aplica a:</h3>';
              html += '<ul>';
                html += '<li>Tarjetas Santander Río American Express</li>';
                html += '<li>Tarjetas Santander Río Visa</li>';
                html += '<li>Tarjetas Santander Río Recargables</li>';
                html += '<li>Tarjetas Santander Río Débito</li>';
                html += '<li>Tarjetas Comerciales Visa</li>';
                html += '<li>Tarjetas ex C-Bank Visa</li>';
              html += '</ul>';
            html += '</div>';
            html += '<div class="semana">';
              html += '<div class="table">';
                html += '<div class="cell middle pos-1">';
                  html += '<p>Aplicable:</p>';
                html += '</div>';
                html += '<div class="cell middle pos-2">';
                  html += '<ul>';
                    html += '<li>l</li>';
                    html += '<li>m</li>';
                    html += '<li>m</li>';
                    html += '<li>j</li>';
                    html += '<li>v</li>';
                    html += '<li>s</li>';
                    html += '<li class="off">d</li>';
                  html += '</ul>';
                html += '</div>';
              html += '</div>';
            html += '</div>';
            html += '<div class="vigencia">';
              html += '<p>Vigencia desde el 01/01/2018 hasta el 31/03/2018.</p>';
            html += '</div>';
          html += '</div>';
          
          html += '<div class="beneficioBox">';
            html += '<div class="titulo">';
              html += '<h2>2x1 en entradas 3D en todas las salas Village Cines:</h2>';
              html += '<p>Sin Tope de Reintegro</p>';
            html += '</div>';
            html += '<div class="aplica">';
              html += '<h3>Aplica a:</h3>';
              html += '<ul>';
                html += '<li>Tarjetas Santander Río American Express</li>';
                html += '<li>Tarjetas Santander Río Visa</li>';
                html += '<li>Tarjetas Santander Río Recargables</li>';
              html += '</ul>';
            html += '</div>';
            html += '<div class="semana">';
              html += '<div class="table">';
                html += '<div class="cell middle pos-1">';
                  html += '<p>Aplicable:</p>';
                html += '</div>';
                html += '<div class="cell middle pos-2">';
                  html += '<ul>';
                    html += '<li>l</li>';
                    html += '<li>m</li>';
                    html += '<li>m</li>';
                    html += '<li>j</li>';
                    html += '<li>v</li>';
                    html += '<li class="off">s</li>';
                    html += '<li class="off">d</li>';
                  html += '</ul>';
                html += '</div>';
              html += '</div>';
            html += '</div>';
            html += '<div class="vigencia">';
              html += '<p>Vigencia desde el 01/01/2018 hasta el 31/03/2018.</p>';
            html += '</div>';
          html += '</div>';
          
          html += '<div class="beneficioVideo"></div>';
          
          html += '<div class="beneficioUbicacion">';
            html += '<div class="text"><h3>Estadio Vélez Sarsfield</h3></div>';
            html += '<div class="map"></div>';
          html += '</div>';
          
          html += '<div class="callToAction">';
            html += '<div class="table">';
              html += '<div class="cell top left pos-1">';
                html += '<h2>Canjea tus puntos<br> SuperClub por entrdas</h2>';
                html += '<p>Desde <strong>12.500</strong> puntos SuperClub<br> a partir del <strong>16 de enero</strong>.</p>';
              html += '</div>';
              html += '<div class="cell middle right pos-2">';
                html += '<a href="#" data-comp="localesAdheridos" class="bttn border">Canjear en Online Banking</a>';
              html += '</div>';
            html += '</div>';
            html += '<small>Stock canje SuperClub: 40.<br> Stock Venta 35.000<br> El CANJE SUPERCLUB APLÍCA ÚNICAMENTE PARA FUNCIÓN DEL 21 DE FEBRERO </small>';
          html += '</div>';
          
          html += '<div class="callToAction">';
            html += '<div class="table">';
              html += '<div class="cell top left pos-1">';
                html += '<h2>Adquirí tu entrada</h2>';
                html += '<p>ed ut perspiciatis unde omnisiste natus error sit voluptatem accusantium doloremque laudantium. <a href="http://www.ticketek.com" >http://www.ticketek.com</a></p>';
              html += '</div>';
              html += '<div class="cell middle right pos-2">';
                html += '<a href="#" data-comp="localesAdheridos" class="bttn border">Ver Puntos de Ventas</a>';
              html += '</div>';
            html += '</div>';
          html += '</div>';
          
          html += '<div class="beneficioAdemas">';
            html += '<div class="text">';
              html += '<h2>Además, obtené los siguientes beneficios adicionales:</h2>';
              html += '<p><strong>Funciones exclusivas:</strong> Te invitamos a Avant Premieres de las';
              html += 'mejores películas en Village cines y Cinema Devoto.';
              html += 'Sujeto a disponibilidad. La invitación será informada por';
              html += 'Moviclub mediante newsletter.';
              html += '</p>';
              html += '<p><strong>Venta anticipada de grandes estrenos:</strong> Conseguí tu lugar antes'; 
              html += 'que nadie en Village cines y Cinema Devoto.';
              html += 'La preventa será informada por Moviclub mediante newsletter.'; 
              html += 'Beneficio sujeto a disponibilidad.</p>';
              html += '<p><strong>MoviePrice:</strong> Entradas al 50% de descuento.'; 
              html += 'Todos los días en Village Cines y Cinema Devoto.';
              html += '</p>';
            html += '</div>';
          html += '</div>';
          
          html += '<div class="encontrarBeneficio">';
            html += '<h3>¿Donde encontrar este ahorro?</h3>';
            html += '<a href="#" class="bttn">Suscribite</a>';
          html += '</div>';
          
          html += '<div class="legales">';
            html += '<p><strong>Legales</strong></p>';
            html += '<p>ed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptate quia voluptas sit aspernatur aut odit aut fugit, sed quia conseq</p>';
          html += '</div>';
          
        html += '</div>';
        
      html += '</div>';
    html += '</div>';
    return html;
  };
  this.storesTPL = function(data) {
    var html = '';
    html += '<div class="stackContent localesAdheridosStack stackLocationList">';
        html += '<div class="header">';
            html += '<div class="table">';
                html += '<div class="cell middle left pos-1">';
                    html += '<a href="#" class="back" data-comp="close"><i class="icon-SR_flecha"></i>Volver</a>';
                html += '</div>';
                html += '<div class="cell middle left pos-center"></div>';
                html += '<div class="cell middle right pos-2">';
                    html += '<a href="#" class="close" data-comp="close"><i class="icon-SR_cerrar"></i></a>';
                html += '</div>';
            html += '</div>';
        html += '</div>';
        html += '<div class="content">';
            html += '<div class="fullScroll">';
              html += '<div class="mapContainer">';
                  html += '<div class="canvas"><div class="map" data-comp="mapCanvas"></div></div>';
                  html += '<div class="canvasAction">';
                      html += '<a href="#" data-comp="mapCanvasPosition"><i class="icon-SR_pin"></i></a>';
                  html += '</div>';
                  html += '<div class="suggest" style="display:none">';
                      html += '<span> Se recomienda habilitar la geolocalización del dispositivo para utilizar este servicio </span>';
                  html += '</div>';
              html += '</div>';
              html += '<div class="locations" data-comp="locations">';
                html += '<div class="markers"></div>';
                html += '<div class="messageBox">';
                  html+= '<div class="table">';
                    html+= '<div class="cell middle center">';
                      html+= '<p data-comp="noLocations">No se encontraron<br> locales en esta ubicación</p>';
                        html+= '<a href="#" class="bttn border" data-comp="showAll">Ver todos</a>';
                      html+= ' </div>';
                    html+= '</div>';
                  html+= '</div>';
              html += '</div>';
          html += '</div>';
        html += '</div>';
    html += '</div>';
    return html;
  };
  this.htmlLocationsTPL = function(data) {
    var html = '';
    html += '<div class="infoList">';
        html += '<ul>';
          for (var i in data) {
            var store = data[i];
            var dir = [];
            if(store.localidad){
              dir.push(store.localidad);
            }
            if(store.provincia){
              dir.push(store.provincia);
            }
            html += '<li>';
              html += '<div class="item" data-comp="marker-item" data-id="' + store.id +'">';
                html += '<div class="info">';
                  if (store.direccion) {
                    html += '<h2><strong>' + store.direccion + '</strong></h2>';
                  }
                  if(dir.length){
                    html += '<p>' + dir.join(', ') + '</p>';
                  }
                  if(store.telefono){
                    html += '<p><a href="tel:' + store.telefono + '">' + store.telefono + '</a></p>';
                  }
                  if(store.mail){
                    html += '<p><a href="mailto:&#39; + store.mail + &#39;" >' + store.mail + '</a></p>';
                  }
                  if(store.web){
                    html += store.web;
                  }
                  
                  if(store.distance != false){
                    html += '<span class="distance">'+ _.formatDistance(store.distance) +'</span>';
                  }
                html += '</div>';
              html += '</div>';
            html += '</li>';
          }
        html += '</ul>';
    html += '</div>';
    return html;
  };
  this.storesLoadingTPL = function() {
    var html = '';
    html += '<div class="messageBox">';
      html += '<div class="table">';
        html += '<div class="cell middle center">';
          html += '<p class="loading">Cargando</p>';
        html += '</div>';
      html += '</div>';
    html += '</div>';
    return html;
  };
  this.storesErrorTPL = function() {
    var html = '';
    html += '<div class="messageBox">';
      html += '<div class="table">';
        html += '<div class="cell middle center">';
        html += '<p>No se encontraron<br> sucursales</p>';
        html += '<a href="#" class="bttn border" data-comp="refresh">Volver a buscar</a>';
        html += '</div>';
      html += '</div>';
    html += '</div>';
    return html;
  };
  this.infoBubbleTPL = function(store) {
    var html = '';
    if (store) {
      var dir = [];
      if(store.localidad){
        dir.push(store.localidad);
      }
      if(store.provincia){
        dir.push(store.provincia);
      }
      html += '<div data-comp="infobubble" data-id="' + store.id + '" class="text">';				
        if (store.direccion) {
          html += '<h2><strong>' + store.direccion + '</strong></h2>';
        }
        if(dir.length){
          html += '<p>' + dir.join(', ') + '</p>';
        }
        if(store.telefono){
          html += '<p><a href="tel:' + store.telefono + '">' + store.telefono + '</a></p>';
        }
        if(store.mail){
          html += '<p><a href="mailto:&#39; + store.mail + &#39;" >' + store.mail + '</a></p>';
        }
        if(store.web){
          html += store.web;
        }
      html += '</div>';
    }
    return html;
  };
  
  // ---
  
  // init
  this.init();

};