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