Advertisement
Guest User

Untitled

a guest
Jan 8th, 2016
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 86.35 KB | None | 0 0
  1. /**
  2. * Mega Filter
  3. */
  4.  
  5. if( typeof Array.prototype.indexOf == 'undefined' ) {
  6. Array.prototype.indexOf = function(obj, start) {
  7. for( var i = ( start || 0 ), j = this.length; i < j; i++ ) {
  8. if( this[i] === obj ) {return i;}
  9. }
  10.  
  11. return -1;
  12. };
  13. };
  14.  
  15. var MegaFilterINSTANCES = typeof MegaFilterINSTANCES == 'undefined' ? [] : MegaFilterINSTANCES;
  16.  
  17. var MegaFilter = function(){ };
  18.  
  19. MegaFilter.prototype = {
  20.  
  21. /**
  22. * Kontener filtrów
  23. */
  24. _box: null,
  25.  
  26. /**
  27. * Opcje
  28. */
  29. _options: null,
  30.  
  31. /**
  32. * @var int
  33. */
  34. _timeoutAjax: null,
  35.  
  36. _timeoutSearchFiled: null,
  37.  
  38. /**
  39. * @var string
  40. */
  41. _url : null,
  42.  
  43. /**
  44. * Separator URL
  45. *
  46. * @var string
  47. */
  48. _urlSep : null,
  49.  
  50. /**
  51. * Lista parametrów
  52. *
  53. * @var object
  54. */
  55. _params : null,
  56.  
  57. /**
  58. * Lista scrolls
  59. *
  60. * @var array
  61. */
  62. _scrolls : null,
  63.  
  64. /**
  65. * Lista guzików
  66. *
  67. * @var array
  68. */
  69. _buttonsMore : null,
  70.  
  71. _liveFilters : null,
  72.  
  73. /**
  74. * Kontener główny
  75. *
  76. * @var jQuery
  77. */
  78. _jqContent : null,
  79.  
  80. /**
  81. * Loader over results
  82. *
  83. * @var jQuery
  84. */
  85. _jqLoader : null,
  86.  
  87. /**
  88. * Loader over filter
  89. *
  90. * @var jQuery
  91. */
  92. _jqLoaderFilter : null,
  93.  
  94. /**
  95. * Slidery
  96. *
  97. * @type array
  98. */
  99. _sliders : null,
  100.  
  101. /**
  102. * ID kontenera głównego
  103. *
  104. * @var string
  105. */
  106. _contentId : '#content',
  107.  
  108. /**
  109. * Trwa oczekiwanie na odpowiedź serwera
  110. *
  111. * @var bool
  112. */
  113. _busy : false,
  114.  
  115. /**
  116. * W trakcie ładowania danych z serwra wprowadzono zmiany
  117. *
  118. * @var bool
  119. */
  120. _waitingChanges : false,
  121.  
  122. /**
  123. * Ostania odpowiedź serwera
  124. *
  125. * @var string
  126. */
  127. _lastResponse : '',
  128.  
  129. _refreshPrice : function(){},
  130.  
  131. _inUrl : null,
  132.  
  133. _isInit: false,
  134.  
  135. _cache: null,
  136.  
  137. _relativeScroll: null,
  138.  
  139. _selectOptions: null,
  140.  
  141. _lastUrl: null,
  142.  
  143. _urlToFilters: null,
  144.  
  145. _instanceIdx: 0,
  146.  
  147. _inlineHorizontalUpdate: null,
  148.  
  149. _lastEvent: null,
  150.  
  151. _startUrl: null,
  152.  
  153. _history: 1,
  154.  
  155. _changed: false,
  156.  
  157. _ajaxPagination: null,
  158.  
  159. ////////////////////////////////////////////////////////////////////////////
  160.  
  161. /**
  162. * Inicjuj klasę
  163. */
  164. init: function( box, options ) {
  165. var self = this,
  166. i;
  167.  
  168. self._instanceIdx = MegaFilterINSTANCES.length;
  169.  
  170. if( options.routeHome == options.route && options.homePageAJAX ) {
  171. self._contentId = options.homePageContentSelector;
  172. } else if( options.contentSelector ) {
  173. self._contentId = options.contentSelector;
  174. }
  175.  
  176. self._jqContent = jQuery(self._contentId);
  177. self._options = options;
  178.  
  179. if( ! self._jqContent.length ) {
  180. self._contentId = '#maincontent';
  181.  
  182. self._jqContent = jQuery(self._contentId);
  183. }
  184.  
  185. if( self._startUrl === null ) {
  186. self._startUrl = self.location();
  187. }
  188.  
  189. self._scrolls = [];
  190. self._buttonsMore = [];
  191. self._liveFilters = [];
  192. self._sliders = [];
  193. self._inlineHorizontalUpdate = [];
  194. self._box = box;
  195. self._selectOptions = {};
  196. self._cache = {
  197. 'lastResponse' : {},
  198. 'mainContent' : {}
  199. };
  200.  
  201. self.initResponsive();
  202.  
  203. if( self._options.manualInit && ! self._isInit ) {
  204. var items = self._box.find('> .mfilter-content').find('> ul,> div').hide(),
  205. $init = jQuery('<a href="#" style="padding: 10px; text-align: center; display: block;">' + self._options.text.init_filter + '</a>').appendTo( self._box.find('> .mfilter-content') );
  206.  
  207. $init.click(function(){
  208. $init.text( self._options.text.initializing );
  209.  
  210. setTimeout(function(){
  211. items.show();
  212. self.boot();
  213. $init.remove();
  214. },100);
  215.  
  216. return false;
  217. });
  218. } else {
  219. self.boot();
  220. }
  221.  
  222. return self;
  223. },
  224.  
  225. boot: function() {
  226. var self = this,
  227. i;
  228.  
  229. self.initUrls();
  230.  
  231. for( i in self._options.params ) {
  232. if( typeof self._options.params[i] == 'function' ) continue;
  233.  
  234. if( typeof self._params[i] == 'undefined' ) {
  235. self._params[i] = self._options.params[i];
  236. }
  237. }
  238.  
  239. self.initSliders();
  240.  
  241. //var t = this.microtime(true);
  242. for( i in self ) {
  243. if( i.indexOf( '_init' ) === 0 ) {
  244. self[i]();
  245. }
  246. }
  247. //alert(this.microtime(true)-t);
  248. self._isInit = true;
  249. },
  250.  
  251. microtime: function(get_as_float) {
  252. var now = new Date()
  253. .getTime() / 1000;
  254. var s = parseInt(now, 10);
  255.  
  256. return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
  257. },
  258.  
  259. keys: function( obj ) {
  260. var keys = [];
  261.  
  262. for( var i in obj ) {
  263. keys.push( i );
  264. }
  265.  
  266. return keys;
  267. },
  268.  
  269. base64_decode: function(data) {
  270. var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
  271. var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
  272. ac = 0,
  273. dec = '',
  274. tmp_arr = [];
  275.  
  276. if (!data) {
  277. return data;
  278. }
  279.  
  280. data += '';
  281.  
  282. do { // unpack four hexets into three octets using index points in b64
  283. h1 = b64.indexOf(data.charAt(i++));
  284. h2 = b64.indexOf(data.charAt(i++));
  285. h3 = b64.indexOf(data.charAt(i++));
  286. h4 = b64.indexOf(data.charAt(i++));
  287.  
  288. bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
  289.  
  290. o1 = bits >> 16 & 0xff;
  291. o2 = bits >> 8 & 0xff;
  292. o3 = bits & 0xff;
  293.  
  294. if (h3 == 64) {
  295. tmp_arr[ac++] = String.fromCharCode(o1);
  296. } else if (h4 == 64) {
  297. tmp_arr[ac++] = String.fromCharCode(o1, o2);
  298. } else {
  299. tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
  300. }
  301. } while (i < data.length);
  302.  
  303. dec = tmp_arr.join('');
  304.  
  305. return dec.replace(/\0+$/, '');
  306. },
  307.  
  308. sortKeys: function( data ) {
  309. var keys = [],
  310. sortData = [],
  311. i;
  312.  
  313. for( i in data ) {
  314. sortData.push( [ i, data[i] ] );
  315. }
  316.  
  317. sortData.sort(function(a,b){
  318. var sa = typeof a[1].sort_order == 'undefined' ? 0 : a[1].sort_order,
  319. sb = typeof b[1].sort_order == 'undefined' ? 0 : b[1].sort_order;
  320.  
  321. if( sa > sb ) {
  322. return 1;
  323. } else if( sa < sb ) {
  324. return -1;
  325. }
  326.  
  327. return 0;
  328. });
  329.  
  330. for( i = 0; i < sortData.length; i++ ) {
  331. keys.push( sortData[i][0] );
  332. }
  333.  
  334. return keys;
  335. },
  336.  
  337. /**
  338. * Inicjuj slidery
  339. *
  340. * @return void
  341. */
  342. initSliders: function(){
  343. var self = this,
  344. _init = false;
  345.  
  346. function d( txt ) {
  347. var $i = jQuery('<div>').html( txt ),
  348. txt2 = $i.text();
  349. $i.remove();
  350. return txt2;
  351. }
  352.  
  353. self._box.find('li.mfilter-filter-item.mfilter-slider').each(function(i){
  354. var _this = jQuery(this).attr('data-slider-id', i),
  355. seo_name = _this.attr('data-seo-name'),
  356. data = jQuery.parseJSON(self.base64_decode(_this.find('.mfilter-slider-data').html())),
  357. $min = _this.find('.mfilter-opts-slider-min'),
  358. $max = _this.find('.mfilter-opts-slider-max'),
  359. $slider = _this.find('.mfilter-slider-slider'),
  360. update = false,
  361. keys, values, map;
  362.  
  363. function init( data ) {
  364. keys = self.sortKeys( data );
  365.  
  366. if( _init ) {
  367. if( ! keys.length ) {
  368. $slider.slider().slider('disable');
  369.  
  370. return;
  371. } else {
  372. $slider.slider().slider('enable');
  373. }
  374. }
  375.  
  376. if( keys.length == 1 ) {
  377. data['copy'] = data[keys[0]];
  378. keys.push('copy');
  379. }
  380.  
  381. var filters = update ? self.filters() : self.urlToFilters();
  382.  
  383. values = typeof filters[seo_name] != 'undefined' ? (function(){
  384. var d = [];
  385.  
  386. for( var i = 0; i < filters[seo_name].length; i++ ) {
  387. d[i] = self.decode( decodeURIComponent( filters[seo_name][i] ) );
  388. }
  389.  
  390. return d;
  391. })() : [ data[keys[0]].key, data[keys[keys.length-1]].key ];
  392. map = (function(){
  393. var m = [ keys.indexOf( values[0] ), keys.indexOf( values[values.length-1] ) ];
  394.  
  395. if( m[0] != -1 && m[1] != -1 ) {
  396. return typeof filters[seo_name] == 'undefined' ? [ 0, keys.length-1 ] : m;
  397. }
  398.  
  399. for( var i = 0; i < keys.length; i++ ) {
  400. if( m[0] == -1 ) {
  401. if( values[0] == d( data[keys[i]].value ) ) {
  402. m[0] = i;
  403. }
  404. } else if( m[1] == -1 ) {
  405. if( values[values.length-1] == d( data[keys[i]].value ) ) {
  406. m[1] = typeof data['copy'] == 'undefined' ? i : ( typeof filters[seo_name] == 'undefined' ? 1 : m[0] );
  407. }
  408. } else {
  409. break;
  410. }
  411. }
  412.  
  413. if( m[0] == -1 ) {
  414. m[0] = 0;
  415. }
  416.  
  417. if( m[1] == -1 ) {
  418. m[1] = m[0];//keys.length-1;
  419. }
  420.  
  421. return m;
  422. })();
  423.  
  424. $min.attr('data-key',map[0]).attr('data-min',0).val( d( data[keys[map[0]]].name ) );
  425. $max.attr('data-key',map[1]).attr('data-max',keys.length-1).val( d( data[keys[map[1]]].name ) );
  426.  
  427. $slider.slider({
  428. range : true,
  429. min : 0,
  430. max : keys.length-1,
  431. values : map,
  432. slide : function( e, ui ) {
  433. if( typeof keys[ui.values[0]] == 'undefined' || typeof data[keys[ui.values[0]]] == 'undefined' )
  434. return;
  435.  
  436. if( typeof keys[ui.values[1]] == 'undefined' || typeof data[keys[ui.values[1]]] == 'undefined' )
  437. return;
  438.  
  439. $min.attr('data-key',ui.values[0]).val( d( data[keys[ui.values[0]]].name ) );
  440. $max.attr('data-key',ui.values[1]).val( d( data[keys[ui.values[1]]].name ) );
  441. },
  442. stop : function( e, ui ) {
  443. update = true;
  444.  
  445. self.runAjax();
  446. }
  447. });
  448.  
  449. if( _init ) {
  450. $slider.slider( 'value', $slider.slider('value') );
  451. }
  452.  
  453. _init = true;
  454. }
  455.  
  456. init( data );
  457.  
  458. var s_idx = self._sliders.length;
  459.  
  460. self._sliders.push({
  461. data: data,
  462. init: function( data, update ) {
  463. init( data, update );
  464. },
  465. resetValues: function(){
  466. data = self._sliders[s_idx].data;
  467. keys = self.sortKeys( data );
  468.  
  469. $min.attr('data-key',0).attr('data-min',0).val( d( data[keys[map[0]]].name ) );
  470. $max.attr('data-key',keys.length-1).attr('data-max',keys.length-1).val( d( data[typeof keys[map[1]] != 'undefined' ? keys[map[1]] : keys[map[0]]].name ) );
  471.  
  472. $slider.slider( 'option', 'min', parseInt( $min.attr('data-min') ) );
  473. $slider.slider( 'option', 'max', parseInt( $max.attr('data-max') ) );
  474. $slider.slider( 'option', 'values', [
  475. $min.attr('data-min'),
  476. $max.attr('data-max')
  477. ]);
  478. $slider.slider( 'value', $slider.slider( 'value' ) );
  479.  
  480. update = true;
  481. },
  482. setValues: function(){
  483. var vals = $slider.slider('values');
  484.  
  485. $min.attr('data-key',vals[0]).val( d( data[keys[vals[0]]].name ) );
  486. $max.attr('data-key',vals[1]).val( d( data[typeof keys[map[1]] != 'undefined' ? keys[map[1]] : keys[map[0]]].name ) );
  487. },
  488. getValues: function(){
  489. if( $min.attr('data-key') == $min.attr('data-min') && $max.attr('data-key') == $max.attr('data-max') && self.keys( data ).length == self.keys( self._sliders[s_idx].data ).length ) {
  490. return [];
  491. }
  492.  
  493. var min = parseInt( $min.attr('data-key') ),
  494. max = parseInt( $max.attr('data-key') ),
  495. vals = [];
  496.  
  497. for( var i = min; i <= max; i++ ) {
  498. var key = keys[i];
  499.  
  500. if( ! key ) continue;
  501.  
  502. if( typeof data[key] == 'undefined' ) {
  503. key = keys[0];
  504. }
  505.  
  506. vals.push( encodeURIComponent( self.encode( d( data[key].value ) ) ) );
  507. }
  508.  
  509. return vals;
  510. }
  511. });
  512. });
  513. },
  514.  
  515. initResponsive: function(){
  516. var self = this,
  517. column = null,
  518. moved = false,
  519. hidden = true;
  520.  
  521. if( self._box.hasClass( 'mfilter-hide-container' ) ) {
  522. column = self._box.parent();
  523. self._box.removeClass( 'mfilter-content_top mfilter-modern-horizontal mfilter-hide' );
  524. } else if( self._box.hasClass( 'mfilter-column_left' ) ) {
  525. column = jQuery('#column-left');
  526. } else if( self._box.hasClass( 'mfilter-column_right' ) ) {
  527. column = jQuery('#column-right');
  528. } else {
  529. return;
  530. }
  531.  
  532. var id = 'mfilter-free-container-' + jQuery('[id^="mfilter-free-container"]').length,
  533. cnt = jQuery('<div class="mfilter-free-container mfilter-free-container-closed mfilter-direction-' + self._options.direction + '">')
  534. .prependTo( jQuery('body') ),
  535. btn = jQuery('<div class="mfilter-free-button">')
  536. .appendTo( cnt )
  537. .click(function(){
  538. if( hidden ) {
  539. cnt.animate(self._options.direction == 'rtl' ? {
  540. 'marginRight' : 0
  541. } : {
  542. 'marginLeft' : 0
  543. }, 500, function(){
  544. self._relativeScroll.refresh();
  545. cnt.addClass('mfilter-free-container-opened').removeClass('mfilter-free-container-closed');
  546. });
  547. } else {
  548. cnt.animate(self._options.direction == 'rtl' ? {
  549. 'marginRight' : - ( cnt.outerWidth(true)<cnt.outerWidth()?cnt.outerWidth():cnt.outerWidth(true) )
  550. } : {
  551. 'marginLeft' : - cnt.outerWidth(true)
  552. }, 500, function(){
  553. cnt.addClass('mfilter-free-container-closed').removeClass('mfilter-free-container-opened');
  554. });
  555. }
  556.  
  557. hidden = ! hidden;
  558. }),
  559. cnt2 = jQuery('<div>')
  560. .css('overflow','hidden')
  561. .attr('id', id)
  562. .appendTo( cnt ),
  563. cnt3 = jQuery('<div>')
  564. .appendTo( cnt2 ),
  565. src = jQuery('<span class="mfilter-before-box">');
  566.  
  567. function reinit() {
  568. var scroll = new IScroll( '#' + id, {
  569. bounce: false,
  570. scrollbars: true,
  571. mouseWheel: true,
  572. interactiveScrollbars: true,
  573. mouseWheelSpeed: 120
  574. });
  575.  
  576. scroll.reinit = function(){
  577. if( ! cnt.hasClass('mfilter-free-container-opened') ) return;
  578.  
  579. var top = $('#' + id + ' > div:first').attr('style');
  580.  
  581. if( typeof top != 'undefined' ) {
  582. top = top.match(/translate\(([\-0-9]+)px, ([\-0-9]+)px\)/);
  583. }
  584.  
  585. self._relativeScroll.destroy();
  586.  
  587. self._relativeScroll = reinit();
  588.  
  589. if( top && typeof top[1] != 'undefined' && typeof top[2] != 'undefined' ) {
  590. self._relativeScroll.scrollTo( parseInt( top[1] ), parseInt( top[2] ) );
  591. }
  592. };
  593.  
  594. return scroll;
  595. }
  596.  
  597. self._relativeScroll = reinit();
  598.  
  599. self._box.before( src );
  600.  
  601. if( ! column.length )
  602. column = self._box.parent();
  603.  
  604. function isVisible() {
  605. var visible = column.is(':visible'),
  606. height = jQuery(window).height() - 50;
  607.  
  608. if( visible && moved ) {
  609. cnt.hide();
  610.  
  611. src.after( self._box );
  612.  
  613. if( ! hidden )
  614. btn.trigger('click');
  615.  
  616. moved = false;
  617. } else if( ! visible && ! moved ) {
  618. cnt.show();
  619.  
  620. cnt3.append( self._box );
  621.  
  622. moved = true;
  623. }
  624.  
  625. if( moved ) {
  626. cnt2.css( 'max-height', height + 'px' );
  627. self._relativeScroll.refresh();
  628. }
  629. }
  630.  
  631. jQuery(window).resize(function() {
  632. isVisible();
  633. });
  634.  
  635. isVisible();
  636. },
  637.  
  638. location: function(){
  639. var self = this,
  640. url = document.location.href.toString();
  641.  
  642. if( self._options.seo.alias != '' ) {
  643. url = url.replace( '/' + self._options.seo.alias, '' );
  644. }
  645.  
  646. return url;
  647. },
  648.  
  649. initUrls: function( url ) {
  650. var self = this;
  651.  
  652. if( typeof url == 'undefined' ) {
  653. url = self.location().split('#')[0];
  654. }
  655.  
  656. self._urlSep = self._parseSep( url ).urlSep;
  657. self._url = self._parseSep( url ).url;
  658. self._params = self._parseUrl( url );
  659. self._inUrl = self._parseUrl( url );
  660. },
  661.  
  662. _initMfImage: function() {
  663. var self = this;
  664.  
  665. self._box.find('.mfilter-image input').change(function(){
  666. var s = jQuery(this).is(':checked'),
  667. t = jQuery(this).attr('type');
  668.  
  669. if( t == 'radio' ) {
  670. jQuery(this).parent().parent().find('.mfilter-image-checked').removeClass('mfilter-image-checked');
  671. }
  672.  
  673. jQuery(this).parent()[s?'addClass':'removeClass']('mfilter-image-checked');
  674. });
  675.  
  676. self._box.find('.mfilter-image input:checked').parent().addClass('mfilter-image-checked');
  677. },
  678.  
  679. __initTreeCategoryEvents: function() {
  680. var self = this,
  681. $path = self._box.find('input[name="path"]');
  682.  
  683. self._box.find('li.mfilter-filter-item.mfilter-tree.mfilter-categories')[self._box.find('.mfilter-category-tree > ul > li').length?'show':'hide']();
  684.  
  685. self._box.find('.mfilter-category-tree').each(function(){
  686. var _this = jQuery(this),
  687. ul = _this.find('> ul'),
  688. top_url = ul.attr('data-top-url'),
  689. top_path = ul.attr('data-top-path').split('_');
  690.  
  691. _this.find('.mfilter-to-parent a').unbind('click').bind('click', function(){
  692. var parts = (jQuery(this).attr('data-path')?jQuery(this).attr('data-path'):$path.val()).split('_');
  693.  
  694. parts.pop();
  695.  
  696. if( top_url != '' && parts.length <= top_path.length ) {
  697. window.location.href = self.createUrl(top_url);
  698. } else {
  699. $path.val( parts.join('_') );
  700.  
  701. self.runAjax();
  702. }
  703.  
  704. return false;
  705. });
  706.  
  707. _this.find('a[data-parent-id]').click(function(){
  708. if( self._busy ) return false;
  709.  
  710. var id = jQuery(this).attr('data-id'),
  711. path = $path.val(),
  712. parts = path.split('_'),
  713. last = parts[parts.length-1].split(',');
  714.  
  715. self._cache['cat_'+id] = jQuery(this).text();
  716.  
  717. if( last.indexOf( id ) == -1 ) {
  718. if( path != '' ) {
  719. path += '_';
  720. }
  721.  
  722. path += id;
  723.  
  724. $path.val( path );
  725. }
  726.  
  727. self.runAjax();
  728.  
  729. return false;
  730. });
  731. });
  732. },
  733.  
  734. _initTreeCategory: function( force ) {
  735. var self = this,
  736. $path = self._box.find('input[name="path"]');
  737.  
  738. if( self._isInit && force !== true ) {
  739. self.__initTreeCategoryEvents();
  740.  
  741. return;
  742. }
  743.  
  744. if( ! $path.val() && ! self._isInit ) {
  745. if( typeof self._options.params.mfp_path != 'undefined' ) {
  746. $path.val( self._options.params.mfp_path );
  747. } else if( typeof self._options.params.mfp_org_path != 'undefined' ) {
  748. $path.val( self._options.params.mfp_org_path );
  749. } else if( typeof self._options.params.path != 'undefined' ) {
  750. $path.val( self._options.params.path );
  751. }
  752. }
  753.  
  754. self._box.find('.mfilter-category-tree').each(function(){
  755. if( $path.val().indexOf( '_' ) > -1 || ( $path.val() && ! self._options.params.path ) || ( $path.val() && self._options.route != self._options.routeCategory ) ) {
  756. jQuery(this).find('ul').prepend(jQuery('<li class="mfilter-to-parent">')
  757. .append(jQuery('<a>')
  758. .html((function(){
  759. var parts = $path.val().split('_'),
  760. cat = parts[parts.length-1];
  761.  
  762. return typeof self._cache['cat_'+cat] != 'undefined' ? self._cache['cat_'+cat] : self._options.text.go_to_top;
  763. }))
  764. )
  765. );
  766. }
  767. });
  768.  
  769. self.__initTreeCategoryEvents();
  770. },
  771.  
  772. _initBox: function() {
  773. var self = this;
  774.  
  775. if( self._isInit ) return;
  776.  
  777. if( self._box.hasClass( 'mfilter-content_top' ) ) {
  778. self._box.find('.mfilter-content > ul > li').each(function(i){
  779. if( i && i % 4 == 0 ) {
  780. jQuery(this).before('<li style="clear:both; display:block;"></li>');
  781. }
  782. });
  783. }
  784. },
  785.  
  786. _initTextFields: function() {
  787. var self = this;
  788.  
  789. self._box.find('.mfilter-filter-item.mfilter-text').each(function(){
  790. var _this = jQuery(this),
  791. name = _this.attr('data-seo-name'),
  792. input = _this.find('input[type=text]');
  793.  
  794. function clear() {
  795. if( self._cache['txt_field_'+name] ) {
  796. clearTimeout( self._cache['txt_field_'+name] );
  797. }
  798.  
  799. self._cache['txt_field_'+name] = null;
  800. }
  801.  
  802. input.bind('keydown', function(e){
  803. if( e.keyCode == 13 ) {
  804. clear();
  805.  
  806. self.ajax();
  807.  
  808. return false;
  809. }
  810. }).bind('keyup.mf_shv', function(){
  811. input[input.val()?'addClass':'removeClass']('mfilter-text-has-value');
  812. }).bind('keyup', function(e){
  813. clear();
  814.  
  815. if( self._options['refreshResults'] != 'using_button' ) {
  816. self._cache['txt_field_'+name] = setTimeout(function(){
  817. self.ajax();
  818.  
  819. self._cache['txt_field_'+name] = null;
  820. }, 1000);
  821. }
  822. }).trigger('keyup.mf_shv');
  823. });
  824. },
  825.  
  826. _initSearchFiled: function() {
  827. var self = this,
  828. searchField = self._box.find('input[id="mfilter-opts-search"]'),
  829. searchButton = self._box.find('[id="mfilter-opts-search_button"]');
  830.  
  831. if( ! searchField.length )
  832. return;
  833.  
  834. var refreshDelay = parseInt( searchField.unbind('keyup keydown click').attr('data-refresh-delay').toString().replace(/[^0-9\-]+/, '') ),
  835. lastValue = searchField.val();
  836.  
  837. function clearInt() {
  838. if( self._timeoutSearchFiled )
  839. clearTimeout( self._timeoutSearchFiled );
  840.  
  841. self._timeoutSearchFiled = null;
  842. }
  843.  
  844. if( refreshDelay != '-1' ) {
  845. searchField.bind('keyup', function(e){
  846. if( jQuery(this).val() == lastValue )
  847. return;
  848.  
  849. if( ! refreshDelay ) {
  850. self.ajax();
  851. } else if( e.keyCode != 13 ) {
  852. clearInt();
  853.  
  854. self._timeoutSearchFiled = setTimeout(function(){
  855. self.ajax();
  856.  
  857. self._timeoutSearchFiled = null;
  858. }, refreshDelay);
  859. }
  860.  
  861. lastValue = searchField.val();
  862. });
  863. }
  864.  
  865. searchField.bind('keydown', function(e){
  866. if( e.keyCode == 13 ) {
  867. clearInt();
  868.  
  869. self.ajax();
  870.  
  871. return false;
  872. }
  873. }).bind('keyup.mf_shv', function(){
  874. jQuery(this)[jQuery(this).val()?'addClass':'removeClass']('mfilter-search-has-value');
  875. }).trigger('keyup.mf_shv');
  876.  
  877. searchButton.bind('click', function(){
  878. clearInt();
  879.  
  880. self.ajax();
  881.  
  882. return false;
  883. });
  884. },
  885.  
  886. encode: function( string ) {
  887. string = string.replace( /,/g, 'LA==' );
  888. string = string.replace( /\[/g, 'Ww==' );
  889. string = string.replace( /\]/g, 'XQ==' );
  890. string = string.replace( /"/g, 'Ig==' );
  891. string = string.replace( /'/g, 'Jw==' );
  892.  
  893. return string;
  894. },
  895.  
  896. decode: function( string ) {
  897. string = string.replace( /LA==/g, ',' );
  898. string = string.replace( /Ww==/g, '[' );
  899. string = string.replace( /XQ==/g, ']' );
  900. string = string.replace( /Ig==/g, '"' );
  901. string = string.replace( /Jw==/g, "'" );
  902.  
  903. return string;
  904. },
  905.  
  906. _parseSep: function( url ) {
  907. var self = this,
  908. urlSep = null;
  909.  
  910. if( typeof url == 'undefined' )
  911. url = self._url;
  912.  
  913. if( ! self._options.smp.isInstalled || self._options.smp.disableConvertUrls ) {
  914. url = self.parse_url( url );
  915. url = url.scheme + '://' + url.host + (url.port ? ':'+url.port: '') + url.path;
  916. url = url.split('&')[0];
  917. } else {
  918. url = url.indexOf('?') > -1 ? url.split('?')[0] : url.split(';')[0];
  919. }
  920.  
  921. urlSep = {
  922. 'f' : '?',
  923. 'n' : '&'
  924. };
  925.  
  926. return {
  927. url : url,
  928. urlSep : urlSep
  929. };
  930. },
  931.  
  932. /**
  933. * Inicjuj kontener
  934. */
  935. _initContent: function() {
  936. var self = this;
  937.  
  938. self._jqContent
  939. .css('position', 'relative');
  940. },
  941.  
  942. /**
  943. * @return {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}
  944. */
  945. parse_url: function(str, component) {
  946. var query, key = ['source', 'scheme', 'authority', 'userInfo', 'user', 'pass', 'host', 'port',
  947. 'relative', 'path', 'directory', 'file', 'query', 'fragment'
  948. ],
  949. ini = (this.php_js && this.php_js.ini) || {},
  950. mode = (ini['phpjs.parse_url.mode'] &&
  951. ini['phpjs.parse_url.mode'].local_value) || 'php',
  952. parser = {
  953. php: /^(?:([^:\/?#]+):)?(?:\/\/()(?:(?:()(?:([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?()(?:(()(?:(?:[^?#\/]*\/)*)()(?:[^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
  954. strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
  955. loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-scheme to catch file:/// (should restrict this)
  956. };
  957.  
  958. var m = parser[mode].exec(str),
  959. uri = {},
  960. i = 14;
  961. while (i--) {
  962. if (m[i]) {
  963. uri[key[i]] = m[i];
  964. }
  965. }
  966.  
  967. if (component) {
  968. return uri[component.replace('PHP_URL_', '')
  969. .toLowerCase()];
  970. }
  971. if (mode !== 'php') {
  972. var name = (ini['phpjs.parse_url.queryKey'] &&
  973. ini['phpjs.parse_url.queryKey'].local_value) || 'queryKey';
  974. parser = /(?:^|&)([^&=]*)=?([^&]*)/g;
  975. uri[name] = {};
  976. query = uri[key[12]] || '';
  977. query.replace(parser, function($0, $1, $2) {
  978. if ($1) {
  979. uri[name][$1] = $2;
  980. }
  981. });
  982. }
  983. delete uri.source;
  984. return uri;
  985. },
  986.  
  987. baseTypes: function( skip ) {
  988. var self = this,
  989. types = [];
  990.  
  991. function find( self ) {
  992. self._box.find('[data-base-type]').each(function(){
  993. var baseType = jQuery(this).attr('data-base-type'),
  994. type = jQuery(this).attr('data-type');
  995.  
  996. if( baseType == 'categories' ) {
  997. baseType += ':' + type;
  998. }
  999.  
  1000. if( types.indexOf( baseType ) > -1 ) return;
  1001. if( typeof skip != 'undefined' && skip.indexOf( baseType ) > -1 ) return;
  1002.  
  1003. if( type == 'text' ) return;
  1004.  
  1005. types.push( baseType );
  1006. });
  1007. }
  1008.  
  1009. find( self );
  1010.  
  1011. for( var i = 0; i < MegaFilterINSTANCES.length; i++ ) {
  1012. if( i == self._instanceIdx ) continue;
  1013.  
  1014. find( MegaFilterINSTANCES[i] );
  1015. }
  1016.  
  1017. return types;
  1018. },
  1019.  
  1020. _ajaxUrl: function( url ) {
  1021. url = url.replace( /\/mfp,([a-z0-9\-_]+\[[^\]]*\],?)+/g, '' );
  1022.  
  1023. var self = this,
  1024. params = url.indexOf('?') > -1 ? url.split('?')[1] : '',
  1025. parts = ( url.indexOf('?') > -1 ? url.split('?')[0] : url ).split('/');
  1026.  
  1027. for( i = 0; i < parts.length; i++ ) {
  1028. if( /page-[0-9]+/.test( parts[i] ) ) {
  1029. delete parts[i];
  1030. }
  1031. }
  1032.  
  1033. url = parts.join('/');
  1034. url = url.replace('://', '###URL###');
  1035. url = url.replace( /\/+/g, '/' );
  1036. url = url.replace('###URL###', '://');
  1037.  
  1038. if( params != '' ) {
  1039. url += '?' + params;
  1040. }
  1041.  
  1042. if( self._options.mijoshop ) {
  1043. return url + ( url.indexOf('?') > -1 ? '&' : '?' ) + 'option=com_mijoshop&format=raw';
  1044. }
  1045.  
  1046. if( self._options.joo_cart != false ) {
  1047. function parse( u ) {
  1048. u = u.replace( 'index.php', '' );
  1049. u = u.replace( /\/$/, '' );
  1050.  
  1051. return u + '/';
  1052. }
  1053.  
  1054. var site_url = parse( self._options.joo_cart.site_url ),
  1055. main_url = parse( self._options.joo_cart.main_url ),
  1056. route = url.indexOf( 'index.php' ) > -1 ? self._parseUrl( url, {} ).route : url.replace( main_url, '' ),
  1057. query = self.parse_url( url ).query;
  1058.  
  1059. if( typeof route == 'undefined' ) {
  1060. route = '';
  1061. }
  1062.  
  1063. if( typeof query == 'undefined' ) {
  1064. query = '';
  1065. }
  1066.  
  1067. if( route.indexOf('?') > -1 ) {
  1068. route = route.split('?')[0];
  1069. }
  1070.  
  1071. if( route == 'module/mega_filter/getajaxinfo' ) {
  1072. return site_url + 'index.php?route=' + route + ( query ? '&' + query : '' ) + '&option=com_opencart&format=raw';
  1073. }
  1074. }
  1075.  
  1076. return url;
  1077. },
  1078.  
  1079. /**
  1080. * Inicjuj informacje o ilości
  1081. */
  1082. _initCountInfo: function() {
  1083. var self = this;
  1084.  
  1085. if( ! self._options.calculateNumberOfProducts || self._isInit )
  1086. return;
  1087.  
  1088. jQuery.ajax({
  1089. 'url' : self._ajaxUrl( self.createUrl( self._options.ajaxGetInfoUrl, jQuery.extend( {}, self._params ), true ) ),
  1090. 'type' : 'GET',
  1091. 'data' : {
  1092. 'mfilterIdx' : self._options.idx,
  1093. 'mfilterRoute' : self._options.route,
  1094. 'mfilterBTypes' : self.baseTypes(['categories:tree','categories:cat_checkbox']).join(',')
  1095. },
  1096. 'success' : function( response ) {
  1097. self._parseInfo( response );
  1098.  
  1099. /*self._cache.mainContent[self.location()] = {
  1100. 'html' : self._jqContent.html(),
  1101. 'json' : response
  1102. };*/
  1103. },
  1104. 'error' : function() {
  1105.  
  1106. }
  1107. });
  1108.  
  1109. self._parseInfo('{"stock_status":[],"manufacturers":[],"rating":[],"attributes":[],"options":[],"filters":[]}',true);
  1110. },
  1111.  
  1112. _parseInfo: function( data, first ) {
  1113. var self = this,
  1114. filters = self.filters(),
  1115. json = jQuery.parseJSON( data );
  1116.  
  1117. for( var i in json ) {
  1118. switch( i ) {
  1119. case 'categories:tree' : {
  1120. self._box.find('.mfilter-category-tree > ul > li').remove();
  1121.  
  1122. for( var j = 0; j < json[i].length; j++ ) {
  1123. if( self._options.hideInactiveValues && json[i][j].cnt == '0' ) continue;
  1124. aclass = "";
  1125. if(json[i][j].cnt > 0){
  1126. aclass = "acategoryblack";
  1127. }
  1128. else{
  1129. aclass = "acategorywhite";
  1130. }
  1131.  
  1132. self._box.find('.mfilter-category-tree > ul').append(jQuery('<li class="mfilter-tb-as-tr">')
  1133. .append(jQuery('<div class="mfilter-tb-as-td">')
  1134. .append(jQuery('<a>')
  1135. .attr('data-id', json[i][j].id)
  1136. .attr('class', aclass)
  1137. .attr('data-parent-id', json[i][j].pid)
  1138. .html( json[i][j].name )
  1139. )
  1140. )
  1141. .append('<div class="mfilter-tb-as-td mfilter-col-count"><span class="mfilter-counter">' + json[i][j].cnt + '</span></div>')
  1142. );
  1143. }
  1144.  
  1145. self._initTreeCategory( true );
  1146.  
  1147. break;
  1148. }
  1149. case 'categories:cat_checkbox' : {
  1150. var cnt = {};
  1151.  
  1152. for( var j in json[i] ) {
  1153. cnt[json[i][j].id] = json[i][j].cnt;
  1154. }
  1155.  
  1156. self._box.find('.mfilter-filter-item.mfilter-cat_checkbox').each(function(){
  1157. var $self = jQuery(this),
  1158. cx = 0,
  1159. idx = 0;
  1160.  
  1161. $self.find('input[value]').each(function(i){
  1162. var $self2 = $(this),
  1163. $parent = $self2.parent().parent(),
  1164. $cnt = $parent.find('.mfilter-counter'),
  1165. checked = $self2.is(':checked'),
  1166. id = $self2.val(),
  1167. c = typeof cnt[id] == 'undefined' ? 0 : parseInt( cnt[id] ),
  1168. ct = c;
  1169.  
  1170. if( typeof filters['path'] != 'undefined' ) {
  1171. if( filters['path'].indexOf( encodeURIComponent( id ) ) == -1 ) {
  1172. ct = '+' + ct;
  1173. }
  1174. }
  1175.  
  1176. $cnt.text( ct )[checked?'addClass':'removeClass']('mfilter-close');
  1177.  
  1178. if( c ) {
  1179. cx++;
  1180. $parent.removeClass('mfilter-hide mfilter-first-child');
  1181. }
  1182.  
  1183. if( checked || c ) {
  1184. $self2.removeAttr('disabled');
  1185. $parent.removeClass('mfilter-disabled');
  1186. } else {
  1187. $self2.attr('disabled',true);
  1188. $parent.addClass('mfilter-disabled');
  1189. }
  1190.  
  1191. if( ! $parent.hasClass('mfilter-hide') ) {
  1192. if( i > 0 && idx == 0 ) {
  1193. $parent.addClass('mfilter-first-child');
  1194. }
  1195. idx++;
  1196. }
  1197. });
  1198.  
  1199. if( cx ) {
  1200. $self.removeClass('mfilter-hide');
  1201. }
  1202. });
  1203.  
  1204. break;
  1205. }
  1206. case 'price' : {
  1207. var priceRange = self.getPriceRange();
  1208.  
  1209. if( priceRange.min == self._options.priceMin && priceRange.max == self._options.priceMax ) {
  1210. self._box.find('[id="mfilter-opts-price-min"]').val( json[i].min );
  1211. self._box.find('[id="mfilter-opts-price-max"]').val( json[i].max );
  1212. }
  1213.  
  1214. self._options.priceMin = json[i].min;
  1215. self._options.priceMax = json[i].max;
  1216.  
  1217. self._refreshPrice();
  1218.  
  1219. break;
  1220. }
  1221. case 'model' :
  1222. case 'sku' :
  1223. case 'upc' :
  1224. case 'ean' :
  1225. case 'jan' :
  1226. case 'isbn' :
  1227. case 'mpn' :
  1228. case 'location' :
  1229. case 'length' :
  1230. case 'width' :
  1231. case 'height' :
  1232. case 'rating' :
  1233. case 'attributes' :
  1234. case 'filters' :
  1235. case 'options' :
  1236. case 'manufacturers' :
  1237. case 'stock_status' : {
  1238. self._box.find('.mfilter-filter-item.mfilter-' + i).each(function(){
  1239. var $item = jQuery(this),
  1240. seo = $item.attr('data-seo-name'),
  1241. id = $item.attr('data-id'),
  1242. $items = $item.find( '.mfilter-options .mfilter-option'),
  1243. hidden = 0;
  1244.  
  1245. $items.each(function(){
  1246. var $self = jQuery(this),
  1247. $input = $self.find('input[type=checkbox],input[type=radio],select'),
  1248. val = $input.val(),
  1249. $counter = jQuery(this).find('.mfilter-counter'),
  1250. text = '',
  1251. cnt = json[i];
  1252.  
  1253. if( id && typeof cnt[id] != 'undefined' ) {
  1254. cnt = cnt[id];
  1255. }
  1256.  
  1257. if( $self.hasClass( 'mfilter-select' ) ) {
  1258. var $options = $input.find('option'),
  1259. hOptions = 0,
  1260. val = $input.val(),
  1261. idx = $input.prop('selectedIndex');
  1262.  
  1263. if( typeof self._selectOptions[seo] == 'undefined' ) {
  1264. self._selectOptions[seo] = [];
  1265.  
  1266. $options.each(function(){
  1267. self._selectOptions[seo].push({
  1268. 'name' : jQuery(this).attr('data-name'),
  1269. 'id' : jQuery(this).attr('id'),
  1270. 'value' : jQuery(this).attr('value'),
  1271. 'text' : jQuery(this).html()
  1272. });
  1273. });
  1274. }
  1275.  
  1276. $options.remove();
  1277.  
  1278. (function(){
  1279. function add( $option ) {
  1280. $input.append( $option );
  1281.  
  1282. if( val == $option.val() ) {
  1283. idx = $input.find('option').length-1;
  1284. }
  1285. }
  1286.  
  1287. for( var i = 0; i < self._selectOptions[seo].length; i++ ) {
  1288. var $option = jQuery('<option>')
  1289. .attr('value', self._selectOptions[seo][i].value);
  1290.  
  1291. if( self._selectOptions[seo][i].name ) {
  1292. $option.attr('data-name', self._selectOptions[seo][i].name);
  1293. }
  1294.  
  1295. if( self._selectOptions[seo][i].id ) {
  1296. $option.attr('id', self._selectOptions[seo][i].id);
  1297. }
  1298.  
  1299. if( self._selectOptions[seo][i].id ) {
  1300. var idd = self._selectOptions[seo][i].id.split('-').pop();
  1301.  
  1302. if( first || typeof cnt[idd] != 'undefined' ) {
  1303. $option.html( ( ! first && self._options.showNumberOfProducts ? '(' + cnt[idd] + ') ' : '' ) + self._selectOptions[seo][i].name );
  1304.  
  1305. add( $option );
  1306. } else {
  1307. $option.attr('disabled', true).html( ( self._options.showNumberOfProducts ? '(0)' : '' ) + self._selectOptions[seo][i].name );
  1308.  
  1309. if( ! self._options.hideInactiveValues ) {
  1310. add( $option );
  1311. }
  1312.  
  1313. hOptions++;
  1314. }
  1315. } else {
  1316. $option.html( self._selectOptions[seo][i].text );
  1317. add( $option );
  1318. }
  1319. }
  1320. })();
  1321.  
  1322. if( idx >= 0 ) {
  1323. $input.prop('selectedIndex', idx);
  1324. }
  1325.  
  1326. if( hOptions == self._selectOptions[seo].length ) {
  1327. hidden++;
  1328. }
  1329. } else if( $self.hasClass( 'mfilter-slider' ) ) {
  1330. //if( self._options.hideInactiveValues ) {
  1331. self._box.find('[data-id="' + id + '"][data-slider-id]').each(function(){
  1332. var slider_id = jQuery(this).attr('data-slider-id'),
  1333. data = {};
  1334.  
  1335. for( var i in self._sliders[slider_id].data ) {
  1336. if( typeof cnt != 'undefined' && typeof cnt[i] != 'undefined' && parseInt( cnt[i] ) > 0 ) {
  1337. data[i] = self._sliders[slider_id].data[i];
  1338. }
  1339. }
  1340.  
  1341. self._sliders[slider_id].init( data, true );
  1342. });
  1343. //}
  1344. } else if( $self.hasClass( 'mfilter-text' ) ) {
  1345. $input = $self.find('input[type=text]');
  1346.  
  1347. if( typeof filters[seo] != 'undefined' ) {
  1348.  
  1349. } else {
  1350.  
  1351. }
  1352. } else {
  1353. var idd = $input.attr('id').split('-').pop();
  1354.  
  1355. if( typeof filters[seo] != 'undefined' ) {
  1356. if( filters[seo].indexOf( encodeURIComponent( self.encode( val ) ) ) > -1 ) {
  1357. $counter.addClass( 'mfilter-close' );
  1358. } else {
  1359. if( ! $item.hasClass( 'mfilter-radio' ) && ! $item.hasClass('mfilter-image_list_radio') /*&& base_type != 'option'*/ )
  1360. text += '+';
  1361.  
  1362. $counter.removeClass( 'mfilter-close' );
  1363. }
  1364. } else {
  1365. $counter.removeClass( 'mfilter-close' );
  1366. }
  1367.  
  1368. $self.removeClass('mfilter-first-child mfilter-last-child mfilter-disabled mfilter-hide mfilter-visible');
  1369. $self.parent().removeClass('mfilter-hide');
  1370.  
  1371. if( typeof cnt[idd] != 'undefined' && parseInt( cnt[idd] ) > 0 ) {
  1372. text += cnt[idd];
  1373.  
  1374. $self.addClass('mfilter-visible');
  1375. $input.attr('disabled', false);
  1376. } else {
  1377. text = '0';
  1378. hidden++;
  1379.  
  1380. $self.addClass('mfilter-disabled');
  1381. $input.attr('disabled',true);
  1382.  
  1383. if( first !== true && self._options.hideInactiveValues ) {
  1384. $self.addClass('mfilter-hide');
  1385.  
  1386. if( self._box.hasClass('mfilter-content_top') ) {
  1387. $self.parent().addClass('mfilter-hide');
  1388. }
  1389. }
  1390. }
  1391.  
  1392. $counter.text( text );
  1393. }
  1394. });
  1395.  
  1396. if( first !== true && self._options.hideInactiveValues ) {
  1397. $item[hidden==$items.length?'addClass':'removeClass']('mfilter-hide');
  1398. $item.find('.mfilter-option').not('.mfilter-hide,.mfilter-hide-by-live-filter').first().addClass('mfilter-first-child');
  1399. $item.find('.mfilter-option').not('.mfilter-hide,.mfilter-hide-by-live-filter').last().addClass('mfilter-last-child');
  1400. }
  1401. });
  1402.  
  1403. break;
  1404. }
  1405. }
  1406. }
  1407.  
  1408. if( first !== true && ( self._options.hideInactiveValues || self._box.find('[data-display-live-filter!="0"]').length ) ) {
  1409. for( var s = 0; s < self._scrolls.length; s++ ) {
  1410. self._scrolls[s].refresh();
  1411. }
  1412.  
  1413. for( var b = 0; b < self._buttonsMore.length; b++ ) {
  1414. self._buttonsMore[b].refresh();
  1415. }
  1416.  
  1417. for( var f = 0; f < self._liveFilters.length; f++ ) {
  1418. self._liveFilters[f].refresh();
  1419. }
  1420.  
  1421. if( self._relativeScroll != null ) {
  1422. self._relativeScroll.refresh();
  1423. }
  1424. }
  1425.  
  1426. self._updateInlineHorizontal();
  1427. },
  1428.  
  1429. _initAlwaysSearch: function() {
  1430. var self = this;
  1431.  
  1432. function search() {
  1433. self._jqContent.find('[name^=filter_],[name=search],[name=category_id],[name=sub_category],[name=description]').each(function(){
  1434. var name = jQuery(this).attr('name'),
  1435. value = jQuery(this).val(),
  1436. type = jQuery(this).attr('type');
  1437.  
  1438. if( [ 'checkbox', 'radio' ].indexOf( type ) > -1 && ! jQuery(this).is(':checked') )
  1439. value = '';
  1440.  
  1441. if( name ) {
  1442. self._inUrl[name] = value;
  1443. self._params[name] = value;
  1444. }
  1445. });
  1446.  
  1447. self.reload();
  1448. //self.ajax();
  1449. }
  1450.  
  1451. jQuery('#button-search').unbind('click').click(function(e){
  1452. e.preventDefault();
  1453.  
  1454. search();
  1455. });
  1456.  
  1457. self._jqContent.find('input[name=filter_name],input[name=search]').unbind('keydown').unbind('keyup').bind('keydown', function(e){
  1458. if( e.keyCode == 13 ) {
  1459. e.preventDefault();
  1460.  
  1461. search();
  1462. }
  1463. });
  1464. },
  1465.  
  1466. _initAlwaysAjaxPagination: function(){
  1467. var self = this;
  1468.  
  1469. if( ! self._options.ajaxPagination ) return;
  1470.  
  1471. self._jqContent.find('.pagination a').click(function(){
  1472. var url = jQuery(this).attr('href'),
  1473. params = self._parseUrl( url );
  1474.  
  1475. if( typeof params.page != 'undefined' ) {
  1476. self._ajaxPagination = params.page;
  1477.  
  1478. self.ajax( url );
  1479.  
  1480. return false;
  1481. }
  1482. });
  1483. },
  1484.  
  1485. __initLoader: function() {
  1486. this._jqLoader = jQuery('<span class="mfilter-ajax-loader-container" style="cursor: wait; z-index: 100; margin: 0; padding: 0; position: absolute; text-align: center; background-color: rgba(255,255,255,0.7);"></span>')
  1487. .prependTo( this._jqContent )
  1488. .html( '<img src="catalog/view/theme/default/stylesheet/mf/images/ajax-loader.gif" alt="" />' )
  1489. .hide();
  1490. },
  1491.  
  1492. __initLoaderFilter: function() {
  1493. this._jqLoaderFilter = jQuery('<span style="cursor: wait; z-index: 10000; margin: 0; padding: 0; position: absolute; background-color: rgba(255,255,255,0.7);"></span>')
  1494. .prependTo( this._box )
  1495. .hide();
  1496. },
  1497.  
  1498. /**
  1499. * Inicjuj wyświetlanie listy
  1500. */
  1501. _initDisplayItems: function() {
  1502. var self = this,
  1503. params = self.urlToFilters();
  1504.  
  1505. self._box.find('.mfilter-filter-item').each(function(i){
  1506. var _level0 = jQuery(this),
  1507. type = _level0.attr('data-type'),
  1508. seo_name = _level0.attr('data-seo-name'),
  1509. displayLiveFilter = parseInt( _level0.attr('data-display-live-filter') ),
  1510. displayListOfItems = _level0.attr('data-display-list-of-items');
  1511.  
  1512. if( ! displayListOfItems ) {
  1513. displayListOfItems = self._options.displayListOfItems.type;
  1514. }
  1515.  
  1516. if( type == 'price' || type == 'rating' ) return;
  1517.  
  1518. var wrapper = _level0.find('.mfilter-content-wrapper'),
  1519. content = _level0.find('> .mfilter-content-opts'),
  1520. heading = _level0.find('> .mfilter-heading'),
  1521. idx = null;
  1522.  
  1523. if( ! self._box.hasClass('mfilter-content_top') && heading.hasClass( 'mfilter-collapsed' ) ) {
  1524. if( typeof params[seo_name] == 'undefined' ) {
  1525. content.show();
  1526. }
  1527. }
  1528.  
  1529. if( displayListOfItems == 'scroll' ) {
  1530. if( ( wrapper.actual ? wrapper.actual( 'outerHeight', { includeMargin: true } ) : wrapper.outerHeight(true) ) > self._options.displayListOfItems.maxHeight ) {
  1531. if( jQuery.browser && jQuery.browser.msie && jQuery.browser.version < 9 ) {
  1532. wrapper
  1533. .css({
  1534. 'max-height': self._options.displayListOfItems.maxHeight + 'px',
  1535. 'overflow-y': 'scroll'
  1536. });
  1537. } else {
  1538. wrapper
  1539. .attr('id', 'mfilter-content-opts-' + self._instanceIdx + '-' + i)
  1540. .addClass('mfilter-iscroll')
  1541. .css('max-height', self._options.displayListOfItems.maxHeight + 'px');
  1542.  
  1543. (function(){
  1544. var iscroll = new IScroll( '#mfilter-content-opts-' + self._instanceIdx + '-' + i, {
  1545. bounce: false,
  1546. scrollbars: true,
  1547. mouseWheel: true,
  1548. interactiveScrollbars: true,
  1549. mouseWheelSpeed: 120
  1550. }),
  1551. start = false;
  1552.  
  1553. iscroll.on('moveStart', function(e){
  1554. if( ! start ) return;
  1555.  
  1556. self._relativeScroll._end(e);
  1557.  
  1558. start = false;
  1559. });
  1560.  
  1561. iscroll.on('moveStop', function(e){
  1562. if( start ) return;
  1563.  
  1564. self._relativeScroll._start(e);
  1565.  
  1566. start = true;
  1567. });
  1568.  
  1569. iscroll.on('scrollEnd', function(e){
  1570. if( e == null ) return;
  1571.  
  1572. self._relativeScroll._end(e);
  1573.  
  1574. start = false;
  1575. });
  1576.  
  1577. idx = self._scrolls.length;
  1578.  
  1579. self._scrolls.push({
  1580. refresh: function(){
  1581. iscroll.refresh();
  1582. }
  1583. });
  1584. })();
  1585. }
  1586. }
  1587. } else if( displayListOfItems == 'button_more' && ! self._box.hasClass('mfilter-content_top') && type != 'image' && type != 'image_radio' ) {
  1588. self._buttonsMore.push((function( _level0 ){
  1589. function init( first ) {
  1590. var lessHeight = 0,
  1591. moreHeight = 0,
  1592. show = false,
  1593. count = 0,
  1594. idx = 0;
  1595.  
  1596. _level0.find('.mfilter-option.mfilter-tb-as-tr').each(function(i){
  1597. var _this = jQuery(this);
  1598.  
  1599. if( _this.hasClass('mfilter-hide') || _this.hasClass('mfilter-hide-by-live-filter') ) return;
  1600.  
  1601. var h = _this.actual ? _this.actual( 'outerHeight', { includeMargin: true } ) : _this.outerHeight(true);
  1602.  
  1603. moreHeight += h;
  1604.  
  1605. if( idx >= self._options.displayListOfItems.limit_of_items ) {
  1606. lessHeight += h;
  1607. count++;
  1608. }
  1609.  
  1610. idx++;
  1611. });
  1612.  
  1613. lessHeight = moreHeight - lessHeight;
  1614.  
  1615. if( count ) {
  1616. wrapper.css('overflow','hidden').css('height', lessHeight+'px');
  1617.  
  1618. function sh( show, force ) {
  1619. if( force ) {
  1620. wrapper.height( moreHeight );
  1621. } else {
  1622. wrapper.animate({
  1623. 'height' : ! show ? moreHeight : lessHeight
  1624. }, 500, function(){
  1625. if( self._relativeScroll != null )
  1626. self._relativeScroll.refresh();
  1627. });
  1628. }
  1629.  
  1630. _level0.find('a.mfilter-button-more').text(show?self._options.displayListOfItems.textMore.replace( '%s', count ):self._options.displayListOfItems.textLess);
  1631. }
  1632.  
  1633. _level0.find('.mfilter-content-opts').append(jQuery('<div>')
  1634. .addClass( 'mfilter-button-more' )
  1635. .append(jQuery('<a>')
  1636. .attr( 'href', '#' )
  1637. .addClass( 'mfilter-button-more' )
  1638. .text( self._options.displayListOfItems.textMore.replace( '%s', count ) )
  1639. .bind('click', function(){
  1640. sh( show );
  1641.  
  1642. show = ! show;
  1643.  
  1644. wrapper[show?'addClass':'removeClass']('mfilter-slide-down');
  1645.  
  1646. return false;
  1647. })
  1648. )
  1649. );
  1650.  
  1651. if( wrapper.hasClass('mfilter-slide-down') ) {
  1652. sh( false, true );
  1653. show = true;
  1654. }
  1655. }
  1656. }
  1657.  
  1658. init( true );
  1659.  
  1660. idx = self._buttonsMore.length;
  1661.  
  1662. return {
  1663. refresh: function() {
  1664. _level0.find('.mfilter-content-wrapper').removeAttr('style');
  1665. _level0.find('.mfilter-button-more').remove();
  1666.  
  1667. init();
  1668. }
  1669. };
  1670. })( _level0 ));
  1671. }
  1672.  
  1673. if( type == 'cat_checkbox' ) {
  1674. (function(){
  1675. var cnt = 0;
  1676.  
  1677. content.find('.mfilter-category .mfilter-option').each(function(i){
  1678. if( jQuery(this).find('.mfilter-counter').text() != '0' ) {
  1679. if( i && ! cnt ) {
  1680. jQuery(this).addClass('mfilter-first-child');
  1681. }
  1682.  
  1683. cnt++;
  1684. } else {
  1685. jQuery(this).addClass('mfilter-hide');
  1686. }
  1687. });
  1688.  
  1689. if( ! cnt ) {
  1690. _level0.addClass('mfilter-hide');
  1691. }
  1692. })();
  1693. }
  1694.  
  1695. (function(){
  1696. if( self._box.hasClass( 'mfilter-content_top' ) ) {
  1697. return;
  1698. }
  1699.  
  1700. if( displayLiveFilter < 1 || content.find('.mfilter-option').length < displayLiveFilter || type == 'image' || type == 'image_radio' ) {
  1701. displayLiveFilter = 0;
  1702.  
  1703. return;
  1704. }
  1705.  
  1706. content.prepend(jQuery('<div class="mfilter-live-filter">')
  1707. .append(jQuery('<input type="text" class="form-control" id="mfilter-live-filter-input-' + self._instanceIdx + '-' + i + '" />'))
  1708. );
  1709. wrapper.find('> .mfilter-options > div').attr('id', 'mfilter-live-filter-list-' + self._instanceIdx + '-' + i);
  1710.  
  1711. _level0.addClass('mfilter-live-filter-init');
  1712.  
  1713. jQuery('#mfilter-live-filter-list-' + self._instanceIdx + '-' + i).liveFilter('#mfilter-live-filter-input-'+self._instanceIdx + '-' + i, '.mfilter-visible,.mfilter-should-visible,.mfilter-disabled,.mfilter-option:not(.mfilter-filter-item)', {
  1714. 'filterChildSelector' : 'label',
  1715. 'after' : function(contains, containsNot){
  1716. var list = jQuery('#mfilter-live-filter-list-' + self._instanceIdx + '-' + i);
  1717.  
  1718. contains.removeClass('mfilter-should-visible').addClass('mfilter-visible');
  1719. containsNot.removeClass('mfilter-visible').addClass('mfilter-should-visible');
  1720.  
  1721. list.find('> .mfilter-option').removeClass('mfilter-first-child mfilter-last-child');
  1722.  
  1723. list.find('> .mfilter-option:not(.mfilter-hide):not(.mfilter-hide-by-live-filter):first').addClass('mfilter-first-child');
  1724. list.find('> .mfilter-option:not(.mfilter-hide):not(.mfilter-hide-by-live-filter):last').addClass('mfilter-last-child');
  1725.  
  1726. if( idx !== null ) {
  1727. if( displayListOfItems == 'scroll' ) {
  1728. self._scrolls[idx].refresh();
  1729. } else if( displayListOfItems == 'button_more' ) {
  1730. self._buttonsMore[idx].refresh();
  1731. }
  1732. }
  1733.  
  1734. if( self._relativeScroll != null ) {
  1735. self._relativeScroll.refresh();
  1736. }
  1737. }
  1738. });
  1739.  
  1740. _level0.addClass('mfilter-live-filter-init');
  1741.  
  1742. self._liveFilters.push({
  1743. refresh: function(){
  1744. content.find('.mfilter-live-filter')[content.find('.mfilter-option:not(.mfilter-hide)').length <= displayLiveFilter?'hide':'show']();
  1745. },
  1746. check: function() {
  1747. jQuery('#mfilter-live-filter-input-'+self._instanceIdx + '-' + i).trigger('keyup');
  1748. }
  1749. });
  1750.  
  1751. self._liveFilters[self._liveFilters.length-1].refresh();
  1752. })();
  1753.  
  1754. if( ! self._box.hasClass('mfilter-content_top') && heading.hasClass( 'mfilter-collapsed' ) ) {
  1755. if( typeof params[seo_name] == 'undefined' ) {
  1756. content.hide();
  1757. }
  1758. }
  1759. });
  1760. },
  1761.  
  1762. /**
  1763. * Inicjuj nagłówki
  1764. */
  1765. _initHeading: function() {
  1766. var self = this;
  1767.  
  1768. if( self._box.hasClass('mfilter-content_top') )
  1769. return;
  1770.  
  1771. self._box.find('.mfilter-heading').click(function(){
  1772. var opts = jQuery(this).parent().find('> .mfilter-content-opts');
  1773.  
  1774. if( jQuery(this).hasClass('mfilter-collapsed') ) {
  1775. opts.slideDown('normal', function(){
  1776. if( self._relativeScroll != null )
  1777. self._relativeScroll.refresh();
  1778. });
  1779. jQuery(this).removeClass('mfilter-collapsed');
  1780. } else {
  1781. opts.slideUp('normal', function(){
  1782. if( self._relativeScroll != null )
  1783. self._relativeScroll.refresh();
  1784. });
  1785. jQuery(this).addClass('mfilter-collapsed');
  1786. }
  1787. });
  1788. },
  1789.  
  1790. _updateInlineHorizontal: function() {
  1791. for( var i = 0; i < this._inlineHorizontalUpdate.length; i++ ) {
  1792. this._inlineHorizontalUpdate[i]();
  1793. }
  1794. },
  1795.  
  1796. _initInlineHorizontal: function() {
  1797. var self = this;
  1798.  
  1799. if( ! self._box.hasClass( 'mfilter-content_top' ) ) {
  1800. return;
  1801. }
  1802.  
  1803. self._box.find('li[data-inline-horizontal="1"][data-type="checkbox"],li[data-inline-horizontal="1"][data-type="radio"]').each(function(){
  1804. var $container = jQuery(this).addClass('mfilter-inline-horizontal').find('.mfilter-opts-container'),
  1805. $wrapper = $container.find('> .mfilter-content-wrapper'),
  1806. $options = $wrapper.find('> .mfilter-options'),
  1807. $optionsCnt = $options.find('> .mfilter-options-container'),
  1808. $tb = $optionsCnt.find('> .mfilter-tb'),
  1809. left = 0;
  1810.  
  1811. function width() {
  1812. var w = 0,
  1813. b = false;
  1814.  
  1815. left = 0;
  1816.  
  1817. $tb.find('> .mfilter-tb').each(function(){
  1818. var ww = jQuery(this).outerWidth(true);
  1819.  
  1820. if( self._lastEvent ) {
  1821. var $el = jQuery(this).find('[id="' + self._lastEvent + '"]');
  1822.  
  1823. if( $el.length ) {
  1824. b = true;
  1825. } else if( ! b ) {
  1826. left += ww;
  1827. }
  1828. }
  1829.  
  1830. w += ww;
  1831. });
  1832.  
  1833. return w;
  1834. }
  1835.  
  1836. self._inlineHorizontalUpdate[self._inlineHorizontalUpdate.length] = function() {
  1837. $optionsCnt.removeAttr('style');
  1838. $tb.removeAttr('style').css('margin-left',$tb.attr('data-mgr')+'px');
  1839.  
  1840. o1 = w1;
  1841. o2 = w2;
  1842.  
  1843. w1 = $optionsCnt.width()-2*8;
  1844. w2 = width();
  1845.  
  1846. $optionsCnt.css('width', w1);
  1847. $tb.css('width', w2+fix);
  1848.  
  1849. if( w2 > w1 ) {
  1850. $right.addClass('mf-active');
  1851.  
  1852. if( x >= w2-w1 && $left.hasClass('mf-active') ) {
  1853. t=0;
  1854. $right.trigger('click');
  1855. } else if( self._lastEvent ) {
  1856. var $el = $tb.find('[id="' + self._lastEvent + '"]');
  1857.  
  1858. if( $el.length ) {
  1859. var w = $el.parent().parent().parent().outerWidth(true);
  1860.  
  1861. if( x > left ) {
  1862. t=0;
  1863. x=left-w+w1;
  1864. $left.trigger('click');
  1865. } else if( x+w1 < left+w ) {
  1866. t=0;
  1867. x=x+(w*2)-w1;
  1868. $right.trigger('click');
  1869. }
  1870. }
  1871. }
  1872. } else {
  1873. t=x=0;
  1874. $left.addClass('mf-active').trigger('click');
  1875. $right.removeClass('mf-active');
  1876. }
  1877.  
  1878. /*if( ! $right.hasClass('mf-active') ) {
  1879. if( w2 > w1 ) {
  1880. //t=0;
  1881. $right.addClass('mf-active');//.trigger('click');
  1882. } else {
  1883. t=x=0;
  1884. $left.addClass('mf-active').trigger('click');
  1885. //$right.removeClass('mf-active');
  1886. }
  1887. } else {
  1888. if( w2 <= w1 ) {
  1889. $right.removeClass('mf-active');
  1890. }
  1891. }*/
  1892. };
  1893.  
  1894. var $left = jQuery('<a href="#"></a>'),
  1895. $right = jQuery('<a href="#"></a>');
  1896.  
  1897. $wrapper.prepend(jQuery('<div class="mfilter-scroll-left"></div>').append($left));
  1898. $wrapper.append(jQuery('<div class="mfilter-scroll-right"></div>').append($right));
  1899.  
  1900. var w1 = $optionsCnt.width(),
  1901. w2 = width(),
  1902. o1 = -1,
  1903. o2 = -1,
  1904. x = 0,
  1905. fix = 50,
  1906. t = 'normal';
  1907.  
  1908. if( w2 > w1 ) {
  1909. $right.addClass('mf-active');
  1910. }
  1911.  
  1912. $optionsCnt.css('width', w1);
  1913. $tb.css('width', w2+fix).attr('data-mgr','0');
  1914.  
  1915. $left.click(function(){
  1916. var $self = jQuery(this);
  1917.  
  1918. if( ! $self.hasClass('mf-active') ) return false;
  1919.  
  1920. x -= w1;
  1921.  
  1922. if( x <= 0 ) {
  1923. x = 0;
  1924. $self.removeClass('mf-active');
  1925. }
  1926.  
  1927. $tb.attr('data-mgr', -x).stop().animate({
  1928. 'marginLeft' : -x
  1929. }, t);
  1930.  
  1931. t = 'normal';
  1932.  
  1933. $right.addClass('mf-active');
  1934.  
  1935. return false;
  1936. });
  1937. $right.click(function(){
  1938. var $self = jQuery(this);
  1939.  
  1940. if( ! $self.hasClass('mf-active') ) return false;
  1941.  
  1942. x += w1;
  1943.  
  1944. if( x >= w2-w1 ) {
  1945. x = w2-w1;
  1946. $self.removeClass('mf-active');
  1947. }
  1948.  
  1949. $tb.attr('data-mgr', -x).stop().animate({
  1950. 'marginLeft' : -x
  1951. }, t);
  1952.  
  1953. t = 'normal';
  1954.  
  1955. $left.addClass('mf-active');
  1956.  
  1957. return false;
  1958. });
  1959. });
  1960. },
  1961.  
  1962. _initCategoryRelated: function() {
  1963. var self = this;
  1964.  
  1965. self._box.find('.mfilter-filter-item.mfilter-related').each(function(){
  1966. var $li = jQuery(this),
  1967. seoName = $li.attr('data-seo-name'),
  1968. autoLevels = $li.attr('data-auto-levels'),
  1969. fields = $li.find('select[data-type="category-related"]');
  1970.  
  1971. fields.each(function(i){
  1972. if( ! autoLevels && i == fields.length - 1 ) {
  1973. jQuery(this).change(function(){
  1974. if( self._options['refreshResults'] != 'using_button' ) {
  1975. self.runAjax();
  1976. }
  1977. });
  1978. } else {
  1979. function eChange( $self, id ) {
  1980. var $this = $self.parent().attr('data-id', id),
  1981. labels = $this.parent().attr('data-labels').split('#|#');
  1982.  
  1983. $self.change(function(){
  1984. var cat_id = $self.val();
  1985.  
  1986. $next = $this.next().find('select');
  1987. $parent = $next.parent();
  1988. label = typeof labels[id+1] == 'undefined' ? $parent.attr('data-next-label') : labels[id+1];
  1989.  
  1990. if( cat_id ) {
  1991. $next.html('<option value="">' + self._options.text.loading + '</option>');
  1992. $next.prop('selectedIndex', 0);
  1993.  
  1994. jQuery.post( self._ajaxUrl( self._options.ajaxGetCategoryUrl ), { 'cat_id' : cat_id }, function( response ){
  1995. var data = jQuery.parseJSON( response );
  1996.  
  1997. if( data.length && autoLevels ) {
  1998. var $li = jQuery('<li>');
  1999.  
  2000. $this.after( $li );
  2001. $next = jQuery('<select>').appendTo( $li );
  2002.  
  2003. if( ! label )
  2004. label = MegaFilterLang.text_select;
  2005.  
  2006. eChange( $next, id+1 );
  2007. }
  2008.  
  2009. $next.html('<option value="">' + label + '</option>');
  2010. $next.prop('selectedIndex', 0);
  2011.  
  2012. for( var i = 0; i < data.length; i++ ) {
  2013. $next.append( '<option value="' + data[i].id + '">' + data[i].name + '</option>' );
  2014. }
  2015.  
  2016. if( autoLevels ) {
  2017. if( ! data.length ) {
  2018. if( self._options['refreshResults'] != 'using_button' ) {
  2019. self.runAjax();
  2020. }
  2021. }
  2022. } else if( ! data.length ) {
  2023. if( self._options['refreshResults'] != 'using_button' ) {
  2024. self.runAjax();
  2025. }
  2026. }
  2027. });
  2028. }
  2029.  
  2030. var $p = $parent;
  2031.  
  2032. while( $p.length ) {
  2033. if( autoLevels ) {
  2034. var $t = $p;
  2035. $p = $p.next();
  2036. $t.remove();
  2037. } else {
  2038. $p.find('select').prop('selectedIndex', 0).find('option[value!=""]').remove();
  2039. $p = $p.next();
  2040. }
  2041. }
  2042.  
  2043. if( ! cat_id ) {
  2044. var beforeVal = self.urlToFilters()[seoName],
  2045. afterVal = self.filters()[seoName];
  2046.  
  2047. if( typeof beforeVal == 'undefined' )
  2048. beforeVal = [-1];
  2049.  
  2050. if( typeof afterVal == 'undefined' )
  2051. afterVal = [-1];
  2052.  
  2053. if( beforeVal.toString() != afterVal.toString() )
  2054. self.runAjax();
  2055. }
  2056. });
  2057. }
  2058.  
  2059. eChange( jQuery(this), i );
  2060. }
  2061. });
  2062. });
  2063. },
  2064.  
  2065. /**
  2066. * Inicjuj zdarzenia
  2067. */
  2068. _initEvents: function() {
  2069. var self = this;
  2070.  
  2071. function val( $input ) {
  2072. var val = $input.val(),
  2073. parent = $input.parent().parent();
  2074.  
  2075. if( $input.attr('type') == 'checkbox' || $input.attr('type') == 'radio' ) {
  2076. val = $input.is(':checked');
  2077.  
  2078. if( ! self._options.calculateNumberOfProducts ) {
  2079. if( self._isInit && $input.attr('type') == 'radio' ) {
  2080. parent.parent().find('.mfilter-counter').removeClass('mfilter-close');
  2081. }
  2082.  
  2083. parent.find('.mfilter-counter')[val?'addClass':'removeClass']('mfilter-close');
  2084. }
  2085.  
  2086. if( $input.attr('type') == 'radio' ) {
  2087. parent.parent().parent().parent().parent().parent().parent().find('.mfilter-input-active').removeClass('mfilter-input-active');
  2088. }
  2089. }
  2090.  
  2091. parent[val?'addClass':'removeClass']('mfilter-input-active');
  2092. }
  2093.  
  2094. self._box.find('input[type=checkbox],input[type=radio],select:not([data-type="category-related"])').change(function(){
  2095. self._lastEvent = jQuery(this).attr('id');
  2096.  
  2097. if( self._options['refreshResults'] != 'using_button' ) {
  2098. self.runAjax();
  2099. }
  2100.  
  2101. val(jQuery(this));
  2102. });
  2103.  
  2104. self._box.find('.mfilter-options .mfilter-option').each(function(){
  2105. var input = jQuery(this).find('input[type=checkbox],input[type=radio]');
  2106.  
  2107. if( ! input.length ) return;
  2108.  
  2109. jQuery(this).find('.mfilter-counter').bind('click', function(){
  2110. if( ! jQuery(this).hasClass( 'mfilter-close' ) ) return;
  2111.  
  2112. input.prop('checked', false).trigger('change');
  2113. //jQuery(this).removeClass('mfilter-close');
  2114. });
  2115.  
  2116. if( input.is(':checked') ) {
  2117. val(input);
  2118. }
  2119. });
  2120.  
  2121. self._box.find('.mfilter-button a').bind('click', function(){
  2122. self._lastEvent = null;
  2123.  
  2124. if( jQuery(this).hasClass( 'mfilter-button-reset' ) ) {
  2125. self.eachInstances(function( self ){
  2126. self.resetFilters();
  2127. });
  2128. }
  2129.  
  2130. self.ajax();
  2131.  
  2132. return false;
  2133. });
  2134. },
  2135.  
  2136. /**
  2137. * Uruchom ładowanie
  2138. */
  2139. runAjax: function() {
  2140. var self = this;
  2141.  
  2142. switch( self._options['refreshResults'] ) {
  2143. case 'using_button' :
  2144. case 'immediately' : {
  2145. self.ajax();
  2146.  
  2147. break;
  2148. }
  2149. case 'with_delay' : {
  2150. if( self._timeoutAjax )
  2151. clearTimeout( self._timeoutAjax );
  2152.  
  2153. self._timeoutAjax = setTimeout(function(){
  2154. self.ajax();
  2155.  
  2156. self._timeoutAjax = null;
  2157. }, self._options['refreshDelay'] );
  2158.  
  2159. break;
  2160. }
  2161. }
  2162. },
  2163.  
  2164. /**
  2165. * Pobierz aktualny zakres cen
  2166. */
  2167. getPriceRange: function() {
  2168. var self = this,
  2169. minInput = self._box.find('[id="mfilter-opts-price-min"]'),
  2170. maxInput = self._box.find('[id="mfilter-opts-price-max"]'),
  2171. min = minInput.val(),
  2172. max = maxInput.val();
  2173.  
  2174. if( ! /^[0-9]+$/.test( min ) || min < self._options.priceMin )
  2175. min = self._options.priceMin;
  2176.  
  2177. if( ! /^[0-9]+$/.test( max ) || max > self._options.priceMax )
  2178. max = self._options.priceMax;
  2179.  
  2180. return {
  2181. min : parseInt( min ),
  2182. max : parseInt( max )
  2183. };
  2184. },
  2185.  
  2186. /**
  2187. * Inicjuj przedział cenowy
  2188. */
  2189. _initPrice: function() {
  2190. var self = this,
  2191. priceRange = self.getPriceRange(),
  2192. filters = self.urlToFilters(),
  2193. minInput = self._box.find('[id="mfilter-opts-price-min"]').unbind('change').bind('change', function(){
  2194. changePrice();
  2195. }).val( filters.price ? filters.price[0] : priceRange.min ),
  2196. maxInput = self._box.find('[id="mfilter-opts-price-max"]').unbind('change').bind('change', function(){
  2197. changePrice();
  2198. }).val( filters.price ? filters.price[1] : priceRange.max ),
  2199. slider = self._box.find('[id="mfilter-price-slider"]');
  2200.  
  2201. self._refreshPrice = function( minMax ) {
  2202. var priceRange = self.getPriceRange();
  2203.  
  2204. if( priceRange.min < self._options.priceMin ) {
  2205. priceRange.min = self._options.priceMin;
  2206. }
  2207.  
  2208. if( priceRange.max > self._options.priceMax ) {
  2209. priceRange.max = self._options.priceMax;
  2210. }
  2211.  
  2212. if( priceRange.min > priceRange.max ) {
  2213. priceRange.min = priceRange.max;
  2214. }
  2215.  
  2216. if( priceRange.min.toString() != minInput.val() ) {
  2217. minInput.val( priceRange.min );
  2218. }
  2219.  
  2220. if( priceRange.max.toString() != maxInput.val() ) {
  2221. maxInput.val( priceRange.max );
  2222. }
  2223.  
  2224. slider.slider( 'option', 'values', [ priceRange.min, priceRange.max ] );
  2225.  
  2226. if( minMax !== false ) {
  2227. slider.slider( 'option', 'min', self._options.priceMin );
  2228. slider.slider( 'option', 'max', self._options.priceMax );
  2229. slider.slider( 'value', slider.slider('value') );
  2230. }
  2231. };
  2232.  
  2233. function changePrice() {
  2234. self._refreshPrice( false );
  2235.  
  2236. if( self._options['refreshResults'] != 'using_button' ) {
  2237. self.runAjax();
  2238. }
  2239. }
  2240.  
  2241.  
  2242. },
  2243.  
  2244. _initWindowOnPopState: function(){
  2245. var self = this;
  2246.  
  2247. if( self._isInit ) return;
  2248.  
  2249. function update() {
  2250. self.eachInstances(function( self ){
  2251. self._urlToFilters = null;
  2252. self.initUrls();
  2253. self.setFiltersByUrl();
  2254. });
  2255. }
  2256.  
  2257. function setFilters( url ) {
  2258. var params = self._parseUrl( url );
  2259.  
  2260. if( typeof params.mfp != 'undefined' ) {
  2261. self.setFiltersByUrl( self.__urlToFilters( decodeURIComponent( params.mfp ) ) );
  2262. } else {
  2263. self.resetFilters();
  2264. }
  2265. }
  2266.  
  2267. window.onpopstate = function(e){
  2268. if( e.state ) {
  2269. update();
  2270.  
  2271. self._render( e.state.html, e.state.json, true );
  2272.  
  2273. setFilters( e.state.url );
  2274. } else if( typeof self._cache.mainContent[self.location()] != 'undefined' && self._history > 0 ) {
  2275. update();
  2276.  
  2277. self._render( self._cache.mainContent[self.location()].html, self._cache.mainContent[self.location()].json, true );
  2278.  
  2279. setFilters( self.location() );
  2280. } else if( self._changed && self._history > 0 ) {
  2281. setFilters( self._startUrl.toString() );
  2282.  
  2283. self.ajax( null, true );
  2284. }
  2285.  
  2286. self._history--;
  2287. };
  2288. },
  2289.  
  2290. count: function( obj ) {
  2291. var c = 0;
  2292.  
  2293. for( var i in obj ) {
  2294. c++;
  2295. }
  2296.  
  2297. return c;
  2298. },
  2299.  
  2300. setFiltersByUrl: function( params ) {
  2301. var self = this;
  2302.  
  2303. if( typeof params == 'undefined' ) {
  2304. params = self.urlToFilters();
  2305. }
  2306.  
  2307. self.resetFilters();
  2308.  
  2309. self._box.find('li[data-type]').each(function(){
  2310. var _this = jQuery(this),
  2311. type = _this.attr('data-type'),
  2312. seoName = _this.attr('data-seo-name'),
  2313. value = params[seoName];
  2314.  
  2315. if( typeof value == 'undefined' || typeof value[0] == 'undefined' )
  2316. return;
  2317.  
  2318. switch( type ) {
  2319. case 'rating' :
  2320. case 'stock_status' :
  2321. case 'manufacturers' :
  2322. case 'image' :
  2323. case 'image_radio' :
  2324. case 'radio' :
  2325. case 'image_list_radio' :
  2326. case 'image_list_checkbox' :
  2327. case 'checkbox' : {
  2328. for( var i in value ) {
  2329. if( typeof value[i] == 'function' ) continue;
  2330.  
  2331. if( type == 'image_radio' || type == 'radio' || type == 'image_list_radio' ) {
  2332. _this.find('.mfilter-image-checked').removeClass('mfilter-image-checked');
  2333. }
  2334.  
  2335. var $p1 = _this.find('input[value="' + self.decode( decodeURIComponent( value[i] ) ).replace( /"/g, '&quot;' ) + '"]').prop('checked', true)
  2336. .parent();
  2337.  
  2338. $p1.parent()
  2339. .addClass('mfilter-input-active').find('.mfilter-counter').addClass('mfilter-close');
  2340.  
  2341. if( $p1.hasClass( 'mfilter-image' ) ) {
  2342. $p1.addClass('mfilter-image-checked');
  2343. }
  2344. }
  2345.  
  2346. break;
  2347. }
  2348. case 'select' : {
  2349. _this.find('select option[value="' + self.decode( decodeURIComponent( value[0] ) ).replace( /"/g, '&quot;' ) + '"]').attr('selected', true);
  2350.  
  2351. break;
  2352. }
  2353. case 'price' : {
  2354. if( typeof value[0] != 'undefined' && typeof value[1] != 'undefined' ) {
  2355. _this.find('input[id="mfilter-opts-price-min"]').val( value[0] );
  2356. _this.find('input[id="mfilter-opts-price-max"]').val( value[1] );
  2357.  
  2358. _this.find('[id="mfilter-price-slider"]').each(function(){
  2359. //jQuery(this).slider( 'option', 'min', value[0] );
  2360. //jQuery(this).slider( 'option', 'max', value[1] );
  2361. jQuery(this).slider( 'option', 'values', [ value[0], value[1] ] );
  2362. jQuery(this).slider( 'value', jQuery(this).slider('value') );
  2363. });
  2364. }
  2365.  
  2366. break;
  2367. }
  2368. case 'text' :
  2369. case 'search' : {
  2370. _this.find('input').val( self.decode( decodeURIComponent( value[0] ) ) );
  2371.  
  2372. break;
  2373. }
  2374. }
  2375. });
  2376.  
  2377. for( var i = 0; i < self._sliders.length; i++ ) {
  2378. self._sliders[i].setValues();
  2379. }
  2380. },
  2381.  
  2382. /**
  2383. * Pokaż loader
  2384. */
  2385. _showLoader: function() {
  2386. var self = this;
  2387.  
  2388. if( self._jqLoader == null && self._options.showLoaderOverResults ) {
  2389. self.__initLoader();
  2390. }
  2391.  
  2392. if( self._jqLoaderFilter == null && self._options.showLoaderOverFilter ) {
  2393. self.__initLoaderFilter();
  2394. }
  2395.  
  2396. if( self._options.showLoaderOverResults ) {
  2397. (function(){
  2398. var w = self._jqContent.outerWidth(),
  2399. h = self._jqContent.outerHeight(),
  2400. j = self._jqContent.find('.product-list'),
  2401. k = j.length ? j : self._jqContent.find('.product-grid'),
  2402. l = k.length ? k : self._jqContent,
  2403. t = k.length ? k.offset().top - 150 : l.offset().top;
  2404.  
  2405. self._jqLoader
  2406. .css('width', w + 'px')
  2407. .css('height', h + 'px')
  2408. .fadeTo('normal', 1)
  2409. .find('img')
  2410. .css('margin-top', t + 'px');
  2411. })();
  2412. }
  2413.  
  2414. if( self._options.showLoaderOverFilter ) {
  2415. (function(){
  2416. var w = self._box.outerWidth(),
  2417. h = self._box.outerHeight();
  2418.  
  2419. self._jqLoaderFilter
  2420. .css('width', w + 'px')
  2421. .css('height', h + 'px')
  2422. .fadeTo('normal',1);
  2423. })();
  2424. }
  2425.  
  2426. if( self._options.autoScroll ) {
  2427. jQuery('html,body').stop().animate({
  2428. scrollTop: self._jqContent.offset().top + self._options.addPixelsFromTop
  2429. }, 'low', function(){
  2430. self._busy = false;
  2431. self.render();
  2432. });
  2433. } else {
  2434. self._busy = false;
  2435. self.render();
  2436. }
  2437. },
  2438.  
  2439. /**
  2440. * Ukryj loader
  2441. */
  2442. _hideLoader: function() {
  2443. var self = this;
  2444.  
  2445. if( self._jqLoader !== null ) {
  2446. self._jqLoader.remove();
  2447. self._jqLoader = null;
  2448. }
  2449.  
  2450. if( self._jqLoaderFilter !== null ) {
  2451. self._jqLoaderFilter.remove();
  2452. self._jqLoaderFilter = null;
  2453. }
  2454. },
  2455.  
  2456. /**
  2457. * Pokaż wczytane dane
  2458. */
  2459. render: function( history ) {
  2460. var self = this;
  2461.  
  2462. if( self._lastResponse === '' || self._busy ) {
  2463. return;
  2464. }
  2465.  
  2466. self._hideLoader();
  2467.  
  2468. // usuń wszystkie linki do skryptów JS
  2469. self._lastResponse = self._lastResponse.replace( /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, '' );
  2470.  
  2471. var tmp = jQuery('<tmp>').html( self._lastResponse ),
  2472. content = tmp.find(self._contentId), // znajdź treść główną
  2473. json = tmp.find('#mfilter-json'); // informacje JSON zawierające dane o ilości produktów wg kategorii
  2474.  
  2475. if( ! content.length && self._contentId != '#content' ) {
  2476. content = tmp.find('#content');
  2477. }
  2478.  
  2479. if( content.length ) {
  2480. var styles = self._jqContent.html().match( /<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi );
  2481.  
  2482. if( styles != null && styles.length ) {
  2483. for( var i = 0; i < styles.length; i++ ) {
  2484. jQuery('head:first').append( styles[i] );
  2485. }
  2486. }
  2487.  
  2488. self._render( content.html(), json && json.length ? self.base64_decode(json.html()) : null, history );
  2489.  
  2490. self._lastResponse = '';
  2491. } else {
  2492. self.reload();
  2493. }
  2494. },
  2495.  
  2496. _render: function( html, json, history ) {
  2497. var self = this;
  2498.  
  2499. if( history !== true ) {
  2500. self._lastUrl = self.createUrl();
  2501.  
  2502. if( self._ajaxPagination !== null ) {
  2503. self._lastUrl += self._lastUrl.indexOf( '?' ) > -1 ? '&' : '?';
  2504. self._lastUrl += 'page=' + self._ajaxPagination;
  2505.  
  2506. self._ajaxPagination = null;
  2507. }
  2508.  
  2509. self._urlToFilters = null;
  2510.  
  2511. if( self._options.seo.enabled ) {
  2512. var u = self.parse_url( self._lastUrl );
  2513.  
  2514. self._lastUrl = '';
  2515. self._lastUrl += u.scheme + '://';
  2516. self._lastUrl += u.host;
  2517. self._lastUrl += decodeURIComponent( u.path ).replace( /\/mfp,([a-z0-9\-_]+\[[^\]]*\],?)+/g, '' );
  2518.  
  2519. if( typeof u.query != 'undefined' && u.query ) {
  2520. //if( u.path != '/' ) {
  2521. var mfp = u.query.match( /mfp=([^&]+)/ );
  2522.  
  2523. self._lastUrl = self._lastUrl.replace( /\/$/, '' );
  2524.  
  2525. if( mfp ) {
  2526. self._lastUrl += '/mfp,' + mfp[1];
  2527. u.query = u.query.replace( 'mfp=' + mfp[1], '' );
  2528. u.query = u.query.replace( /^(\?|&)|&$/g, '' );
  2529. }
  2530.  
  2531. if( u.query != '' ) {
  2532. self._lastUrl += '?' + u.query;
  2533. }
  2534. //} else {
  2535. // self._lastUrl += '?' + u.query;
  2536. //}
  2537. }
  2538. }
  2539.  
  2540. try {
  2541. window.history.pushState({
  2542. 'html' : html,
  2543. 'json' : json,
  2544. 'url' : self._lastUrl
  2545. }, '', self._lastUrl );
  2546.  
  2547. self._history++;
  2548. } catch( e ) {}
  2549. }
  2550.  
  2551. if( json ) {
  2552. self.eachInstances(function( self ){
  2553. self._parseInfo( json );
  2554. });
  2555. }
  2556.  
  2557. self.beforeRender( self._lastResponse, html, json );
  2558.  
  2559. self._jqContent.html( html );
  2560.  
  2561. /*if( self._box.hasClass( 'mfilter-content_top' ) ) {
  2562. self._jqContent.prepend( self._box.removeClass('init') );
  2563. self.init( self._box, self._options );
  2564. }*/
  2565.  
  2566. if( typeof jQuery.totalStorage == 'function' && jQuery.totalStorage('display') ) {
  2567. display_MFP( jQuery.totalStorage('display') );
  2568. } else if( typeof jQuery.cookie == 'function' && jQuery.cookie('display') ) {
  2569. display_MFP( jQuery.cookie('display') );
  2570. } else {
  2571. display_MFP( 'list' );
  2572. }
  2573.  
  2574. for( var i in self ) {
  2575. if( i.indexOf( '_initAlways' ) === 0 && typeof self[i] == 'function' ) {
  2576. self[i]();
  2577. }
  2578. }
  2579.  
  2580. for( var f = 0; f < self._liveFilters.length; f++ ) {
  2581. self._liveFilters[f].check();
  2582. }
  2583.  
  2584. // Support for Product Quantity Extension (15186)
  2585. if( typeof pq_initExt == 'function' ) {
  2586. pq_initExt();
  2587. }
  2588.  
  2589. if( self._options.routeHome == self._options.route && self._options.homePageAJAX ) {
  2590. self._jqContent.find('.pagination > li > a').unbind('click').bind('click', function(){
  2591. self.ajax( jQuery(this).attr('href') );
  2592.  
  2593. return false;
  2594. });
  2595. }
  2596.  
  2597. if( self._relativeScroll ) {
  2598. self._relativeScroll.reinit();
  2599. }
  2600.  
  2601. self.afterRender( self._lastResponse, html, json );
  2602. },
  2603.  
  2604. beforeRequest: function(){},
  2605.  
  2606. beforeRender: function(){},
  2607.  
  2608. afterRender: function(){},
  2609.  
  2610. eachInstances: function( fn, skipCurrent ) {
  2611. for( var i = 0; i < MegaFilterINSTANCES.length; i++ ) {
  2612. if( skipCurrent === true && i == this._instanceIdx ) continue;
  2613.  
  2614. fn( MegaFilterINSTANCES[i] );
  2615. }
  2616. },
  2617.  
  2618. /**
  2619. * Załaduj dane
  2620. */
  2621. ajax: function( url, history ) {
  2622. var self = this;
  2623.  
  2624. if( self._busy ) {
  2625. self._waitingChanges = true;
  2626.  
  2627. return;
  2628. }
  2629.  
  2630. (function(){
  2631. var filters = self.filters( true );
  2632.  
  2633. self.eachInstances(function( self ){
  2634. var params = $.extend( self.filters(), filters );
  2635.  
  2636. self.setFiltersByUrl( params );
  2637. }, true);
  2638. })();
  2639.  
  2640. if( typeof url == 'undefined' || url === null ) {
  2641. //url = [ self._options.routeProduct, self._options.routeHome ].indexOf( self._options.route ) > -1 ? self.createUrl( self._options.ajaxResultsUrl ) : self.createUrl();
  2642. url = [ self._options.routeProduct, self._options.routeHome, self._options.routeInformation, self._options.routeManufacturerList ].indexOf( self._options.route ) > -1 ? self.createUrl( self._options.ajaxResultsUrl ) : self.createUrl();
  2643. }
  2644.  
  2645. var cname = url + self._options.idx;
  2646.  
  2647. if( ( ! self._options.homePageAJAX && self._options.routeHome == self._options.route ) || [ self._options.routeProduct, self._options.routeInformation, self._options.routeManufacturerList ].indexOf( self._options.route ) > -1 ) {
  2648. //if( ( ! self._options.homePageAJAX && self._options.routeHome == self._options.route ) || self._options.routeProduct == self._options.route ) {
  2649. window.location.href = url;return;
  2650. }
  2651.  
  2652. self.eachInstances(function( self ){
  2653. self._busy = true;
  2654. self._lastResponse = '';
  2655. });
  2656.  
  2657. self._showLoader();
  2658.  
  2659. if( typeof self._params['page'] != 'undefined' ) {
  2660. delete self._params['page'];
  2661. }
  2662.  
  2663. if( typeof self._cache.lastResponse[cname] != 'undefined' ) {
  2664. self.eachInstances(function( self2 ){
  2665. self2._lastResponse = self._cache.lastResponse[cname];
  2666. });
  2667.  
  2668. setTimeout(function(){
  2669. self.eachInstances(function( self ){
  2670. self._busy = false;
  2671. });
  2672.  
  2673. self.render( history );
  2674. }, 100);
  2675.  
  2676. return;
  2677. }
  2678.  
  2679. self.beforeRequest();
  2680.  
  2681. self._changed = true;
  2682.  
  2683. jQuery.ajax({
  2684. 'type' : 'GET',
  2685. 'url' : self._ajaxUrl( url ),
  2686. 'timeout' : 60 * 1000,
  2687. 'cache' : false,
  2688. 'data' : {
  2689. 'mfilterAjax' : '1',
  2690. 'mfilterIdx' : self._options.idx,
  2691. 'mfilterBTypes' : self.baseTypes().join(','),
  2692. 'mfilterPath' : typeof self._options.params.mfp_org_path != 'undefined' ? self._options.params.mfp_org_path : self._options.params.path
  2693. },
  2694. 'success' : function( response ) {
  2695.  
  2696. self.eachInstances(function( self ){
  2697. self._busy = false;
  2698. });
  2699.  
  2700. if( response ) {
  2701. self.eachInstances(function( self ){
  2702. self._lastResponse = response;
  2703. self._cache.lastResponse[cname] = response;
  2704. });
  2705.  
  2706. self.render( history );
  2707.  
  2708. if( self._waitingChanges ) {
  2709. self._waitingChanges = false;
  2710. self.ajax();
  2711. }
  2712. } else {
  2713. self.reload();
  2714. }
  2715. },
  2716. 'error' : function() {
  2717. self.reload();
  2718. }
  2719. });
  2720. },
  2721.  
  2722. /**
  2723. * Utwórz pełny adres URL
  2724. */
  2725. createUrl: function( url, attribs, force ) {
  2726. var self = this,
  2727. params = self.paramsToUrl( url, attribs ),
  2728. filters = self.filtersToUrl(),
  2729. urlSep = self._urlSep;
  2730.  
  2731. if( typeof url == 'undefined' ) {
  2732. url = self._url;
  2733. } else {
  2734. urlSep = self._parseSep( url.split('#')[0] ).urlSep;
  2735. url = self._parseSep( url.split('#')[0] ).url;
  2736. }
  2737.  
  2738. url = decodeURIComponent( url ).replace( /\/mfp,([a-z0-9\-_]+\[[^]]*\],?)+/, '' );
  2739.  
  2740. if( params || filters ) {
  2741. url += urlSep.f;
  2742.  
  2743. if( params ) {
  2744. url += params;
  2745. }
  2746.  
  2747. if( filters ) {
  2748. if( params ) {
  2749. url += urlSep.n;
  2750. }
  2751.  
  2752. url += 'mfp' + ( urlSep.n == '&' ? '=' : urlSep.n ) + filters;
  2753. } else if( force ) {
  2754. var mfp = self.filtersToUrl( self.urlToFilters() );
  2755.  
  2756. if( mfp ) {
  2757. url += urlSep.n;
  2758. url += 'mfp' + ( urlSep.n == '&' ? '=' : urlSep.n ) + mfp;
  2759. }
  2760. }
  2761. }
  2762.  
  2763. return url;
  2764. },
  2765.  
  2766. /**
  2767. * Sprawdź poprawność wpisanego zakresu cen
  2768. *
  2769. * @return bool
  2770. */
  2771. _validPrice: function( min, max ) {
  2772. var self = this;
  2773.  
  2774. min = parseInt( min );
  2775. max = parseInt( max );
  2776.  
  2777. if( min < self._options.priceMin )
  2778. return false;
  2779.  
  2780. if( max > self._options.priceMax )
  2781. return false;
  2782.  
  2783. if( min > max )
  2784. return false;
  2785.  
  2786. if( min == max && min == self._options.priceMin && max == self._options.priceMax )
  2787. return false;
  2788.  
  2789. return true;
  2790. },
  2791.  
  2792. /**
  2793. * Przekształć parametry z adresu URL na obiekt
  2794. *
  2795. * @return object
  2796. */
  2797. urlToFilters: function() {
  2798. if( this._urlToFilters !== null ) {
  2799. return this._urlToFilters;
  2800. }
  2801.  
  2802. var self = this;
  2803.  
  2804. self._urlToFilters = {};
  2805.  
  2806. if( ! self._params.mfp )
  2807. return self._urlToFilters;
  2808.  
  2809. self._params.mfp = decodeURIComponent( self._params.mfp );
  2810.  
  2811. self._urlToFilters = self.__urlToFilters( self._params.mfp );
  2812.  
  2813. return self._urlToFilters;
  2814. },
  2815.  
  2816. __urlToFilters: function( mfp ) {
  2817. var self = this,
  2818. obj = {},
  2819. matches = mfp.match( /[a-z0-9\-_]+\[[^\]]+\]/g );
  2820.  
  2821. if( ! matches ) {
  2822. return obj;
  2823. }
  2824.  
  2825. for( var i = 0; i < matches.length; i++ ) {
  2826. var key = matches[i].match( /([a-z0-9\-_]+)\[[^\]]+\]/ )[1],
  2827. val = matches[i].match( /[a-z0-9\-_]+\[([^\]]+)\]/ )[1].split(',');
  2828.  
  2829. switch( key ) {
  2830. case 'price' : {
  2831. if( typeof val[0] != 'undefined' && val[1] != 'undefined' ) {
  2832. if( self._validPrice( val[0], val[1] ) )
  2833. obj[key] = val;
  2834. }
  2835.  
  2836. break;
  2837. }
  2838. default : {
  2839. obj[key] = val;
  2840. }
  2841. }
  2842. }
  2843.  
  2844. return obj;
  2845. },
  2846.  
  2847. resetFilters: function(){
  2848. var self = this;
  2849.  
  2850. self._box.find('li[data-type]').each(function(){
  2851. var _this = jQuery(this),
  2852. type = _this.attr('data-type'),
  2853. baseType = _this.attr('data-base-type'),
  2854. defaultVal = null;
  2855.  
  2856. _this.find('.mfilter-input-active').removeClass('mfilter-input-active');
  2857.  
  2858. if( baseType == 'stock_status' && self._options.inStockDefaultSelected ) {
  2859. defaultVal = self._options.inStockStatus;
  2860. }
  2861.  
  2862. switch( type ) {
  2863. case 'image_radio' :
  2864. case 'image' : {
  2865. _this.find('input[type=checkbox]:checked,input[type=radio]:checked').prop('checked', false).parent().removeClass('mfilter-image-checked');
  2866.  
  2867. break;
  2868. }
  2869. case 'cat_checkbox' : {
  2870. _this.find('input[type=checkbox]:checked').prop('checked', false);
  2871. _this.find('.mfilter-counter').removeClass('mfilter-close');
  2872.  
  2873. break;
  2874. }
  2875. case 'tree' : {
  2876. _this.find('input[name=path]').val( typeof self._options.params.path == 'undefined' ? '' : self._options.params.path );
  2877.  
  2878. break;
  2879. }
  2880. case 'rating' :
  2881. case 'stock_status' :
  2882. case 'manufacturers' :
  2883. case 'checkbox' :
  2884. case 'image_list_checkbox' :
  2885. case 'image_list_radio' :
  2886. case 'radio' : {
  2887. _this.find('input[type=checkbox]:checked,input[type=radio]:checked').prop('checked', false);
  2888. _this.find('.mfilter-counter').removeClass('mfilter-close');
  2889.  
  2890. if( defaultVal !== null ) {
  2891. _this.find('input[value="' + defaultVal.replace( /"/g, '&quot;' ) + '"]').prop('checked', true)
  2892. .parent().parent().find('.mfilter-counter').addClass('mfilter-close');
  2893. }
  2894.  
  2895. break;
  2896. }
  2897. case 'search_oc' :
  2898. case 'search' : {
  2899. _this.find('input[id="mfilter-opts-search"]').val( '' );
  2900.  
  2901. break;
  2902. }
  2903. case 'text' : {
  2904. _this.find('input[type=text]').val( '' );
  2905.  
  2906. break;
  2907. }
  2908. case 'slider' : {
  2909.  
  2910.  
  2911. break;
  2912. }
  2913. case 'price' : {
  2914. _this.find('input[id="mfilter-opts-price-min"]').val( self._options.priceMin );
  2915. _this.find('input[id="mfilter-opts-price-max"]').val( self._options.priceMax );
  2916. _this.find('[id="mfilter-price-slider"]').each(function(){
  2917. jQuery(this).slider( 'option', 'min', self._options.priceMin );
  2918. jQuery(this).slider( 'option', 'max', self._options.priceMax );
  2919. jQuery(this).slider( 'option', 'values', [ self._options.priceMin, self._options.priceMax ] );
  2920. jQuery(this).slider( 'value', jQuery(this).slider('value') );
  2921. });
  2922.  
  2923. break;
  2924. }
  2925. case 'related' :
  2926. case 'select' : {
  2927. _this.find('select option').removeAttr('selected');
  2928.  
  2929. if( defaultVal !== null ) {
  2930. _this.find('select option').each(function(i){
  2931. if( jQuery(this).val() == defaultVal ) {
  2932. jQuery(this).attr('selected', true);
  2933. _this.find('select').prop('selectedIndex', i);
  2934.  
  2935. return false;
  2936. }
  2937. });
  2938. } else {
  2939. _this.find('select option:first').attr('selected', true);
  2940. _this.find('select').prop('selectedIndex', 0);
  2941. }
  2942.  
  2943. if( type == 'related' ) {
  2944. _this.find('select').each(function(i){
  2945. if( i ) {
  2946. if( _this.attr('data-auto-levels') ) {
  2947. jQuery(this).parent().remove();
  2948. } else {
  2949. jQuery(this).find('option[value!=""]').remove();
  2950. }
  2951. }
  2952. });
  2953. }
  2954.  
  2955. break;
  2956. }
  2957. }
  2958. });
  2959.  
  2960. for( var i = 0; i < self._sliders.length; i++ ) {
  2961. self._sliders[i].resetValues();
  2962. }
  2963. },
  2964.  
  2965. /**
  2966. * Pobierz aktualne wartości filtrów
  2967. *
  2968. * @return object
  2969. */
  2970. filters: function( alsoEmpty ) {
  2971. var self = this,
  2972. params = { },
  2973. stockStatusExist = self._box.find('li[data-base-type="stock_status"]').length ? true : false;
  2974.  
  2975. self._box.find('li[data-type]').each(function(){
  2976. var _this = jQuery(this),
  2977. type = _this.attr('data-type'),
  2978. seoName = _this.attr('data-seo-name');
  2979.  
  2980. if( alsoEmpty === true ) {
  2981. if( typeof params[seoName] == 'undefined' ) {
  2982. params[seoName] = [];
  2983. }
  2984. }
  2985.  
  2986. switch( type ) {
  2987. case 'cat_checkbox' :
  2988. case 'rating' :
  2989. case 'stock_status' :
  2990. case 'manufacturers' :
  2991. case 'image_list_checkbox' :
  2992. case 'image' :
  2993. case 'checkbox' : {
  2994. _this.find('input[type=checkbox]:checked').each(function(){
  2995. if( typeof params[seoName] == 'undefined' ) {
  2996. params[seoName] = [];
  2997.  
  2998. /*if( type == 'cat_checkbox' ) {
  2999. if( typeof self._options.params.mfp_org_path != 'undefined' ) {
  3000. params[seoName].push( self._options.params.mfp_org_path );
  3001. } else if( typeof self._options.params.path != 'undefined' ) {
  3002. params[seoName].push( self._options.params.path );
  3003. }
  3004. }*/
  3005. }
  3006.  
  3007. params[seoName].push( encodeURIComponent( self.encode( jQuery(this).val() ) ) );
  3008. });
  3009.  
  3010. break;
  3011. }
  3012. case 'image_radio' :
  3013. case 'image_list_radio' :
  3014. case 'radio' : {
  3015. _this.find('input[type=radio]:checked').each(function(){
  3016. params[seoName] = [ encodeURIComponent( self.encode( jQuery(this).val() ) ) ];
  3017. });
  3018.  
  3019. break;
  3020. }
  3021. case 'slider' : {
  3022. var slider_id = _this.attr('data-slider-id'),
  3023. slider_vals = self._sliders[slider_id].getValues();
  3024.  
  3025. if( slider_vals.length ) {
  3026. params[seoName] = slider_vals;
  3027. }
  3028.  
  3029. break;
  3030. }
  3031. case 'price' : {
  3032. var priceRange = self.getPriceRange();
  3033.  
  3034. if( priceRange.min != self._options.priceMin || priceRange.max != self._options.priceMax ) {
  3035. if( self._validPrice( priceRange.min, priceRange.max ) )
  3036. params[seoName] = [ priceRange.min, priceRange.max ];
  3037. }
  3038.  
  3039. break;
  3040. }
  3041. case 'search_oc' :
  3042. case 'search' : {
  3043. _this.find('input[id="mfilter-opts-search"]').each(function(){
  3044. if( jQuery(this).val() !== '' ) {
  3045. params[seoName] = [ encodeURIComponent( self.encode( jQuery(this).val() ) ) ];
  3046. }
  3047. });
  3048.  
  3049. break;
  3050. }
  3051. case 'text' : {
  3052. _this.find('input[type=text]').each(function(){
  3053. if( jQuery(this).val() != '' ) {
  3054. params[seoName] = [ encodeURIComponent( self.encode( jQuery(this).val() ) ) ];
  3055. }
  3056. });
  3057.  
  3058. break;
  3059. }
  3060. case 'select' : {
  3061. _this.find('select').each(function(){
  3062. if( jQuery(this).val() )
  3063. params[seoName] = [ encodeURIComponent( self.encode( jQuery(this).val() ) ) ];
  3064. });
  3065.  
  3066. break;
  3067. }
  3068. case 'related' : {
  3069. //if( _this.find('select:last').val() ) {
  3070. _this.find('select').each(function(){
  3071. var val = jQuery(this).val();
  3072.  
  3073. if( val ) {
  3074. if( typeof params[seoName] == 'undefined' )
  3075. params[seoName] = [];
  3076.  
  3077. params[seoName].push( val );
  3078. }
  3079. });
  3080. //}
  3081. }
  3082. case 'tree' : {
  3083. _this.find('input').each(function(){
  3084. var val = jQuery(this).val(),
  3085. path = typeof self._options.params.mfp_org_path == 'undefined' ? self._options.params.path : self._options.params.mfp_org_path;
  3086.  
  3087. if( val && val != path ) {
  3088. params['path'] = [ val ];
  3089. }
  3090. });
  3091.  
  3092. break;
  3093. }
  3094. }
  3095. });
  3096.  
  3097. // sprawdź czy domyślnie powinna być zaznaczona opcja "in stock"
  3098. if( self._options.inStockDefaultSelected && typeof params['stock_status'] == 'undefined' ) {
  3099. params['stock_status'] = stockStatusExist ? [] : [ self._options.inStockStatus ];
  3100. }
  3101.  
  3102. return params;
  3103. },
  3104.  
  3105. /**
  3106. * Utwórz URL na podstawie parametrów
  3107. */
  3108. filtersToUrl: function( params ) {
  3109. var self = this,
  3110. url = '';
  3111.  
  3112. if( typeof params == 'undefined' ) {
  3113. params = self.filters();
  3114.  
  3115. self.eachInstances(function( self ){
  3116. params = $.extend( self.filters(), params );
  3117. }, true);
  3118. }
  3119.  
  3120. for( var i in params ) {
  3121. url += url ? ',' : '';
  3122. url += '' + i + '[' + params[i].join(',') + ']';
  3123. }
  3124.  
  3125. return url;
  3126. },
  3127.  
  3128. /**
  3129. * Przekształć parametry na adres URL
  3130. *
  3131. * @return string
  3132. */
  3133. paramsToUrl: function( url, attribs ) {
  3134. var self = this,
  3135. params = typeof url == 'undefined' ? self._params : self._parseUrl( url, attribs ),
  3136. urlSep = typeof url == 'undefined' ? self._urlSep : self._parseSep( url ).urlSep;
  3137.  
  3138. return self._paramsToUrl( params, {
  3139. 'skip' : [ 'mfilter-ajax', 'mfp', 'page' ],
  3140. 'sep' : urlSep.n,
  3141. 'sep2' : urlSep.n == '&' ? '=' : urlSep.n,
  3142. 'fn' : function( i ) {
  3143. return typeof url == 'undefined' && typeof self._inUrl[i] == 'undefined';
  3144. }
  3145. });
  3146. },
  3147.  
  3148. _paramsToUrl: function( params, o ) {
  3149. var url = '';
  3150.  
  3151. o = jQuery.extend({
  3152. 'skip' : [],
  3153. 'sep' : '&',
  3154. 'sep2' : '=',
  3155. 'fn' : function(){}
  3156. }, typeof o == 'object' ? o : {});
  3157.  
  3158. for( var i in params ) {
  3159. if( o.skip.indexOf( i ) > -1 ) continue;
  3160.  
  3161. if( o.fn( i, params[i] ) ) continue;
  3162.  
  3163. url += url ? o.sep : '';
  3164. url += i + o.sep2 + params[i];
  3165. }
  3166.  
  3167. return url;
  3168. },
  3169.  
  3170. /**
  3171. * @param url string
  3172. * @param attribs object
  3173. * @return object
  3174. */
  3175. _parseUrl: function( url, attribs ) {
  3176. if( typeof attribs != 'object' )
  3177. attribs = {
  3178. 'mfilter-ajax' : '1'
  3179. };
  3180.  
  3181. if( typeof url == 'undefined' )
  3182. return attribs;
  3183.  
  3184. var self = this,
  3185. params, i, name, value, param,
  3186. mfp;
  3187.  
  3188. url = url.split('#')[0];
  3189. mfp = url.match( /\/mfp,([a-z0-9\-_]+\[[^\]]*\],?)+/g );
  3190.  
  3191. if( mfp ) {
  3192. attribs['mfp'] = mfp[0].replace( /^\/mfp,/, '' );
  3193. }
  3194.  
  3195. if( url.indexOf( '?' ) > -1 || url.indexOf( '&' ) > -1 ) {
  3196. params = typeof self.parse_url( url ).query != 'undefined' ? self.parse_url( url ).query.split('&') : url.split('&');
  3197.  
  3198. for( i = 0; i < params.length; i++ ) {
  3199. if( params[i].indexOf( '=' ) < 0 ) continue;
  3200.  
  3201. param = params[i].split('=');
  3202. name = param[0];
  3203. value = param[1];
  3204.  
  3205. if( ! name ) continue;
  3206.  
  3207. attribs[name] = value;
  3208. }
  3209. } else {
  3210. params = url.split( ';' );
  3211. name = null;
  3212.  
  3213. for( i = 1; i < params.length; i++ ) {
  3214. if( name === null )
  3215. name = params[i];
  3216. else {
  3217. attribs[name] = params[i];
  3218. name = null;
  3219. }
  3220. }
  3221. }
  3222.  
  3223. return attribs;
  3224. },
  3225.  
  3226. /**
  3227. * Przeładuj stronę
  3228. */
  3229. reload: function() {
  3230. var self = this;
  3231.  
  3232. window.location.href = self.createUrl();
  3233. }
  3234. };
  3235. var MegaFilterLang = {};
  3236.  
  3237. function display_MFP(view) {
  3238. // Product List
  3239. jQuery('#list-view').click(function() {
  3240. jQuery('#content .product-layout > .clearfix').remove();
  3241.  
  3242. jQuery('#content .product-layout').attr('class', 'product-layout product-list col-xs-12');
  3243.  
  3244. localStorage.setItem('display', 'list');
  3245. });
  3246.  
  3247. // Product Grid
  3248. jQuery('#grid-view').click(function() {
  3249. jQuery('#content .product-layout > .clearfix').remove();
  3250.  
  3251. // What a shame bootstrap does not take into account dynamically loaded columns
  3252. cols = jQuery('#column-right, #column-left').length;
  3253.  
  3254. if (cols == 2) {
  3255. jQuery('#content .product-layout').attr('class', 'product-layout product-grid col-lg-6 col-md-6 col-sm-12 col-xs-12');
  3256.  
  3257. jQuery('#content .product-layout:nth-child(2)').after('<div class="clearfix visible-md visible-sm"></div>');
  3258. } else if (cols == 1) {
  3259. jQuery('#content .product-layout').attr('class', 'product-layout product-grid col-lg-4 col-md-4 col-sm-6 col-xs-12');
  3260.  
  3261. jQuery('#content .product-layout:nth-child(3)').after('<div class="clearfix visible-lg"></div>');
  3262. } else {
  3263. jQuery('#content .product-layout').attr('class', 'product-layout product-grid col-lg-3 col-md-3 col-sm-6 col-xs-12');
  3264.  
  3265. jQuery('#content .product-layout:nth-child(4)').after('<div class="clearfix"></div>');
  3266. }
  3267.  
  3268. localStorage.setItem('display', 'grid');
  3269. });
  3270.  
  3271. if (localStorage.getItem('display') == 'list') {
  3272. jQuery('#list-view').trigger('click');
  3273. } else {
  3274. jQuery('#grid-view').trigger('click');
  3275. }
  3276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement