Diff
checker
文本
文本
图像
文档
Excel
文件夹
Legal
Enterprise
桌面版
定价
登录
下载 Diffchecker 桌面版
比较文本
查找两个文本文件之间的差异
工具
历史
实时编辑器
隐藏空白更改
折叠未更改行
关闭换行
视图
拆分
统一
比对精度
智能
单词
字符
文本样式
更改外观
语法高亮
选择语法
忽略
文本转换
转到第一个差异
编辑输入
Diffchecker Desktop
运行Diffchecker最安全的方式。获取Diffchecker桌面应用:您的差异永远不会离开您的电脑!
获取桌面版
Untitled diff
创建于
9年前
差异永不过期
清除
导出
分享
解释
3 删除
行
总计
删除
字符
总计
删除
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
984 行
全部复制
4 添加
行
总计
添加
字符
总计
添加
要继续使用此功能,请升级到
Diff
checker
Pro
查看价格
984 行
全部复制
/**
/**
* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
* JA Megafilter Component
* JA Megafilter Component
* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
* Copyright (C) 2004-2016 J.O.O.M Solutions Co., Ltd. All Rights Reserved.
* Copyright (C) 2004-2016 J.O.O.M Solutions Co., Ltd. All Rights Reserved.
* @license - GNU/GPL, http://www.gnu.org/licenses/gpl.html
* @license - GNU/GPL, http://www.gnu.org/licenses/gpl.html
* Author: J.O.O.M Solutions Co., Ltd
* Author: J.O.O.M Solutions Co., Ltd
* Websites: http://www.joomlart.com - http://www.joomlancers.com
* Websites: http://www.joomlart.com - http://www.joomlancers.com
* This file may not be redistributed in whole or significant part.
* This file may not be redistributed in whole or significant part.
* ------------------------------------------------------------------------
* ------------------------------------------------------------------------
*/
*/
var LNBase = Class.extend(function(){
var LNBase = Class.extend(function(){
// private variable
// private variable
var self = this,
var self = this,
$ = jQuery;
$ = jQuery;
self.type = 'LNBase';
self.type = 'LNBase';
self.options = null;
self.options = null;
self.defaultOptions = {
self.defaultOptions = {
rerenderWhenUpdate: false
rerenderWhenUpdate: false
};
};
self.state = {
self.state = {
};
};
self.items = {};
self.items = {};
self.$item = null;
self.$item = null;
self.data = {};
self.data = {};
self.ids = [];
self.ids = [];
self.matchedIds = [];
self.matchedIds = [];
self.shownIds = [];
self.shownIds = [];
self.showingIds = [];
self.showingIds = [];
self.startIdx = 1;
self.startIdx = 1;
self.endIdx = 0;
self.endIdx = 0;
self.page = 1;
self.page = 1;
self.itemPerPage = 12;
self.itemPerPage = 12;
self.rendered = false;
self.rendered = false;
self.sortField = 'position';
self.sortField = 'position';
self.sortDir = 'desc';
self.sortDir = 'desc';
self.qs = {};
self.qs = {};
self.timeout = [];
self.timeout = [];
self.constructor = function (options) {
self.constructor = function (options) {
self.options = $.extend({}, self.defaultOptions, options);
self.options = $.extend({}, self.defaultOptions, options);
}
}
self.render = function (callback) {
self.render = function (callback) {
self.beforeRender();
self.beforeRender();
var e = $.Event('beforeRender');
var e = $.Event('beforeRender');
e.lntype = self.type;
e.lntype = self.type;
e.lntarget = self;
e.lntarget = self;
$(document).trigger(e);
$(document).trigger(e);
dust.render(self.options.template, self, function(err, out) {
dust.render(self.options.template, self, function(err, out) {
var $el = $(out);
var $el = $(out);
if ($el.length != 1) $el = $('<div>').html(out);
if ($el.length != 1) $el = $('<div>').html(out);
$el.addClass('ln-element').addClass(self.options.class).data('lnid', self.getId());
$el.addClass('ln-element').addClass(self.options.class).data('lnid', self.getId());
if (self.$item) {
if (self.$item) {
self.$item.remove();
self.$item.remove();
self.$item = null;
self.$item = null;
}
}
if (callback) {
if (callback) {
self.$item = callback($el);
self.$item = callback($el);
} else {
} else {
self.$item = $el.appendTo($(self.options.container).empty());
self.$item = $el.appendTo($(self.options.container).empty());
}
}
if (self.options.itemWrapper) {
if (self.options.itemWrapper) {
self.$wrapper = self.$item.is(self.options.itemWrapper) ? self.$item : self.$item.find(self.options.itemWrapper);
self.$wrapper = self.$item.is(self.options.itemWrapper) ? self.$item : self.$item.find(self.options.itemWrapper);
}
}
// find state fields
// find state fields
self.$stateFields = self.$item.find('[data-lnstate]');
self.$stateFields = self.$item.find('[data-lnstate]');
self.renderItems();
self.renderItems();
// Render state value
// Render state value
self.renderStateFields ();
self.renderStateFields ();
self.afterRender();
self.afterRender();
self.rendered = true;
self.rendered = true;
var e = $.Event('afterRender');
var e = $.Event('afterRender');
e.lntype = self.type;
e.lntype = self.type;
e.lntarget = self;
e.lntarget = self;
self.$item.trigger(e);
self.$item.trigger(e);
});
});
var e = $.Event('completeRender');
var e = $.Event('completeRender');
e.lntype = self.type;
e.lntype = self.type;
e.lntarget = self;
e.lntarget = self;
self.$item.trigger(e);
self.$item.trigger(e);
}
}
self.renderStateFields = function () {
self.renderStateFields = function () {
if (self.$stateFields.length) {
if (self.$stateFields.length) {
self.$stateFields.each(function () {
self.$stateFields.each(function () {
var $field = $(this),
var $field = $(this),
field = $field.data('lnstate'),
field = $field.data('lnstate'),
value = self.getField (field);
value = self.getField (field);
$field.html(value);
$field.html(value);
})
})
}
}
}
}
self.beforeRender = function () {
self.beforeRender = function () {
if (self.options.beforeRender) self.options.beforeRender.apply(self);
if (self.options.beforeRender) self.options.beforeRender.apply(self);
}
}
self.afterRender = function () {
self.afterRender = function () {
if (self.options.afterRender) self.options.afterRender.apply(self);
if (self.options.afterRender) self.options.afterRender.apply(self);
}
}
self.beforeUpdateRender = function () {
self.beforeUpdateRender = function () {
if (self.options.beforeUpdateRender) self.options.beforeUpdateRender.apply(self);
if (self.options.beforeUpdateRender) self.options.beforeUpdateRender.apply(self);
}
}
self.afterUpdateRender = function () {
self.afterUpdateRender = function () {
if (self.options.afterUpdateRender) self.options.afterUpdateRender.apply(self);
if (self.options.afterUpdateRender) self.options.afterUpdateRender.apply(self);
}
}
self.beforeRenderItems = function () {
self.beforeRenderItems = function () {
if (self.options.beforeRenderItems) self.options.beforeRenderItems.apply(self);
if (self.options.beforeRenderItems) self.options.beforeRenderItems.apply(self);
if (!Object.keys(self.items).length) return;
if (!Object.keys(self.items).length) return;
if (self.options.showAllItems) {
if (self.options.showAllItems) {
self.matchedIds = Object.keys(self.items);
self.matchedIds = Object.keys(self.items);
self.endIdx = self.matchedIds.length;
self.endIdx = self.matchedIds.length;
self.startIdx = 1;
self.startIdx = 1;
} else {
} else {
self.endIdx = self.startIdx + self.itemPerPage - 1;
self.endIdx = self.startIdx + self.itemPerPage - 1;
if (self.endIdx > self.matchedIds.length) self.endIdx = self.matchedIds.length;
if (self.endIdx > self.matchedIds.length) self.endIdx = self.matchedIds.length;
}
}
if (!self.matchedIds || !self.matchedIds.length) return false;
if (!self.matchedIds || !self.matchedIds.length) return false;
self.showingIds = self.matchedIds.slice(self.startIdx - 1, self.endIdx);
self.showingIds = self.matchedIds.slice(self.startIdx - 1, self.endIdx);
return true;
return true;
}
}
self.afterRenderItems = function () {
self.afterRenderItems = function () {
if (self.options.afterRenderItems) self.options.afterRenderItems.apply(self);
if (self.options.afterRenderItems) self.options.afterRenderItems.apply(self);
}
}
self.renderItems = function () {
self.renderItems = function () {
// render children item
// render children item
if (self.beforeRenderItems()) {
if (self.beforeRenderItems()) {
var oldIds = [];
var oldIds = [];
for(var i=0; i<self.shownIds.length; i++) {
for(var i=0; i<self.shownIds.length; i++) {
// remove old item on page
// remove old item on page
var id = self.shownIds[i];
var id = self.shownIds[i];
if ($.inArray(id, self.showingIds) == -1) {
if ($.inArray(id, self.showingIds) == -1) {
// remove html item
// remove html item
self.getItem(id).$item.remove();
self.getItem(id).$item.remove();
} else {
} else {
oldIds.push(id);
oldIds.push(id);
}
}
}
}
// Render for new item
// Render for new item
self.$currentItem = null;
self.$currentItem = null;
for(var i=0; i<self.showingIds.length; i++) {
for(var i=0; i<self.showingIds.length; i++) {
var id = self.showingIds[i];
var id = self.showingIds[i];
if ($.inArray(id, oldIds) == -1) {
if ($.inArray(id, oldIds) == -1) {
// render new one
// render new one
self.renderItem(id);
self.renderItem(id);
} else {
} else {
var item = self.getItem (id);
var item = self.getItem (id);
item.updateRender();
item.updateRender();
if (self.$currentItem) item.$item.insertAfter(self.$currentItem);
if (self.$currentItem) item.$item.insertAfter(self.$currentItem);
self.$currentItem = item.$item;
self.$currentItem = item.$item;
}
}
}
}
// update shownIds
// update shownIds
self.shownIds = self.showingIds.slice();
self.shownIds = self.showingIds.slice();
} else {
} else {
if (self.$wrapper) self.$wrapper.empty();
if (self.$wrapper) self.$wrapper.empty();
self.shownIds = []
self.shownIds = []
}
}
self.afterRenderItems();
self.afterRenderItems();
}
}
self.renderItem = function (id) {
self.renderItem = function (id) {
var item = self.getItem(id);
var item = self.getItem(id);
item.render(function($item){
item.render(function($item){
$item.addClass(self.options.itemClass);
$item.addClass(self.options.itemClass);
if (self.$currentItem) $item.insertAfter(self.$currentItem);
if (self.$currentItem) $item.insertAfter(self.$currentItem);
else $item.appendTo(self.$wrapper);
else $item.appendTo(self.$wrapper);
self.$currentItem = $item;
self.$currentItem = $item;
return $item;
return $item;
});
});
}
}
self.updateRender = function () {
self.updateRender = function () {
self.delayCall('_updateRender', 100);
self.delayCall('_updateRender', 100);
}
}
self._updateRender = function () {
self._updateRender = function () {
var e = $.Event('beforeUpdateRender');
var e = $.Event('beforeUpdateRender');
e.lntype = self.type;
e.lntype = self.type;
e.lntarget = self;
e.lntarget = self;
self.$item.trigger(e);
self.$item.trigger(e);
if (self.options.rerenderWhenUpdate) {
if (self.options.rerenderWhenUpdate) {
self.render();
self.render();
} else {
} else {
self.beforeUpdateRender();
self.beforeUpdateRender();
self.renderItems();
self.renderItems();
self.renderStateFields ();
self.renderStateFields ();
self.afterUpdateRender();
self.afterUpdateRender();
}
}
if (self.type === 'LNBase' && self.options.autopage) {
if (self.type === 'LNBase' && self.options.autopage) {
self.autoPage();
self.autoPage();
}
}
var e = $.Event('afterUpdateRender');
var e = $.Event('afterUpdateRender');
e.lntype = self.type;
e.lntype = self.type;
e.lntarget = self;
e.lntarget = self;
self.$item.trigger(e);
self.$item.trigger(e);
}
}
self.addItem = function (child, id) {
self.addItem = function (child, id) {
if (!id) id = child.data[id];
if (!id) id = child.data[id];
child.lnid = id.slugify();
child.lnid = id.slugify();
child.parent = self;
child.parent = self;
self.items[child.lnid] = child;
self.items[child.lnid] = child;
}
}
self.getData = function () {
self.getData = function () {
return self.data;
return self.data;
}
}
self.setData = function (data) {
self.setData = function (data) {
self.data = data;
self.data = data;
}
}
self.getField = function (field) {
self.getField = function (field) {
if (self[field] !== undefined) return self[field];
if (self[field] !== undefined) return self[field];
if (self.data[field] !== undefined) return self.data[field];
if (self.data[field] !== undefined) return self.data[field];
// check if path field, eg: stats.HP
// check if path field, eg: stats.HP
var fields = field.split('.'),
var fields = field.split('.'),
v = self.data,
v = self.data,
i=0;
i=0;
while(v && i<fields.length) {
while(v && i<fields.length) {
v = v[fields[i++]];
v = v[fields[i++]];
}
}
return v === undefined ? '' : v;
return v === undefined ? '' : v;
}
}
self.getTemplate = function () {
self.getTemplate = function () {
return self.options.template;
return self.options.template;
}
}
self.getItem = function (id) {
self.getItem = function (id) {
return self.items[id.slugify()];
return self.items[id.slugify()];
}
}
self.getId = function () {
self.getId = function () {
return self.lnid;
return self.lnid;
}
}
self.is = function (check) {
self.is = function (check) {
if (typeof check == 'string') {
if (typeof check == 'string') {
return check === self.type;
return check === self.type;
}
}
if (check instanceof LNBase) {
if (check instanceof LNBase) {
return (check.is(self.type) && check.getId() == self.getId());
return (check.is(self.type) && check.getId() == self.getId());
}
}
return false;
return false;
}
}
// pages
// pages
self.setPage = function (p) {
self.setPage = function (p) {
if (!p) return;
if (!p) return;
self.setQS('page', p);
self.setQS('page', p);
self.page = p;
self.page = p;
self.startIdx = (p-1) * self.itemPerPage + 1;
self.startIdx = (p-1) * self.itemPerPage + 1;
// if (self.startIdx >= self.matchedIds.length) {
// if (self.startIdx >= self.matchedIds.length) {
// // reset to first page
// // reset to first page
// self.startIdx = 1;
// self.startIdx = 1;
// self.page = 1;
// self.page = 1;
// }
// }
return self;
return self;
}
}
// sticky
// sticky
self.sticky = function () {
self.sticky = function () {
if(!isMobile.any ) {
if(!isMobile.any ) {
$(self.options.container).parent().stick_in_parent().trigger('sticky_kit:recalc');
$(self.options.container).parent().stick_in_parent().trigger('sticky_kit:recalc');
}
}
}
}
// auto page
// auto page
self.autoPage = function () {
self.autoPage = function () {
var itemWrapper = $(self.options.itemWrapper),
var itemWrapper = $(self.options.itemWrapper),
div = $('<div>', {id:'autopage','page-data': 1, 'style':'clear:both'}),
div = $('<div>', {id:'autopage','page-data': 1, 'style':'clear:both'}),
reachEnd = 0;
reachEnd = 0;
if ($('#autopage').length) {
if ($('#autopage').length) {
$('#autopage').remove();
$('#autopage').remove();
itemWrapper.append(div);
itemWrapper.append(div);
}
}
else {
else {
itemWrapper.append(div);
itemWrapper.append(div);
}
}
self.startIdx = 1;
self.startIdx = 1;
self.endIdx = self.matchedIds.length;
self.endIdx = self.matchedIds.length;
$(window).on('scroll.page',function () {
$(window).on('scroll.page',function () {
var wheight = $(window).outerHeight(),
var wheight = $(window).outerHeight(),
target = $('#autopage').offset().top,
target = $('#autopage').offset().top,
numpage = parseInt($('#autopage').attr('page-data')),
numpage = parseInt($('#autopage').attr('page-data')),
start = numpage * self.itemPerPage + 1,
start = numpage * self.itemPerPage + 1,
end = start + self.itemPerPage - 1;
end = start + self.itemPerPage - 1;
if (end > self.endIdx )
if (end > self.endIdx )
end = self.endIdx;
end = self.endIdx;
if( ($(window).scrollTop() + wheight + 400) >= target ) {
if( ($(window).scrollTop() + wheight + 400) >= target ) {
self.showingIds = self.matchedIds.slice(start - 1, end)
self.showingIds = self.matchedIds.slice(start - 1, end)
for(var i=0; i<self.showingIds.length; i++) {
for(var i=0; i<self.showingIds.length; i++) {
var id = self.showingIds[i];
var id = self.showingIds[i];
self.renderItem(id);
self.renderItem(id);
self.shownIds.push(id);
self.shownIds.push(id);
}
}
if (end === self.endIdx) {
if (end === self.endIdx) {
$(window).off('scroll.page')
$(window).off('scroll.page')
} else {
} else {
numpage = numpage + 1;
numpage = numpage + 1;
$('#autopage').attr('page-data', numpage );
$('#autopage').attr('page-data', numpage );
}
}
// for afterAutoPage() callback
// for afterAutoPage() callback
var e = $.Event('afterAutoPage');
var e = $.Event('afterAutoPage');
e.lntype = self.type;
e.lntype = self.type;
e.lntarget = self;
e.lntarget = self;
self.$item.trigger(e);
self.$item.trigger(e);
}
}
});
});
}
}
// pages
// pages
self.setLimiter = function (limiter) {
self.setLimiter = function (limiter) {
self.setQS('limiter', limiter);
self.setQS('limiter', limiter);
self.itemPerPage = parseInt(limiter);
self.itemPerPage = parseInt(limiter);
self.startIdx = (self.page-1) * self.itemPerPage + 1;
self.startIdx = (self.page-1) * self.itemPerPage + 1;
if (self.startIdx >= self.matchedIds.length) {
if (self.startIdx >= self.matchedIds.length) {
// reset to first page
// reset to first page
self.startIdx = 1;
self.startIdx = 1;
self.page = 1;
self.page = 1;
}
}
return self;
return self;
}
}
// sort
// sort
self.sort = function (field, dir) {
self.sort = function (field, dir) {
if (field !== undefined) {
if (field !== undefined) {
self.setQS('sort', field);
self.setQS('sort', field);
self.sortField = field;
self.sortField = field;
}
}
if (dir == 'asc' || dir == 'desc') {
if (dir == 'asc' || dir == 'desc') {
self.setQS('sortdir', dir);
self.setQS('sortdir', dir);
self.sortDir = dir;
self.sortDir = dir;
}
}
var d = self.sortDir == 'desc' ? -1 : 1;
var d = self.sortDir == 'desc' ? -1 : 1;
if (!self.ids.length || (self.sortField == 'position' && d == -1))
if (!self.ids.length || (self.sortField == 'position' && d == -1))
self.ids = Object.keys(self.items);
self.ids = Object.keys(self.items);
// do sort
// do sort
if (self.sortField != 'position') {
if (self.sortField != 'position') {
self.ids.sort(function (a, b) {
self.ids.sort(function (a, b) {
var v1 = self.getItem(a).getField(self.sortField),
var v1 = self.getItem(a).getField(self.sortField),
v2 = self.getItem(b).getField(self.sortField);
v2 = self.getItem(b).getField(self.sortField);
// transfer array to string
// transfer array to string
if (Array.isArray(v1)) {
if (Array.isArray(v1)) {
v1.sort();
v1.sort();
v1 = v1.join(' ');
v1 = v1.join(' ');
}
}
if (Array.isArray(v2)) {
if (Array.isArray(v2)) {
v2.sort();
v2.sort();
v2 = v2.join(' ');
v2 = v2.join(' ');
}
}
if (v1 == v2) {
if (v1 == v2) {
var t1 = +self.getItem(a).getField('id'),
var t1 = +self.getItem(a).getField('id'),
t2 = +self.getItem(b).getField('id');
t2 = +self.getItem(b).getField('id');
return t1 > t2 ? d : -d;
return t1 > t2 ? d : -d;
}
}
if ( !isNaN(v1) && !isNaN(v2) ) {
if ( !isNaN(v1) && !isNaN(v2) ) {
v1 = +v1;
v1 = +v1;
v2 = +v2;
v2 = +v2;
复制
已复制
复制
已复制
return v1 > v2 ? d : -d;
} else if( v1 && v2 ) {
} else if( v1 && v2 ) {
v1 = v1.split('');
v1 = v1.split('');
v2 = v2.split('');
v2 = v2.split('');
var min = Math.min(v1.length, v2.length);
var min = Math.min(v1.length, v2.length);
for (var i = 0; i < min; i++) {
for (var i = 0; i < min; i++) {
if (v1[i] != v2[i]) {
if (v1[i] != v2[i]) {
return v1[i].localeCompare(v2[i]) > 0 ? d : -d;
return v1[i].localeCompare(v2[i]) > 0 ? d : -d;
}
}
}
}
复制
已复制
复制
已复制
return v1 > v2 ? d : -d;
}
}
// let empty value always goes to bottom
// let empty value always goes to bottom
if (!v1) {
if (!v1) {
return d > 0 ? d : -d;
return d > 0 ? d : -d;
}
}
if (!v2) {
if (!v2) {
return d < 0 ? d : -d;
return d < 0 ? d : -d;
}
}
复制
已复制
复制
已复制
return v1 > v2 ? d : -d;
});
});
} else if (d == 1) {
} else if (d == 1) {
self.ids.reverse();
self.ids.reverse();
}
}
return self;
return self;
}
}
self.setMatchedItems = function (ids) {
self.setMatchedItems = function (ids) {
self.matchedIds = [];
self.matchedIds = [];
if (!self.ids.length) self.ids = Object.keys(self.items);
if (!self.ids.length) self.ids = Object.keys(self.items);
self.ids.forEach(function(id) {
self.ids.forEach(function(id) {
if (ids.indexOf(id) != -1) self.matchedIds.push(id);
if (ids.indexOf(id) != -1) self.matchedIds.push(id);
})
})
return self;
return self;
}
}
self.setQS = function (name, value) {
self.setQS = function (name, value) {
self.getQS().set(name, value);
self.getQS().set(name, value);
}
}
self.getQS = function () {
self.getQS = function () {
if ($.lnqs == undefined) {
if ($.lnqs == undefined) {
$.lnqs = new LNQueryString();
$.lnqs = new LNQueryString();
$.lnqs.load();
$.lnqs.load();
}
}
return $.lnqs;
return $.lnqs;
}
}
self.delayCall = function (func, timeOut) {
self.delayCall = function (func, timeOut) {
if (self.timeout[func]) clearTimeout(self.timeout[func]);
if (self.timeout[func]) clearTimeout(self.timeout[func]);
if (self[func]) {
if (self[func]) {
self.timeout[func] = setTimeout(function () {self[func]()}, timeOut);
self.timeout[func] = setTimeout(function () {self[func]()}, timeOut);
}
}
}
}
});
});
;
;
var LNFilter = LNBase.extend(function(){
var LNFilter = LNBase.extend(function(){
// private variable
// private variable
var self = this,
var self = this,
$ = jQuery,
$ = jQuery,
so = setOps;
so = setOps;
self.type = 'LNFilter';
self.type = 'LNFilter';
self.defaultOptions = {
self.defaultOptions = {
template: 'filter-list',
template: 'filter-list',
container: '.sidebar',
container: '.sidebar',
itemWrapper: '.filter-list',
itemWrapper: '.filter-list',
showAllItems: true
showAllItems: true
};
};
self.lnItems = null;
self.lnItems = null;
self.filterResult = null;
self.filterResult = null;
// is first load
// is first load
self.isFirstLoad = true;
self.isFirstLoad = true;
// store selected value
// store selected value
self.selectedFilters = {};
self.selectedFilters = {};
// page
// page
self.page = 1;
self.page = 1;
// Filter base on list data items
// Filter base on list data items
self.addItems = function (lnItems) {
self.addItems = function (lnItems) {
self.lnItems = lnItems;
self.lnItems = lnItems;
}
}
// Filter result
// Filter result
self.addFilterResult = function (filterResult) {
self.addFilterResult = function (filterResult) {
self.filterResult = filterResult;
self.filterResult = filterResult;
self.filterResult.setSelectedFilters (self.selectedFilters);
self.filterResult.setSelectedFilters (self.selectedFilters);
}
}
self.addFilterSingle = function (options) {
self.addFilterSingle = function (options) {
// template
// template
self.addItem (new LNFilterGroup($.extend(options, {
self.addItem (new LNFilterGroup($.extend(options, {
template: 'filter.radio',
template: 'filter.radio',
type: 'single'
type: 'single'
})), 'filter-' + options.field);
})), 'filter-' + options.field);
}
}
self.addFilterDropdown = function (options) {
self.addFilterDropdown = function (options) {
// template
// template
self.addItem (new LNFilterGroup($.extend(options, {
self.addItem (new LNFilterGroup($.extend(options, {
template: 'filter.dropdown',
template: 'filter.dropdown',
type: 'dropdown'
type: 'dropdown'
})), 'filter-' + options.field);
})), 'filter-' + options.field);
}
}
self.addFilterList = function (options) {
self.addFilterList = function (options) {
// template
// template
self.addItem (new LNFilterGroup($.extend(options, {
self.addItem (new LNFilterGroup($.extend(options, {
template: 'filter.list',
template: 'filter.list',
type: 'list'
type: 'list'
})), 'filter-' + options.field);
})), 'filter-' + options.field);
}
}
self.addFilterMultiple = function (options) {
self.addFilterMultiple = function (options) {
// template
// template
self.addItem (new LNFilterGroup($.extend(options, {
self.addItem (new LNFilterGroup($.extend(options, {
template: 'filter.multiple',
template: 'filter.multiple',
type: 'multiple'
type: 'multiple'
})), 'filter-' + options.field);
})), 'filter-' + options.field);
}
}
self.addFilterValue = function (options) {
self.addFilterValue = function (options) {
// template
// template
self.addItem (new LNFilterValue(options), 'filter-' + options.field);
self.addItem (new LNFilterValue(options), 'filter-' + options.field);
}
}
self.addFilterDate = function (options) {
self.addFilterDate = function (options) {
// template
// template
self.addItem (new LNFilterDate(options), 'filter-' + options.field);
self.addItem (new LNFilterDate(options), 'filter-' + options.field);
}
}
self.addFilterColor = function (options) {
self.addFilterColor = function (options) {
// template
// template
self.addItem (new LNFilterGroup($.extend(options, {
self.addItem (new LNFilterGroup($.extend(options, {
template: 'filter.color',
template: 'filter.color',
type: 'color'
type: 'color'
})), 'filter-' + options.field);
})), 'filter-' + options.field);
}
}
self.addFilterMedia = function (options) {
self.addFilterMedia = function (options) {
// template
// template
self.addItem (new LNFilterGroup($.extend(options, {
self.addItem (new LNFilterGroup($.extend(options, {
template: 'filter.media',
template: 'filter.media',
type: 'media'
type: 'media'
})), 'filter-' + options.field);
})), 'filter-' + options.field);
}
}
self.addFilterRange = function (options) {
self.addFilterRange = function (options) {
// find max value
// find max value
if (!options.max) {
if (!options.max) {
var field = options.field,
var field = options.field,
vals = [];
vals = [];
for (var id in self.lnItems.items) {
for (var id in self.lnItems.items) {
var v = self.lnItems.getItem(id).getField(field);
var v = self.lnItems.getItem(id).getField(field);
if (Array.isArray(v)) {
if (Array.isArray(v)) {
for (var i = 0; i < v.length; i++) {
for (var i = 0; i < v.length; i++) {
vals.push(+self.cleanRangeValue(v[i]));
vals.push(+self.cleanRangeValue(v[i]));
}
}
} else {
} else {
vals.push (+self.cleanRangeValue(v));
vals.push (+self.cleanRangeValue(v));
}
}
}
}
options.min = Math.min.apply(Math, vals);
options.min = Math.min.apply(Math, vals);
options.max = Math.max.apply(Math, vals);
options.max = Math.max.apply(Math, vals);
// change max min value to float to int.
// change max min value to float to int.
if (!!(options.max % 1)) options.max = Math.ceil(options.max);
if (!!(options.max % 1)) options.max = Math.ceil(options.max);
if (!!(options.min % 1)) options.min = Math.floor(options.min);
if (!!(options.min % 1)) options.min = Math.floor(options.min);
}
}
// template
// template
self.addItem (new LNFilterRange(options), 'filter-' + options.field);
self.addItem (new LNFilterRange(options), 'filter-' + options.field);
}
}
self.cleanRangeValue = function (value) {
self.cleanRangeValue = function (value) {
if(isNaN(value)) {
if(isNaN(value)) {
var arr = [], pieces = value.split('');
var arr = [], pieces = value.split('');
for (var i = 0; i < pieces.length; i++) {
for (var i = 0; i < pieces.length; i++) {
pieces[i] = pieces[i].replace(',', '.');
pieces[i] = pieces[i].replace(',', '.');
if (pieces[i] == ' ') {
if (pieces[i] == ' ') {
continue;
continue;
}
}
if (pieces[i] === '.' || !isNaN(pieces[i])) {
if (pieces[i] === '.' || !isNaN(pieces[i])) {
arr.push(pieces[i]);
arr.push(pieces[i]);
}
}
}
}
value = arr.join('');
value = arr.join('');
return isNaN(value) ? 0 : value;
return isNaN(value) ? 0 : value;
}
}
return value;
return value;
}
}
// update value for filter type Single & Multiple
// update value for filter type Single & Multiple
self.updateFilter = function () {
self.updateFilter = function () {
for (var gid in self.items) {
for (var gid in self.items) {
var fgroup = self.getItem(gid),
var fgroup = self.getItem(gid),
field = fgroup.options.field,
field = fgroup.options.field,
type = fgroup.options.type,
type = fgroup.options.type,
frontend_value;
frontend_value;
if (fgroup.options.frontend_field)
if (fgroup.options.frontend_field)
frontend_value=fgroup.options.frontend_field;
frontend_value=fgroup.options.frontend_field;
else
else
frontend_value=fgroup.options.field;
frontend_value=fgroup.options.field;
// show all child
// show all child
fgroup.options.showAllItems = true;
fgroup.options.showAllItems = true;
fgroup.options.itemWrapper = '.filter-items';
fgroup.options.itemWrapper = '.filter-items';
// fetch child value from filter data
// fetch child value from filter data
if (fgroup.is('LNFilterGroup')) {
if (fgroup.is('LNFilterGroup')) {
// fetch field values into array
// fetch field values into array
for (var id in self.lnItems.items) {
for (var id in self.lnItems.items) {
var item = self.lnItems.getItem(id),
var item = self.lnItems.getItem(id),
val = item.getField(field),
val = item.getField(field),
frontend_val = item.getField(frontend_value);
frontend_val = item.getField(frontend_value);
if (val === undefined) continue;
if (val === undefined) continue;
if ($.isArray(val)) {
if ($.isArray(val)) {
for (var i=0; i<val.length; i++) {
for (var i=0; i<val.length; i++) {
var v = val[i],
var v = val[i],
key = field + '-' + v,
key = field + '-' + v,
fitem = fgroup.getItem(key);
fitem = fgroup.getItem(key);
if (!v || v == 'N/A') continue;
if (!v || v == 'N/A') continue;
if (!fitem) {
if (!fitem) {
fitem = new LNFilterItem({
fitem = new LNFilterItem({
template: fgroup.getTemplate() + '-item',
template: fgroup.getTemplate() + '-item',
name: field,
name: field,
frontend_value: frontend_val[i],
frontend_value: frontend_val[i],
value: v
value: v
});
});
fitem.mids = [];
fitem.mids = [];
fgroup.addItem(fitem, key);
fgroup.addItem(fitem, key);
}
}
fitem.mids.push(id);
fitem.mids.push(id);
}
}
} else {
} else {
var v = val,
var v = val,
key = field + '-' + v,
key = field + '-' + v,
fitem = fgroup.getItem(key);
fitem = fgroup.getItem(key);
if (!v || v == 'N/A') continue;
if (!v || v == 'N/A') continue;
if (!fitem) {
if (!fitem) {
fitem = new LNFilterItem({
fitem = new LNFilterItem({
template: fgroup.getTemplate() + '-item',
template: fgroup.getTemplate() + '-item',
name: field,
name: field,
value: v
value: v
});
});
fitem.mids = [];
fitem.mids = [];
fgroup.addItem(fitem, key);
fgroup.addItem(fitem, key);
}
}
fitem.mids.push(id);
fitem.mids.push(id);
}
}
}
}
// sort child items
// sort child items
var keys = Object.keys(fgroup.items);
var keys = Object.keys(fgroup.items);
// unset this fgroup if less than 1 values
// unset this fgroup if less than 1 values
if (keys.length < 1) {
if (keys.length < 1) {
delete self.items[gid];
delete self.items[gid];
} else {
} else {
var order = (fgroup.options.order.toUpperCase() == 'DESC') ? -1 : 1;
var order = (fgroup.options.order.toUpperCase() == 'DESC') ? -1 : 1;
keys.sort(function (a, b) {
keys.sort(function (a, b) {
return fgroup.getItem(a).options.frontend_value.localeCompare(fgroup.getItem(b).options.frontend_value) * order;
return fgroup.getItem(a).options.frontend_value.localeCompare(fgroup.getItem(b).options.frontend_value) * order;
});
});
var _items = {};
var _items = {};
keys.forEach(function (id) {
keys.forEach(function (id) {
_items[id] = fgroup.getItem(id);
_items[id] = fgroup.getItem(id);
});
});
fgroup.items = _items;
fgroup.items = _items;
}
}
}
}
}
}
return self;
return self;
}
}
self.afterRender = function () {
self.afterRender = function () {
// tracking change on filter
// tracking change on filter
self.$item.on('change', function (e) {
self.$item.on('change', function (e) {
if (self.options.sticky) {
if (self.options.sticky) {
self.sticky();
self.sticky();
}
}
// update filter selected
// update filter selected
var $value = $(e.target),
var $value = $(e.target),
$fgroup = $value.closest('.filter-field'),
$fgroup = $value.closest('.filter-field'),
fgroup = self.getItem($fgroup.data('lnid')),
fgroup = self.getItem($fgroup.data('lnid')),
field = fgroup.options.field,
field = fgroup.options.field,
type = fgroup.options.type;
type = fgroup.options.type;
if ($value.is('select')) {
if ($value.is('select')) {
// find element item
// find element item
var val = $value.val(),
var val = $value.val(),
key = field + '-' + val,
key = field + '-' + val,
fitem = fgroup.getItem(key);
fitem = fgroup.getItem(key);
// update to selected list
// update to selected list
if (val) {
if (val) {
self.selectedFilters[field] = fitem;
self.selectedFilters[field] = fitem;
} else {
} else {
delete self.selectedFilters[field];
delete self.selectedFilters[field];
}
}
} else {
} else {
if (fgroup.is('LNFilterValue')) {
if (fgroup.is('LNFilterValue')) {
fgroup.value = $value.val();
fgroup.value = $value.val();
if (fgroup.value) {
if (fgroup.value) {
self.selectedFilters[field] = fgroup;
self.selectedFilters[field] = fgroup;
} else {
} else {
delete self.selectedFilters[field];
delete self.selectedFilters[field];
}
}
}
}
if (fgroup.is('LNFilterGroup') && (type == 'multiple' || type == 'color' || type == 'media')) {
if (fgroup.is('LNFilterGroup') && (type == 'multiple' || type == 'color' || type == 'media')) {
var $fitem = $value.closest('.ln-element'),
var $fitem = $value.closest('.ln-element'),
fitem = fgroup.getItem($fitem.data('lnid')),
fitem = fgroup.getItem($fitem.data('lnid')),
key = $fitem.data('lnid');//field + '-' + fitem.options.value;
key = $fitem.data('lnid');//field + '-' + fitem.options.value;
// toggle
// toggle
if ($value.prop('checked')) {
if ($value.prop('checked')) {
self.selectedFilters[key] = fitem;
self.selectedFilters[key] = fitem;
} else {
} else {
delete self.selectedFilters[key];
delete self.selectedFilters[key];
}
}
}
}
if (fgroup.is('LNFilterGroup') && type == 'single') {
if (fgroup.is('LNFilterGroup') && type == 'single') {
var $fitem = $value.closest('.ln-element'),
var $fitem = $value.closest('.ln-element'),
fitem = fgroup.getItem($fitem.data('lnid'));
fitem = fgroup.getItem($fitem.data('lnid'));
if (fitem) {
if (fitem) {
self.selectedFilters[field] = fitem;
self.selectedFilters[field] = fitem;
} else {
} else {
delete self.selectedFilters[field];
delete self.selectedFilters[field];
}
}
}
}
if (fgroup.is('LNFilterRange')) {
if (fgroup.is('LNFilterRange')) {
fgroup.value = $value.val();
fgroup.value = $value.val();
fgroup.value[0] = parseInt(fgroup.value[0]); // to Int
fgroup.value[0] = parseInt(fgroup.value[0]); // to Int
fgroup.value[1] = parseInt(fgroup.value[1]); // to Int
fgroup.value[1] = parseInt(fgroup.value[1]); // to Int
if (fgroup.value) {
if (fgroup.value) {
self.selectedFilters[field] = fgroup;
self.selectedFilters[field] = fgroup;
} else {
} else {
delete self.selectedFilters[field];
delete self.selectedFilters[field];
}
}
}
}
if (fgroup.is('LNFilterDate')) {
if (fgroup.is('LNFilterDate')) {
fgroup.value = $value.val();
fgroup.value = $value.val();
if (fgroup.value) {
if (fgroup.value) {
self.selectedFilters[field] = fgroup;
self.selectedFilters[field] = fgroup;
} else {
} else {
delete self.selectedFilters[field];
delete self.selectedFilters[field];
}
}
}
}
}
}
// using timeout to prevent multiple change in sort time
// using timeout to prevent multiple change in sort time
clearTimeout(self.filterChangeTimeout);
clearTimeout(self.filterChangeTimeout);
self.filterChangeTimeout = setTimeout(function() {self.filterChangeHandle();}, 100);
self.filterChangeTimeout = setTimeout(function() {self.filterChangeHandle();}, 100);
});
});
self.super.afterRender();
self.super.afterRender();
}
}
self.filterChangeHandle = function () {
self.filterChangeHandle = function () {
// fetch matched item
// fetch matched item
var matchedIds = [];
var matchedIds = [];
jQuery('span.color-item-bg').removeClass('color-active');
jQuery('span.color-item-bg').removeClass('color-active');
jQuery('img.img-item').removeClass('media-active');
jQuery('img.img-item').removeClass('media-active');
if (Object.keys(self.selectedFilters).length) {
if (Object.keys(self.selectedFilters).length) {
var fields = {},
var fields = {},
ids = [],
ids = [],
vfields = [];
vfields = [];
for(var prop in self.selectedFilters) {
for(var prop in self.selectedFilters) {
var fitem = self.selectedFilters[prop],
var fitem = self.selectedFilters[prop],
field;
field;
if (!fitem.is('LNFilterItem')) {
if (!fitem.is('LNFilterItem')) {
field = fitem.options.field;
field = fitem.options.field;
// process for value & range filter
// process for value & range filter
// vfields.push(prop);
// vfields.push(prop);
var _ids = [];
var _ids = [];
for (var id in self.lnItems.items) {
for (var id in self.lnItems.items) {
var item = self.lnItems.getItem(id),
var item = self.lnItems.getItem(id),
matched = true;
matched = true;
if (!fitem.options.match || !fitem.options.match(item, field, fitem.value))
if (!fitem.options.match || !fitem.options.match(item, field, fitem.value))
matched = false;
matched = false;
if (matched) _ids.push(id);
if (matched) _ids.push(id);
}
}
fields[field] = _ids;
fields[field] = _ids;
} else {
} else {
field = fitem.parent.options.field;
field = fitem.parent.options.field;
if (fitem.options.template === 'filter.color-item') {
if (fitem.options.template === 'filter.color-item') {
fitem.$item.find('.color-item-bg').addClass('color-active');
fitem.$item.find('.color-item-bg').addClass('color-active');
} else if (fitem.options.template === 'filter.media-item') {
} else if (fitem.options.template === 'filter.media-item') {
fitem.$item.find('img').addClass('media-active');
fitem.$item.find('img').addClass('media-active');
}
}
fields[field] = fields[field] ? setOps.union(fields[field], fitem.mids) : fitem.mids;
fields[field] = fields[field] ? setOps.union(fields[field], fitem.mids) : fitem.mids;
}
}
ids = setOps.union(ids, fields[field]);
ids = setOps.union(ids, fields[field]);
}
}
var t = 0;
var t = 0;
// find matched items
// find matched items
for(var field in fields) {
for(var field in fields) {
matchedIds = t ? setOps.intersection(matchedIds, fields[field]) : fields[field];
matchedIds = t ? setOps.intersection(matchedIds, fields[field]) : fields[field];
t++;
t++;
}
}
// update counter for this field
// update counter for this field
for (var gid in self.items) {
for (var gid in self.items) {
var fgroup = self.getItem(gid),
var fgroup = self.getItem(gid),
field = fgroup.options.field,
field = fgroup.options.field,
fmatchedIds = [];
fmatchedIds = [];
// reset before count
// reset before count
for (var fid in fgroup.items) {
for (var fid in fgroup.items) {
fgroup.getItem(fid).mcount = 0;
fgroup.getItem(fid).mcount = 0;
}
}
if (field in fields) {
if (field in fields) {
if (Object.keys(fields).length == 1) {
if (Object.keys(fields).length == 1) {
// use global count
// use global count
// update counter for each item
// update counter for each item
for (var fid in fgroup.items) {
for (var fid in fgroup.items) {
fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length;
fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length;
}
}
} else {
} else {
// find matched items except this condition
// find matched items except this condition
var t = 0
var t = 0
for(var f in fields) {
for(var f in fields) {
if (f == field) continue;
if (f == field) continue;
fmatchedIds = t ? setOps.intersection(fmatchedIds, fields[f]):fields[f];
fmatchedIds = t ? setOps.intersection(fmatchedIds, fields[f]):fields[f];
t++
t++
}
}
}
}
} else {
} else {
fmatchedIds = matchedIds;
fmatchedIds = matchedIds;
}
}
if (fmatchedIds.length) {
if (fmatchedIds.length) {
// reset before count
// reset before count
fmatchedIds.forEach(function(id) {
fmatchedIds.forEach(function(id) {
var item = self.lnItems.getItem(id),
var item = self.lnItems.getItem(id),
val = item.getField(field);
val = item.getField(field);
if ($.isArray(val)) {
if ($.isArray(val)) {
val.forEach(function(v){
val.forEach(function(v){
var fitem = fgroup.getItem(field + '-' + v);
var fitem = fgroup.getItem(field + '-' + v);
if (fitem) fitem.mcount += 1;
if (fitem) fitem.mcount += 1;
});
});
} else {
} else {
var v = val,
var v = val,
key = field + '-' + v,
key = field + '-' + v,
fitem = fgroup.getItem(key);
fitem = fgroup.getItem(key);
if (fitem) fitem.mcount += 1;
if (fitem) fitem.mcount += 1;
}
}
})
})
}
}
}
}
} else {
} else {
matchedIds = Object.keys(self.lnItems.items);
matchedIds = Object.keys(self.lnItems.items);
// reset counter
// reset counter
for (gid in self.items) {
for (gid in self.items) {
var fgroup = self.getItem(gid);
var fgroup = self.getItem(gid);
for (var fid in fgroup.items) {
for (var fid in fgroup.items) {
fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length;
fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length;
}
}
}
}
}
}
self.lnItems.setMatchedItems(matchedIds);
self.lnItems.setMatchedItems(matchedIds);
if (self.isFirstLoad) {
if (self.isFirstLoad) {
self.isFirstLoad = false;
self.isFirstLoad = false;
} else {
} else {
self.page = 1;
self.page = 1;
}
}
self.lnItems.setPage(self.page);
self.lnItems.setPage(self.page);
self.lnItems.updateRender();
self.lnItems.updateRender();
self.updateRender();
self.updateRender();
self.updateFilterResult();
self.updateFilterResult();
}
}
self.updateFilterResult = function () {
self.updateFilterResult = function () {
if (self.filterResult) {
if (self.filterResult) {
self.filterResult.updateRender();
self.filterResult.updateRender();
}
}
}
}
self.load = function () {
self.load = function () {
var qs = self.getQS().qs,
var qs = self.getQS().qs,
filtered = false;
filtered = false;
for (var gid in self.items) {
for (var gid in self.items) {
var fgroup = self.getItem(gid),
var fgroup = self.getItem(gid),
field = fgroup.options.field;
field = fgroup.options.field;
if (qs[field]) {
if (qs[field]) {
fgroup.setValue(qs[field]);
fgroup.setValue(qs[field]);
filtered = true;
filtered = true;
}
}
}
}
return self;
return self;
}
}
});;
});;
var LNFilterGroup = LNBase.extend(function() {
var LNFilterGroup = LNBase.extend(function() {
// private variable
// private variable
var self = this,
var self = this,
$ = jQuery;
$ = jQuery;
self.type = 'LNFilterGroup';
self.type = 'LNFilterGroup';
self.options = null;
self.options = null;
self.defaultOptions = {
self.defaultOptions = {
class: 'filter-field',
class: 'filter-field',
order: 'ASC'
order: 'ASC'
};
};
self.afterRender = function () {
self.afterRender = function () {
// easy way to change the category tree name.
// easy way to change the category tree name.
// only use field name that we can detect it's category tree.
// only use field name that we can detect it's category tree.
if (self.options.field == 'attr.cat.value' || self.options.field == 'attr.category.value' || self.options.field == 'attr.tag.value') {
if (self.options.field == 'attr.cat.value' || self.options.field == 'attr.category.value' || self.options.field == 'attr.tag.value') {
var $lv;
var $lv;
switch (self.options.type) {
switch (self.options.type) {
case 'multiple':
case 'multiple':
self.$item.find('input').each(function() {
self.$item.find('input').each(function() {
$lv = ($(this).next().text().match(/ » /g) || []).length+1;
$lv = ($(this).next().text().match(/ » /g) || []).length+1;
$(this).parents('li').addClass('lv-'+$lv);
$(this).parents('li').addClass('lv-'+$lv);
$(this).next().text($(this).next().text().replace(/^(.*)?» /, ''));
$(this).next().text($(this).next().text().replace(/^(.*)?» /, ''));
});
});
break;
break;
case 'single':
case 'single':
self.$item.find('input').each(function() {
self.$item.find('input').each(function() {
$lv = ($(this).next().text().match(/ » /g) || []).length+1;
$lv = ($(this).next().text().match(/ » /g) || []).length+1;
$(this).parents('li').addClass('lv-'+$lv);
$(this).parents('li').addClass('lv-'+$lv);
$(this).next().text($(this).next().text().replace(/^(.*)?» /, ''));
$(this).next().text($(this).next().text().replace(/^(.*)?» /, ''));
});
});
break;
break;
case 'dropdown':
case 'dropdown':
self.$item.find('option').each(function() {
self.$item.find('option').each(function() {
$lv = ($(this).text().match(/ » /g) || []).length+1;
$lv = ($(this).text().match(/ » /g) || []).length+1;
var $space = '';
var $space = '';
for (i=1;i<$lv;i++) {
for (i=1;i<$lv;i++) {
$space += String.fromCharCode(160)+''+String.fromCharCode(160)+''+String.fromCharCode(160);
$space += String.fromCharCode(160)+''+String.fromCharCode(160)+''+String.fromCharCode(160);
}
}
$(this).text($space+''+$(this).text().replace(/^(.*)?» /, ''));
$(this).text($space+''+$(this).text().replace(/^(.*)?» /, ''));
});
});
break;
break;
case 'color':
case 'color':
case 'list':
case 'list':
case 'media':
case 'media':
break;
break;
}
}
}
}
if (self.options.type == 'color') {
if (self.options.type == 'color') {
self.$item.find('span.color-item-bg').each(function() {
self.$item.find('span.color-item-bg').each(function() {
if ((JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]) != undefined) {
if ((JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]) != undefined) {
$(this).css('background-color', JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]);
$(this).css('background-color', JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]);
} else {
} else {
$(this).css('background-color', ($(this).data('bgcolor').toLowerCase().trim().indexOf('#') === -1 ? '#' : '')+jQuery(this).data('bgcolor').toLowerCase().trim());
$(this).css('background-color', ($(this).data('bgcolor').toLowerCase().trim().indexOf('#') === -1 ? '#' : '')+jQuery(this).data('bgcolor').toLowerCase().trim());
}
}
});
});
}
}
}
}
self.reset = function () {
self.reset = function () {
/*
/*
复制
已复制
复制
已复制
switch (self.opti
switch (self.opti
ons.type) {
case 'multiple':
已保存差异
原始文本
打开文件
/** * ------------------------------------------------------------------------ * JA Megafilter Component * ------------------------------------------------------------------------ * Copyright (C) 2004-2016 J.O.O.M Solutions Co., Ltd. All Rights Reserved. * @license - GNU/GPL, http://www.gnu.org/licenses/gpl.html * Author: J.O.O.M Solutions Co., Ltd * Websites: http://www.joomlart.com - http://www.joomlancers.com * This file may not be redistributed in whole or significant part. * ------------------------------------------------------------------------ */ var LNBase = Class.extend(function(){ // private variable var self = this, $ = jQuery; self.type = 'LNBase'; self.options = null; self.defaultOptions = { rerenderWhenUpdate: false }; self.state = { }; self.items = {}; self.$item = null; self.data = {}; self.ids = []; self.matchedIds = []; self.shownIds = []; self.showingIds = []; self.startIdx = 1; self.endIdx = 0; self.page = 1; self.itemPerPage = 12; self.rendered = false; self.sortField = 'position'; self.sortDir = 'desc'; self.qs = {}; self.timeout = []; self.constructor = function (options) { self.options = $.extend({}, self.defaultOptions, options); } self.render = function (callback) { self.beforeRender(); var e = $.Event('beforeRender'); e.lntype = self.type; e.lntarget = self; $(document).trigger(e); dust.render(self.options.template, self, function(err, out) { var $el = $(out); if ($el.length != 1) $el = $('<div>').html(out); $el.addClass('ln-element').addClass(self.options.class).data('lnid', self.getId()); if (self.$item) { self.$item.remove(); self.$item = null; } if (callback) { self.$item = callback($el); } else { self.$item = $el.appendTo($(self.options.container).empty()); } if (self.options.itemWrapper) { self.$wrapper = self.$item.is(self.options.itemWrapper) ? self.$item : self.$item.find(self.options.itemWrapper); } // find state fields self.$stateFields = self.$item.find('[data-lnstate]'); self.renderItems(); // Render state value self.renderStateFields (); self.afterRender(); self.rendered = true; var e = $.Event('afterRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); }); var e = $.Event('completeRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); } self.renderStateFields = function () { if (self.$stateFields.length) { self.$stateFields.each(function () { var $field = $(this), field = $field.data('lnstate'), value = self.getField (field); $field.html(value); }) } } self.beforeRender = function () { if (self.options.beforeRender) self.options.beforeRender.apply(self); } self.afterRender = function () { if (self.options.afterRender) self.options.afterRender.apply(self); } self.beforeUpdateRender = function () { if (self.options.beforeUpdateRender) self.options.beforeUpdateRender.apply(self); } self.afterUpdateRender = function () { if (self.options.afterUpdateRender) self.options.afterUpdateRender.apply(self); } self.beforeRenderItems = function () { if (self.options.beforeRenderItems) self.options.beforeRenderItems.apply(self); if (!Object.keys(self.items).length) return; if (self.options.showAllItems) { self.matchedIds = Object.keys(self.items); self.endIdx = self.matchedIds.length; self.startIdx = 1; } else { self.endIdx = self.startIdx + self.itemPerPage - 1; if (self.endIdx > self.matchedIds.length) self.endIdx = self.matchedIds.length; } if (!self.matchedIds || !self.matchedIds.length) return false; self.showingIds = self.matchedIds.slice(self.startIdx - 1, self.endIdx); return true; } self.afterRenderItems = function () { if (self.options.afterRenderItems) self.options.afterRenderItems.apply(self); } self.renderItems = function () { // render children item if (self.beforeRenderItems()) { var oldIds = []; for(var i=0; i<self.shownIds.length; i++) { // remove old item on page var id = self.shownIds[i]; if ($.inArray(id, self.showingIds) == -1) { // remove html item self.getItem(id).$item.remove(); } else { oldIds.push(id); } } // Render for new item self.$currentItem = null; for(var i=0; i<self.showingIds.length; i++) { var id = self.showingIds[i]; if ($.inArray(id, oldIds) == -1) { // render new one self.renderItem(id); } else { var item = self.getItem (id); item.updateRender(); if (self.$currentItem) item.$item.insertAfter(self.$currentItem); self.$currentItem = item.$item; } } // update shownIds self.shownIds = self.showingIds.slice(); } else { if (self.$wrapper) self.$wrapper.empty(); self.shownIds = [] } self.afterRenderItems(); } self.renderItem = function (id) { var item = self.getItem(id); item.render(function($item){ $item.addClass(self.options.itemClass); if (self.$currentItem) $item.insertAfter(self.$currentItem); else $item.appendTo(self.$wrapper); self.$currentItem = $item; return $item; }); } self.updateRender = function () { self.delayCall('_updateRender', 100); } self._updateRender = function () { var e = $.Event('beforeUpdateRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); if (self.options.rerenderWhenUpdate) { self.render(); } else { self.beforeUpdateRender(); self.renderItems(); self.renderStateFields (); self.afterUpdateRender(); } if (self.type === 'LNBase' && self.options.autopage) { self.autoPage(); } var e = $.Event('afterUpdateRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); } self.addItem = function (child, id) { if (!id) id = child.data[id]; child.lnid = id.slugify(); child.parent = self; self.items[child.lnid] = child; } self.getData = function () { return self.data; } self.setData = function (data) { self.data = data; } self.getField = function (field) { if (self[field] !== undefined) return self[field]; if (self.data[field] !== undefined) return self.data[field]; // check if path field, eg: stats.HP var fields = field.split('.'), v = self.data, i=0; while(v && i<fields.length) { v = v[fields[i++]]; } return v === undefined ? '' : v; } self.getTemplate = function () { return self.options.template; } self.getItem = function (id) { return self.items[id.slugify()]; } self.getId = function () { return self.lnid; } self.is = function (check) { if (typeof check == 'string') { return check === self.type; } if (check instanceof LNBase) { return (check.is(self.type) && check.getId() == self.getId()); } return false; } // pages self.setPage = function (p) { if (!p) return; self.setQS('page', p); self.page = p; self.startIdx = (p-1) * self.itemPerPage + 1; // if (self.startIdx >= self.matchedIds.length) { // // reset to first page // self.startIdx = 1; // self.page = 1; // } return self; } // sticky self.sticky = function () { if(!isMobile.any ) { $(self.options.container).parent().stick_in_parent().trigger('sticky_kit:recalc'); } } // auto page self.autoPage = function () { var itemWrapper = $(self.options.itemWrapper), div = $('<div>', {id:'autopage','page-data': 1, 'style':'clear:both'}), reachEnd = 0; if ($('#autopage').length) { $('#autopage').remove(); itemWrapper.append(div); } else { itemWrapper.append(div); } self.startIdx = 1; self.endIdx = self.matchedIds.length; $(window).on('scroll.page',function () { var wheight = $(window).outerHeight(), target = $('#autopage').offset().top, numpage = parseInt($('#autopage').attr('page-data')), start = numpage * self.itemPerPage + 1, end = start + self.itemPerPage - 1; if (end > self.endIdx ) end = self.endIdx; if( ($(window).scrollTop() + wheight + 400) >= target ) { self.showingIds = self.matchedIds.slice(start - 1, end) for(var i=0; i<self.showingIds.length; i++) { var id = self.showingIds[i]; self.renderItem(id); self.shownIds.push(id); } if (end === self.endIdx) { $(window).off('scroll.page') } else { numpage = numpage + 1; $('#autopage').attr('page-data', numpage ); } // for afterAutoPage() callback var e = $.Event('afterAutoPage'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); } }); } // pages self.setLimiter = function (limiter) { self.setQS('limiter', limiter); self.itemPerPage = parseInt(limiter); self.startIdx = (self.page-1) * self.itemPerPage + 1; if (self.startIdx >= self.matchedIds.length) { // reset to first page self.startIdx = 1; self.page = 1; } return self; } // sort self.sort = function (field, dir) { if (field !== undefined) { self.setQS('sort', field); self.sortField = field; } if (dir == 'asc' || dir == 'desc') { self.setQS('sortdir', dir); self.sortDir = dir; } var d = self.sortDir == 'desc' ? -1 : 1; if (!self.ids.length || (self.sortField == 'position' && d == -1)) self.ids = Object.keys(self.items); // do sort if (self.sortField != 'position') { self.ids.sort(function (a, b) { var v1 = self.getItem(a).getField(self.sortField), v2 = self.getItem(b).getField(self.sortField); // transfer array to string if (Array.isArray(v1)) { v1.sort(); v1 = v1.join(' '); } if (Array.isArray(v2)) { v2.sort(); v2 = v2.join(' '); } if (v1 == v2) { var t1 = +self.getItem(a).getField('id'), t2 = +self.getItem(b).getField('id'); return t1 > t2 ? d : -d; } if ( !isNaN(v1) && !isNaN(v2) ) { v1 = +v1; v2 = +v2; return v1 > v2 ? d : -d; } else if( v1 && v2 ) { v1 = v1.split(''); v2 = v2.split(''); var min = Math.min(v1.length, v2.length); for (var i = 0; i < min; i++) { if (v1[i] != v2[i]) { return v1[i].localeCompare(v2[i]) > 0 ? d : -d; } } return v1 > v2 ? d : -d; } // let empty value always goes to bottom if (!v1) { return d > 0 ? d : -d; } if (!v2) { return d < 0 ? d : -d; } }); } else if (d == 1) { self.ids.reverse(); } return self; } self.setMatchedItems = function (ids) { self.matchedIds = []; if (!self.ids.length) self.ids = Object.keys(self.items); self.ids.forEach(function(id) { if (ids.indexOf(id) != -1) self.matchedIds.push(id); }) return self; } self.setQS = function (name, value) { self.getQS().set(name, value); } self.getQS = function () { if ($.lnqs == undefined) { $.lnqs = new LNQueryString(); $.lnqs.load(); } return $.lnqs; } self.delayCall = function (func, timeOut) { if (self.timeout[func]) clearTimeout(self.timeout[func]); if (self[func]) { self.timeout[func] = setTimeout(function () {self[func]()}, timeOut); } } }); ; var LNFilter = LNBase.extend(function(){ // private variable var self = this, $ = jQuery, so = setOps; self.type = 'LNFilter'; self.defaultOptions = { template: 'filter-list', container: '.sidebar', itemWrapper: '.filter-list', showAllItems: true }; self.lnItems = null; self.filterResult = null; // is first load self.isFirstLoad = true; // store selected value self.selectedFilters = {}; // page self.page = 1; // Filter base on list data items self.addItems = function (lnItems) { self.lnItems = lnItems; } // Filter result self.addFilterResult = function (filterResult) { self.filterResult = filterResult; self.filterResult.setSelectedFilters (self.selectedFilters); } self.addFilterSingle = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.radio', type: 'single' })), 'filter-' + options.field); } self.addFilterDropdown = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.dropdown', type: 'dropdown' })), 'filter-' + options.field); } self.addFilterList = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.list', type: 'list' })), 'filter-' + options.field); } self.addFilterMultiple = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.multiple', type: 'multiple' })), 'filter-' + options.field); } self.addFilterValue = function (options) { // template self.addItem (new LNFilterValue(options), 'filter-' + options.field); } self.addFilterDate = function (options) { // template self.addItem (new LNFilterDate(options), 'filter-' + options.field); } self.addFilterColor = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.color', type: 'color' })), 'filter-' + options.field); } self.addFilterMedia = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.media', type: 'media' })), 'filter-' + options.field); } self.addFilterRange = function (options) { // find max value if (!options.max) { var field = options.field, vals = []; for (var id in self.lnItems.items) { var v = self.lnItems.getItem(id).getField(field); if (Array.isArray(v)) { for (var i = 0; i < v.length; i++) { vals.push(+self.cleanRangeValue(v[i])); } } else { vals.push (+self.cleanRangeValue(v)); } } options.min = Math.min.apply(Math, vals); options.max = Math.max.apply(Math, vals); // change max min value to float to int. if (!!(options.max % 1)) options.max = Math.ceil(options.max); if (!!(options.min % 1)) options.min = Math.floor(options.min); } // template self.addItem (new LNFilterRange(options), 'filter-' + options.field); } self.cleanRangeValue = function (value) { if(isNaN(value)) { var arr = [], pieces = value.split(''); for (var i = 0; i < pieces.length; i++) { pieces[i] = pieces[i].replace(',', '.'); if (pieces[i] == ' ') { continue; } if (pieces[i] === '.' || !isNaN(pieces[i])) { arr.push(pieces[i]); } } value = arr.join(''); return isNaN(value) ? 0 : value; } return value; } // update value for filter type Single & Multiple self.updateFilter = function () { for (var gid in self.items) { var fgroup = self.getItem(gid), field = fgroup.options.field, type = fgroup.options.type, frontend_value; if (fgroup.options.frontend_field) frontend_value=fgroup.options.frontend_field; else frontend_value=fgroup.options.field; // show all child fgroup.options.showAllItems = true; fgroup.options.itemWrapper = '.filter-items'; // fetch child value from filter data if (fgroup.is('LNFilterGroup')) { // fetch field values into array for (var id in self.lnItems.items) { var item = self.lnItems.getItem(id), val = item.getField(field), frontend_val = item.getField(frontend_value); if (val === undefined) continue; if ($.isArray(val)) { for (var i=0; i<val.length; i++) { var v = val[i], key = field + '-' + v, fitem = fgroup.getItem(key); if (!v || v == 'N/A') continue; if (!fitem) { fitem = new LNFilterItem({ template: fgroup.getTemplate() + '-item', name: field, frontend_value: frontend_val[i], value: v }); fitem.mids = []; fgroup.addItem(fitem, key); } fitem.mids.push(id); } } else { var v = val, key = field + '-' + v, fitem = fgroup.getItem(key); if (!v || v == 'N/A') continue; if (!fitem) { fitem = new LNFilterItem({ template: fgroup.getTemplate() + '-item', name: field, value: v }); fitem.mids = []; fgroup.addItem(fitem, key); } fitem.mids.push(id); } } // sort child items var keys = Object.keys(fgroup.items); // unset this fgroup if less than 1 values if (keys.length < 1) { delete self.items[gid]; } else { var order = (fgroup.options.order.toUpperCase() == 'DESC') ? -1 : 1; keys.sort(function (a, b) { return fgroup.getItem(a).options.frontend_value.localeCompare(fgroup.getItem(b).options.frontend_value) * order; }); var _items = {}; keys.forEach(function (id) { _items[id] = fgroup.getItem(id); }); fgroup.items = _items; } } } return self; } self.afterRender = function () { // tracking change on filter self.$item.on('change', function (e) { if (self.options.sticky) { self.sticky(); } // update filter selected var $value = $(e.target), $fgroup = $value.closest('.filter-field'), fgroup = self.getItem($fgroup.data('lnid')), field = fgroup.options.field, type = fgroup.options.type; if ($value.is('select')) { // find element item var val = $value.val(), key = field + '-' + val, fitem = fgroup.getItem(key); // update to selected list if (val) { self.selectedFilters[field] = fitem; } else { delete self.selectedFilters[field]; } } else { if (fgroup.is('LNFilterValue')) { fgroup.value = $value.val(); if (fgroup.value) { self.selectedFilters[field] = fgroup; } else { delete self.selectedFilters[field]; } } if (fgroup.is('LNFilterGroup') && (type == 'multiple' || type == 'color' || type == 'media')) { var $fitem = $value.closest('.ln-element'), fitem = fgroup.getItem($fitem.data('lnid')), key = $fitem.data('lnid');//field + '-' + fitem.options.value; // toggle if ($value.prop('checked')) { self.selectedFilters[key] = fitem; } else { delete self.selectedFilters[key]; } } if (fgroup.is('LNFilterGroup') && type == 'single') { var $fitem = $value.closest('.ln-element'), fitem = fgroup.getItem($fitem.data('lnid')); if (fitem) { self.selectedFilters[field] = fitem; } else { delete self.selectedFilters[field]; } } if (fgroup.is('LNFilterRange')) { fgroup.value = $value.val(); fgroup.value[0] = parseInt(fgroup.value[0]); // to Int fgroup.value[1] = parseInt(fgroup.value[1]); // to Int if (fgroup.value) { self.selectedFilters[field] = fgroup; } else { delete self.selectedFilters[field]; } } if (fgroup.is('LNFilterDate')) { fgroup.value = $value.val(); if (fgroup.value) { self.selectedFilters[field] = fgroup; } else { delete self.selectedFilters[field]; } } } // using timeout to prevent multiple change in sort time clearTimeout(self.filterChangeTimeout); self.filterChangeTimeout = setTimeout(function() {self.filterChangeHandle();}, 100); }); self.super.afterRender(); } self.filterChangeHandle = function () { // fetch matched item var matchedIds = []; jQuery('span.color-item-bg').removeClass('color-active'); jQuery('img.img-item').removeClass('media-active'); if (Object.keys(self.selectedFilters).length) { var fields = {}, ids = [], vfields = []; for(var prop in self.selectedFilters) { var fitem = self.selectedFilters[prop], field; if (!fitem.is('LNFilterItem')) { field = fitem.options.field; // process for value & range filter // vfields.push(prop); var _ids = []; for (var id in self.lnItems.items) { var item = self.lnItems.getItem(id), matched = true; if (!fitem.options.match || !fitem.options.match(item, field, fitem.value)) matched = false; if (matched) _ids.push(id); } fields[field] = _ids; } else { field = fitem.parent.options.field; if (fitem.options.template === 'filter.color-item') { fitem.$item.find('.color-item-bg').addClass('color-active'); } else if (fitem.options.template === 'filter.media-item') { fitem.$item.find('img').addClass('media-active'); } fields[field] = fields[field] ? setOps.union(fields[field], fitem.mids) : fitem.mids; } ids = setOps.union(ids, fields[field]); } var t = 0; // find matched items for(var field in fields) { matchedIds = t ? setOps.intersection(matchedIds, fields[field]) : fields[field]; t++; } // update counter for this field for (var gid in self.items) { var fgroup = self.getItem(gid), field = fgroup.options.field, fmatchedIds = []; // reset before count for (var fid in fgroup.items) { fgroup.getItem(fid).mcount = 0; } if (field in fields) { if (Object.keys(fields).length == 1) { // use global count // update counter for each item for (var fid in fgroup.items) { fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length; } } else { // find matched items except this condition var t = 0 for(var f in fields) { if (f == field) continue; fmatchedIds = t ? setOps.intersection(fmatchedIds, fields[f]):fields[f]; t++ } } } else { fmatchedIds = matchedIds; } if (fmatchedIds.length) { // reset before count fmatchedIds.forEach(function(id) { var item = self.lnItems.getItem(id), val = item.getField(field); if ($.isArray(val)) { val.forEach(function(v){ var fitem = fgroup.getItem(field + '-' + v); if (fitem) fitem.mcount += 1; }); } else { var v = val, key = field + '-' + v, fitem = fgroup.getItem(key); if (fitem) fitem.mcount += 1; } }) } } } else { matchedIds = Object.keys(self.lnItems.items); // reset counter for (gid in self.items) { var fgroup = self.getItem(gid); for (var fid in fgroup.items) { fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length; } } } self.lnItems.setMatchedItems(matchedIds); if (self.isFirstLoad) { self.isFirstLoad = false; } else { self.page = 1; } self.lnItems.setPage(self.page); self.lnItems.updateRender(); self.updateRender(); self.updateFilterResult(); } self.updateFilterResult = function () { if (self.filterResult) { self.filterResult.updateRender(); } } self.load = function () { var qs = self.getQS().qs, filtered = false; for (var gid in self.items) { var fgroup = self.getItem(gid), field = fgroup.options.field; if (qs[field]) { fgroup.setValue(qs[field]); filtered = true; } } return self; } });; var LNFilterGroup = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterGroup'; self.options = null; self.defaultOptions = { class: 'filter-field', order: 'ASC' }; self.afterRender = function () { // easy way to change the category tree name. // only use field name that we can detect it's category tree. if (self.options.field == 'attr.cat.value' || self.options.field == 'attr.category.value' || self.options.field == 'attr.tag.value') { var $lv; switch (self.options.type) { case 'multiple': self.$item.find('input').each(function() { $lv = ($(this).next().text().match(/ » /g) || []).length+1; $(this).parents('li').addClass('lv-'+$lv); $(this).next().text($(this).next().text().replace(/^(.*)?» /, '')); }); break; case 'single': self.$item.find('input').each(function() { $lv = ($(this).next().text().match(/ » /g) || []).length+1; $(this).parents('li').addClass('lv-'+$lv); $(this).next().text($(this).next().text().replace(/^(.*)?» /, '')); }); break; case 'dropdown': self.$item.find('option').each(function() { $lv = ($(this).text().match(/ » /g) || []).length+1; var $space = ''; for (i=1;i<$lv;i++) { $space += String.fromCharCode(160)+''+String.fromCharCode(160)+''+String.fromCharCode(160); } $(this).text($space+''+$(this).text().replace(/^(.*)?» /, '')); }); break; case 'color': case 'list': case 'media': break; } } if (self.options.type == 'color') { self.$item.find('span.color-item-bg').each(function() { if ((JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]) != undefined) { $(this).css('background-color', JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]); } else { $(this).css('background-color', ($(this).data('bgcolor').toLowerCase().trim().indexOf('#') === -1 ? '#' : '')+jQuery(this).data('bgcolor').toLowerCase().trim()); } }); } } self.reset = function () { /* switch (self.options.type) { case 'multiple': self.$item.find('input').prop('checked', false).trigger('change'); break; case 'single': self.$item.find('input').first().prop('checked', true).trigger('change'); break; case 'dropdown': self.$item.find('select').val('').trigger('change'); break; case 'list': break; }*/ self.setValue(''); } self.setValue = function (value) { switch (self.options.type) { case 'color': case 'multiple': case 'media': var vals = value.split(','); self.$item.find('input').prop('checked', false).filter(function(){ return vals.indexOf (this.value) != -1 }).prop('checked', true).trigger('change'); break; case 'single': self.$item.find('input[value="' + value + '"]').prop('checked', true).trigger('change'); break; case 'dropdown': self.$item.find('select').val(value).trigger('change'); break; case 'list': break; } } }); var LNFilterItem = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterItem'; self.options = null; self.defaultOptions = { class: 'filter-item' }; self.updateRender = function () { // update textnode to replce counter self.$item.find(":not(iframe)").addBack().contents().filter(function(){ return this.nodeType == 3; }).each(function(){ var $this = $(this); $this.replaceWith($this.text().replace(/\(.*\)$/, '(' + self.mcount + ')')); }); // add empty class into empty group if (!self.mcount) self.$item.addClass('empty'); else self.$item.removeClass('empty'); // call super self.super.updateRender(); } self.reset = function () { if (self.parent.options.type == 'multiple' || self.parent.options.type == 'color' || self.parent.options.type == 'media'){ self.$item.find('input').prop('checked', false).trigger('change'); } else { self.parent.reset(); } } }); var LNFilterColor = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterColor'; self.options = null; self.defaultOptions = { template: 'filter.color', class: 'filter-input filter-field filter-item', match: function (item, field, val) { return null; } }; self.afterRender = function () { } self.reset = function () { } self.setValue = function (value) { } }); var LNFilterMedia = LNBase.extend(function() { var self = this, $ = jQuery; self.type = 'LNFilterMedia'; self.options = null; self.defaultOptions = { template: 'filter.media', class: 'filter-input filter-field filter-item', match: function (item, field, val) { return null; } }; }); var LNFilterDate = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterDate'; self.options = null; self.defaultOptions = { template: 'filter.date', class: 'filter-input filter-field', match: function (item, field, val) { var from, to; // prevent error when the item do not had value on this field. if (item.getField(field) == undefined == true || item.getField(field) == false || item.getField(field) == undefined || item.getField(field) == 'undefined') return null; from = self.$item.find('.jafrom').val(), to = self.$item.find('.jato').val(); from = new Date(from).getTime() / 1000; to = new Date(to).getTime() / 1000 + 24 * 60 * 60; var itemval = item.getField(field)[0]; var timeoffset = (new Date()).getTimezoneOffset(); itemval = itemval - timeoffset * 60; return (itemval >= from && itemval < to); } }; self.afterRender = function () { self.$item.find('input').each(function(i, e){ $(this).datepicker({ changeMonth: true, changeYear: true, dateFormat: "yy-mm-dd", onSelect : function(s, o){ var from = self.$item.find('.jafrom').val(), to = self.$item.find('.jato').val(); if (from !== '' && to !== '') { $(this).trigger('change'); } } }); }); } self.reset = function () { self.$item.find('input').each(function(i, e){ $(e).val('').trigger('change'); }); } self.setValue = function (value) { var vals = value.split(','); self.$item.find('input').each(function(i, e){ $(e).val(vals[i]); $(e).trigger('change'); }); } }); var LNFilterRange = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterRange'; self.options = null; self.defaultOptions = { template: 'filter.range', class: 'filter-range filter-field', min: 0, max: 0, match: function (item, field, val) { var itemVal = item.getField(field); var v; if (Array.isArray(itemVal)) { for (var i = 0; i < itemVal.length; i++) { v = itemVal[i]; if (v >= val[0] && (val[1] == self.options.max || v <= val[1])) { return true; } } } else { v = parseFloat(itemVal); return (v >= val[0] && (val[1] == self.options.max || v <= val[1])); } return false; } }; self.afterRender = function () { self.$slider = self.$item.find('.range-item'); if (self.$slider.length) { self.$slider[0].slide = null; self.$slider.slider({ range: true, min: self.options.min, max: self.options.max, isRTL: true, // RTL values: [ self.options.min, self.options.max ], slide: function( event, ui ) { self.$item.find('.range-value0').html(ui.values[0]); self.$item.find('.range-value1').html(ui.values[1]); }, change: function( event, ui ) { clearTimeout(self.changeTimeout); self.changeTimeout = setTimeout(function(){self.triggerChange();}, 100); self.$item.find('.range-value0').html(ui.values[0]); self.$item.find('.range-value1').html(ui.values[1]); } }); // first value self.$item.find('.range-value0').html(self.options.min); self.$item.find('.range-value1').html(self.options.max); } } self.reset = function () { self.$slider.slider( "values", [self.options.min, self.options.max]); } self.setValue = function (value) { self.$slider.slider( "values", value.split(',')); } self.triggerChange = function () { var values = self.$slider.slider("values"); self.$slider.val((values[0] == self.options.min && values[1] == self.options.max) ? null : values); var e = $.Event( "change", { target: self.$slider[0] } ); self.$slider.trigger('change', e); } self.toString = function () { if (self.options.toString) self.options.toString.apply(self); return self.$slider.slider("values").join (' - '); } }); var LNFilterValue = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterValue'; self.options = null; self.defaultOptions = { template: 'filter.value', class: 'filter-input filter-field', match: function (item, field, val) { if (item.getField(field) == undefined || item.getField(field) == 'undefined') return null; // prevent error when the item do not had value on this field. val = val.replace(/([^a-zA-Z0-9])/g, '\\$1'); // addslashes to all special characters. return item.getField(field).match(new RegExp(val, 'i')); } }; self.reset = function () { self.$item.find('input').val('').trigger('change'); } self.setValue = function (value) { self.$item.find('input').val(value).trigger('change'); } self.afterRender = function () { if (navigator.userAgent.match(/Trident/)) { self.$item.find('input').on('keyup', function(e) { if (e.keyCode === 13) { jQuery(this).trigger('change'); } }); } } }); var LNItem = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNItem'; self.options = null; self.defaultOptions = { class: 'ln-item' }; }); var LNQueryString = Class.extend(function(){ // private variable var self = this, $ = jQuery; self.qs = {}; self.curHash = location.hash; self.cache = []; self.defaultValues = {}; self.load = function () { // handle first visit, reselect var qs = {}; location.hash.substr(1).split('&').forEach(function(nvp){ var nv = nvp.split('='); if (nv.length == 2) qs[nv[0]] = decodeURIComponent(nv[1]); }); self.qs = qs; // register event to update update url hash $(document).on('afterRender', function (e) { if (e.lntype === 'LNToolbar' || e.lntype === 'LNSelected') { var hash = [], page = 0; for (var name in self.qs) { if (name == 'page') { page = self.qs[name]; continue; } hash.push(name + '=' + encodeURIComponent(self.qs[name])); } var curHash = hash.slice(0); if (page) curHash.push('page=' + page); curHash = curHash.length ? '#' + curHash.join('&') : ''; if (self.curHash != curHash) { // only update url once self.curHash = curHash; if ($('#jamegafilter-search-btn').length > 0) { var surl = filter_url + curHash; $('#jamegafilter-search-btn').attr('href', surl ); } else { history.replaceState(null, null, curHash); // update href for page links var baseLink = '#' + (hash.length ? hash.join('&') + '&' : ''); $('a.page').each(function(){ var $a = $(this), page = $a.data('value'); $a.attr('href', baseLink + 'page=' + page); }) } } } }) } self.set = function (name, value) { if (value) { self.qs[name] = value; } else { delete self.qs[name]; } } self.setDefault = function (defaultValues) { self.defaultValues = defaultValues; } }); var LNSelected = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNSelected'; self.options = null; self.defaultOptions = { template: 'filter-selected', class: 'selected-filters' }; self.selectedFilters = null; self.values = {}; self.filterFields = []; self.setSelectedFilters = function (selectedFilters) { self.selectedFilters = selectedFilters; } self.setFilter = function (lnFilter) { self.lnFilter = lnFilter; self.filterFields = []; for (var gid in lnFilter.items) { var fgroup = lnFilter.getItem(gid), field = fgroup.options.field; self.filterFields.push(field); } } self.updateRender = function () { self.render(); } self.beforeRender = function () { // parse selected filters to display self.values = {}; for(var prop in self.selectedFilters) { var fitem = self.selectedFilters[prop], field, sval, rval, fval; if (fitem.is('LNFilterItem')) { fval = fitem.parent.options.field; field = fitem.parent.options.title; rval = fitem.options.value; sval = fitem.options.frontend_value; if (fitem.options.name == 'attr.cat.value' || fitem.options.name == 'attr.category.value' || fitem.options.name == 'attr.tag.value') sval = sval.replace(/^(.*)?\»\; /, '').replace(/^(.*)?» /, ''); if (fitem.options.template === 'filter.color-item') { if (JAnameColor[sval.toLowerCase().trim()] != undefined) { sval = '<i class="fa fa-circle-o" style="color:'+JAnameColor[sval.toLowerCase().trim()]+';" aria-hidden="true"></i>'; } else { sval = '<i class="fa fa-circle-o" style="color:'+(sval.toLowerCase().trim().indexOf('#') === -1 ? '#' : '')+sval.toLowerCase().trim()+';" aria-hidden="true"></i>'; } } else if (fitem.options.template === 'filter.media-item') { sval= '<img class="img-selected" src="'+JABaseUrl + '/' +sval+'" />'; } } else if (fitem.is('LNFilterRange')) { fval = fitem.options.field; field = fitem.options.title; sval = fitem.toString(); rval = fitem.value; } else if (fitem.is('LNFilterDate')) { fval = fitem.options.field; field = fitem.options.title; var from = fitem.$item.find('.jafrom').val(), to = fitem.$item.find('.jato').val(); sval = from+' '+jamegafilter_to+' '+ to; rval = from+','+to; } else { fval = fitem.options.field; field = fitem.options.title; rval = fitem.value; sval = rval; } if (!self.values[fval]) self.values[fval] = []; self.values[fval].push({prop: prop, name: field, value: sval, raw_value: rval}); } // update url hash if (self.registeredClearFilterEvent) { var hash = []; self.filterFields.forEach(function(field) { var val = null; if (self.values[field]) { var vals = []; self.values[field].forEach(function(val){ vals.push(val.raw_value); }); val = vals.join(','); } self.setQS(field, val); }) } //self.super.beforeRender(); } self.afterRender = function () { if (Object.keys(self.values).length) self.$item.parent().removeClass ('empty'); else self.$item.parent().addClass ('empty'); self.super.afterRender(); self.registerClearFilter(); } self.registerClearFilter = function () { if (self.registeredClearFilterEvent) return; self.registeredClearFilterEvent = true; // listening click on filter-clear $(self.options.container).on('click', function (e) { var $item = $(e.target); if ($item.is ('.clear-filter')) { var lnprop = $item.data('lnprop'), item = self.selectedFilters[lnprop]; item.reset(); } if ($item.is ('.clear-all-filter')) { self.resetAll(); } }) } self.resetAll = function () { for(var prop in self.selectedFilters) { var fitem = self.selectedFilters[prop]; fitem.reset(); } } }) ; var LNToolbar = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNToolbar'; self.options = null; self.defaultOptions = { template: 'product-toolbar', class: 'products-toolbar', rerenderWhenUpdate: true }; self.lnItems = null; self.startIdx = 0; self.endIdx = 0; self.totalItems = 0; self.page = 0; self.itemPerPage = 0; self.nextPage = null; self.sortDir = ''; self.constructor = function (options) { self.super.constructor(options); // get from config self.sortByOptions = self.options.config.sortByOptions; self.productsPerPageAllowed = self.options.config.productsPerPageAllowed; self.itemPerPage = self.productsPerPageAllowed[0]; self.autopage = self.options.config.autopage; } self.beforeRender = function () { self.startIdx = self.lnItems.matchedIds.length ? self.lnItems.startIdx:0; self.endIdx = self.lnItems.endIdx; self.totalItems = self.lnItems.matchedIds.length; self.curPage = parseInt(self.lnItems.page); self.itemPerPage = self.lnItems.itemPerPage; // calculate pages, prevPage, nextPage var pages = Math.ceil(self.totalItems / self.itemPerPage); self.startPage = 1; self.endPage = pages; self.prevPage = self.curPage > 1 ? self.curPage - 1 : 1; self.nextPage = self.curPage < pages ? self.curPage + 1 : pages; self.pages = null; if (pages > 1) { self.pages = []; var start, end; start = self.curPage - 2; if (start < 1) start = 1; end = 5 + start; if (end > pages) { end = pages; start = end - 5; if (start < 1) start = 1; } for (var i=start; i<=end; i++) self.pages.push(i); } // if (self.lnItems.sortField.search('.value') !== -1) // self.lnItems.sortField = self.lnItems.sortField.replace('.value', '.frontend_value'); self.sortField = self.lnItems.sortField; self.sortDir = self.lnItems.sortDir == 'desc' ? 'asc' : 'desc'; } // Filter base on list data items self.addItems = function (lnItems) { self.lnItems = lnItems; } self.setPage = function (p) { self.page = p; } self.afterRender = function () { if (!self.actionHandled) { self.actionHandled = true; self.$item.parent().on('click', function (e) { var $btn = $(e.target).closest('[data-action]'), action = 'do' + $btn.data('action'); if (!self[action]) return false; var value = $btn.data('value'); self[action](value); return false; }).on('change', function (e) { var $elem = $(e.target); if ($elem.prop('tagName') == 'SELECT') { var $btn = $elem.find(":selected"), action = 'do' + $btn.data('action'); if (!self[action]) return false; var value = $btn.data('value'); self[action](value); return false; } }); } } self.dopage = function (value) { if (value != self.lnItems.page){ self.lnItems.setPage(value).updateRender(); } } self.dosort = function (value) { if (value != self.lnItems.sortField) { self.lnItems.sort(value).setMatchedItems(self.lnItems.matchedIds).updateRender(); } } self.dosortdir = function (value) { var sorDir = value == 'desc' ? 'desc' : 'asc'; self.lnItems.sort(undefined, sorDir).setMatchedItems(self.lnItems.matchedIds).updateRender(); } self.dolimiter = function (value) { if (value != self.lnItems.itemPerPage) { self.lnItems.setLimiter(value).updateRender(); } } self.load = function () { var qs = self.getQS(); // set default toolbar value qs.setDefault({ page: 1, limiter: self.productsPerPageAllowed[0], sort: self.sortByOptions[0].field, sortdir: 'desc' }) //update query string for default sorting if ( !qs.qs.sort ) qs.qs.sort = ja_default_sort; if ( !qs.qs.sortdir ) qs.qs.sortdir = ja_sort_by; for (var name in qs.qs) { var value = qs.qs[name], action = 'do' + name; if (self[action]) { self[action](value); } } } });
更改后文本
打开文件
/** * ------------------------------------------------------------------------ * JA Megafilter Component * ------------------------------------------------------------------------ * Copyright (C) 2004-2016 J.O.O.M Solutions Co., Ltd. All Rights Reserved. * @license - GNU/GPL, http://www.gnu.org/licenses/gpl.html * Author: J.O.O.M Solutions Co., Ltd * Websites: http://www.joomlart.com - http://www.joomlancers.com * This file may not be redistributed in whole or significant part. * ------------------------------------------------------------------------ */ var LNBase = Class.extend(function(){ // private variable var self = this, $ = jQuery; self.type = 'LNBase'; self.options = null; self.defaultOptions = { rerenderWhenUpdate: false }; self.state = { }; self.items = {}; self.$item = null; self.data = {}; self.ids = []; self.matchedIds = []; self.shownIds = []; self.showingIds = []; self.startIdx = 1; self.endIdx = 0; self.page = 1; self.itemPerPage = 12; self.rendered = false; self.sortField = 'position'; self.sortDir = 'desc'; self.qs = {}; self.timeout = []; self.constructor = function (options) { self.options = $.extend({}, self.defaultOptions, options); } self.render = function (callback) { self.beforeRender(); var e = $.Event('beforeRender'); e.lntype = self.type; e.lntarget = self; $(document).trigger(e); dust.render(self.options.template, self, function(err, out) { var $el = $(out); if ($el.length != 1) $el = $('<div>').html(out); $el.addClass('ln-element').addClass(self.options.class).data('lnid', self.getId()); if (self.$item) { self.$item.remove(); self.$item = null; } if (callback) { self.$item = callback($el); } else { self.$item = $el.appendTo($(self.options.container).empty()); } if (self.options.itemWrapper) { self.$wrapper = self.$item.is(self.options.itemWrapper) ? self.$item : self.$item.find(self.options.itemWrapper); } // find state fields self.$stateFields = self.$item.find('[data-lnstate]'); self.renderItems(); // Render state value self.renderStateFields (); self.afterRender(); self.rendered = true; var e = $.Event('afterRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); }); var e = $.Event('completeRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); } self.renderStateFields = function () { if (self.$stateFields.length) { self.$stateFields.each(function () { var $field = $(this), field = $field.data('lnstate'), value = self.getField (field); $field.html(value); }) } } self.beforeRender = function () { if (self.options.beforeRender) self.options.beforeRender.apply(self); } self.afterRender = function () { if (self.options.afterRender) self.options.afterRender.apply(self); } self.beforeUpdateRender = function () { if (self.options.beforeUpdateRender) self.options.beforeUpdateRender.apply(self); } self.afterUpdateRender = function () { if (self.options.afterUpdateRender) self.options.afterUpdateRender.apply(self); } self.beforeRenderItems = function () { if (self.options.beforeRenderItems) self.options.beforeRenderItems.apply(self); if (!Object.keys(self.items).length) return; if (self.options.showAllItems) { self.matchedIds = Object.keys(self.items); self.endIdx = self.matchedIds.length; self.startIdx = 1; } else { self.endIdx = self.startIdx + self.itemPerPage - 1; if (self.endIdx > self.matchedIds.length) self.endIdx = self.matchedIds.length; } if (!self.matchedIds || !self.matchedIds.length) return false; self.showingIds = self.matchedIds.slice(self.startIdx - 1, self.endIdx); return true; } self.afterRenderItems = function () { if (self.options.afterRenderItems) self.options.afterRenderItems.apply(self); } self.renderItems = function () { // render children item if (self.beforeRenderItems()) { var oldIds = []; for(var i=0; i<self.shownIds.length; i++) { // remove old item on page var id = self.shownIds[i]; if ($.inArray(id, self.showingIds) == -1) { // remove html item self.getItem(id).$item.remove(); } else { oldIds.push(id); } } // Render for new item self.$currentItem = null; for(var i=0; i<self.showingIds.length; i++) { var id = self.showingIds[i]; if ($.inArray(id, oldIds) == -1) { // render new one self.renderItem(id); } else { var item = self.getItem (id); item.updateRender(); if (self.$currentItem) item.$item.insertAfter(self.$currentItem); self.$currentItem = item.$item; } } // update shownIds self.shownIds = self.showingIds.slice(); } else { if (self.$wrapper) self.$wrapper.empty(); self.shownIds = [] } self.afterRenderItems(); } self.renderItem = function (id) { var item = self.getItem(id); item.render(function($item){ $item.addClass(self.options.itemClass); if (self.$currentItem) $item.insertAfter(self.$currentItem); else $item.appendTo(self.$wrapper); self.$currentItem = $item; return $item; }); } self.updateRender = function () { self.delayCall('_updateRender', 100); } self._updateRender = function () { var e = $.Event('beforeUpdateRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); if (self.options.rerenderWhenUpdate) { self.render(); } else { self.beforeUpdateRender(); self.renderItems(); self.renderStateFields (); self.afterUpdateRender(); } if (self.type === 'LNBase' && self.options.autopage) { self.autoPage(); } var e = $.Event('afterUpdateRender'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); } self.addItem = function (child, id) { if (!id) id = child.data[id]; child.lnid = id.slugify(); child.parent = self; self.items[child.lnid] = child; } self.getData = function () { return self.data; } self.setData = function (data) { self.data = data; } self.getField = function (field) { if (self[field] !== undefined) return self[field]; if (self.data[field] !== undefined) return self.data[field]; // check if path field, eg: stats.HP var fields = field.split('.'), v = self.data, i=0; while(v && i<fields.length) { v = v[fields[i++]]; } return v === undefined ? '' : v; } self.getTemplate = function () { return self.options.template; } self.getItem = function (id) { return self.items[id.slugify()]; } self.getId = function () { return self.lnid; } self.is = function (check) { if (typeof check == 'string') { return check === self.type; } if (check instanceof LNBase) { return (check.is(self.type) && check.getId() == self.getId()); } return false; } // pages self.setPage = function (p) { if (!p) return; self.setQS('page', p); self.page = p; self.startIdx = (p-1) * self.itemPerPage + 1; // if (self.startIdx >= self.matchedIds.length) { // // reset to first page // self.startIdx = 1; // self.page = 1; // } return self; } // sticky self.sticky = function () { if(!isMobile.any ) { $(self.options.container).parent().stick_in_parent().trigger('sticky_kit:recalc'); } } // auto page self.autoPage = function () { var itemWrapper = $(self.options.itemWrapper), div = $('<div>', {id:'autopage','page-data': 1, 'style':'clear:both'}), reachEnd = 0; if ($('#autopage').length) { $('#autopage').remove(); itemWrapper.append(div); } else { itemWrapper.append(div); } self.startIdx = 1; self.endIdx = self.matchedIds.length; $(window).on('scroll.page',function () { var wheight = $(window).outerHeight(), target = $('#autopage').offset().top, numpage = parseInt($('#autopage').attr('page-data')), start = numpage * self.itemPerPage + 1, end = start + self.itemPerPage - 1; if (end > self.endIdx ) end = self.endIdx; if( ($(window).scrollTop() + wheight + 400) >= target ) { self.showingIds = self.matchedIds.slice(start - 1, end) for(var i=0; i<self.showingIds.length; i++) { var id = self.showingIds[i]; self.renderItem(id); self.shownIds.push(id); } if (end === self.endIdx) { $(window).off('scroll.page') } else { numpage = numpage + 1; $('#autopage').attr('page-data', numpage ); } // for afterAutoPage() callback var e = $.Event('afterAutoPage'); e.lntype = self.type; e.lntarget = self; self.$item.trigger(e); } }); } // pages self.setLimiter = function (limiter) { self.setQS('limiter', limiter); self.itemPerPage = parseInt(limiter); self.startIdx = (self.page-1) * self.itemPerPage + 1; if (self.startIdx >= self.matchedIds.length) { // reset to first page self.startIdx = 1; self.page = 1; } return self; } // sort self.sort = function (field, dir) { if (field !== undefined) { self.setQS('sort', field); self.sortField = field; } if (dir == 'asc' || dir == 'desc') { self.setQS('sortdir', dir); self.sortDir = dir; } var d = self.sortDir == 'desc' ? -1 : 1; if (!self.ids.length || (self.sortField == 'position' && d == -1)) self.ids = Object.keys(self.items); // do sort if (self.sortField != 'position') { self.ids.sort(function (a, b) { var v1 = self.getItem(a).getField(self.sortField), v2 = self.getItem(b).getField(self.sortField); // transfer array to string if (Array.isArray(v1)) { v1.sort(); v1 = v1.join(' '); } if (Array.isArray(v2)) { v2.sort(); v2 = v2.join(' '); } if (v1 == v2) { var t1 = +self.getItem(a).getField('id'), t2 = +self.getItem(b).getField('id'); return t1 > t2 ? d : -d; } if ( !isNaN(v1) && !isNaN(v2) ) { v1 = +v1; v2 = +v2; } else if( v1 && v2 ) { v1 = v1.split(''); v2 = v2.split(''); var min = Math.min(v1.length, v2.length); for (var i = 0; i < min; i++) { if (v1[i] != v2[i]) { return v1[i].localeCompare(v2[i]) > 0 ? d : -d; } } } // let empty value always goes to bottom if (!v1) { return d > 0 ? d : -d; } if (!v2) { return d < 0 ? d : -d; } return v1 > v2 ? d : -d; }); } else if (d == 1) { self.ids.reverse(); } return self; } self.setMatchedItems = function (ids) { self.matchedIds = []; if (!self.ids.length) self.ids = Object.keys(self.items); self.ids.forEach(function(id) { if (ids.indexOf(id) != -1) self.matchedIds.push(id); }) return self; } self.setQS = function (name, value) { self.getQS().set(name, value); } self.getQS = function () { if ($.lnqs == undefined) { $.lnqs = new LNQueryString(); $.lnqs.load(); } return $.lnqs; } self.delayCall = function (func, timeOut) { if (self.timeout[func]) clearTimeout(self.timeout[func]); if (self[func]) { self.timeout[func] = setTimeout(function () {self[func]()}, timeOut); } } }); ; var LNFilter = LNBase.extend(function(){ // private variable var self = this, $ = jQuery, so = setOps; self.type = 'LNFilter'; self.defaultOptions = { template: 'filter-list', container: '.sidebar', itemWrapper: '.filter-list', showAllItems: true }; self.lnItems = null; self.filterResult = null; // is first load self.isFirstLoad = true; // store selected value self.selectedFilters = {}; // page self.page = 1; // Filter base on list data items self.addItems = function (lnItems) { self.lnItems = lnItems; } // Filter result self.addFilterResult = function (filterResult) { self.filterResult = filterResult; self.filterResult.setSelectedFilters (self.selectedFilters); } self.addFilterSingle = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.radio', type: 'single' })), 'filter-' + options.field); } self.addFilterDropdown = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.dropdown', type: 'dropdown' })), 'filter-' + options.field); } self.addFilterList = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.list', type: 'list' })), 'filter-' + options.field); } self.addFilterMultiple = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.multiple', type: 'multiple' })), 'filter-' + options.field); } self.addFilterValue = function (options) { // template self.addItem (new LNFilterValue(options), 'filter-' + options.field); } self.addFilterDate = function (options) { // template self.addItem (new LNFilterDate(options), 'filter-' + options.field); } self.addFilterColor = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.color', type: 'color' })), 'filter-' + options.field); } self.addFilterMedia = function (options) { // template self.addItem (new LNFilterGroup($.extend(options, { template: 'filter.media', type: 'media' })), 'filter-' + options.field); } self.addFilterRange = function (options) { // find max value if (!options.max) { var field = options.field, vals = []; for (var id in self.lnItems.items) { var v = self.lnItems.getItem(id).getField(field); if (Array.isArray(v)) { for (var i = 0; i < v.length; i++) { vals.push(+self.cleanRangeValue(v[i])); } } else { vals.push (+self.cleanRangeValue(v)); } } options.min = Math.min.apply(Math, vals); options.max = Math.max.apply(Math, vals); // change max min value to float to int. if (!!(options.max % 1)) options.max = Math.ceil(options.max); if (!!(options.min % 1)) options.min = Math.floor(options.min); } // template self.addItem (new LNFilterRange(options), 'filter-' + options.field); } self.cleanRangeValue = function (value) { if(isNaN(value)) { var arr = [], pieces = value.split(''); for (var i = 0; i < pieces.length; i++) { pieces[i] = pieces[i].replace(',', '.'); if (pieces[i] == ' ') { continue; } if (pieces[i] === '.' || !isNaN(pieces[i])) { arr.push(pieces[i]); } } value = arr.join(''); return isNaN(value) ? 0 : value; } return value; } // update value for filter type Single & Multiple self.updateFilter = function () { for (var gid in self.items) { var fgroup = self.getItem(gid), field = fgroup.options.field, type = fgroup.options.type, frontend_value; if (fgroup.options.frontend_field) frontend_value=fgroup.options.frontend_field; else frontend_value=fgroup.options.field; // show all child fgroup.options.showAllItems = true; fgroup.options.itemWrapper = '.filter-items'; // fetch child value from filter data if (fgroup.is('LNFilterGroup')) { // fetch field values into array for (var id in self.lnItems.items) { var item = self.lnItems.getItem(id), val = item.getField(field), frontend_val = item.getField(frontend_value); if (val === undefined) continue; if ($.isArray(val)) { for (var i=0; i<val.length; i++) { var v = val[i], key = field + '-' + v, fitem = fgroup.getItem(key); if (!v || v == 'N/A') continue; if (!fitem) { fitem = new LNFilterItem({ template: fgroup.getTemplate() + '-item', name: field, frontend_value: frontend_val[i], value: v }); fitem.mids = []; fgroup.addItem(fitem, key); } fitem.mids.push(id); } } else { var v = val, key = field + '-' + v, fitem = fgroup.getItem(key); if (!v || v == 'N/A') continue; if (!fitem) { fitem = new LNFilterItem({ template: fgroup.getTemplate() + '-item', name: field, value: v }); fitem.mids = []; fgroup.addItem(fitem, key); } fitem.mids.push(id); } } // sort child items var keys = Object.keys(fgroup.items); // unset this fgroup if less than 1 values if (keys.length < 1) { delete self.items[gid]; } else { var order = (fgroup.options.order.toUpperCase() == 'DESC') ? -1 : 1; keys.sort(function (a, b) { return fgroup.getItem(a).options.frontend_value.localeCompare(fgroup.getItem(b).options.frontend_value) * order; }); var _items = {}; keys.forEach(function (id) { _items[id] = fgroup.getItem(id); }); fgroup.items = _items; } } } return self; } self.afterRender = function () { // tracking change on filter self.$item.on('change', function (e) { if (self.options.sticky) { self.sticky(); } // update filter selected var $value = $(e.target), $fgroup = $value.closest('.filter-field'), fgroup = self.getItem($fgroup.data('lnid')), field = fgroup.options.field, type = fgroup.options.type; if ($value.is('select')) { // find element item var val = $value.val(), key = field + '-' + val, fitem = fgroup.getItem(key); // update to selected list if (val) { self.selectedFilters[field] = fitem; } else { delete self.selectedFilters[field]; } } else { if (fgroup.is('LNFilterValue')) { fgroup.value = $value.val(); if (fgroup.value) { self.selectedFilters[field] = fgroup; } else { delete self.selectedFilters[field]; } } if (fgroup.is('LNFilterGroup') && (type == 'multiple' || type == 'color' || type == 'media')) { var $fitem = $value.closest('.ln-element'), fitem = fgroup.getItem($fitem.data('lnid')), key = $fitem.data('lnid');//field + '-' + fitem.options.value; // toggle if ($value.prop('checked')) { self.selectedFilters[key] = fitem; } else { delete self.selectedFilters[key]; } } if (fgroup.is('LNFilterGroup') && type == 'single') { var $fitem = $value.closest('.ln-element'), fitem = fgroup.getItem($fitem.data('lnid')); if (fitem) { self.selectedFilters[field] = fitem; } else { delete self.selectedFilters[field]; } } if (fgroup.is('LNFilterRange')) { fgroup.value = $value.val(); fgroup.value[0] = parseInt(fgroup.value[0]); // to Int fgroup.value[1] = parseInt(fgroup.value[1]); // to Int if (fgroup.value) { self.selectedFilters[field] = fgroup; } else { delete self.selectedFilters[field]; } } if (fgroup.is('LNFilterDate')) { fgroup.value = $value.val(); if (fgroup.value) { self.selectedFilters[field] = fgroup; } else { delete self.selectedFilters[field]; } } } // using timeout to prevent multiple change in sort time clearTimeout(self.filterChangeTimeout); self.filterChangeTimeout = setTimeout(function() {self.filterChangeHandle();}, 100); }); self.super.afterRender(); } self.filterChangeHandle = function () { // fetch matched item var matchedIds = []; jQuery('span.color-item-bg').removeClass('color-active'); jQuery('img.img-item').removeClass('media-active'); if (Object.keys(self.selectedFilters).length) { var fields = {}, ids = [], vfields = []; for(var prop in self.selectedFilters) { var fitem = self.selectedFilters[prop], field; if (!fitem.is('LNFilterItem')) { field = fitem.options.field; // process for value & range filter // vfields.push(prop); var _ids = []; for (var id in self.lnItems.items) { var item = self.lnItems.getItem(id), matched = true; if (!fitem.options.match || !fitem.options.match(item, field, fitem.value)) matched = false; if (matched) _ids.push(id); } fields[field] = _ids; } else { field = fitem.parent.options.field; if (fitem.options.template === 'filter.color-item') { fitem.$item.find('.color-item-bg').addClass('color-active'); } else if (fitem.options.template === 'filter.media-item') { fitem.$item.find('img').addClass('media-active'); } fields[field] = fields[field] ? setOps.union(fields[field], fitem.mids) : fitem.mids; } ids = setOps.union(ids, fields[field]); } var t = 0; // find matched items for(var field in fields) { matchedIds = t ? setOps.intersection(matchedIds, fields[field]) : fields[field]; t++; } // update counter for this field for (var gid in self.items) { var fgroup = self.getItem(gid), field = fgroup.options.field, fmatchedIds = []; // reset before count for (var fid in fgroup.items) { fgroup.getItem(fid).mcount = 0; } if (field in fields) { if (Object.keys(fields).length == 1) { // use global count // update counter for each item for (var fid in fgroup.items) { fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length; } } else { // find matched items except this condition var t = 0 for(var f in fields) { if (f == field) continue; fmatchedIds = t ? setOps.intersection(fmatchedIds, fields[f]):fields[f]; t++ } } } else { fmatchedIds = matchedIds; } if (fmatchedIds.length) { // reset before count fmatchedIds.forEach(function(id) { var item = self.lnItems.getItem(id), val = item.getField(field); if ($.isArray(val)) { val.forEach(function(v){ var fitem = fgroup.getItem(field + '-' + v); if (fitem) fitem.mcount += 1; }); } else { var v = val, key = field + '-' + v, fitem = fgroup.getItem(key); if (fitem) fitem.mcount += 1; } }) } } } else { matchedIds = Object.keys(self.lnItems.items); // reset counter for (gid in self.items) { var fgroup = self.getItem(gid); for (var fid in fgroup.items) { fgroup.getItem(fid).mcount = fgroup.getItem(fid).mids.length; } } } self.lnItems.setMatchedItems(matchedIds); if (self.isFirstLoad) { self.isFirstLoad = false; } else { self.page = 1; } self.lnItems.setPage(self.page); self.lnItems.updateRender(); self.updateRender(); self.updateFilterResult(); } self.updateFilterResult = function () { if (self.filterResult) { self.filterResult.updateRender(); } } self.load = function () { var qs = self.getQS().qs, filtered = false; for (var gid in self.items) { var fgroup = self.getItem(gid), field = fgroup.options.field; if (qs[field]) { fgroup.setValue(qs[field]); filtered = true; } } return self; } });; var LNFilterGroup = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterGroup'; self.options = null; self.defaultOptions = { class: 'filter-field', order: 'ASC' }; self.afterRender = function () { // easy way to change the category tree name. // only use field name that we can detect it's category tree. if (self.options.field == 'attr.cat.value' || self.options.field == 'attr.category.value' || self.options.field == 'attr.tag.value') { var $lv; switch (self.options.type) { case 'multiple': self.$item.find('input').each(function() { $lv = ($(this).next().text().match(/ » /g) || []).length+1; $(this).parents('li').addClass('lv-'+$lv); $(this).next().text($(this).next().text().replace(/^(.*)?» /, '')); }); break; case 'single': self.$item.find('input').each(function() { $lv = ($(this).next().text().match(/ » /g) || []).length+1; $(this).parents('li').addClass('lv-'+$lv); $(this).next().text($(this).next().text().replace(/^(.*)?» /, '')); }); break; case 'dropdown': self.$item.find('option').each(function() { $lv = ($(this).text().match(/ » /g) || []).length+1; var $space = ''; for (i=1;i<$lv;i++) { $space += String.fromCharCode(160)+''+String.fromCharCode(160)+''+String.fromCharCode(160); } $(this).text($space+''+$(this).text().replace(/^(.*)?» /, '')); }); break; case 'color': case 'list': case 'media': break; } } if (self.options.type == 'color') { self.$item.find('span.color-item-bg').each(function() { if ((JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]) != undefined) { $(this).css('background-color', JAnameColor[$(this).data('bgcolor').toLowerCase().trim()]); } else { $(this).css('background-color', ($(this).data('bgcolor').toLowerCase().trim().indexOf('#') === -1 ? '#' : '')+jQuery(this).data('bgcolor').toLowerCase().trim()); } }); } } self.reset = function () { /* switch (self.options.type) { case 'multiple': self.$item.find('input').prop('checked', false).trigger('change'); break; case 'single': self.$item.find('input').first().prop('checked', true).trigger('change'); break; case 'dropdown': self.$item.find('select').val('').trigger('change'); break; case 'list': break; }*/ self.setValue(''); } self.setValue = function (value) { switch (self.options.type) { case 'color': case 'multiple': case 'media': var vals = value.split(','); self.$item.find('input').prop('checked', false).filter(function(){ return vals.indexOf (this.value) != -1 }).prop('checked', true).trigger('change'); break; case 'single': self.$item.find('input[value="' + value + '"]').prop('checked', true).trigger('change'); break; case 'dropdown': self.$item.find('select').val(value).trigger('change'); break; case 'list': break; } } }); var LNFilterItem = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterItem'; self.options = null; self.defaultOptions = { class: 'filter-item' }; self.updateRender = function () { // update textnode to replce counter self.$item.find(":not(iframe)").addBack().contents().filter(function(){ return this.nodeType == 3; }).each(function(){ var $this = $(this); $this.replaceWith($this.text().replace(/\(.*\)$/, '(' + self.mcount + ')')); }); // add empty class into empty group if (!self.mcount) self.$item.addClass('empty'); else self.$item.removeClass('empty'); // call super self.super.updateRender(); } self.reset = function () { if (self.parent.options.type == 'multiple' || self.parent.options.type == 'color' || self.parent.options.type == 'media'){ self.$item.find('input').prop('checked', false).trigger('change'); } else { self.parent.reset(); } } }); var LNFilterColor = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterColor'; self.options = null; self.defaultOptions = { template: 'filter.color', class: 'filter-input filter-field filter-item', match: function (item, field, val) { return null; } }; self.afterRender = function () { } self.reset = function () { } self.setValue = function (value) { } }); var LNFilterMedia = LNBase.extend(function() { var self = this, $ = jQuery; self.type = 'LNFilterMedia'; self.options = null; self.defaultOptions = { template: 'filter.media', class: 'filter-input filter-field filter-item', match: function (item, field, val) { return null; } }; }); var LNFilterDate = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterDate'; self.options = null; self.defaultOptions = { template: 'filter.date', class: 'filter-input filter-field', match: function (item, field, val) { var from, to; // prevent error when the item do not had value on this field. if (item.getField(field) == undefined == true || item.getField(field) == false || item.getField(field) == undefined || item.getField(field) == 'undefined') return null; from = self.$item.find('.jafrom').val(), to = self.$item.find('.jato').val(); from = new Date(from).getTime() / 1000; to = new Date(to).getTime() / 1000 + 24 * 60 * 60; var itemval = item.getField(field)[0]; var timeoffset = (new Date()).getTimezoneOffset(); itemval = itemval - timeoffset * 60; return (itemval >= from && itemval < to); } }; self.afterRender = function () { self.$item.find('input').each(function(i, e){ $(this).datepicker({ changeMonth: true, changeYear: true, dateFormat: "yy-mm-dd", onSelect : function(s, o){ var from = self.$item.find('.jafrom').val(), to = self.$item.find('.jato').val(); if (from !== '' && to !== '') { $(this).trigger('change'); } } }); }); } self.reset = function () { self.$item.find('input').each(function(i, e){ $(e).val('').trigger('change'); }); } self.setValue = function (value) { var vals = value.split(','); self.$item.find('input').each(function(i, e){ $(e).val(vals[i]); $(e).trigger('change'); }); } }); var LNFilterRange = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterRange'; self.options = null; self.defaultOptions = { template: 'filter.range', class: 'filter-range filter-field', min: 0, max: 0, match: function (item, field, val) { var itemVal = item.getField(field); var v; if (Array.isArray(itemVal)) { for (var i = 0; i < itemVal.length; i++) { v = itemVal[i]; if (v >= val[0] && (val[1] == self.options.max || v <= val[1])) { return true; } } } else { v = parseFloat(itemVal); return (v >= val[0] && (val[1] == self.options.max || v <= val[1])); } return false; } }; self.afterRender = function () { self.$slider = self.$item.find('.range-item'); if (self.$slider.length) { self.$slider.slider({ range: true, min: self.options.min, max: self.options.max, isRTL: true, // RTL values: [ self.options.min, self.options.max ], slide: function( event, ui ) { self.$item.find('.range-value0').html(ui.values[0]); self.$item.find('.range-value1').html(ui.values[1]); }, change: function( event, ui ) { clearTimeout(self.changeTimeout); self.changeTimeout = setTimeout(function(){self.triggerChange();}, 100); self.$item.find('.range-value0').html(ui.values[0]); self.$item.find('.range-value1').html(ui.values[1]); } }); // first value self.$item.find('.range-value0').html(self.options.min); self.$item.find('.range-value1').html(self.options.max); } } self.reset = function () { self.$slider.slider( "values", [self.options.min, self.options.max]); } self.setValue = function (value) { self.$slider.slider( "values", value.split(',')); } self.triggerChange = function () { var values = self.$slider.slider("values"); self.$slider.val((values[0] == self.options.min && values[1] == self.options.max) ? null : values); var e = $.Event( "change", { target: self.$slider[0] } ); self.$slider.trigger('change', e); } self.toString = function () { if (self.options.toString) self.options.toString.apply(self); return self.$slider.slider("values").join (' - '); } }); var LNFilterValue = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNFilterValue'; self.options = null; self.defaultOptions = { template: 'filter.value', class: 'filter-input filter-field', match: function (item, field, val) { if (item.getField(field) == undefined || item.getField(field) == 'undefined') return null; // prevent error when the item do not had value on this field. val = val.replace(/([^a-zA-Z0-9])/g, '\\$1'); // addslashes to all special characters. return item.getField(field).match(new RegExp(val, 'i')); } }; self.reset = function () { self.$item.find('input').val('').trigger('change'); } self.setValue = function (value) { self.$item.find('input').val(value).trigger('change'); } self.afterRender = function () { if (navigator.userAgent.match(/Trident/)) { self.$item.find('input').on('keyup', function(e) { if (e.keyCode === 13) { jQuery(this).trigger('change'); } }); } } }); var LNItem = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNItem'; self.options = null; self.defaultOptions = { class: 'ln-item' }; }); var LNQueryString = Class.extend(function(){ // private variable var self = this, $ = jQuery; self.qs = {}; self.curHash = location.hash; self.cache = []; self.defaultValues = {}; self.load = function () { // handle first visit, reselect var qs = {}; location.hash.substr(1).split('&').forEach(function(nvp){ var nv = nvp.split('='); if (nv.length == 2) qs[nv[0]] = decodeURIComponent(nv[1]); }); self.qs = qs; // register event to update update url hash $(document).on('afterRender', function (e) { if (e.lntype === 'LNToolbar' || e.lntype === 'LNSelected') { var hash = [], page = 0; for (var name in self.qs) { if (name == 'page') { page = self.qs[name]; continue; } hash.push(name + '=' + encodeURIComponent(self.qs[name])); } var curHash = hash.slice(0); if (page) curHash.push('page=' + page); curHash = curHash.length ? '#' + curHash.join('&') : ''; if (self.curHash != curHash) { // only update url once self.curHash = curHash; if ($('#jamegafilter-search-btn').length > 0) { var surl = filter_url + curHash; $('#jamegafilter-search-btn').attr('href', surl ); } else { history.replaceState(null, null, curHash); // update href for page links var baseLink = '#' + (hash.length ? hash.join('&') + '&' : ''); $('a.page').each(function(){ var $a = $(this), page = $a.data('value'); $a.attr('href', baseLink + 'page=' + page); }) } } } }) } self.set = function (name, value) { if (value) { self.qs[name] = value; } else { delete self.qs[name]; } } self.setDefault = function (defaultValues) { self.defaultValues = defaultValues; } }); var LNSelected = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNSelected'; self.options = null; self.defaultOptions = { template: 'filter-selected', class: 'selected-filters' }; self.selectedFilters = null; self.values = {}; self.filterFields = []; self.setSelectedFilters = function (selectedFilters) { self.selectedFilters = selectedFilters; } self.setFilter = function (lnFilter) { self.lnFilter = lnFilter; self.filterFields = []; for (var gid in lnFilter.items) { var fgroup = lnFilter.getItem(gid), field = fgroup.options.field; self.filterFields.push(field); } } self.updateRender = function () { self.render(); } self.beforeRender = function () { // parse selected filters to display self.values = {}; for(var prop in self.selectedFilters) { var fitem = self.selectedFilters[prop], field, sval, rval, fval; if (fitem.is('LNFilterItem')) { fval = fitem.parent.options.field; field = fitem.parent.options.title; rval = fitem.options.value; sval = fitem.options.frontend_value; if (fitem.options.name == 'attr.cat.value' || fitem.options.name == 'attr.category.value' || fitem.options.name == 'attr.tag.value') sval = sval.replace(/^(.*)?\»\; /, '').replace(/^(.*)?» /, ''); if (fitem.options.template === 'filter.color-item') { if (JAnameColor[sval.toLowerCase().trim()] != undefined) { sval = '<i class="fa fa-circle-o" style="color:'+JAnameColor[sval.toLowerCase().trim()]+';" aria-hidden="true"></i>'; } else { sval = '<i class="fa fa-circle-o" style="color:'+(sval.toLowerCase().trim().indexOf('#') === -1 ? '#' : '')+sval.toLowerCase().trim()+';" aria-hidden="true"></i>'; } } else if (fitem.options.template === 'filter.media-item') { sval= '<img class="img-selected" src="'+JABaseUrl + '/' +sval+'" />'; } } else if (fitem.is('LNFilterRange')) { fval = fitem.options.field; field = fitem.options.title; sval = fitem.toString(); rval = fitem.value; } else if (fitem.is('LNFilterDate')) { fval = fitem.options.field; field = fitem.options.title; var from = fitem.$item.find('.jafrom').val(), to = fitem.$item.find('.jato').val(); sval = from+' '+Joomla.JText._('COM_JAMEGAFILTER_TO')+' '+ to; rval = from+','+to; } else { fval = fitem.options.field; field = fitem.options.title; rval = fitem.value; sval = rval; } if (!self.values[fval]) self.values[fval] = []; self.values[fval].push({prop: prop, name: field, value: sval, raw_value: rval}); } // update url hash if (self.registeredClearFilterEvent) { var hash = []; self.filterFields.forEach(function(field) { var val = null; if (self.values[field]) { var vals = []; self.values[field].forEach(function(val){ vals.push(val.raw_value); }); val = vals.join(','); } self.setQS(field, val); }) } //self.super.beforeRender(); } self.afterRender = function () { if (Object.keys(self.values).length) self.$item.parent().removeClass ('empty'); else self.$item.parent().addClass ('empty'); self.super.afterRender(); self.registerClearFilter(); } self.registerClearFilter = function () { if (self.registeredClearFilterEvent) return; self.registeredClearFilterEvent = true; // listening click on filter-clear $(self.options.container).on('click', function (e) { var $item = $(e.target); if ($item.is ('.clear-filter')) { var lnprop = $item.data('lnprop'), item = self.selectedFilters[lnprop]; item.reset(); } if ($item.is ('.clear-all-filter')) { self.resetAll(); } }) } self.resetAll = function () { for(var prop in self.selectedFilters) { var fitem = self.selectedFilters[prop]; fitem.reset(); } } }) ; var LNToolbar = LNBase.extend(function() { // private variable var self = this, $ = jQuery; self.type = 'LNToolbar'; self.options = null; self.defaultOptions = { template: 'product-toolbar', class: 'products-toolbar', rerenderWhenUpdate: true }; self.lnItems = null; self.startIdx = 0; self.endIdx = 0; self.totalItems = 0; self.page = 0; self.itemPerPage = 0; self.nextPage = null; self.sortDir = ''; self.constructor = function (options) { self.super.constructor(options); // get from config self.sortByOptions = self.options.config.sortByOptions; self.productsPerPageAllowed = self.options.config.productsPerPageAllowed; self.itemPerPage = self.productsPerPageAllowed[0]; self.autopage = self.options.config.autopage; } self.beforeRender = function () { self.startIdx = self.lnItems.matchedIds.length ? self.lnItems.startIdx:0; self.endIdx = self.lnItems.endIdx; self.totalItems = self.lnItems.matchedIds.length; self.curPage = parseInt(self.lnItems.page); self.itemPerPage = self.lnItems.itemPerPage; // calculate pages, prevPage, nextPage var pages = Math.ceil(self.totalItems / self.itemPerPage); self.startPage = 1; self.endPage = pages; self.prevPage = self.curPage > 1 ? self.curPage - 1 : 1; self.nextPage = self.curPage < pages ? self.curPage + 1 : pages; self.pages = null; if (pages > 1) { self.pages = []; var start, end; start = self.curPage - 2; if (start < 1) start = 1; end = 5 + start; if (end > pages) { end = pages; start = end - 5; if (start < 1) start = 1; } for (var i=start; i<=end; i++) self.pages.push(i); } // if (self.lnItems.sortField.search('.value') !== -1) // self.lnItems.sortField = self.lnItems.sortField.replace('.value', '.frontend_value'); self.sortField = self.lnItems.sortField; self.sortDir = self.lnItems.sortDir == 'desc' ? 'asc' : 'desc'; } // Filter base on list data items self.addItems = function (lnItems) { self.lnItems = lnItems; } self.setPage = function (p) { self.page = p; } self.afterRender = function () { if (!self.actionHandled) { self.actionHandled = true; self.$item.parent().on('click', function (e) { var $btn = $(e.target).closest('[data-action]'), action = 'do' + $btn.data('action'); if (!self[action]) return false; var value = $btn.data('value'); self[action](value); return false; }).on('change', function (e) { var $elem = $(e.target); if ($elem.prop('tagName') == 'SELECT') { var $btn = $elem.find(":selected"), action = 'do' + $btn.data('action'); if (!self[action]) return false; var value = $btn.data('value'); self[action](value); return false; } }); } } self.dopage = function (value) { if (value != self.lnItems.page){ self.lnItems.setPage(value).updateRender(); } } self.dosort = function (value) { if (value != self.lnItems.sortField) { self.lnItems.sort(value).setMatchedItems(self.lnItems.matchedIds).updateRender(); } } self.dosortdir = function (value) { var sorDir = value == 'desc' ? 'desc' : 'asc'; self.lnItems.sort(undefined, sorDir).setMatchedItems(self.lnItems.matchedIds).updateRender(); } self.dolimiter = function (value) { if (value != self.lnItems.itemPerPage) { self.lnItems.setLimiter(value).updateRender(); } } self.load = function () { var qs = self.getQS(); // set default toolbar value qs.setDefault({ page: 1, limiter: self.productsPerPageAllowed[0], sort: self.sortByOptions[0].field, sortdir: 'desc' }) //update query string for default sorting if ( !qs.qs.sort ) qs.qs.sort = ja_default_sort; if ( !qs.qs.sortdir ) qs.qs.sortdir = ja_sort_by; for (var name in qs.qs) { var value = qs.qs[name], action = 'do' + name; if (self[action]) { self[action](value); } } } });
查找差异