text: /**
   * Includes functionality for manipulating facet data
   * @module FacetData
   * @param  {jQuery} $ Instance of jQuery
   * @param  {Document} document dom document object
   * @return {FacetDataModel} FacetDataModel api
  */
  XA.component.search.facet.data = (function ($, document) {
      /**
        * @name module:FacetData.FacetDataModel
        * @constructor
        * @augments Backbone.Model
        */
      var FacetDataModel = Backbone.Model.extend(
          /** @lends module:FacetData.FacetDataModel.prototype **/
          {
              /**
              * Default model options
              * @default
              */
              defaults: {
              },
              /**
             * @memberof module:FacetData.FacetDataModel.prototype
             */
              initialize: function () {
              },
              /**
              * Gets facet data by calling 
              * ["search.ajax.getData"]{@link module:ajax.ApiModel#getData} method
              * @memberof module:FacetData.FacetDataModel
              * @alias module:FacetData.FacetDataModel#getInitialFacetData
              */
              getInitialFacetData: function () {
                  var facetRequestData = this.getFacetRequestData(),
                      data = facetRequestData.data,
                      facetNames = [],
                      language;
  
                  for (var signature in data) {
                      if (data.hasOwnProperty(signature)) {
                          //here we don't have any params after hash in the url, we are getting all data at once
                          facetNames = facetNames.concat(data[signature].normalFiltering);
                          facetNames = facetNames.concat(data[signature].partialFiltering);
  
                          //get language settings form Search Results rendering
                          language = this.getSearchResultsLanguage(signature);
  
                          if (facetNames.length > 0) {
                              XA.component.search.ajax.getData({
                                  callback: function (data) {
                                      XA.component.search.vent.trigger("facet-data-loaded", data);
                                  },
                                  url: XA.component.search.url.createMultiFacetUrl({
                                      endpoint: facetRequestData.endpoint,
                                      s: facetRequestData.s,
                                      l: language
                                  }, facetNames, signature)
                              });
                          }
                      }
                  }
              },
              /**
              * Filter facet data
              * ["search.ajax.getData"]{@link module:ajax.ApiModel#getData} method and 
              * triggered event '' on callback with sending response from server
              * @memberof module:FacetData.FacetDataModel
              * @param {Object} hashObj Object with hashes from url
              * @fires XA.component.search.vent#facet-data-filtered
              * @fires XA.component.search.vent#facet-data-partial-filtered
              * @alias module:FacetData.FacetDataModel#filterFacetData
              */
              filterFacetData: function (hashObj) {
                  var facetRequestData = this.getFacetRequestData(hashObj),
                      data = facetRequestData.data,
                      requestData,
                      language,
                      scope,
                      searchModel,
                      itemId;
  
                  for (var signature in data) {
                      if (data.hasOwnProperty(signature)) {
                          //Gets language settings form Search Results rendering
                          language = this.getSearchResultsLanguage(signature);
                          //Gets scope settings form Search Results rendering
                          scope = this.getSearchResultsScope(signature);
  
                          searchModel = this.getSearchResultsModelBySignature(signature),
                              itemId = searchModel.get('dataProperties').itemid;
  
                          //Makes one request for data for facet controls with all hash params
                          if (data[signature].normalFiltering.length > 0) {
                              requestData = $.extend({ endpoint: facetRequestData.endpoint, s: scope, l: language }, hashObj);
                              XA.component.search.ajax.getData({
                                  callback: function (data) {
                                      XA.component.search.vent.trigger("facet-data-filtered", data);
                                  },
                                  url: XA.component.search.url.createMultiFacetUrl(requestData, data[signature].normalFiltering, signature, itemId)
                              });
                          }
  
                          //Makes as many requests as many controls that require partial filtering we have
                          //We will take all params from url hash without control facet name so controls won't collapse
                          if (data[signature].partialFiltering.length > 0) {
                              _.each(data[signature].partialFiltering, function (facetName) {
                                  var hash = $.extend({}, hashObj);
  
                                  //Ensures removal of facet (despite lower case or not) from hash object in case of partial filtering  
                                  delete hash[signature !== "" ? signature + "_" + facetName : facetName];
                                  delete hash[signature !== "" ? signature + "_" + facetName.toLowerCase() : facetName.toLowerCase()];
  
                                  requestData = $.extend({ endpoint: facetRequestData.endpoint, s: scope, l: language }, hash);
  
                                  XA.component.search.ajax.getData({
                                      callback: function (data) {
                                          XA.component.search.vent.trigger("facet-data-partial-filtered", data);
                                      },
                                      url: XA.component.search.url.createMultiFacetUrl(requestData, [facetName], signature, itemId)
                                  });
                              });
                          }
                      }
                  }
              },
  
              /**
              * Gets facet request data from server by calling 
              * getFacetDataRequestInfo method in a loop for all facet components
              * and stores them in returned object
              * @memberof module:FacetData.FacetDataModel
              * @param {Object} hashObj Object with hashes from url
              * @returns {facetRequestData} request data from each facet component stored in object
              * @alias module:FacetData.FacetDataModel#getFacetRequestData
              */
              getFacetRequestData: function (hashObj) {
                  var that = this, data = [], requestData = {}, facetControl, control, endpoint, facetName;
  
                  for (facetControl in XA.component.search.facet) {
                      control = XA.component.search.facet[facetControl];
                      if (typeof (control.getFacetDataRequestInfo) === "function") {
                          data = control.getFacetDataRequestInfo();
                          _.each(data, function (controlData) {
                              facetName = controlData.signature !== "" ? controlData.signature + "_" + controlData.facetName : controlData.facetName;
  
                              if (!requestData.hasOwnProperty(controlData.signature)) {
                                  that.initRequestObject(requestData, controlData);
                              }
  
                              if (!controlData.filterWithoutMe || (hashObj !== undefined && !hashObj.hasOwnProperty(facetName) && !hashObj.hasOwnProperty(facetName.toLowerCase()))) {
                                  //If the control does not require partial filtering or control facet name is not in the hash, add it to "one request" list.
                                  requestData[controlData.signature].normalFiltering.push(controlData.facetName);
                                  endpoint = controlData.endpoint;
                              } else {
                                  requestData[controlData.signature].partialFiltering.push(controlData.facetName);
                                  endpoint = controlData.endpoint;
                              }
                          });
                      }
                  }
                  return {
                      endpoint: endpoint,
                      data: requestData
                  };
              },
              /**
              * On initialization fullfils requestData argument with
              * right structure
              * @memberof module:FacetData.FacetDataModel
              * @param {Object} requestData Object with request data
              * @param {Object} controlData Object data taked from facet
              * @alias module:FacetData.FacetDataModel#initRequestObject
              */
              initRequestObject: function (requestData, controlData) {
                  requestData[controlData.signature] = {};
                  requestData[controlData.signature].normalFiltering = [];
                  requestData[controlData.signature].partialFiltering = [];
              },
              /**
              * Returns language of search result
              * @memberof module:FacetData.FacetDataModel
              * @param {String} signature - signature of search result
              * @alias module:FacetData.FacetDataModel#getSearchResultsLanguage
              * @returns {String} search result language
              */
              getSearchResultsLanguage: function (signature) {
                  var searchResultsModel = this.getSearchResultsModelBySignature(signature);
                  if (typeof searchResultsModel !== "undefined") {
                      return searchResultsModel.get("dataProperties").l;
                  }
                  return "";
              },
              /**
              * Returns search result scope
              * @memberof module:FacetData.FacetDataModel
              * @param {String} signature - signature of search result
              * @alias module:FacetData.FacetDataModel#getSearchResultsScope
              * @returns {String} search result scope
              */
              getSearchResultsScope: function (signature) {
                  var searchResultsModel = this.getSearchResultsModelBySignature(signature);
                  if (typeof searchResultsModel !== "undefined") {
                      return searchResultsModel.get("dataProperties").s;
                  }
                  return "";
              },
              /**
              * Returns search result model by signature
              * @memberof module:FacetData.FacetDataModel
              * @param {String} signature - signature of search result
              * @alias module:FacetData.FacetDataModel#getSearchResultsModelBySignature
              * @returns {BackboneModel} search result model
              */
              getSearchResultsModelBySignature: function (signature) {
                  var searchResultModels = XA.component.search.results.searchResultModels,
                      model = searchResultModels.filter(function (element) {
                          return element.get("dataProperties").sig === signature;
                      })[0];
  
                  return model;
              }
          });
  
      return new FacetDataModel();
  
  }(jQuery, document));