/*! backbone.paginator - v0.6.0 - 3/15/2013 * http://github.com/addyosmani/backbone.paginator * Copyright (c) 2013 Addy Osmani; Licensed MIT */ Backbone.Paginator=function(e,t,n){"use strict";var r={};return r.version="0.6.0",r.clientPager=e.Collection.extend({useDiacriticsPlugin:!0,useLevenshteinPlugin:!0,sortColumn:"",sortDirection:"desc",lastSortColumn:"",fieldFilterRules:[],lastFieldFilterRules:[],filterFields:"",filterExpression:"",lastFilterExpression:"",defaults_ui:{firstPage:0,currentPage:1,perPage:5,totalPages:10,pagesInRange:4},initialize:function(){this.on("add",this.addModel,this),this.on("remove",this.removeModel,this),this.setDefaults()},setDefaults:function(){var e=t.defaults(this.paginator_ui,this.defaults_ui);t.defaults(this,e)},addModel:function(e){this.origModels.push(e)},removeModel:function(e){var n=t.indexOf(this.origModels,e);this.origModels.splice(n,1)},sync:function(r,i,s){var o=this;this.setDefaults();var u={};t.each(t.result(o,"server_api"),function(e,n){t.isFunction(e)&&(e=t.bind(e,o),e=e()),u[n]=e});var a=t.clone(o.paginator_core);t.each(a,function(e,n){t.isFunction(e)&&(e=t.bind(e,o),e=e()),a[n]=e}),a=t.defaults(a,{timeout:25e3,cache:!1,type:"GET",dataType:"jsonp"}),a=t.extend(a,{data:decodeURIComponent(n.param(u)),processData:!1,url:t.result(a,"url")},s);var f=e.VERSION.split("."),l=parseInt(f[0],10)===0&&parseInt(f[1],10)===9&&parseInt(f[2],10)<=9,c=a.success;a.success=function(e,t,n){c&&(l?c(e,t,n):c(i,e,a)),i&&i.trigger&&i.trigger("sync",i,e,a)};var h=a.error;a.error=function(e){h&&h(i,e,a),i&&i.trigger&&i.trigger("error",i,e,a)};var p=a.xhr=n.ajax(a);return i&&i.trigger&&i.trigger("request",i,p,a),p},nextPage:function(e){this.currentPage1&&(this.currentPage=--this.currentPage,this.pager(e))},goTo:function(e,t){e!==undefined&&(this.currentPage=parseInt(e,10),this.pager(t))},howManyPer:function(e){if(e!==undefined){var t=this.perPage;this.perPage=parseInt(e,10),this.currentPage=Math.ceil((t*(this.currentPage-1)+1)/e),this.pager()}},setSort:function(e,t){e!==undefined&&t!==undefined&&(this.lastSortColumn=this.sortColumn,this.sortColumn=e,this.sortDirection=t,this.pager(),this.info())},setFieldFilter:function(e){t.isEmpty(e)?(this.lastFieldFilterRules=this.fieldFilterRules,this.fieldFilterRules="",this.pager(),this.info()):(this.lastFieldFilterRules=this.fieldFilterRules,this.fieldFilterRules=e,this.pager(),this.info())},doFakeFieldFilter:function(e){if(!t.isEmpty(e)){var n=this.origModels;return n===undefined&&(n=this.models),n=this._fieldFilter(n,e),this.filterExpression!==""&&(n=this._filter(n,this.filterFields,this.filterExpression)),n.length}},setFilter:function(e,t){e!==undefined&&t!==undefined&&(this.filterFields=e,this.lastFilterExpression=this.filterExpression,this.filterExpression=t,this.pager(),this.info())},doFakeFilter:function(e,n){if(e!==undefined&&n!==undefined){var r=this.origModels;return r===undefined&&(r=this.models),t.isEmpty(this.fieldFilterRules)||(r=this._fieldFilter(r,this.fieldFilterRules)),r=this._filter(r,e,n),r.length}},pager:function(e){var n=this,r=this.perPage,i=(n.currentPage-1)*r,s=i+r;n.origModels===undefined&&(n.origModels=n.models),n.models=n.origModels.slice(),this.sortColumn!==""&&(n.models=n._sort(n.models,this.sortColumn,this.sortDirection)),t.isEmpty(this.fieldFilterRules)||(n.models=n._fieldFilter(n.models,this.fieldFilterRules)),this.filterExpression!==""&&(n.models=n._filter(n.models,this.filterFields,this.filterExpression));if(this.lastSortColumn!==this.sortColumn||this.lastFilterExpression!==this.filterExpression||!t.isEqual(this.fieldFilterRules,this.lastFieldFilterRules))i=0,s=i+r,n.currentPage=1,this.lastSortColumn=this.sortColumn,this.lastFieldFilterRules=this.fieldFilterRules,this.lastFilterExpression=this.filterExpression;n.sortedAndFilteredModels=n.models.slice(),n.info(),n.reset(n.models.slice(i,s)),t.result(e,"success")},_sort:function(e,n,r){return e=e.sort(function(e,i){var s=e.get(n),o=i.get(n);if(t.isUndefined(s)||t.isUndefined(o)||s===null||o===null)return 0;s=s.toString().toLowerCase(),o=o.toString().toLowerCase();if(r==="desc")if(!s.match(/[^\-\d\.]/)&&s.match(/-?[\d\.]+/)&&!o.match(/[^\-\d\.]/)&&o.match(/-?[\d\.]+/)){if(s-0o-0)return-1}else{if(so)return-1}else if(!s.match(/[^\-\d\.]/)&&s.match(/-?[\d\.]+/)&&!o.match(/[^\-\d\.]/)&&o.match(/-?[\d\.]+/)){if(s-0o-0)return 1}else{if(so)return 1}if(e.cid&&i.cid){var u=e.cid,a=i.cid;if(ua)return 1}return 0}),e},_fieldFilter:function(e,n){if(t.isEmpty(n))return e;var r=[];return t.each(e,function(e){var i=!0;t.each(n,function(n){if(!i)return!1;i=!1;if(n.type==="function"){var r=t.wrap(n.value,function(t){return t(e.get(n.field))});r()&&(i=!0)}else n.type==="required"?t.isEmpty(e.get(n.field).toString())||(i=!0):n.type==="min"?!t.isNaN(Number(e.get(n.field)))&&!t.isNaN(Number(n.value))&&Number(e.get(n.field))>=Number(n.value)&&(i=!0):n.type==="max"?!t.isNaN(Number(e.get(n.field)))&&!t.isNaN(Number(n.value))&&Number(e.get(n.field))<=Number(n.value)&&(i=!0):n.type==="range"?!t.isNaN(Number(e.get(n.field)))&&t.isObject(n.value)&&!t.isNaN(Number(n.value.min))&&!t.isNaN(Number(n.value.max))&&Number(e.get(n.field))>=Number(n.value.min)&&Number(e.get(n.field))<=Number(n.value.max)&&(i=!0):n.type==="minLength"?e.get(n.field).toString().length>=n.value&&(i=!0):n.type==="maxLength"?e.get(n.field).toString().length<=n.value&&(i=!0):n.type==="rangeLength"?t.isObject(n.value)&&!t.isNaN(Number(n.value.min))&&!t.isNaN(Number(n.value.max))&&e.get(n.field).toString().length>=n.value.min&&e.get(n.field).toString().length<=n.value.max&&(i=!0):n.type==="oneOf"?t.isArray(n.value)&&t.include(n.value,e.get(n.field))&&(i=!0):n.type==="equalTo"?n.value===e.get(n.field)&&(i=!0):n.type==="containsAllOf"?t.isArray(n.value)&&t.isArray(e.get(n.field))&&t.intersection(n.value,e.get(n.field)).length===n.value.length&&(i=!0):n.type==="pattern"?e.get(n.field).toString().match(n.value)&&(i=!0):i=!1}),i&&r.push(e)}),r},_filter:function(n,r,i){var s=this,o={};t.isString(r)?o[r]={cmp_method:"regexp"}:t.isArray(r)?t.each(r,function(e){o[e]={cmp_method:"regexp"}}):t.each(r,function(e,n){o[n]=t.defaults(e,{cmp_method:"regexp"})}),r=o,t.has(e.Paginator,"removeDiacritics")&&s.useDiacriticsPlugin&&(i=e.Paginator.removeDiacritics(i));if(i===""||!t.isString(i))return n;var u=t.map(i.match(/\w+/ig),function(e){return e.toLowerCase()}),a="("+t.uniq(u).join("|")+")",f=new RegExp(a,"igm"),l=[];return t.each(n,function(n){var o=[];t.each(r,function(r,a){var l=n.get(a);if(l){var c=[];t.has(e.Paginator,"removeDiacritics")&&s.useDiacriticsPlugin?l=e.Paginator.removeDiacritics(l.toString()):l=l.toString();if(r.cmp_method==="levenshtein"&&t.has(e.Paginator,"levenshtein")&&s.useLevenshteinPlugin){var h=e.Paginator.levenshtein(l,i);t.defaults(r,{max_distance:0}),h<=r.max_distance&&(c=t.uniq(u))}else c=l.match(f);c=t.map(c,function(e){return e.toString().toLowerCase()}),t.each(c,function(e){o.push(e)})}}),o=t.uniq(t.without(o,"")),t.isEmpty(t.difference(u,o))&&l.push(n)}),l},info:function(){var e=this,t={},n=e.sortedAndFilteredModels?e.sortedAndFilteredModels.length:e.length,r=Math.ceil(n/e.perPage);return t={totalUnfilteredRecords:e.origModels.length,totalRecords:n,currentPage:e.currentPage,perPage:this.perPage,totalPages:r,lastPage:r,previous:!1,next:!1,startRecord:n===0?0:(e.currentPage-1)*this.perPage+1,endRecord:Math.min(n,e.currentPage*this.perPage)},e.currentPage>1&&(t.previous=e.currentPage-1),e.currentPage1)if(s<=1+i)for(n=1,r=s;n<=r;n++)t.push(n);else if(e.currentPage<=this.pagesInRange+1)for(n=1,r=2+i;ne.currentPage&&e.currentPage>this.pagesInRange)for(n=e.currentPage-this.pagesInRange;n<=e.currentPage+this.pagesInRange;n++)t.push(n);else for(n=s-i;n<=s;n++)t.push(n);return t},bootstrap:function(e){return t.extend(this,e),this.goTo(1),this.info(),this}}),r.clientPager.prototype.prevPage=r.clientPager.prototype.previousPage,r.requestPager=e.Collection.extend({sync:function(r,i,s){var o=this;o.setDefaults();var u={};t.each(t.result(o,"server_api"),function(e,n){t.isFunction(e)&&(e=t.bind(e,o),e=e()),u[n]=e});var a=t.clone(o.paginator_core);t.each(a,function(e,n){t.isFunction(e)&&(e=t.bind(e,o),e=e()),a[n]=e}),a=t.defaults(a,{timeout:25e3,cache:!1,type:"GET",dataType:"jsonp"}),s.data?s.data=decodeURIComponent(n.param(t.extend(u,s.data))):s.data=decodeURIComponent(n.param(u)),a=t.extend(a,{data:decodeURIComponent(n.param(u)),processData:!1,url:t.result(a,"url")},s);var f=e.VERSION.split("."),l=parseInt(f[0],10)===0&&parseInt(f[1],10)===9&&parseInt(f[2],10)<=9,c=a.success;a.success=function(e,t,n){c&&(l?c(e,t,n):c(i,e,a)),i&&i.trigger&&i.trigger("sync",i,e,a)};var h=a.error;a.error=function(e){h&&h(i,e,a),i&&i.trigger&&i.trigger("error",i,e,a)};var p=a.xhr=n.ajax(a);return i&&i.trigger&&i.trigger("request",i,p,a),p},setDefaults:function(){var e=this;t.defaults(e.paginator_ui,{firstPage:0,currentPage:1,perPage:5,totalPages:10,pagesInRange:4}),t.each(e.paginator_ui,function(n,r){t.isUndefined(e[r])&&(e[r]=e.paginator_ui[r])})},requestNextPage:function(e){if(this.currentPage!==undefined)return this.currentPage+=1,this.pager(e);var t=new n.Deferred;return t.reject(),t.promise()},requestPreviousPage:function(e){if(this.currentPage!==undefined)return this.currentPage-=1,this.pager(e);var t=new n.Deferred;return t.reject(),t.promise()},updateOrder:function(e){e!==undefined&&(this.sortField=e,this.pager())},goTo:function(e,t){if(e!==undefined)return this.currentPage=parseInt(e,10),this.pager(t);var r=new n.Deferred;return r.reject(),r.promise()},howManyPer:function(e){e!==undefined&&(this.currentPage=this.firstPage,this.perPage=e,this.pager())},info:function(){var e={totalRecords:this.totalRecords||0,currentPage:this.currentPage,firstPage:this.firstPage,totalPages:Math.ceil(this.totalRecords/this.perPage),lastPage:this.totalPages,perPage:this.perPage,previous:!1,next:!1};return this.currentPage>1&&(e.previous=this.currentPage-1),this.currentPage1)if(s<=1+i)for(n=1,r=s;n<=r;n++)t.push(n);else if(e.currentPage<=this.pagesInRange+1)for(n=1,r=2+i;ne.currentPage&&e.currentPage>this.pagesInRange)for(n=e.currentPage-this.pagesInRange;n<=e.currentPage+this.pagesInRange;n++)t.push(n);else for(n=s-i;n<=s;n++)t.push(n);return t},pager:function(e){return t.isObject(e)||(e={}),this.fetch(e)},url:function(){return this.paginator_core!==undefined&&this.paginator_core.url!==undefined?this.paginator_core.url:null},bootstrap:function(e){return t.extend(this,e),this.setDefaults(),this.info(),this}}),r.requestPager.prototype.nextPage=r.requestPager.prototype.requestNextPage,r.requestPager.prototype.prevPage=r.requestPager.prototype.requestPreviousPage,r}(Backbone,_,jQuery);