/** * Mega Filter */ if( typeof Array.prototype.indexOf == 'undefined' ) { Array.prototype.indexOf = function(obj, start) { for( var i = ( start || 0 ), j = this.length; i < j; i++ ) { if( this[i] === obj ) {return i;} } return -1; }; }; var MegaFilterINSTANCES = typeof MegaFilterINSTANCES == 'undefined' ? [] : MegaFilterINSTANCES; var MegaFilter = function(){ }; MegaFilter.prototype = { /** * Main box of filter */ _box: null, /** * Ooptions */ _options: null, /** * @var int */ _timeoutAjax: null, _timeoutSearchFiled: null, /** * @var string */ _url : null, /** * URL separator * * @var string */ _urlSep : null, /** * List of parameters * * @var object */ _params : null, /** * List of scrolls * * @var array */ _scrolls : null, /** * List of buttons * * @var array */ _buttonsMore : null, _liveFilters : null, /** * Main container * * @var jQuery */ _jqContent : null, /** * Loader over results * * @var jQuery */ _jqLoader : null, /** * Loader over filter * * @var jQuery */ _jqLoaderFilter : null, /** * Sliders * * @type array */ _sliders : null, /** * ID of main container * * @var string */ _contentId : '#content', /** * Waiting for server response * * @var bool */ _busy : false, /** * Something was changed when loading data from the server * * @var bool */ _waitingChanges : false, /** * Last response * * @var string */ _lastResponse : '', _refreshPrice : function(){}, _inUrl : null, _isInit: false, _cache: null, _relativeScroll: null, _selectOptions: null, _lastUrl: null, _urlToFilters: null, _instanceIdx: 0, _inlineHorizontalUpdate: null, _lastEvent: null, _startUrl: null, _history: 1, _changed: false, _ajaxPagination: null, _seoAliases: null, _selectedFilters: null, //////////////////////////////////////////////////////////////////////////// /** * Init class */ init: function( box, options ) { var self = this, i; self._instanceIdx = MegaFilterINSTANCES.length; if( options.routeHome == options.route && options.homePageAJAX ) { self._contentId = options.homePageContentSelector; } else if( options.contentSelector ) { self._contentId = options.contentSelector; } self._jqContent = jQuery(self._contentId); self._options = options; if( ! self._jqContent.length ) { self._contentId = '#maincontent'; self._jqContent = jQuery(self._contentId); } if( options.routeHome == options.route && options.homePageAJAX && box.hasClass( 'mfilter-content_top' ) && box.parents(self._contentId) ) { self._jqContent.parent().prepend( box.addClass('col-sm-12') ); } if( self._startUrl === null ) { self._startUrl = self.location(); } self._seoAliases = {}; self._scrolls = []; self._buttonsMore = []; self._liveFilters = []; self._sliders = []; self._inlineHorizontalUpdate = []; self._box = box; self._selectOptions = {}; self._cache = { 'lastResponse' : {}, 'mainContent' : {} }; if( self._box.tooltip ) { self._box.find('[data-mf-toggle="tooltip"]').tooltip({ 'viewport' : 'body', 'container' : 'body' }); } self.initResponsive(); if( self._options.manualInit && ! self._isInit ) { var items = self._box.find('> .mfilter-content').find('> ul,> div').hide(), $init = jQuery('' + self._options.text.init_filter + '').appendTo( self._box.find('> .mfilter-content') ); $init.click(function(){ $init.text( self._options.text.initializing ); setTimeout(function(){ items.show(); self.boot(); $init.remove(); },100); return false; }); } else { self.boot(); } return self; }, boot: function() { var self = this, i; self.initUrls(); for( i in self._options.params ) { if( typeof self._options.params[i] == 'function' ) continue; if( typeof self._params[i] == 'undefined' ) { self._params[i] = self._options.params[i]; } } self.initSliders(); //var t = this.microtime(true); for( i in self ) { if( i.indexOf( '_init' ) === 0 ) { self[i](); } } //alert(this.microtime(true)-t); self._isInit = true; if( self._options.route == self._options.routeHome && self._params.mfp ) { setTimeout(function(){ self.ajax(); },50); } if( self._params.mfp ) { self.setFiltersByUrl(); } }, microtime: function(get_as_float) { var now = new Date() .getTime() / 1000; var s = parseInt(now, 10); return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s; }, keys: function( obj ) { var keys = []; for( var i in obj ) { keys.push( i ); } return keys; }, base64_decode: function(data) { var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = '', tmp_arr = []; if (!data) { return data; } data += ''; do { // unpack four hexets into three octets using index points in b64 h1 = b64.indexOf(data.charAt(i++)); h2 = b64.indexOf(data.charAt(i++)); h3 = b64.indexOf(data.charAt(i++)); h4 = b64.indexOf(data.charAt(i++)); bits = h1 << 18 | h2 << 12 | h3 << 6 | h4; o1 = bits >> 16 & 0xff; o2 = bits >> 8 & 0xff; o3 = bits & 0xff; if (h3 == 64) { tmp_arr[ac++] = String.fromCharCode(o1); } else if (h4 == 64) { tmp_arr[ac++] = String.fromCharCode(o1, o2); } else { tmp_arr[ac++] = String.fromCharCode(o1, o2, o3); } } while (i < data.length); dec = tmp_arr.join(''); return dec.replace(/\0+$/, ''); }, sortKeys: function( data ) { var keys = [], sortData = [], i; for( i in data ) { sortData.push( [ i, data[i] ] ); } sortData.sort(function(a,b){ var sa = typeof a[1].sort_order == 'undefined' ? 0 : a[1].sort_order, sb = typeof b[1].sort_order == 'undefined' ? 0 : b[1].sort_order; if( sa > sb ) { return 1; } else if( sa < sb ) { return -1; } return 0; }); for( i = 0; i < sortData.length; i++ ) { keys.push( sortData[i][0] ); } return keys; }, urldecode: function(str) { return decodeURIComponent((str + '') .replace(/%(?![\da-f]{2})/gi, function () { return '%25' }) .replace(/\+/g, '%20')) }, /** * Init sliders * * @return void */ initSliders: function(){ var self = this, _init = false; function d( txt ) { var $i = jQuery('