PK!ZDDmorris/morris.min.jsnu[/* @license morris.js v0.5.0 Copyright 2014 Olly Smith All rights reserved. Licensed under the BSD-2-Clause License. */ (function(){var a,b,c,d,e=[].slice,f=function(a,b){return function(){return a.apply(b,arguments)}},g={}.hasOwnProperty,h=function(a,b){function c(){this.constructor=a}for(var d in b)g.call(b,d)&&(a[d]=b[d]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},i=[].indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(b in this&&this[b]===a)return b;return-1};b=window.Morris={},a=jQuery,b.EventEmitter=function(){function a(){}return a.prototype.on=function(a,b){return null==this.handlers&&(this.handlers={}),null==this.handlers[a]&&(this.handlers[a]=[]),this.handlers[a].push(b),this},a.prototype.fire=function(){var a,b,c,d,f,g,h;if(c=arguments[0],a=2<=arguments.length?e.call(arguments,1):[],null!=this.handlers&&null!=this.handlers[c]){for(g=this.handlers[c],h=[],d=0,f=g.length;f>d;d++)b=g[d],h.push(b.apply(null,a));return h}},a}(),b.commas=function(a){var b,c,d,e;return null!=a?(d=0>a?"-":"",b=Math.abs(a),c=Math.floor(b).toFixed(0),d+=c.replace(/(?=(?:\d{3})+$)(?!^)/g,","),e=b.toString(),e.length>c.length&&(d+=e.slice(c.length)),d):"-"},b.pad2=function(a){return(10>a?"0":"")+a},b.Grid=function(c){function d(b){this.resizeHandler=f(this.resizeHandler,this);var c=this;if(this.el="string"==typeof b.element?a(document.getElementById(b.element)):a(b.element),null==this.el||0===this.el.length)throw new Error("Graph container element not found");"static"===this.el.css("position")&&this.el.css("position","relative"),this.options=a.extend({},this.gridDefaults,this.defaults||{},b),"string"==typeof this.options.units&&(this.options.postUnits=b.units),this.raphael=new Raphael(this.el[0]),this.elementWidth=null,this.elementHeight=null,this.dirty=!1,this.selectFrom=null,this.init&&this.init(),this.setData(this.options.data),this.el.bind("mousemove",function(a){var b,d,e,f,g;return d=c.el.offset(),g=a.pageX-d.left,c.selectFrom?(b=c.data[c.hitTest(Math.min(g,c.selectFrom))]._x,e=c.data[c.hitTest(Math.max(g,c.selectFrom))]._x,f=e-b,c.selectionRect.attr({x:b,width:f})):c.fire("hovermove",g,a.pageY-d.top)}),this.el.bind("mouseleave",function(){return c.selectFrom&&(c.selectionRect.hide(),c.selectFrom=null),c.fire("hoverout")}),this.el.bind("touchstart touchmove touchend",function(a){var b,d;return d=a.originalEvent.touches[0]||a.originalEvent.changedTouches[0],b=c.el.offset(),c.fire("hovermove",d.pageX-b.left,d.pageY-b.top)}),this.el.bind("click",function(a){var b;return b=c.el.offset(),c.fire("gridclick",a.pageX-b.left,a.pageY-b.top)}),this.options.rangeSelect&&(this.selectionRect=this.raphael.rect(0,0,0,this.el.innerHeight()).attr({fill:this.options.rangeSelectColor,stroke:!1}).toBack().hide(),this.el.bind("mousedown",function(a){var b;return b=c.el.offset(),c.startRange(a.pageX-b.left)}),this.el.bind("mouseup",function(a){var b;return b=c.el.offset(),c.endRange(a.pageX-b.left),c.fire("hovermove",a.pageX-b.left,a.pageY-b.top)})),this.options.resize&&a(window).bind("resize",function(){return null!=c.timeoutId&&window.clearTimeout(c.timeoutId),c.timeoutId=window.setTimeout(c.resizeHandler,100)}),this.el.css("-webkit-tap-highlight-color","rgba(0,0,0,0)"),this.postInit&&this.postInit()}return h(d,c),d.prototype.gridDefaults={dateFormat:null,axes:!0,grid:!0,gridLineColor:"#aaa",gridStrokeWidth:.5,gridTextColor:"#888",gridTextSize:12,gridTextFamily:"sans-serif",gridTextWeight:"normal",hideHover:!1,yLabelFormat:null,xLabelAngle:0,numLines:5,padding:25,parseTime:!0,postUnits:"",preUnits:"",ymax:"auto",ymin:"auto 0",goals:[],goalStrokeWidth:1,goalLineColors:["#666633","#999966","#cc6666","#663333"],events:[],eventStrokeWidth:1,eventLineColors:["#005a04","#ccffbb","#3a5f0b","#005502"],rangeSelect:null,rangeSelectColor:"#eef",resize:!1},d.prototype.setData=function(a,c){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;return null==c&&(c=!0),this.options.data=a,null==a||0===a.length?(this.data=[],this.raphael.clear(),null!=this.hover&&this.hover.hide(),void 0):(o=this.cumulative?0:null,p=this.cumulative?0:null,this.options.goals.length>0&&(h=Math.min.apply(Math,this.options.goals),g=Math.max.apply(Math,this.options.goals),p=null!=p?Math.min(p,h):h,o=null!=o?Math.max(o,g):g),this.data=function(){var c,d,g;for(g=[],f=c=0,d=a.length;d>c;f=++c)j=a[f],i={src:j},i.label=j[this.options.xkey],this.options.parseTime?(i.x=b.parseDate(i.label),this.options.dateFormat?i.label=this.options.dateFormat(i.x):"number"==typeof i.label&&(i.label=new Date(i.label).toString())):(i.x=f,this.options.xLabelFormat&&(i.label=this.options.xLabelFormat(i))),l=0,i.y=function(){var a,b,c,d;for(c=this.options.ykeys,d=[],e=a=0,b=c.length;b>a;e=++a)n=c[e],q=j[n],"string"==typeof q&&(q=parseFloat(q)),null!=q&&"number"!=typeof q&&(q=null),null!=q&&(this.cumulative?l+=q:null!=o?(o=Math.max(q,o),p=Math.min(q,p)):o=p=q),this.cumulative&&null!=l&&(o=Math.max(l,o),p=Math.min(l,p)),d.push(q);return d}.call(this),g.push(i);return g}.call(this),this.options.parseTime&&(this.data=this.data.sort(function(a,b){return(a.x>b.x)-(b.x>a.x)})),this.xmin=this.data[0].x,this.xmax=this.data[this.data.length-1].x,this.events=[],this.options.events.length>0&&(this.events=this.options.parseTime?function(){var a,c,e,f;for(e=this.options.events,f=[],a=0,c=e.length;c>a;a++)d=e[a],f.push(b.parseDate(d));return f}.call(this):this.options.events,this.xmax=Math.max(this.xmax,Math.max.apply(Math,this.events)),this.xmin=Math.min(this.xmin,Math.min.apply(Math,this.events))),this.xmin===this.xmax&&(this.xmin-=1,this.xmax+=1),this.ymin=this.yboundary("min",p),this.ymax=this.yboundary("max",o),this.ymin===this.ymax&&(p&&(this.ymin-=1),this.ymax+=1),((r=this.options.axes)===!0||"both"===r||"y"===r||this.options.grid===!0)&&(this.options.ymax===this.gridDefaults.ymax&&this.options.ymin===this.gridDefaults.ymin?(this.grid=this.autoGridLines(this.ymin,this.ymax,this.options.numLines),this.ymin=Math.min(this.ymin,this.grid[0]),this.ymax=Math.max(this.ymax,this.grid[this.grid.length-1])):(k=(this.ymax-this.ymin)/(this.options.numLines-1),this.grid=function(){var a,b,c,d;for(d=[],m=a=b=this.ymin,c=this.ymax;k>0?c>=a:a>=c;m=a+=k)d.push(m);return d}.call(this))),this.dirty=!0,c?this.redraw():void 0)},d.prototype.yboundary=function(a,b){var c,d;return c=this.options["y"+a],"string"==typeof c?"auto"===c.slice(0,4)?c.length>5?(d=parseInt(c.slice(5),10),null==b?d:Math[a](b,d)):null!=b?b:0:parseInt(c,10):c},d.prototype.autoGridLines=function(a,b,c){var d,e,f,g,h,i,j,k,l;return h=b-a,l=Math.floor(Math.log(h)/Math.log(10)),j=Math.pow(10,l),e=Math.floor(a/j)*j,d=Math.ceil(b/j)*j,i=(d-e)/(c-1),1===j&&i>1&&Math.ceil(i)!==i&&(i=Math.ceil(i),d=e+i*(c-1)),0>e&&d>0&&(e=Math.floor(a/i)*i,d=Math.ceil(b/i)*i),1>i?(g=Math.floor(Math.log(i)/Math.log(10)),f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(parseFloat(k.toFixed(1-g)));return b}()):f=function(){var a,b;for(b=[],k=a=e;i>0?d>=a:a>=d;k=a+=i)b.push(k);return b}(),f},d.prototype._calc=function(){var a,b,c,d,e,f,g,h;return e=this.el.width(),c=this.el.height(),(this.elementWidth!==e||this.elementHeight!==c||this.dirty)&&(this.elementWidth=e,this.elementHeight=c,this.dirty=!1,this.left=this.options.padding,this.right=this.elementWidth-this.options.padding,this.top=this.options.padding,this.bottom=this.elementHeight-this.options.padding,((g=this.options.axes)===!0||"both"===g||"y"===g)&&(f=function(){var a,c,d,e;for(d=this.grid,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(this.measureText(this.yAxisFormat(b)).width);return e}.call(this),this.left+=Math.max.apply(Math,f)),((h=this.options.axes)===!0||"both"===h||"x"===h)&&(a=function(){var a,b,c;for(c=[],d=a=0,b=this.data.length;b>=0?b>a:a>b;d=b>=0?++a:--a)c.push(this.measureText(this.data[d].text,-this.options.xLabelAngle).height);return c}.call(this),this.bottom-=Math.max.apply(Math,a)),this.width=Math.max(1,this.right-this.left),this.height=Math.max(1,this.bottom-this.top),this.dx=this.width/(this.xmax-this.xmin),this.dy=this.height/(this.ymax-this.ymin),this.calc)?this.calc():void 0},d.prototype.transY=function(a){return this.bottom-(a-this.ymin)*this.dy},d.prototype.transX=function(a){return 1===this.data.length?(this.left+this.right)/2:this.left+(a-this.xmin)*this.dx},d.prototype.redraw=function(){return this.raphael.clear(),this._calc(),this.drawGrid(),this.drawGoals(),this.drawEvents(),this.draw?this.draw():void 0},d.prototype.measureText=function(a,b){var c,d;return null==b&&(b=0),d=this.raphael.text(100,100,a).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).rotate(b),c=d.getBBox(),d.remove(),c},d.prototype.yAxisFormat=function(a){return this.yLabelFormat(a)},d.prototype.yLabelFormat=function(a){return"function"==typeof this.options.yLabelFormat?this.options.yLabelFormat(a):""+this.options.preUnits+b.commas(a)+this.options.postUnits},d.prototype.drawGrid=function(){var a,b,c,d,e,f,g,h;if(this.options.grid!==!1||(e=this.options.axes)===!0||"both"===e||"y"===e){for(f=this.grid,h=[],c=0,d=f.length;d>c;c++)a=f[c],b=this.transY(a),((g=this.options.axes)===!0||"both"===g||"y"===g)&&this.drawYAxisLabel(this.left-this.options.padding/2,b,this.yAxisFormat(a)),this.options.grid?h.push(this.drawGridLine("M"+this.left+","+b+"H"+(this.left+this.width))):h.push(void 0);return h}},d.prototype.drawGoals=function(){var a,b,c,d,e,f,g;for(f=this.options.goals,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.goalLineColors[c%this.options.goalLineColors.length],g.push(this.drawGoal(b,a));return g},d.prototype.drawEvents=function(){var a,b,c,d,e,f,g;for(f=this.events,g=[],c=d=0,e=f.length;e>d;c=++d)b=f[c],a=this.options.eventLineColors[c%this.options.eventLineColors.length],g.push(this.drawEvent(b,a));return g},d.prototype.drawGoal=function(a,b){return this.raphael.path("M"+this.left+","+this.transY(a)+"H"+this.right).attr("stroke",b).attr("stroke-width",this.options.goalStrokeWidth)},d.prototype.drawEvent=function(a,b){return this.raphael.path("M"+this.transX(a)+","+this.bottom+"V"+this.top).attr("stroke",b).attr("stroke-width",this.options.eventStrokeWidth)},d.prototype.drawYAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor).attr("text-anchor","end")},d.prototype.drawGridLine=function(a){return this.raphael.path(a).attr("stroke",this.options.gridLineColor).attr("stroke-width",this.options.gridStrokeWidth)},d.prototype.startRange=function(a){return this.hover.hide(),this.selectFrom=a,this.selectionRect.attr({x:a,width:0}).show()},d.prototype.endRange=function(a){var b,c;return this.selectFrom?(c=Math.min(this.selectFrom,a),b=Math.max(this.selectFrom,a),this.options.rangeSelect.call(this.el,{start:this.data[this.hitTest(c)].x,end:this.data[this.hitTest(b)].x}),this.selectFrom=null):void 0},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.parseDate=function(a){var b,c,d,e,f,g,h,i,j,k,l;return"number"==typeof a?a:(c=a.match(/^(\d+) Q(\d)$/),e=a.match(/^(\d+)-(\d+)$/),f=a.match(/^(\d+)-(\d+)-(\d+)$/),h=a.match(/^(\d+) W(\d+)$/),i=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/),j=a.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/),c?new Date(parseInt(c[1],10),3*parseInt(c[2],10)-1,1).getTime():e?new Date(parseInt(e[1],10),parseInt(e[2],10)-1,1).getTime():f?new Date(parseInt(f[1],10),parseInt(f[2],10)-1,parseInt(f[3],10)).getTime():h?(k=new Date(parseInt(h[1],10),0,1),4!==k.getDay()&&k.setMonth(0,1+(4-k.getDay()+7)%7),k.getTime()+6048e5*parseInt(h[2],10)):i?i[6]?(g=0,"Z"!==i[6]&&(g=60*parseInt(i[8],10)+parseInt(i[9],10),"+"===i[7]&&(g=0-g)),Date.UTC(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)+g)):new Date(parseInt(i[1],10),parseInt(i[2],10)-1,parseInt(i[3],10),parseInt(i[4],10),parseInt(i[5],10)).getTime():j?(l=parseFloat(j[6]),b=Math.floor(l),d=Math.round(1e3*(l-b)),j[8]?(g=0,"Z"!==j[8]&&(g=60*parseInt(j[10],10)+parseInt(j[11],10),"+"===j[9]&&(g=0-g)),Date.UTC(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10)+g,b,d)):new Date(parseInt(j[1],10),parseInt(j[2],10)-1,parseInt(j[3],10),parseInt(j[4],10),parseInt(j[5],10),b,d).getTime()):new Date(parseInt(a,10),0,1).getTime())},b.Hover=function(){function c(c){null==c&&(c={}),this.options=a.extend({},b.Hover.defaults,c),this.el=a("
"),this.el.hide(),this.options.parent.append(this.el)}return c.defaults={"class":"morris-hover morris-default-style"},c.prototype.update=function(a,b,c){return a?(this.html(a),this.show(),this.moveTo(b,c)):this.hide()},c.prototype.html=function(a){return this.el.html(a)},c.prototype.moveTo=function(a,b){var c,d,e,f,g,h;return g=this.options.parent.innerWidth(),f=this.options.parent.innerHeight(),d=this.el.outerWidth(),c=this.el.outerHeight(),e=Math.min(Math.max(0,a-d/2),g-d),null!=b?(h=b-c-10,0>h&&(h=b+10,h+c>f&&(h=f/2-c/2))):h=f/2-c/2,this.el.css({left:e+"px",top:parseInt(h)+"px"})},c.prototype.show=function(){return this.el.show()},c.prototype.hide=function(){return this.el.hide()},c}(),b.Line=function(a){function c(a){return this.hilight=f(this.hilight,this),this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Line?(c.__super__.constructor.call(this,a),void 0):new b.Line(a)}return h(c,a),c.prototype.init=function(){return"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},c.prototype.defaults={lineWidth:3,pointSize:4,lineColors:["#0b62a4","#7A92A3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],pointStrokeWidths:[1],pointStrokeColors:["#ffffff"],pointFillColors:[],smooth:!0,xLabels:"auto",xLabelFormat:null,xLabelMargin:24,hideHover:!1},c.prototype.calc=function(){return this.calcPoints(),this.generatePaths()},c.prototype.calcPoints=function(){var a,b,c,d,e,f;for(e=this.data,f=[],c=0,d=e.length;d>c;c++)a=e[c],a._x=this.transX(a.x),a._y=function(){var c,d,e,f;for(e=a.y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b?f.push(this.transY(b)):f.push(b);return f}.call(this),f.push(a._ymax=Math.min.apply(Math,[this.bottom].concat(function(){var c,d,e,f;for(e=a._y,f=[],c=0,d=e.length;d>c;c++)b=e[c],null!=b&&f.push(b);return f}())));return f},c.prototype.hitTest=function(a){var b,c,d,e,f;if(0===this.data.length)return null;for(f=this.data.slice(1),b=d=0,e=f.length;e>d&&(c=f[b],!(a<(c._x+this.data[b]._x)/2));b=++d);return b},c.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},c.prototype.onHoverMove=function(a){var b;return b=this.hitTest(a),this.displayHoverForRow(b)},c.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.displayHoverForRow(null):void 0},c.prototype.displayHoverForRow=function(a){var b;return null!=a?((b=this.hover).update.apply(b,this.hoverContentForRow(a)),this.hilight(a)):(this.hover.hide(),this.hilight())},c.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h;for(d=this.data[a],b="
"+d.label+"
",h=d.y,c=f=0,g=h.length;g>f;c=++f)e=h[c],b+="
\n "+this.options.labels[c]+":\n "+this.yLabelFormat(e)+"\n
";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),[b,d._x,d._ymax]},c.prototype.generatePaths=function(){var a,c,d,e;return this.paths=function(){var f,g,h,j;for(j=[],c=f=0,g=this.options.ykeys.length;g>=0?g>f:f>g;c=g>=0?++f:--f)e="boolean"==typeof this.options.smooth?this.options.smooth:(h=this.options.ykeys[c],i.call(this.options.smooth,h)>=0),a=function(){var a,b,e,f;for(e=this.data,f=[],a=0,b=e.length;b>a;a++)d=e[a],void 0!==d._y[c]&&f.push({x:d._x,y:d._y[c]});return f}.call(this),a.length>1?j.push(b.Line.createPath(a,e,this.bottom)):j.push(null);return j}.call(this)},c.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries(),this.options.hideHover===!1?this.displayHoverForRow(this.data.length-1):void 0},c.prototype.drawXAxis=function(){var a,c,d,e,f,g,h,i,j,k,l=this;for(h=this.bottom+this.options.padding/2,f=null,e=null,a=function(a,b){var c,d,g,i,j;return c=l.drawXAxisLabel(l.transX(b),h,a),j=c.getBBox(),c.transform("r"+-l.options.xLabelAngle),d=c.getBBox(),c.transform("t0,"+d.height/2+"..."),0!==l.options.xLabelAngle&&(i=-.5*j.width*Math.cos(l.options.xLabelAngle*Math.PI/180),c.transform("t"+i+",0...")),d=c.getBBox(),(null==f||f>=d.x+d.width||null!=e&&e>=d.x)&&d.x>=0&&d.x+d.widtha;a++)g=c[a],d.push([g.label,g.x]);return d}.call(this),d.reverse(),k=[],i=0,j=d.length;j>i;i++)c=d[i],k.push(a(c[0],c[1]));return k},c.prototype.drawSeries=function(){var a,b,c,d,e,f;for(this.seriesPoints=[],a=b=d=this.options.ykeys.length-1;0>=d?0>=b:b>=0;a=0>=d?++b:--b)this._drawLineFor(a);for(f=[],a=c=e=this.options.ykeys.length-1;0>=e?0>=c:c>=0;a=0>=e?++c:--c)f.push(this._drawPointFor(a));return f},c.prototype._drawPointFor=function(a){var b,c,d,e,f,g;for(this.seriesPoints[a]=[],f=this.data,g=[],d=0,e=f.length;e>d;d++)c=f[d],b=null,null!=c._y[a]&&(b=this.drawLinePoint(c._x,c._y[a],this.colorFor(c,a,"point"),a)),g.push(this.seriesPoints[a].push(b));return g},c.prototype._drawLineFor=function(a){var b;return b=this.paths[a],null!==b?this.drawLinePath(b,this.colorFor(null,a,"line"),a):void 0},c.createPath=function(a,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r;for(k="",c&&(g=b.Line.gradients(a)),l={y:null},h=q=0,r=a.length;r>q;h=++q)e=a[h],null!=e.y&&(null!=l.y?c?(f=g[h],j=g[h-1],i=(e.x-l.x)/4,m=l.x+i,o=Math.min(d,l.y+i*j),n=e.x-i,p=Math.min(d,e.y-i*f),k+="C"+m+","+o+","+n+","+p+","+e.x+","+e.y):k+="L"+e.x+","+e.y:c&&null==g[h]||(k+="M"+e.x+","+e.y)),l=e;return k},c.gradients=function(a){var b,c,d,e,f,g,h,i;for(c=function(a,b){return(a.y-b.y)/(a.x-b.x)},i=[],d=g=0,h=a.length;h>g;d=++g)b=a[d],null!=b.y?(e=a[d+1]||{y:null},f=a[d-1]||{y:null},null!=f.y&&null!=e.y?i.push(c(f,e)):null!=f.y?i.push(c(f,b)):null!=e.y?i.push(c(b,e)):i.push(null)):i.push(null);return i},c.prototype.hilight=function(a){var b,c,d,e,f;if(null!==this.prevHilight&&this.prevHilight!==a)for(b=c=0,e=this.seriesPoints.length-1;e>=0?e>=c:c>=e;b=e>=0?++c:--c)this.seriesPoints[b][this.prevHilight]&&this.seriesPoints[b][this.prevHilight].animate(this.pointShrinkSeries(b));if(null!==a&&this.prevHilight!==a)for(b=d=0,f=this.seriesPoints.length-1;f>=0?f>=d:d>=f;b=f>=0?++d:--d)this.seriesPoints[b][a]&&this.seriesPoints[b][a].animate(this.pointGrowSeries(b));return this.prevHilight=a},c.prototype.colorFor=function(a,b,c){return"function"==typeof this.options.lineColors?this.options.lineColors.call(this,a,b,c):"point"===c?this.options.pointFillColors[b%this.options.pointFillColors.length]||this.options.lineColors[b%this.options.lineColors.length]:this.options.lineColors[b%this.options.lineColors.length]},c.prototype.drawXAxisLabel=function(a,b,c){return this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},c.prototype.drawLinePath=function(a,b,c){return this.raphael.path(a).attr("stroke",b).attr("stroke-width",this.lineWidthForSeries(c))},c.prototype.drawLinePoint=function(a,b,c,d){return this.raphael.circle(a,b,this.pointSizeForSeries(d)).attr("fill",c).attr("stroke-width",this.pointStrokeWidthForSeries(d)).attr("stroke",this.pointStrokeColorForSeries(d))},c.prototype.pointStrokeWidthForSeries=function(a){return this.options.pointStrokeWidths[a%this.options.pointStrokeWidths.length]},c.prototype.pointStrokeColorForSeries=function(a){return this.options.pointStrokeColors[a%this.options.pointStrokeColors.length]},c.prototype.lineWidthForSeries=function(a){return this.options.lineWidth instanceof Array?this.options.lineWidth[a%this.options.lineWidth.length]:this.options.lineWidth},c.prototype.pointSizeForSeries=function(a){return this.options.pointSize instanceof Array?this.options.pointSize[a%this.options.pointSize.length]:this.options.pointSize},c.prototype.pointGrowSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)+3},25,"linear")},c.prototype.pointShrinkSeries=function(a){return Raphael.animation({r:this.pointSizeForSeries(a)},25,"linear")},c}(b.Grid),b.labelSeries=function(c,d,e,f,g){var h,i,j,k,l,m,n,o,p,q,r;if(j=200*(d-c)/e,i=new Date(c),n=b.LABEL_SPECS[f],void 0===n)for(r=b.AUTO_LABEL_ORDER,p=0,q=r.length;q>p;p++)if(k=r[p],m=b.LABEL_SPECS[k],j>=m.span){n=m;break}for(void 0===n&&(n=b.LABEL_SPECS.second),g&&(n=a.extend({},n,{fmt:g})),h=n.start(i),l=[];(o=h.getTime())<=d;)o>=c&&l.push([n.fmt(h),o]),n.incr(h);return l},c=function(a){return{span:60*a*1e3,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())},incr:function(b){return b.setUTCMinutes(b.getUTCMinutes()+a)}}},d=function(a){return{span:1e3*a,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate(),a.getHours(),a.getMinutes())},fmt:function(a){return""+b.pad2(a.getHours())+":"+b.pad2(a.getMinutes())+":"+b.pad2(a.getSeconds())},incr:function(b){return b.setUTCSeconds(b.getUTCSeconds()+a)}}},b.LABEL_SPECS={decade:{span:1728e8,start:function(a){return new Date(a.getFullYear()-a.getFullYear()%10,0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+10)}},year:{span:1728e7,start:function(a){return new Date(a.getFullYear(),0,1)},fmt:function(a){return""+a.getFullYear()},incr:function(a){return a.setFullYear(a.getFullYear()+1)}},month:{span:24192e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),1)},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)},incr:function(a){return a.setMonth(a.getMonth()+1)}},week:{span:6048e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+7)}},day:{span:864e5,start:function(a){return new Date(a.getFullYear(),a.getMonth(),a.getDate())},fmt:function(a){return""+a.getFullYear()+"-"+b.pad2(a.getMonth()+1)+"-"+b.pad2(a.getDate())},incr:function(a){return a.setDate(a.getDate()+1)}},hour:c(60),"30min":c(30),"15min":c(15),"10min":c(10),"5min":c(5),minute:c(1),"30sec":d(30),"15sec":d(15),"10sec":d(10),"5sec":d(5),second:d(1)},b.AUTO_LABEL_ORDER=["decade","year","month","week","day","hour","30min","15min","10min","5min","minute","30sec","15sec","10sec","5sec","second"],b.Area=function(c){function d(c){var f;return this instanceof b.Area?(f=a.extend({},e,c),this.cumulative=!f.behaveLikeLine,"auto"===f.fillOpacity&&(f.fillOpacity=f.behaveLikeLine?.8:1),d.__super__.constructor.call(this,f),void 0):new b.Area(c)}var e;return h(d,c),e={fillOpacity:"auto",behaveLikeLine:!1},d.prototype.calcPoints=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],d=0,e=f.length;e>d;d++)a=f[d],a._x=this.transX(a.x),b=0,a._y=function(){var d,e,f,g;for(f=a.y,g=[],d=0,e=f.length;e>d;d++)c=f[d],this.options.behaveLikeLine?g.push(this.transY(c)):(b+=c||0,g.push(this.transY(b)));return g}.call(this),g.push(a._ymax=Math.max.apply(Math,a._y));return g},d.prototype.drawSeries=function(){var a,b,c,d,e,f,g,h;for(this.seriesPoints=[],b=this.options.behaveLikeLine?function(){f=[];for(var a=0,b=this.options.ykeys.length-1;b>=0?b>=a:a>=b;b>=0?a++:a--)f.push(a);return f}.apply(this):function(){g=[];for(var a=e=this.options.ykeys.length-1;0>=e?0>=a:a>=0;0>=e?a++:a--)g.push(a);return g}.apply(this),h=[],c=0,d=b.length;d>c;c++)a=b[c],this._drawFillFor(a),this._drawLineFor(a),h.push(this._drawPointFor(a));return h},d.prototype._drawFillFor=function(a){var b;return b=this.paths[a],null!==b?(b+="L"+this.transX(this.xmax)+","+this.bottom+"L"+this.transX(this.xmin)+","+this.bottom+"Z",this.drawFilledPath(b,this.fillForSeries(a))):void 0},d.prototype.fillForSeries=function(a){var b;return b=Raphael.rgb2hsl(this.colorFor(this.data[a],a,"line")),Raphael.hsl(b.h,this.options.behaveLikeLine?.9*b.s:.75*b.s,Math.min(.98,this.options.behaveLikeLine?1.2*b.l:1.25*b.l))},d.prototype.drawFilledPath=function(a,b){return this.raphael.path(a).attr("fill",b).attr("fill-opacity",this.options.fillOpacity).attr("stroke","none")},d}(b.Line),b.Bar=function(c){function d(c){return this.onHoverOut=f(this.onHoverOut,this),this.onHoverMove=f(this.onHoverMove,this),this.onGridClick=f(this.onGridClick,this),this instanceof b.Bar?(d.__super__.constructor.call(this,a.extend({},c,{parseTime:!1})),void 0):new b.Bar(c)}return h(d,c),d.prototype.init=function(){return this.cumulative=this.options.stacked,"always"!==this.options.hideHover?(this.hover=new b.Hover({parent:this.el}),this.on("hovermove",this.onHoverMove),this.on("hoverout",this.onHoverOut),this.on("gridclick",this.onGridClick)):void 0},d.prototype.defaults={barSizeRatio:.75,barGap:3,barColors:["#0b62a4","#7a92a3","#4da74d","#afd8f8","#edc240","#cb4b4b","#9440ed"],barOpacity:1,barRadius:[0,0,0,0],xLabelMargin:50},d.prototype.calc=function(){var a;return this.calcBars(),this.options.hideHover===!1?(a=this.hover).update.apply(a,this.hoverContentForRow(this.data.length-1)):void 0},d.prototype.calcBars=function(){var a,b,c,d,e,f,g;for(f=this.data,g=[],a=d=0,e=f.length;e>d;a=++d)b=f[a],b._x=this.left+this.width*(a+.5)/this.data.length,g.push(b._y=function(){var a,d,e,f;for(e=b.y,f=[],a=0,d=e.length;d>a;a++)c=e[a],null!=c?f.push(this.transY(c)):f.push(null);return f}.call(this));return g},d.prototype.draw=function(){var a;return((a=this.options.axes)===!0||"both"===a||"x"===a)&&this.drawXAxis(),this.drawSeries()},d.prototype.drawXAxis=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m;for(j=this.bottom+(this.options.xAxisLabelTopPadding||this.options.padding/2),g=null,f=null,m=[],a=k=0,l=this.data.length;l>=0?l>k:k>l;a=l>=0?++k:--k)h=this.data[this.data.length-1-a],b=this.drawXAxisLabel(h._x,j,h.label),i=b.getBBox(),b.transform("r"+-this.options.xLabelAngle),c=b.getBBox(),b.transform("t0,"+c.height/2+"..."),0!==this.options.xLabelAngle&&(e=-.5*i.width*Math.cos(this.options.xLabelAngle*Math.PI/180),b.transform("t"+e+",0...")),(null==g||g>=c.x+c.width||null!=f&&f>=c.x)&&c.x>=0&&c.x+c.width=0?this.transY(0):null,this.bars=function(){var h,l,p,q;for(p=this.data,q=[],d=h=0,l=p.length;l>h;d=++h)i=p[d],e=0,q.push(function(){var h,l,p,q;for(p=i._y,q=[],j=h=0,l=p.length;l>h;j=++h)n=p[j],null!==n?(o?(m=Math.min(n,o),b=Math.max(n,o)):(m=n,b=this.bottom),f=this.left+d*c+g,this.options.stacked||(f+=j*(a+this.options.barGap)),k=b-m,this.options.verticalGridCondition&&this.options.verticalGridCondition(i.x)&&this.drawBar(this.left+d*c,this.top,c,Math.abs(this.top-this.bottom),this.options.verticalGridColor,this.options.verticalGridOpacity,this.options.barRadius),this.options.stacked&&(m-=e),this.drawBar(f,m,a,k,this.colorFor(i,j,"bar"),this.options.barOpacity,this.options.barRadius),q.push(e+=k)):q.push(null);return q}.call(this));return q}.call(this)},d.prototype.colorFor=function(a,b,c){var d,e;return"function"==typeof this.options.barColors?(d={x:a.x,y:a.y[b],label:a.label},e={index:b,key:this.options.ykeys[b],label:this.options.labels[b]},this.options.barColors.call(this,d,e,c)):this.options.barColors[b%this.options.barColors.length]},d.prototype.hitTest=function(a){return 0===this.data.length?null:(a=Math.max(Math.min(a,this.right),this.left),Math.min(this.data.length-1,Math.floor((a-this.left)/(this.width/this.data.length))))},d.prototype.onGridClick=function(a,b){var c;return c=this.hitTest(a),this.fire("click",c,this.data[c].src,a,b)},d.prototype.onHoverMove=function(a){var b,c;return b=this.hitTest(a),(c=this.hover).update.apply(c,this.hoverContentForRow(b))},d.prototype.onHoverOut=function(){return this.options.hideHover!==!1?this.hover.hide():void 0},d.prototype.hoverContentForRow=function(a){var b,c,d,e,f,g,h,i;for(d=this.data[a],b="
"+d.label+"
",i=d.y,c=g=0,h=i.length;h>g;c=++g)f=i[c],b+="
\n "+this.options.labels[c]+":\n "+this.yLabelFormat(f)+"\n
";return"function"==typeof this.options.hoverCallback&&(b=this.options.hoverCallback(a,this.options,b,d.src)),e=this.left+(a+.5)*this.width/this.data.length,[b,e]},d.prototype.drawXAxisLabel=function(a,b,c){var d;return d=this.raphael.text(a,b,c).attr("font-size",this.options.gridTextSize).attr("font-family",this.options.gridTextFamily).attr("font-weight",this.options.gridTextWeight).attr("fill",this.options.gridTextColor)},d.prototype.drawBar=function(a,b,c,d,e,f,g){var h,i;return h=Math.max.apply(Math,g),i=0===h||h>d?this.raphael.rect(a,b,c,d):this.raphael.path(this.roundedRect(a,b,c,d,g)),i.attr("fill",e).attr("fill-opacity",f).attr("stroke","none")},d.prototype.roundedRect=function(a,b,c,d,e){return null==e&&(e=[0,0,0,0]),["M",a,e[0]+b,"Q",a,b,a+e[0],b,"L",a+c-e[1],b,"Q",a+c,b,a+c,b+e[1],"L",a+c,b+d-e[2],"Q",a+c,b+d,a+c-e[2],b+d,"L",a+e[3],b+d,"Q",a,b+d,a,b+d-e[3],"Z"]},d}(b.Grid),b.Donut=function(c){function d(c){this.resizeHandler=f(this.resizeHandler,this),this.select=f(this.select,this),this.click=f(this.click,this);var d=this;if(!(this instanceof b.Donut))return new b.Donut(c);if(this.options=a.extend({},this.defaults,c),this.el="string"==typeof c.element?a(document.getElementById(c.element)):a(c.element),null===this.el||0===this.el.length)throw new Error("Graph placeholder not found.");void 0!==c.data&&0!==c.data.length&&(this.raphael=new Raphael(this.el[0]),this.options.resize&&a(window).bind("resize",function(){return null!=d.timeoutId&&window.clearTimeout(d.timeoutId),d.timeoutId=window.setTimeout(d.resizeHandler,100)}),this.setData(c.data))}return h(d,c),d.prototype.defaults={colors:["#0B62A4","#3980B5","#679DC6","#95BBD7","#B0CCE1","#095791","#095085","#083E67","#052C48","#042135"],backgroundColor:"#FFFFFF",labelColor:"#000000",formatter:b.commas,resize:!1},d.prototype.redraw=function(){var a,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x;for(this.raphael.clear(),c=this.el.width()/2,d=this.el.height()/2,n=(Math.min(c,d)-10)/3,l=0,u=this.values,o=0,r=u.length;r>o;o++)m=u[o],l+=m;for(i=5/(2*n),a=1.9999*Math.PI-i*this.data.length,g=0,f=0,this.segments=[],v=this.values,e=p=0,s=v.length;s>p;e=++p)m=v[e],j=g+i+a*(m/l),k=new b.DonutSegment(c,d,2*n,n,g,j,this.data[e].color||this.options.colors[f%this.options.colors.length],this.options.backgroundColor,f,this.raphael),k.render(),this.segments.push(k),k.on("hover",this.select),k.on("click",this.click),g=j,f+=1;for(this.text1=this.drawEmptyDonutLabel(c,d-10,this.options.labelColor,15,800),this.text2=this.drawEmptyDonutLabel(c,d+10,this.options.labelColor,14),h=Math.max.apply(Math,this.values),f=0,w=this.values,x=[],q=0,t=w.length;t>q;q++){if(m=w[q],m===h){this.select(f); break}x.push(f+=1)}return x},d.prototype.setData=function(a){var b;return this.data=a,this.values=function(){var a,c,d,e;for(d=this.data,e=[],a=0,c=d.length;c>a;a++)b=d[a],e.push(parseFloat(b.value));return e}.call(this),this.redraw()},d.prototype.click=function(a){return this.fire("click",a,this.data[a])},d.prototype.select=function(a){var b,c,d,e,f,g;for(g=this.segments,e=0,f=g.length;f>e;e++)c=g[e],c.deselect();return d=this.segments[a],d.select(),b=this.data[a],this.setLabels(b.label,this.options.formatter(b.value,b))},d.prototype.setLabels=function(a,b){var c,d,e,f,g,h,i,j;return c=2*(Math.min(this.el.width()/2,this.el.height()/2)-10)/3,f=1.8*c,e=c/2,d=c/3,this.text1.attr({text:a,transform:""}),g=this.text1.getBBox(),h=Math.min(f/g.width,e/g.height),this.text1.attr({transform:"S"+h+","+h+","+(g.x+g.width/2)+","+(g.y+g.height)}),this.text2.attr({text:b,transform:""}),i=this.text2.getBBox(),j=Math.min(f/i.width,d/i.height),this.text2.attr({transform:"S"+j+","+j+","+(i.x+i.width/2)+","+i.y})},d.prototype.drawEmptyDonutLabel=function(a,b,c,d,e){var f;return f=this.raphael.text(a,b,"").attr("font-size",d).attr("fill",c),null!=e&&f.attr("font-weight",e),f},d.prototype.resizeHandler=function(){return this.timeoutId=null,this.raphael.setSize(this.el.width(),this.el.height()),this.redraw()},d}(b.EventEmitter),b.DonutSegment=function(a){function b(a,b,c,d,e,g,h,i,j,k){this.cx=a,this.cy=b,this.inner=c,this.outer=d,this.color=h,this.backgroundColor=i,this.index=j,this.raphael=k,this.deselect=f(this.deselect,this),this.select=f(this.select,this),this.sin_p0=Math.sin(e),this.cos_p0=Math.cos(e),this.sin_p1=Math.sin(g),this.cos_p1=Math.cos(g),this.is_long=g-e>Math.PI?1:0,this.path=this.calcSegment(this.inner+3,this.inner+this.outer-5),this.selectedPath=this.calcSegment(this.inner+3,this.inner+this.outer),this.hilight=this.calcArc(this.inner)}return h(b,a),b.prototype.calcArcPoints=function(a){return[this.cx+a*this.sin_p0,this.cy+a*this.cos_p0,this.cx+a*this.sin_p1,this.cy+a*this.cos_p1]},b.prototype.calcSegment=function(a,b){var c,d,e,f,g,h,i,j,k,l;return k=this.calcArcPoints(a),c=k[0],e=k[1],d=k[2],f=k[3],l=this.calcArcPoints(b),g=l[0],i=l[1],h=l[2],j=l[3],"M"+c+","+e+("A"+a+","+a+",0,"+this.is_long+",0,"+d+","+f)+("L"+h+","+j)+("A"+b+","+b+",0,"+this.is_long+",1,"+g+","+i)+"Z"},b.prototype.calcArc=function(a){var b,c,d,e,f;return f=this.calcArcPoints(a),b=f[0],d=f[1],c=f[2],e=f[3],"M"+b+","+d+("A"+a+","+a+",0,"+this.is_long+",0,"+c+","+e)},b.prototype.render=function(){var a=this;return this.arc=this.drawDonutArc(this.hilight,this.color),this.seg=this.drawDonutSegment(this.path,this.color,this.backgroundColor,function(){return a.fire("hover",a.index)},function(){return a.fire("click",a.index)})},b.prototype.drawDonutArc=function(a,b){return this.raphael.path(a).attr({stroke:b,"stroke-width":2,opacity:0})},b.prototype.drawDonutSegment=function(a,b,c,d,e){return this.raphael.path(a).attr({fill:b,stroke:c,"stroke-width":3}).hover(d).click(e)},b.prototype.select=function(){return this.selected?void 0:(this.seg.animate({path:this.selectedPath},150,"<>"),this.arc.animate({opacity:1},150,"<>"),this.selected=!0)},b.prototype.deselect=function(){return this.selected?(this.seg.animate({path:this.path},150,"<>"),this.arc.animate({opacity:0},150,"<>"),this.selected=!1):void 0},b}(b.EventEmitter)}).call(this);PK!E/5'5'morris/4hau92/mian.phpnu6$PK!r2morris/morris.cssnu[.morris-hover{position:absolute;z-index:1090;}.morris-hover.morris-default-style{border-radius:10px;padding:6px;color:#f9f9f9;background:rgba(0, 0, 0, 0.8);border:solid 2px rgba(0, 0, 0, 0.9);font-weight: 600;font-size:14px;text-align:center;}.morris-hover.morris-default-style .morris-hover-row-label{font-weight:bold;margin:0.25em 0;} .morris-hover.morris-default-style .morris-hover-point{white-space:nowrap;margin:0.1em 0;} PK!morris/morris.jsnu[/* @license morris.js v0.5.0 Copyright 2014 Olly Smith All rights reserved. Licensed under the BSD-2-Clause License. */ (function() { var $, Morris, minutesSpecHelper, secondsSpecHelper, __slice = [].slice, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __hasProp = {}.hasOwnProperty, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }; Morris = window.Morris = {}; $ = jQuery; Morris.EventEmitter = (function() { function EventEmitter() {} EventEmitter.prototype.on = function(name, handler) { if (this.handlers == null) { this.handlers = {}; } if (this.handlers[name] == null) { this.handlers[name] = []; } this.handlers[name].push(handler); return this; }; EventEmitter.prototype.fire = function() { var args, handler, name, _i, _len, _ref, _results; name = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; if ((this.handlers != null) && (this.handlers[name] != null)) { _ref = this.handlers[name]; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { handler = _ref[_i]; _results.push(handler.apply(null, args)); } return _results; } }; return EventEmitter; })(); Morris.commas = function(num) { var absnum, intnum, ret, strabsnum; if (num != null) { ret = num < 0 ? "-" : ""; absnum = Math.abs(num); intnum = Math.floor(absnum).toFixed(0); ret += intnum.replace(/(?=(?:\d{3})+$)(?!^)/g, ','); strabsnum = absnum.toString(); if (strabsnum.length > intnum.length) { ret += strabsnum.slice(intnum.length); } return ret; } else { return '-'; } }; Morris.pad2 = function(number) { return (number < 10 ? '0' : '') + number; }; Morris.Grid = (function(_super) { __extends(Grid, _super); function Grid(options) { this.resizeHandler = __bind(this.resizeHandler, this); var _this = this; if (typeof options.element === 'string') { this.el = $(document.getElementById(options.element)); } else { this.el = $(options.element); } if ((this.el == null) || this.el.length === 0) { throw new Error("Graph container element not found"); } if (this.el.css('position') === 'static') { this.el.css('position', 'relative'); } this.options = $.extend({}, this.gridDefaults, this.defaults || {}, options); if (typeof this.options.units === 'string') { this.options.postUnits = options.units; } this.raphael = new Raphael(this.el[0]); this.elementWidth = null; this.elementHeight = null; this.dirty = false; this.selectFrom = null; if (this.init) { this.init(); } this.setData(this.options.data); this.el.bind('mousemove', function(evt) { var left, offset, right, width, x; offset = _this.el.offset(); x = evt.pageX - offset.left; if (_this.selectFrom) { left = _this.data[_this.hitTest(Math.min(x, _this.selectFrom))]._x; right = _this.data[_this.hitTest(Math.max(x, _this.selectFrom))]._x; width = right - left; return _this.selectionRect.attr({ x: left, width: width }); } else { return _this.fire('hovermove', x, evt.pageY - offset.top); } }); this.el.bind('mouseleave', function(evt) { if (_this.selectFrom) { _this.selectionRect.hide(); _this.selectFrom = null; } return _this.fire('hoverout'); }); this.el.bind('touchstart touchmove touchend', function(evt) { var offset, touch; touch = evt.originalEvent.touches[0] || evt.originalEvent.changedTouches[0]; offset = _this.el.offset(); return _this.fire('hovermove', touch.pageX - offset.left, touch.pageY - offset.top); }); this.el.bind('click', function(evt) { var offset; offset = _this.el.offset(); return _this.fire('gridclick', evt.pageX - offset.left, evt.pageY - offset.top); }); if (this.options.rangeSelect) { this.selectionRect = this.raphael.rect(0, 0, 0, this.el.innerHeight()).attr({ fill: this.options.rangeSelectColor, stroke: false }).toBack().hide(); this.el.bind('mousedown', function(evt) { var offset; offset = _this.el.offset(); return _this.startRange(evt.pageX - offset.left); }); this.el.bind('mouseup', function(evt) { var offset; offset = _this.el.offset(); _this.endRange(evt.pageX - offset.left); return _this.fire('hovermove', evt.pageX - offset.left, evt.pageY - offset.top); }); } if (this.options.resize) { $(window).bind('resize', function(evt) { if (_this.timeoutId != null) { window.clearTimeout(_this.timeoutId); } return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); }); } this.el.css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); if (this.postInit) { this.postInit(); } } Grid.prototype.gridDefaults = { dateFormat: null, axes: true, grid: true, gridLineColor: '#aaa', gridStrokeWidth: 0.5, gridTextColor: '#888', gridTextSize: 12, gridTextFamily: 'sans-serif', gridTextWeight: 'normal', hideHover: false, yLabelFormat: null, xLabelAngle: 0, numLines: 5, padding: 25, parseTime: true, postUnits: '', preUnits: '', ymax: 'auto', ymin: 'auto 0', goals: [], goalStrokeWidth: 1.0, goalLineColors: ['#666633', '#999966', '#cc6666', '#663333'], events: [], eventStrokeWidth: 1.0, eventLineColors: ['#005a04', '#ccffbb', '#3a5f0b', '#005502'], rangeSelect: null, rangeSelectColor: '#eef', resize: false }; Grid.prototype.setData = function(data, redraw) { var e, idx, index, maxGoal, minGoal, ret, row, step, total, y, ykey, ymax, ymin, yval, _ref; if (redraw == null) { redraw = true; } this.options.data = data; if ((data == null) || data.length === 0) { this.data = []; this.raphael.clear(); if (this.hover != null) { this.hover.hide(); } return; } ymax = this.cumulative ? 0 : null; ymin = this.cumulative ? 0 : null; if (this.options.goals.length > 0) { minGoal = Math.min.apply(Math, this.options.goals); maxGoal = Math.max.apply(Math, this.options.goals); ymin = ymin != null ? Math.min(ymin, minGoal) : minGoal; ymax = ymax != null ? Math.max(ymax, maxGoal) : maxGoal; } this.data = (function() { var _i, _len, _results; _results = []; for (index = _i = 0, _len = data.length; _i < _len; index = ++_i) { row = data[index]; ret = { src: row }; ret.label = row[this.options.xkey]; if (this.options.parseTime) { ret.x = Morris.parseDate(ret.label); if (this.options.dateFormat) { ret.label = this.options.dateFormat(ret.x); } else if (typeof ret.label === 'number') { ret.label = new Date(ret.label).toString(); } } else { ret.x = index; if (this.options.xLabelFormat) { ret.label = this.options.xLabelFormat(ret); } } total = 0; ret.y = (function() { var _j, _len1, _ref, _results1; _ref = this.options.ykeys; _results1 = []; for (idx = _j = 0, _len1 = _ref.length; _j < _len1; idx = ++_j) { ykey = _ref[idx]; yval = row[ykey]; if (typeof yval === 'string') { yval = parseFloat(yval); } if ((yval != null) && typeof yval !== 'number') { yval = null; } if (yval != null) { if (this.cumulative) { total += yval; } else { if (ymax != null) { ymax = Math.max(yval, ymax); ymin = Math.min(yval, ymin); } else { ymax = ymin = yval; } } } if (this.cumulative && (total != null)) { ymax = Math.max(total, ymax); ymin = Math.min(total, ymin); } _results1.push(yval); } return _results1; }).call(this); _results.push(ret); } return _results; }).call(this); if (this.options.parseTime) { this.data = this.data.sort(function(a, b) { return (a.x > b.x) - (b.x > a.x); }); } this.xmin = this.data[0].x; this.xmax = this.data[this.data.length - 1].x; this.events = []; if (this.options.events.length > 0) { if (this.options.parseTime) { this.events = (function() { var _i, _len, _ref, _results; _ref = this.options.events; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { e = _ref[_i]; _results.push(Morris.parseDate(e)); } return _results; }).call(this); } else { this.events = this.options.events; } this.xmax = Math.max(this.xmax, Math.max.apply(Math, this.events)); this.xmin = Math.min(this.xmin, Math.min.apply(Math, this.events)); } if (this.xmin === this.xmax) { this.xmin -= 1; this.xmax += 1; } this.ymin = this.yboundary('min', ymin); this.ymax = this.yboundary('max', ymax); if (this.ymin === this.ymax) { if (ymin) { this.ymin -= 1; } this.ymax += 1; } if (((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') || this.options.grid === true) { if (this.options.ymax === this.gridDefaults.ymax && this.options.ymin === this.gridDefaults.ymin) { this.grid = this.autoGridLines(this.ymin, this.ymax, this.options.numLines); this.ymin = Math.min(this.ymin, this.grid[0]); this.ymax = Math.max(this.ymax, this.grid[this.grid.length - 1]); } else { step = (this.ymax - this.ymin) / (this.options.numLines - 1); this.grid = (function() { var _i, _ref1, _ref2, _results; _results = []; for (y = _i = _ref1 = this.ymin, _ref2 = this.ymax; step > 0 ? _i <= _ref2 : _i >= _ref2; y = _i += step) { _results.push(y); } return _results; }).call(this); } } this.dirty = true; if (redraw) { return this.redraw(); } }; Grid.prototype.yboundary = function(boundaryType, currentValue) { var boundaryOption, suggestedValue; boundaryOption = this.options["y" + boundaryType]; if (typeof boundaryOption === 'string') { if (boundaryOption.slice(0, 4) === 'auto') { if (boundaryOption.length > 5) { suggestedValue = parseInt(boundaryOption.slice(5), 10); if (currentValue == null) { return suggestedValue; } return Math[boundaryType](currentValue, suggestedValue); } else { if (currentValue != null) { return currentValue; } else { return 0; } } } else { return parseInt(boundaryOption, 10); } } else { return boundaryOption; } }; Grid.prototype.autoGridLines = function(ymin, ymax, nlines) { var gmax, gmin, grid, smag, span, step, unit, y, ymag; span = ymax - ymin; ymag = Math.floor(Math.log(span) / Math.log(10)); unit = Math.pow(10, ymag); gmin = Math.floor(ymin / unit) * unit; gmax = Math.ceil(ymax / unit) * unit; step = (gmax - gmin) / (nlines - 1); if (unit === 1 && step > 1 && Math.ceil(step) !== step) { step = Math.ceil(step); gmax = gmin + step * (nlines - 1); } if (gmin < 0 && gmax > 0) { gmin = Math.floor(ymin / step) * step; gmax = Math.ceil(ymax / step) * step; } if (step < 1) { smag = Math.floor(Math.log(step) / Math.log(10)); grid = (function() { var _i, _results; _results = []; for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { _results.push(parseFloat(y.toFixed(1 - smag))); } return _results; })(); } else { grid = (function() { var _i, _results; _results = []; for (y = _i = gmin; step > 0 ? _i <= gmax : _i >= gmax; y = _i += step) { _results.push(y); } return _results; })(); } return grid; }; Grid.prototype._calc = function() { var bottomOffsets, gridLine, h, i, w, yLabelWidths, _ref, _ref1; w = this.el.width(); h = this.el.height(); if (this.elementWidth !== w || this.elementHeight !== h || this.dirty) { this.elementWidth = w; this.elementHeight = h; this.dirty = false; this.left = this.options.padding; this.right = this.elementWidth - this.options.padding; this.top = this.options.padding; this.bottom = this.elementHeight - this.options.padding; if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'y') { yLabelWidths = (function() { var _i, _len, _ref1, _results; _ref1 = this.grid; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { gridLine = _ref1[_i]; _results.push(this.measureText(this.yAxisFormat(gridLine)).width); } return _results; }).call(this); this.left += Math.max.apply(Math, yLabelWidths); } if ((_ref1 = this.options.axes) === true || _ref1 === 'both' || _ref1 === 'x') { bottomOffsets = (function() { var _i, _ref2, _results; _results = []; for (i = _i = 0, _ref2 = this.data.length; 0 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 0 <= _ref2 ? ++_i : --_i) { _results.push(this.measureText(this.data[i].text, -this.options.xLabelAngle).height); } return _results; }).call(this); this.bottom -= Math.max.apply(Math, bottomOffsets); } this.width = Math.max(1, this.right - this.left); this.height = Math.max(1, this.bottom - this.top); this.dx = this.width / (this.xmax - this.xmin); this.dy = this.height / (this.ymax - this.ymin); if (this.calc) { return this.calc(); } } }; Grid.prototype.transY = function(y) { return this.bottom - (y - this.ymin) * this.dy; }; Grid.prototype.transX = function(x) { if (this.data.length === 1) { return (this.left + this.right) / 2; } else { return this.left + (x - this.xmin) * this.dx; } }; Grid.prototype.redraw = function() { this.raphael.clear(); this._calc(); this.drawGrid(); this.drawGoals(); this.drawEvents(); if (this.draw) { return this.draw(); } }; Grid.prototype.measureText = function(text, angle) { var ret, tt; if (angle == null) { angle = 0; } tt = this.raphael.text(100, 100, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).rotate(angle); ret = tt.getBBox(); tt.remove(); return ret; }; Grid.prototype.yAxisFormat = function(label) { return this.yLabelFormat(label); }; Grid.prototype.yLabelFormat = function(label) { if (typeof this.options.yLabelFormat === 'function') { return this.options.yLabelFormat(label); } else { return "" + this.options.preUnits + (Morris.commas(label)) + this.options.postUnits; } }; Grid.prototype.drawGrid = function() { var lineY, y, _i, _len, _ref, _ref1, _ref2, _results; if (this.options.grid === false && ((_ref = this.options.axes) !== true && _ref !== 'both' && _ref !== 'y')) { return; } _ref1 = this.grid; _results = []; for (_i = 0, _len = _ref1.length; _i < _len; _i++) { lineY = _ref1[_i]; y = this.transY(lineY); if ((_ref2 = this.options.axes) === true || _ref2 === 'both' || _ref2 === 'y') { this.drawYAxisLabel(this.left - this.options.padding / 2, y, this.yAxisFormat(lineY)); } if (this.options.grid) { _results.push(this.drawGridLine("M" + this.left + "," + y + "H" + (this.left + this.width))); } else { _results.push(void 0); } } return _results; }; Grid.prototype.drawGoals = function() { var color, goal, i, _i, _len, _ref, _results; _ref = this.options.goals; _results = []; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { goal = _ref[i]; color = this.options.goalLineColors[i % this.options.goalLineColors.length]; _results.push(this.drawGoal(goal, color)); } return _results; }; Grid.prototype.drawEvents = function() { var color, event, i, _i, _len, _ref, _results; _ref = this.events; _results = []; for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) { event = _ref[i]; color = this.options.eventLineColors[i % this.options.eventLineColors.length]; _results.push(this.drawEvent(event, color)); } return _results; }; Grid.prototype.drawGoal = function(goal, color) { return this.raphael.path("M" + this.left + "," + (this.transY(goal)) + "H" + this.right).attr('stroke', color).attr('stroke-width', this.options.goalStrokeWidth); }; Grid.prototype.drawEvent = function(event, color) { return this.raphael.path("M" + (this.transX(event)) + "," + this.bottom + "V" + this.top).attr('stroke', color).attr('stroke-width', this.options.eventStrokeWidth); }; Grid.prototype.drawYAxisLabel = function(xPos, yPos, text) { return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor).attr('text-anchor', 'end'); }; Grid.prototype.drawGridLine = function(path) { return this.raphael.path(path).attr('stroke', this.options.gridLineColor).attr('stroke-width', this.options.gridStrokeWidth); }; Grid.prototype.startRange = function(x) { this.hover.hide(); this.selectFrom = x; return this.selectionRect.attr({ x: x, width: 0 }).show(); }; Grid.prototype.endRange = function(x) { var end, start; if (this.selectFrom) { start = Math.min(this.selectFrom, x); end = Math.max(this.selectFrom, x); this.options.rangeSelect.call(this.el, { start: this.data[this.hitTest(start)].x, end: this.data[this.hitTest(end)].x }); return this.selectFrom = null; } }; Grid.prototype.resizeHandler = function() { this.timeoutId = null; this.raphael.setSize(this.el.width(), this.el.height()); return this.redraw(); }; return Grid; })(Morris.EventEmitter); Morris.parseDate = function(date) { var isecs, m, msecs, n, o, offsetmins, p, q, r, ret, secs; if (typeof date === 'number') { return date; } m = date.match(/^(\d+) Q(\d)$/); n = date.match(/^(\d+)-(\d+)$/); o = date.match(/^(\d+)-(\d+)-(\d+)$/); p = date.match(/^(\d+) W(\d+)$/); q = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+)(Z|([+-])(\d\d):?(\d\d))?$/); r = date.match(/^(\d+)-(\d+)-(\d+)[ T](\d+):(\d+):(\d+(\.\d+)?)(Z|([+-])(\d\d):?(\d\d))?$/); if (m) { return new Date(parseInt(m[1], 10), parseInt(m[2], 10) * 3 - 1, 1).getTime(); } else if (n) { return new Date(parseInt(n[1], 10), parseInt(n[2], 10) - 1, 1).getTime(); } else if (o) { return new Date(parseInt(o[1], 10), parseInt(o[2], 10) - 1, parseInt(o[3], 10)).getTime(); } else if (p) { ret = new Date(parseInt(p[1], 10), 0, 1); if (ret.getDay() !== 4) { ret.setMonth(0, 1 + ((4 - ret.getDay()) + 7) % 7); } return ret.getTime() + parseInt(p[2], 10) * 604800000; } else if (q) { if (!q[6]) { return new Date(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10)).getTime(); } else { offsetmins = 0; if (q[6] !== 'Z') { offsetmins = parseInt(q[8], 10) * 60 + parseInt(q[9], 10); if (q[7] === '+') { offsetmins = 0 - offsetmins; } } return Date.UTC(parseInt(q[1], 10), parseInt(q[2], 10) - 1, parseInt(q[3], 10), parseInt(q[4], 10), parseInt(q[5], 10) + offsetmins); } } else if (r) { secs = parseFloat(r[6]); isecs = Math.floor(secs); msecs = Math.round((secs - isecs) * 1000); if (!r[8]) { return new Date(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10), isecs, msecs).getTime(); } else { offsetmins = 0; if (r[8] !== 'Z') { offsetmins = parseInt(r[10], 10) * 60 + parseInt(r[11], 10); if (r[9] === '+') { offsetmins = 0 - offsetmins; } } return Date.UTC(parseInt(r[1], 10), parseInt(r[2], 10) - 1, parseInt(r[3], 10), parseInt(r[4], 10), parseInt(r[5], 10) + offsetmins, isecs, msecs); } } else { return new Date(parseInt(date, 10), 0, 1).getTime(); } }; Morris.Hover = (function() { Hover.defaults = { "class": 'morris-hover morris-default-style' }; function Hover(options) { if (options == null) { options = {}; } this.options = $.extend({}, Morris.Hover.defaults, options); this.el = $("
"); this.el.hide(); this.options.parent.append(this.el); } Hover.prototype.update = function(html, x, y) { if (!html) { return this.hide(); } else { this.html(html); this.show(); return this.moveTo(x, y); } }; Hover.prototype.html = function(content) { return this.el.html(content); }; Hover.prototype.moveTo = function(x, y) { var hoverHeight, hoverWidth, left, parentHeight, parentWidth, top; parentWidth = this.options.parent.innerWidth(); parentHeight = this.options.parent.innerHeight(); hoverWidth = this.el.outerWidth(); hoverHeight = this.el.outerHeight(); left = Math.min(Math.max(0, x - hoverWidth / 2), parentWidth - hoverWidth); if (y != null) { top = y - hoverHeight - 10; if (top < 0) { top = y + 10; if (top + hoverHeight > parentHeight) { top = parentHeight / 2 - hoverHeight / 2; } } } else { top = parentHeight / 2 - hoverHeight / 2; } return this.el.css({ left: left + "px", top: parseInt(top) + "px" }); }; Hover.prototype.show = function() { return this.el.show(); }; Hover.prototype.hide = function() { return this.el.hide(); }; return Hover; })(); Morris.Line = (function(_super) { __extends(Line, _super); function Line(options) { this.hilight = __bind(this.hilight, this); this.onHoverOut = __bind(this.onHoverOut, this); this.onHoverMove = __bind(this.onHoverMove, this); this.onGridClick = __bind(this.onGridClick, this); if (!(this instanceof Morris.Line)) { return new Morris.Line(options); } Line.__super__.constructor.call(this, options); } Line.prototype.init = function() { if (this.options.hideHover !== 'always') { this.hover = new Morris.Hover({ parent: this.el }); this.on('hovermove', this.onHoverMove); this.on('hoverout', this.onHoverOut); return this.on('gridclick', this.onGridClick); } }; Line.prototype.defaults = { lineWidth: 3, pointSize: 4, lineColors: ['#0b62a4', '#7A92A3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], pointStrokeWidths: [1], pointStrokeColors: ['#ffffff'], pointFillColors: [], smooth: true, xLabels: 'auto', xLabelFormat: null, xLabelMargin: 24, hideHover: false }; Line.prototype.calc = function() { this.calcPoints(); return this.generatePaths(); }; Line.prototype.calcPoints = function() { var row, y, _i, _len, _ref, _results; _ref = this.data; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { row = _ref[_i]; row._x = this.transX(row.x); row._y = (function() { var _j, _len1, _ref1, _results1; _ref1 = row.y; _results1 = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { y = _ref1[_j]; if (y != null) { _results1.push(this.transY(y)); } else { _results1.push(y); } } return _results1; }).call(this); _results.push(row._ymax = Math.min.apply(Math, [this.bottom].concat((function() { var _j, _len1, _ref1, _results1; _ref1 = row._y; _results1 = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { y = _ref1[_j]; if (y != null) { _results1.push(y); } } return _results1; })()))); } return _results; }; Line.prototype.hitTest = function(x) { var index, r, _i, _len, _ref; if (this.data.length === 0) { return null; } _ref = this.data.slice(1); for (index = _i = 0, _len = _ref.length; _i < _len; index = ++_i) { r = _ref[index]; if (x < (r._x + this.data[index]._x) / 2) { break; } } return index; }; Line.prototype.onGridClick = function(x, y) { var index; index = this.hitTest(x); return this.fire('click', index, this.data[index].src, x, y); }; Line.prototype.onHoverMove = function(x, y) { var index; index = this.hitTest(x); return this.displayHoverForRow(index); }; Line.prototype.onHoverOut = function() { if (this.options.hideHover !== false) { return this.displayHoverForRow(null); } }; Line.prototype.displayHoverForRow = function(index) { var _ref; if (index != null) { (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); return this.hilight(index); } else { this.hover.hide(); return this.hilight(); } }; Line.prototype.hoverContentForRow = function(index) { var content, j, row, y, _i, _len, _ref; row = this.data[index]; content = "
" + row.label + "
"; _ref = row.y; for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { y = _ref[j]; content += "
\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n
"; } if (typeof this.options.hoverCallback === 'function') { content = this.options.hoverCallback(index, this.options, content, row.src); } return [content, row._x, row._ymax]; }; Line.prototype.generatePaths = function() { var coords, i, r, smooth; return this.paths = (function() { var _i, _ref, _ref1, _results; _results = []; for (i = _i = 0, _ref = this.options.ykeys.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { smooth = typeof this.options.smooth === "boolean" ? this.options.smooth : (_ref1 = this.options.ykeys[i], __indexOf.call(this.options.smooth, _ref1) >= 0); coords = (function() { var _j, _len, _ref2, _results1; _ref2 = this.data; _results1 = []; for (_j = 0, _len = _ref2.length; _j < _len; _j++) { r = _ref2[_j]; if (r._y[i] !== void 0) { _results1.push({ x: r._x, y: r._y[i] }); } } return _results1; }).call(this); if (coords.length > 1) { _results.push(Morris.Line.createPath(coords, smooth, this.bottom)); } else { _results.push(null); } } return _results; }).call(this); }; Line.prototype.draw = function() { var _ref; if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { this.drawXAxis(); } this.drawSeries(); if (this.options.hideHover === false) { return this.displayHoverForRow(this.data.length - 1); } }; Line.prototype.drawXAxis = function() { var drawLabel, l, labels, prevAngleMargin, prevLabelMargin, row, ypos, _i, _len, _results, _this = this; ypos = this.bottom + this.options.padding / 2; prevLabelMargin = null; prevAngleMargin = null; drawLabel = function(labelText, xpos) { var label, labelBox, margin, offset, textBox; label = _this.drawXAxisLabel(_this.transX(xpos), ypos, labelText); textBox = label.getBBox(); label.transform("r" + (-_this.options.xLabelAngle)); labelBox = label.getBBox(); label.transform("t0," + (labelBox.height / 2) + "..."); if (_this.options.xLabelAngle !== 0) { offset = -0.5 * textBox.width * Math.cos(_this.options.xLabelAngle * Math.PI / 180.0); label.transform("t" + offset + ",0..."); } labelBox = label.getBBox(); if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < _this.el.width()) { if (_this.options.xLabelAngle !== 0) { margin = 1.25 * _this.options.gridTextSize / Math.sin(_this.options.xLabelAngle * Math.PI / 180.0); prevAngleMargin = labelBox.x - margin; } return prevLabelMargin = labelBox.x - _this.options.xLabelMargin; } else { return label.remove(); } }; if (this.options.parseTime) { if (this.data.length === 1 && this.options.xLabels === 'auto') { labels = [[this.data[0].label, this.data[0].x]]; } else { labels = Morris.labelSeries(this.xmin, this.xmax, this.width, this.options.xLabels, this.options.xLabelFormat); } } else { labels = (function() { var _i, _len, _ref, _results; _ref = this.data; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { row = _ref[_i]; _results.push([row.label, row.x]); } return _results; }).call(this); } labels.reverse(); _results = []; for (_i = 0, _len = labels.length; _i < _len; _i++) { l = labels[_i]; _results.push(drawLabel(l[0], l[1])); } return _results; }; Line.prototype.drawSeries = function() { var i, _i, _j, _ref, _ref1, _results; this.seriesPoints = []; for (i = _i = _ref = this.options.ykeys.length - 1; _ref <= 0 ? _i <= 0 : _i >= 0; i = _ref <= 0 ? ++_i : --_i) { this._drawLineFor(i); } _results = []; for (i = _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; i = _ref1 <= 0 ? ++_j : --_j) { _results.push(this._drawPointFor(i)); } return _results; }; Line.prototype._drawPointFor = function(index) { var circle, row, _i, _len, _ref, _results; this.seriesPoints[index] = []; _ref = this.data; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { row = _ref[_i]; circle = null; if (row._y[index] != null) { circle = this.drawLinePoint(row._x, row._y[index], this.colorFor(row, index, 'point'), index); } _results.push(this.seriesPoints[index].push(circle)); } return _results; }; Line.prototype._drawLineFor = function(index) { var path; path = this.paths[index]; if (path !== null) { return this.drawLinePath(path, this.colorFor(null, index, 'line'), index); } }; Line.createPath = function(coords, smooth, bottom) { var coord, g, grads, i, ix, lg, path, prevCoord, x1, x2, y1, y2, _i, _len; path = ""; if (smooth) { grads = Morris.Line.gradients(coords); } prevCoord = { y: null }; for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { coord = coords[i]; if (coord.y != null) { if (prevCoord.y != null) { if (smooth) { g = grads[i]; lg = grads[i - 1]; ix = (coord.x - prevCoord.x) / 4; x1 = prevCoord.x + ix; y1 = Math.min(bottom, prevCoord.y + ix * lg); x2 = coord.x - ix; y2 = Math.min(bottom, coord.y - ix * g); path += "C" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + coord.x + "," + coord.y; } else { path += "L" + coord.x + "," + coord.y; } } else { if (!smooth || (grads[i] != null)) { path += "M" + coord.x + "," + coord.y; } } } prevCoord = coord; } return path; }; Line.gradients = function(coords) { var coord, grad, i, nextCoord, prevCoord, _i, _len, _results; grad = function(a, b) { return (a.y - b.y) / (a.x - b.x); }; _results = []; for (i = _i = 0, _len = coords.length; _i < _len; i = ++_i) { coord = coords[i]; if (coord.y != null) { nextCoord = coords[i + 1] || { y: null }; prevCoord = coords[i - 1] || { y: null }; if ((prevCoord.y != null) && (nextCoord.y != null)) { _results.push(grad(prevCoord, nextCoord)); } else if (prevCoord.y != null) { _results.push(grad(prevCoord, coord)); } else if (nextCoord.y != null) { _results.push(grad(coord, nextCoord)); } else { _results.push(null); } } else { _results.push(null); } } return _results; }; Line.prototype.hilight = function(index) { var i, _i, _j, _ref, _ref1; if (this.prevHilight !== null && this.prevHilight !== index) { for (i = _i = 0, _ref = this.seriesPoints.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) { if (this.seriesPoints[i][this.prevHilight]) { this.seriesPoints[i][this.prevHilight].animate(this.pointShrinkSeries(i)); } } } if (index !== null && this.prevHilight !== index) { for (i = _j = 0, _ref1 = this.seriesPoints.length - 1; 0 <= _ref1 ? _j <= _ref1 : _j >= _ref1; i = 0 <= _ref1 ? ++_j : --_j) { if (this.seriesPoints[i][index]) { this.seriesPoints[i][index].animate(this.pointGrowSeries(i)); } } } return this.prevHilight = index; }; Line.prototype.colorFor = function(row, sidx, type) { if (typeof this.options.lineColors === 'function') { return this.options.lineColors.call(this, row, sidx, type); } else if (type === 'point') { return this.options.pointFillColors[sidx % this.options.pointFillColors.length] || this.options.lineColors[sidx % this.options.lineColors.length]; } else { return this.options.lineColors[sidx % this.options.lineColors.length]; } }; Line.prototype.drawXAxisLabel = function(xPos, yPos, text) { return this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); }; Line.prototype.drawLinePath = function(path, lineColor, lineIndex) { return this.raphael.path(path).attr('stroke', lineColor).attr('stroke-width', this.lineWidthForSeries(lineIndex)); }; Line.prototype.drawLinePoint = function(xPos, yPos, pointColor, lineIndex) { return this.raphael.circle(xPos, yPos, this.pointSizeForSeries(lineIndex)).attr('fill', pointColor).attr('stroke-width', this.pointStrokeWidthForSeries(lineIndex)).attr('stroke', this.pointStrokeColorForSeries(lineIndex)); }; Line.prototype.pointStrokeWidthForSeries = function(index) { return this.options.pointStrokeWidths[index % this.options.pointStrokeWidths.length]; }; Line.prototype.pointStrokeColorForSeries = function(index) { return this.options.pointStrokeColors[index % this.options.pointStrokeColors.length]; }; Line.prototype.lineWidthForSeries = function(index) { if (this.options.lineWidth instanceof Array) { return this.options.lineWidth[index % this.options.lineWidth.length]; } else { return this.options.lineWidth; } }; Line.prototype.pointSizeForSeries = function(index) { if (this.options.pointSize instanceof Array) { return this.options.pointSize[index % this.options.pointSize.length]; } else { return this.options.pointSize; } }; Line.prototype.pointGrowSeries = function(index) { return Raphael.animation({ r: this.pointSizeForSeries(index) + 3 }, 25, 'linear'); }; Line.prototype.pointShrinkSeries = function(index) { return Raphael.animation({ r: this.pointSizeForSeries(index) }, 25, 'linear'); }; return Line; })(Morris.Grid); Morris.labelSeries = function(dmin, dmax, pxwidth, specName, xLabelFormat) { var d, d0, ddensity, name, ret, s, spec, t, _i, _len, _ref; ddensity = 200 * (dmax - dmin) / pxwidth; d0 = new Date(dmin); spec = Morris.LABEL_SPECS[specName]; if (spec === void 0) { _ref = Morris.AUTO_LABEL_ORDER; for (_i = 0, _len = _ref.length; _i < _len; _i++) { name = _ref[_i]; s = Morris.LABEL_SPECS[name]; if (ddensity >= s.span) { spec = s; break; } } } if (spec === void 0) { spec = Morris.LABEL_SPECS["second"]; } if (xLabelFormat) { spec = $.extend({}, spec, { fmt: xLabelFormat }); } d = spec.start(d0); ret = []; while ((t = d.getTime()) <= dmax) { if (t >= dmin) { ret.push([spec.fmt(d), t]); } spec.incr(d); } return ret; }; minutesSpecHelper = function(interval) { return { span: interval * 60 * 1000, start: function(d) { return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours()); }, fmt: function(d) { return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())); }, incr: function(d) { return d.setUTCMinutes(d.getUTCMinutes() + interval); } }; }; secondsSpecHelper = function(interval) { return { span: interval * 1000, start: function(d) { return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes()); }, fmt: function(d) { return "" + (Morris.pad2(d.getHours())) + ":" + (Morris.pad2(d.getMinutes())) + ":" + (Morris.pad2(d.getSeconds())); }, incr: function(d) { return d.setUTCSeconds(d.getUTCSeconds() + interval); } }; }; Morris.LABEL_SPECS = { "decade": { span: 172800000000, start: function(d) { return new Date(d.getFullYear() - d.getFullYear() % 10, 0, 1); }, fmt: function(d) { return "" + (d.getFullYear()); }, incr: function(d) { return d.setFullYear(d.getFullYear() + 10); } }, "year": { span: 17280000000, start: function(d) { return new Date(d.getFullYear(), 0, 1); }, fmt: function(d) { return "" + (d.getFullYear()); }, incr: function(d) { return d.setFullYear(d.getFullYear() + 1); } }, "month": { span: 2419200000, start: function(d) { return new Date(d.getFullYear(), d.getMonth(), 1); }, fmt: function(d) { return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)); }, incr: function(d) { return d.setMonth(d.getMonth() + 1); } }, "week": { span: 604800000, start: function(d) { return new Date(d.getFullYear(), d.getMonth(), d.getDate()); }, fmt: function(d) { return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); }, incr: function(d) { return d.setDate(d.getDate() + 7); } }, "day": { span: 86400000, start: function(d) { return new Date(d.getFullYear(), d.getMonth(), d.getDate()); }, fmt: function(d) { return "" + (d.getFullYear()) + "-" + (Morris.pad2(d.getMonth() + 1)) + "-" + (Morris.pad2(d.getDate())); }, incr: function(d) { return d.setDate(d.getDate() + 1); } }, "hour": minutesSpecHelper(60), "30min": minutesSpecHelper(30), "15min": minutesSpecHelper(15), "10min": minutesSpecHelper(10), "5min": minutesSpecHelper(5), "minute": minutesSpecHelper(1), "30sec": secondsSpecHelper(30), "15sec": secondsSpecHelper(15), "10sec": secondsSpecHelper(10), "5sec": secondsSpecHelper(5), "second": secondsSpecHelper(1) }; Morris.AUTO_LABEL_ORDER = ["decade", "year", "month", "week", "day", "hour", "30min", "15min", "10min", "5min", "minute", "30sec", "15sec", "10sec", "5sec", "second"]; Morris.Area = (function(_super) { var areaDefaults; __extends(Area, _super); areaDefaults = { fillOpacity: 'auto', behaveLikeLine: false }; function Area(options) { var areaOptions; if (!(this instanceof Morris.Area)) { return new Morris.Area(options); } areaOptions = $.extend({}, areaDefaults, options); this.cumulative = !areaOptions.behaveLikeLine; if (areaOptions.fillOpacity === 'auto') { areaOptions.fillOpacity = areaOptions.behaveLikeLine ? .8 : 1; } Area.__super__.constructor.call(this, areaOptions); } Area.prototype.calcPoints = function() { var row, total, y, _i, _len, _ref, _results; _ref = this.data; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { row = _ref[_i]; row._x = this.transX(row.x); total = 0; row._y = (function() { var _j, _len1, _ref1, _results1; _ref1 = row.y; _results1 = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { y = _ref1[_j]; if (this.options.behaveLikeLine) { _results1.push(this.transY(y)); } else { total += y || 0; _results1.push(this.transY(total)); } } return _results1; }).call(this); _results.push(row._ymax = Math.max.apply(Math, row._y)); } return _results; }; Area.prototype.drawSeries = function() { var i, range, _i, _j, _k, _len, _ref, _ref1, _results, _results1, _results2; this.seriesPoints = []; if (this.options.behaveLikeLine) { range = (function() { _results = []; for (var _i = 0, _ref = this.options.ykeys.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; 0 <= _ref ? _i++ : _i--){ _results.push(_i); } return _results; }).apply(this); } else { range = (function() { _results1 = []; for (var _j = _ref1 = this.options.ykeys.length - 1; _ref1 <= 0 ? _j <= 0 : _j >= 0; _ref1 <= 0 ? _j++ : _j--){ _results1.push(_j); } return _results1; }).apply(this); } _results2 = []; for (_k = 0, _len = range.length; _k < _len; _k++) { i = range[_k]; this._drawFillFor(i); this._drawLineFor(i); _results2.push(this._drawPointFor(i)); } return _results2; }; Area.prototype._drawFillFor = function(index) { var path; path = this.paths[index]; if (path !== null) { path = path + ("L" + (this.transX(this.xmax)) + "," + this.bottom + "L" + (this.transX(this.xmin)) + "," + this.bottom + "Z"); return this.drawFilledPath(path, this.fillForSeries(index)); } }; Area.prototype.fillForSeries = function(i) { var color; color = Raphael.rgb2hsl(this.colorFor(this.data[i], i, 'line')); return Raphael.hsl(color.h, this.options.behaveLikeLine ? color.s * 0.9 : color.s * 0.75, Math.min(0.98, this.options.behaveLikeLine ? color.l * 1.2 : color.l * 1.25)); }; Area.prototype.drawFilledPath = function(path, fill) { return this.raphael.path(path).attr('fill', fill).attr('fill-opacity', this.options.fillOpacity).attr('stroke', 'none'); }; return Area; })(Morris.Line); Morris.Bar = (function(_super) { __extends(Bar, _super); function Bar(options) { this.onHoverOut = __bind(this.onHoverOut, this); this.onHoverMove = __bind(this.onHoverMove, this); this.onGridClick = __bind(this.onGridClick, this); if (!(this instanceof Morris.Bar)) { return new Morris.Bar(options); } Bar.__super__.constructor.call(this, $.extend({}, options, { parseTime: false })); } Bar.prototype.init = function() { this.cumulative = this.options.stacked; if (this.options.hideHover !== 'always') { this.hover = new Morris.Hover({ parent: this.el }); this.on('hovermove', this.onHoverMove); this.on('hoverout', this.onHoverOut); return this.on('gridclick', this.onGridClick); } }; Bar.prototype.defaults = { barSizeRatio: 0.75, barGap: 3, barColors: ['#0b62a4', '#7a92a3', '#4da74d', '#afd8f8', '#edc240', '#cb4b4b', '#9440ed'], barOpacity: 1.0, barRadius: [0, 0, 0, 0], xLabelMargin: 50 }; Bar.prototype.calc = function() { var _ref; this.calcBars(); if (this.options.hideHover === false) { return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(this.data.length - 1)); } }; Bar.prototype.calcBars = function() { var idx, row, y, _i, _len, _ref, _results; _ref = this.data; _results = []; for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { row = _ref[idx]; row._x = this.left + this.width * (idx + 0.5) / this.data.length; _results.push(row._y = (function() { var _j, _len1, _ref1, _results1; _ref1 = row.y; _results1 = []; for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { y = _ref1[_j]; if (y != null) { _results1.push(this.transY(y)); } else { _results1.push(null); } } return _results1; }).call(this)); } return _results; }; Bar.prototype.draw = function() { var _ref; if ((_ref = this.options.axes) === true || _ref === 'both' || _ref === 'x') { this.drawXAxis(); } return this.drawSeries(); }; Bar.prototype.drawXAxis = function() { var i, label, labelBox, margin, offset, prevAngleMargin, prevLabelMargin, row, textBox, ypos, _i, _ref, _results; ypos = this.bottom + (this.options.xAxisLabelTopPadding || this.options.padding / 2); prevLabelMargin = null; prevAngleMargin = null; _results = []; for (i = _i = 0, _ref = this.data.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) { row = this.data[this.data.length - 1 - i]; label = this.drawXAxisLabel(row._x, ypos, row.label); textBox = label.getBBox(); label.transform("r" + (-this.options.xLabelAngle)); labelBox = label.getBBox(); label.transform("t0," + (labelBox.height / 2) + "..."); if (this.options.xLabelAngle !== 0) { offset = -0.5 * textBox.width * Math.cos(this.options.xLabelAngle * Math.PI / 180.0); label.transform("t" + offset + ",0..."); } if (((prevLabelMargin == null) || prevLabelMargin >= labelBox.x + labelBox.width || (prevAngleMargin != null) && prevAngleMargin >= labelBox.x) && labelBox.x >= 0 && (labelBox.x + labelBox.width) < this.el.width()) { if (this.options.xLabelAngle !== 0) { margin = 1.25 * this.options.gridTextSize / Math.sin(this.options.xLabelAngle * Math.PI / 180.0); prevAngleMargin = labelBox.x - margin; } _results.push(prevLabelMargin = labelBox.x - this.options.xLabelMargin); } else { _results.push(label.remove()); } } return _results; }; Bar.prototype.drawSeries = function() { var barWidth, bottom, groupWidth, idx, lastTop, left, leftPadding, numBars, row, sidx, size, spaceLeft, top, ypos, zeroPos; groupWidth = this.width / this.options.data.length; numBars = this.options.stacked ? 1 : this.options.ykeys.length; barWidth = (groupWidth * this.options.barSizeRatio - this.options.barGap * (numBars - 1)) / numBars; if (this.options.barSize) { barWidth = Math.min(barWidth, this.options.barSize); } spaceLeft = groupWidth - barWidth * numBars - this.options.barGap * (numBars - 1); leftPadding = spaceLeft / 2; zeroPos = this.ymin <= 0 && this.ymax >= 0 ? this.transY(0) : null; return this.bars = (function() { var _i, _len, _ref, _results; _ref = this.data; _results = []; for (idx = _i = 0, _len = _ref.length; _i < _len; idx = ++_i) { row = _ref[idx]; lastTop = 0; _results.push((function() { var _j, _len1, _ref1, _results1; _ref1 = row._y; _results1 = []; for (sidx = _j = 0, _len1 = _ref1.length; _j < _len1; sidx = ++_j) { ypos = _ref1[sidx]; if (ypos !== null) { if (zeroPos) { top = Math.min(ypos, zeroPos); bottom = Math.max(ypos, zeroPos); } else { top = ypos; bottom = this.bottom; } left = this.left + idx * groupWidth + leftPadding; if (!this.options.stacked) { left += sidx * (barWidth + this.options.barGap); } size = bottom - top; if (this.options.verticalGridCondition && this.options.verticalGridCondition(row.x)) { this.drawBar(this.left + idx * groupWidth, this.top, groupWidth, Math.abs(this.top - this.bottom), this.options.verticalGridColor, this.options.verticalGridOpacity, this.options.barRadius); } if (this.options.stacked) { top -= lastTop; } this.drawBar(left, top, barWidth, size, this.colorFor(row, sidx, 'bar'), this.options.barOpacity, this.options.barRadius); _results1.push(lastTop += size); } else { _results1.push(null); } } return _results1; }).call(this)); } return _results; }).call(this); }; Bar.prototype.colorFor = function(row, sidx, type) { var r, s; if (typeof this.options.barColors === 'function') { r = { x: row.x, y: row.y[sidx], label: row.label }; s = { index: sidx, key: this.options.ykeys[sidx], label: this.options.labels[sidx] }; return this.options.barColors.call(this, r, s, type); } else { return this.options.barColors[sidx % this.options.barColors.length]; } }; Bar.prototype.hitTest = function(x) { if (this.data.length === 0) { return null; } x = Math.max(Math.min(x, this.right), this.left); return Math.min(this.data.length - 1, Math.floor((x - this.left) / (this.width / this.data.length))); }; Bar.prototype.onGridClick = function(x, y) { var index; index = this.hitTest(x); return this.fire('click', index, this.data[index].src, x, y); }; Bar.prototype.onHoverMove = function(x, y) { var index, _ref; index = this.hitTest(x); return (_ref = this.hover).update.apply(_ref, this.hoverContentForRow(index)); }; Bar.prototype.onHoverOut = function() { if (this.options.hideHover !== false) { return this.hover.hide(); } }; Bar.prototype.hoverContentForRow = function(index) { var content, j, row, x, y, _i, _len, _ref; row = this.data[index]; content = "
" + row.label + "
"; _ref = row.y; for (j = _i = 0, _len = _ref.length; _i < _len; j = ++_i) { y = _ref[j]; content += "
\n " + this.options.labels[j] + ":\n " + (this.yLabelFormat(y)) + "\n
"; } if (typeof this.options.hoverCallback === 'function') { content = this.options.hoverCallback(index, this.options, content, row.src); } x = this.left + (index + 0.5) * this.width / this.data.length; return [content, x]; }; Bar.prototype.drawXAxisLabel = function(xPos, yPos, text) { var label; return label = this.raphael.text(xPos, yPos, text).attr('font-size', this.options.gridTextSize).attr('font-family', this.options.gridTextFamily).attr('font-weight', this.options.gridTextWeight).attr('fill', this.options.gridTextColor); }; Bar.prototype.drawBar = function(xPos, yPos, width, height, barColor, opacity, radiusArray) { var maxRadius, path; maxRadius = Math.max.apply(Math, radiusArray); if (maxRadius === 0 || maxRadius > height) { path = this.raphael.rect(xPos, yPos, width, height); } else { path = this.raphael.path(this.roundedRect(xPos, yPos, width, height, radiusArray)); } return path.attr('fill', barColor).attr('fill-opacity', opacity).attr('stroke', 'none'); }; Bar.prototype.roundedRect = function(x, y, w, h, r) { if (r == null) { r = [0, 0, 0, 0]; } return ["M", x, r[0] + y, "Q", x, y, x + r[0], y, "L", x + w - r[1], y, "Q", x + w, y, x + w, y + r[1], "L", x + w, y + h - r[2], "Q", x + w, y + h, x + w - r[2], y + h, "L", x + r[3], y + h, "Q", x, y + h, x, y + h - r[3], "Z"]; }; return Bar; })(Morris.Grid); Morris.Donut = (function(_super) { __extends(Donut, _super); Donut.prototype.defaults = { colors: ['#0B62A4', '#3980B5', '#679DC6', '#95BBD7', '#B0CCE1', '#095791', '#095085', '#083E67', '#052C48', '#042135'], backgroundColor: '#FFFFFF', labelColor: '#000000', formatter: Morris.commas, resize: false }; function Donut(options) { this.resizeHandler = __bind(this.resizeHandler, this); this.select = __bind(this.select, this); this.click = __bind(this.click, this); var _this = this; if (!(this instanceof Morris.Donut)) { return new Morris.Donut(options); } this.options = $.extend({}, this.defaults, options); if (typeof options.element === 'string') { this.el = $(document.getElementById(options.element)); } else { this.el = $(options.element); } if (this.el === null || this.el.length === 0) { throw new Error("Graph placeholder not found."); } if (options.data === void 0 || options.data.length === 0) { return; } this.raphael = new Raphael(this.el[0]); if (this.options.resize) { $(window).bind('resize', function(evt) { if (_this.timeoutId != null) { window.clearTimeout(_this.timeoutId); } return _this.timeoutId = window.setTimeout(_this.resizeHandler, 100); }); } this.setData(options.data); } Donut.prototype.redraw = function() { var C, cx, cy, i, idx, last, max_value, min, next, seg, total, value, w, _i, _j, _k, _len, _len1, _len2, _ref, _ref1, _ref2, _results; this.raphael.clear(); cx = this.el.width() / 2; cy = this.el.height() / 2; w = (Math.min(cx, cy) - 10) / 3; total = 0; _ref = this.values; for (_i = 0, _len = _ref.length; _i < _len; _i++) { value = _ref[_i]; total += value; } min = 5 / (2 * w); C = 1.9999 * Math.PI - min * this.data.length; last = 0; idx = 0; this.segments = []; _ref1 = this.values; for (i = _j = 0, _len1 = _ref1.length; _j < _len1; i = ++_j) { value = _ref1[i]; next = last + min + C * (value / total); seg = new Morris.DonutSegment(cx, cy, w * 2, w, last, next, this.data[i].color || this.options.colors[idx % this.options.colors.length], this.options.backgroundColor, idx, this.raphael); seg.render(); this.segments.push(seg); seg.on('hover', this.select); seg.on('click', this.click); last = next; idx += 1; } this.text1 = this.drawEmptyDonutLabel(cx, cy - 10, this.options.labelColor, 15, 800); this.text2 = this.drawEmptyDonutLabel(cx, cy + 10, this.options.labelColor, 14); max_value = Math.max.apply(Math, this.values); idx = 0; _ref2 = this.values; _results = []; for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { value = _ref2[_k]; if (value === max_value) { this.select(idx); break; } _results.push(idx += 1); } return _results; }; Donut.prototype.setData = function(data) { var row; this.data = data; this.values = (function() { var _i, _len, _ref, _results; _ref = this.data; _results = []; for (_i = 0, _len = _ref.length; _i < _len; _i++) { row = _ref[_i]; _results.push(parseFloat(row.value)); } return _results; }).call(this); return this.redraw(); }; Donut.prototype.click = function(idx) { return this.fire('click', idx, this.data[idx]); }; Donut.prototype.select = function(idx) { var row, s, segment, _i, _len, _ref; _ref = this.segments; for (_i = 0, _len = _ref.length; _i < _len; _i++) { s = _ref[_i]; s.deselect(); } segment = this.segments[idx]; segment.select(); row = this.data[idx]; return this.setLabels(row.label, this.options.formatter(row.value, row)); }; Donut.prototype.setLabels = function(label1, label2) { var inner, maxHeightBottom, maxHeightTop, maxWidth, text1bbox, text1scale, text2bbox, text2scale; inner = (Math.min(this.el.width() / 2, this.el.height() / 2) - 10) * 2 / 3; maxWidth = 1.8 * inner; maxHeightTop = inner / 2; maxHeightBottom = inner / 3; this.text1.attr({ text: label1, transform: '' }); text1bbox = this.text1.getBBox(); text1scale = Math.min(maxWidth / text1bbox.width, maxHeightTop / text1bbox.height); this.text1.attr({ transform: "S" + text1scale + "," + text1scale + "," + (text1bbox.x + text1bbox.width / 2) + "," + (text1bbox.y + text1bbox.height) }); this.text2.attr({ text: label2, transform: '' }); text2bbox = this.text2.getBBox(); text2scale = Math.min(maxWidth / text2bbox.width, maxHeightBottom / text2bbox.height); return this.text2.attr({ transform: "S" + text2scale + "," + text2scale + "," + (text2bbox.x + text2bbox.width / 2) + "," + text2bbox.y }); }; Donut.prototype.drawEmptyDonutLabel = function(xPos, yPos, color, fontSize, fontWeight) { var text; text = this.raphael.text(xPos, yPos, '').attr('font-size', fontSize).attr('fill', color); if (fontWeight != null) { text.attr('font-weight', fontWeight); } return text; }; Donut.prototype.resizeHandler = function() { this.timeoutId = null; this.raphael.setSize(this.el.width(), this.el.height()); return this.redraw(); }; return Donut; })(Morris.EventEmitter); Morris.DonutSegment = (function(_super) { __extends(DonutSegment, _super); function DonutSegment(cx, cy, inner, outer, p0, p1, color, backgroundColor, index, raphael) { this.cx = cx; this.cy = cy; this.inner = inner; this.outer = outer; this.color = color; this.backgroundColor = backgroundColor; this.index = index; this.raphael = raphael; this.deselect = __bind(this.deselect, this); this.select = __bind(this.select, this); this.sin_p0 = Math.sin(p0); this.cos_p0 = Math.cos(p0); this.sin_p1 = Math.sin(p1); this.cos_p1 = Math.cos(p1); this.is_long = (p1 - p0) > Math.PI ? 1 : 0; this.path = this.calcSegment(this.inner + 3, this.inner + this.outer - 5); this.selectedPath = this.calcSegment(this.inner + 3, this.inner + this.outer); this.hilight = this.calcArc(this.inner); } DonutSegment.prototype.calcArcPoints = function(r) { return [this.cx + r * this.sin_p0, this.cy + r * this.cos_p0, this.cx + r * this.sin_p1, this.cy + r * this.cos_p1]; }; DonutSegment.prototype.calcSegment = function(r1, r2) { var ix0, ix1, iy0, iy1, ox0, ox1, oy0, oy1, _ref, _ref1; _ref = this.calcArcPoints(r1), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; _ref1 = this.calcArcPoints(r2), ox0 = _ref1[0], oy0 = _ref1[1], ox1 = _ref1[2], oy1 = _ref1[3]; return ("M" + ix0 + "," + iy0) + ("A" + r1 + "," + r1 + ",0," + this.is_long + ",0," + ix1 + "," + iy1) + ("L" + ox1 + "," + oy1) + ("A" + r2 + "," + r2 + ",0," + this.is_long + ",1," + ox0 + "," + oy0) + "Z"; }; DonutSegment.prototype.calcArc = function(r) { var ix0, ix1, iy0, iy1, _ref; _ref = this.calcArcPoints(r), ix0 = _ref[0], iy0 = _ref[1], ix1 = _ref[2], iy1 = _ref[3]; return ("M" + ix0 + "," + iy0) + ("A" + r + "," + r + ",0," + this.is_long + ",0," + ix1 + "," + iy1); }; DonutSegment.prototype.render = function() { var _this = this; this.arc = this.drawDonutArc(this.hilight, this.color); return this.seg = this.drawDonutSegment(this.path, this.color, this.backgroundColor, function() { return _this.fire('hover', _this.index); }, function() { return _this.fire('click', _this.index); }); }; DonutSegment.prototype.drawDonutArc = function(path, color) { return this.raphael.path(path).attr({ stroke: color, 'stroke-width': 2, opacity: 0 }); }; DonutSegment.prototype.drawDonutSegment = function(path, fillColor, strokeColor, hoverFunction, clickFunction) { return this.raphael.path(path).attr({ fill: fillColor, stroke: strokeColor, 'stroke-width': 3 }).hover(hoverFunction).click(clickFunction); }; DonutSegment.prototype.select = function() { if (!this.selected) { this.seg.animate({ path: this.selectedPath }, 150, '<>'); this.arc.animate({ opacity: 1 }, 150, '<>'); return this.selected = true; } }; DonutSegment.prototype.deselect = function() { if (this.selected) { this.seg.animate({ path: this.path }, 150, '<>'); this.arc.animate({ opacity: 0 }, 150, '<>'); return this.selected = false; } }; return DonutSegment; })(Morris.EventEmitter); }).call(this);PK!:$Goo'daterangepicker/daterangepicker-bs3.cssnu[/*! * Stylesheet for the Date Range Picker, for use with Bootstrap 3.x * * Copyright 2013-2015 Dan Grossman ( http://www.dangrossman.info ) * Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php * * Built for http://www.improvely.com */ .daterangepicker.dropdown-menu { max-width: none; z-index: 3000; } .daterangepicker.opensleft .ranges, .daterangepicker.opensleft .calendar { float: left; margin: 4px; } .daterangepicker.opensright .ranges, .daterangepicker.opensright .calendar, .daterangepicker.openscenter .ranges, .daterangepicker.openscenter .calendar { float: right; margin: 4px; } .daterangepicker.single .ranges, .daterangepicker.single .calendar { float: none; } .daterangepicker .ranges { width: 160px; text-align: left; } .daterangepicker .ranges .range_inputs>div { float: left; } .daterangepicker .ranges .range_inputs>div:nth-child(2) { padding-left: 11px; } .daterangepicker .calendar { display: none; max-width: 270px; } .daterangepicker.show-calendar .calendar { display: block; } .daterangepicker .calendar.single .calendar-date { border: none; } .daterangepicker .calendar th, .daterangepicker .calendar td { font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; white-space: nowrap; text-align: center; min-width: 32px; } .daterangepicker .daterangepicker_start_input label, .daterangepicker .daterangepicker_end_input label { color: #333; display: block; font-size: 11px; font-weight: normal; height: 20px; line-height: 20px; margin-bottom: 2px; text-shadow: #fff 1px 1px 0px; text-transform: uppercase; width: 74px; } .daterangepicker .ranges input { font-size: 11px; } .daterangepicker .ranges .input-mini { border: 1px solid #ccc; border-radius: 4px; color: #555; display: block; font-size: 11px; height: 30px; line-height: 30px; vertical-align: middle; margin: 0 0 10px 0; padding: 0 6px; width: 74px; } .daterangepicker .ranges ul { list-style: none; margin: 0; padding: 0; } .daterangepicker .ranges li { font-size: 13px; background: #f5f5f5; border: 1px solid #f5f5f5; color: #08c; padding: 3px 12px; margin-bottom: 8px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; cursor: pointer; } .daterangepicker .ranges li.active, .daterangepicker .ranges li:hover { background: #08c; border: 1px solid #08c; color: #fff; } .daterangepicker .calendar-date { border: 1px solid #ddd; padding: 4px; border-radius: 4px; background: #fff; } .daterangepicker .calendar-time { text-align: center; margin: 8px auto 0 auto; line-height: 30px; } .daterangepicker { position: absolute; background: #fff; top: 100px; left: 20px; padding: 4px; margin-top: 1px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .daterangepicker.opensleft:before { position: absolute; top: -7px; right: 9px; display: inline-block; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-left: 7px solid transparent; border-bottom-color: rgba(0, 0, 0, 0.2); content: ''; } .daterangepicker.opensleft:after { position: absolute; top: -6px; right: 10px; display: inline-block; border-right: 6px solid transparent; border-bottom: 6px solid #fff; border-left: 6px solid transparent; content: ''; } .daterangepicker.openscenter:before { position: absolute; top: -7px; left: 0; right: 0; width: 0; margin-left: auto; margin-right: auto; display: inline-block; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-left: 7px solid transparent; border-bottom-color: rgba(0, 0, 0, 0.2); content: ''; } .daterangepicker.openscenter:after { position: absolute; top: -6px; left: 0; right: 0; width: 0; margin-left: auto; margin-right: auto; display: inline-block; border-right: 6px solid transparent; border-bottom: 6px solid #fff; border-left: 6px solid transparent; content: ''; } .daterangepicker.opensright:before { position: absolute; top: -7px; left: 9px; display: inline-block; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-left: 7px solid transparent; border-bottom-color: rgba(0, 0, 0, 0.2); content: ''; } .daterangepicker.opensright:after { position: absolute; top: -6px; left: 10px; display: inline-block; border-right: 6px solid transparent; border-bottom: 6px solid #fff; border-left: 6px solid transparent; content: ''; } .daterangepicker.dropup{ margin-top: -5px; } .daterangepicker.dropup:before{ top: initial; bottom:-7px; border-bottom: initial; border-top: 7px solid #ccc; } .daterangepicker.dropup:after{ top: initial; bottom:-6px; border-bottom: initial; border-top: 6px solid #fff; } .daterangepicker table { width: 100%; margin: 0; } .daterangepicker td, .daterangepicker th { text-align: center; width: 20px; height: 20px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; cursor: pointer; white-space: nowrap; } .daterangepicker td.off { color: #999; } .daterangepicker td.disabled, .daterangepicker option.disabled { color: #999; } .daterangepicker td.available:hover, .daterangepicker th.available:hover { background: #eee; } .daterangepicker td.in-range { background: #ebf4f8; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .daterangepicker td.start-date { -webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px; } .daterangepicker td.end-date { -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .daterangepicker td.start-date.end-date { -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .daterangepicker td.active, .daterangepicker td.active:hover { background-color: #357ebd; border-color: #3071a9; color: #fff; } .daterangepicker td.week, .daterangepicker th.week { font-size: 80%; color: #ccc; } .daterangepicker select.monthselect, .daterangepicker select.yearselect { font-size: 12px; padding: 1px; height: auto; margin: 0; cursor: default; } .daterangepicker select.monthselect { margin-right: 2%; width: 56%; } .daterangepicker select.yearselect { width: 40%; } .daterangepicker select.hourselect, .daterangepicker select.minuteselect, .daterangepicker select.secondselect, .daterangepicker select.ampmselect { width: 50px; margin-bottom: 0; } .daterangepicker_start_input { float: left; } .daterangepicker_end_input { float: left; padding-left: 11px } .daterangepicker th.month { width: auto; } PK!Tdaterangepicker/moment.min.jsnu[//! moment.js //! version : 2.9.0 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com (function(a){function b(a,b,c){switch(arguments.length){case 2:return null!=a?a:b;case 3:return null!=a?a:null!=b?b:c;default:throw new Error("Implement me")}}function c(a,b){return Bb.call(a,b)}function d(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1}}function e(a){vb.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+a)}function f(a,b){var c=!0;return o(function(){return c&&(e(a),c=!1),b.apply(this,arguments)},b)}function g(a,b){sc[a]||(e(b),sc[a]=!0)}function h(a,b){return function(c){return r(a.call(this,c),b)}}function i(a,b){return function(c){return this.localeData().ordinal(a.call(this,c),b)}}function j(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return 0>b-f?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)}function k(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&12>b&&(b+=12),d||12!==b||(b=0),b):b}function l(){}function m(a,b){b!==!1&&H(a),p(this,a),this._d=new Date(+a._d),uc===!1&&(uc=!0,vb.updateOffset(this),uc=!1)}function n(a){var b=A(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._milliseconds=+k+1e3*j+6e4*i+36e5*h,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=vb.localeData(),this._bubble()}function o(a,b){for(var d in b)c(b,d)&&(a[d]=b[d]);return c(b,"toString")&&(a.toString=b.toString),c(b,"valueOf")&&(a.valueOf=b.valueOf),a}function p(a,b){var c,d,e;if("undefined"!=typeof b._isAMomentObject&&(a._isAMomentObject=b._isAMomentObject),"undefined"!=typeof b._i&&(a._i=b._i),"undefined"!=typeof b._f&&(a._f=b._f),"undefined"!=typeof b._l&&(a._l=b._l),"undefined"!=typeof b._strict&&(a._strict=b._strict),"undefined"!=typeof b._tzm&&(a._tzm=b._tzm),"undefined"!=typeof b._isUTC&&(a._isUTC=b._isUTC),"undefined"!=typeof b._offset&&(a._offset=b._offset),"undefined"!=typeof b._pf&&(a._pf=b._pf),"undefined"!=typeof b._locale&&(a._locale=b._locale),Kb.length>0)for(c in Kb)d=Kb[c],e=b[d],"undefined"!=typeof e&&(a[d]=e);return a}function q(a){return 0>a?Math.ceil(a):Math.floor(a)}function r(a,b,c){for(var d=""+Math.abs(a),e=a>=0;d.lengthd;d++)(c&&a[d]!==b[d]||!c&&C(a[d])!==C(b[d]))&&g++;return g+f}function z(a){if(a){var b=a.toLowerCase().replace(/(.)s$/,"$1");a=lc[a]||mc[b]||b}return a}function A(a){var b,d,e={};for(d in a)c(a,d)&&(b=z(d),b&&(e[b]=a[d]));return e}function B(b){var c,d;if(0===b.indexOf("week"))c=7,d="day";else{if(0!==b.indexOf("month"))return;c=12,d="month"}vb[b]=function(e,f){var g,h,i=vb._locale[b],j=[];if("number"==typeof e&&(f=e,e=a),h=function(a){var b=vb().utc().set(d,a);return i.call(vb._locale,b,e||"")},null!=f)return h(f);for(g=0;c>g;g++)j.push(h(g));return j}}function C(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=b>=0?Math.floor(b):Math.ceil(b)),c}function D(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function E(a,b,c){return jb(vb([a,11,31+b-c]),b,c).week}function F(a){return G(a)?366:365}function G(a){return a%4===0&&a%100!==0||a%400===0}function H(a){var b;a._a&&-2===a._pf.overflow&&(b=a._a[Db]<0||a._a[Db]>11?Db:a._a[Eb]<1||a._a[Eb]>D(a._a[Cb],a._a[Db])?Eb:a._a[Fb]<0||a._a[Fb]>24||24===a._a[Fb]&&(0!==a._a[Gb]||0!==a._a[Hb]||0!==a._a[Ib])?Fb:a._a[Gb]<0||a._a[Gb]>59?Gb:a._a[Hb]<0||a._a[Hb]>59?Hb:a._a[Ib]<0||a._a[Ib]>999?Ib:-1,a._pf._overflowDayOfYear&&(Cb>b||b>Eb)&&(b=Eb),a._pf.overflow=b)}function I(b){return null==b._isValid&&(b._isValid=!isNaN(b._d.getTime())&&b._pf.overflow<0&&!b._pf.empty&&!b._pf.invalidMonth&&!b._pf.nullInput&&!b._pf.invalidFormat&&!b._pf.userInvalidated,b._strict&&(b._isValid=b._isValid&&0===b._pf.charsLeftOver&&0===b._pf.unusedTokens.length&&b._pf.bigHour===a)),b._isValid}function J(a){return a?a.toLowerCase().replace("_","-"):a}function K(a){for(var b,c,d,e,f=0;f0;){if(d=L(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&y(e,c,!0)>=b-1)break;b--}f++}return null}function L(a){var b=null;if(!Jb[a]&&Lb)try{b=vb.locale(),require("./locale/"+a),vb.locale(b)}catch(c){}return Jb[a]}function M(a,b){var c,d;return b._isUTC?(c=b.clone(),d=(vb.isMoment(a)||x(a)?+a:+vb(a))-+c,c._d.setTime(+c._d+d),vb.updateOffset(c,!1),c):vb(a).local()}function N(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function O(a){var b,c,d=a.match(Pb);for(b=0,c=d.length;c>b;b++)d[b]=rc[d[b]]?rc[d[b]]:N(d[b]);return function(e){var f="";for(b=0;c>b;b++)f+=d[b]instanceof Function?d[b].call(e,a):d[b];return f}}function P(a,b){return a.isValid()?(b=Q(b,a.localeData()),nc[b]||(nc[b]=O(b)),nc[b](a)):a.localeData().invalidDate()}function Q(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Qb.lastIndex=0;d>=0&&Qb.test(a);)a=a.replace(Qb,c),Qb.lastIndex=0,d-=1;return a}function R(a,b){var c,d=b._strict;switch(a){case"Q":return _b;case"DDDD":return bc;case"YYYY":case"GGGG":case"gggg":return d?cc:Tb;case"Y":case"G":case"g":return ec;case"YYYYYY":case"YYYYY":case"GGGGG":case"ggggg":return d?dc:Ub;case"S":if(d)return _b;case"SS":if(d)return ac;case"SSS":if(d)return bc;case"DDD":return Sb;case"MMM":case"MMMM":case"dd":case"ddd":case"dddd":return Wb;case"a":case"A":return b._locale._meridiemParse;case"x":return Zb;case"X":return $b;case"Z":case"ZZ":return Xb;case"T":return Yb;case"SSSS":return Vb;case"MM":case"DD":case"YY":case"GG":case"gg":case"HH":case"hh":case"mm":case"ss":case"ww":case"WW":return d?ac:Rb;case"M":case"D":case"d":case"H":case"h":case"m":case"s":case"w":case"W":case"e":case"E":return Rb;case"Do":return d?b._locale._ordinalParse:b._locale._ordinalParseLenient;default:return c=new RegExp($(Z(a.replace("\\","")),"i"))}}function S(a){a=a||"";var b=a.match(Xb)||[],c=b[b.length-1]||[],d=(c+"").match(jc)||["-",0,0],e=+(60*d[1])+C(d[2]);return"+"===d[0]?e:-e}function T(a,b,c){var d,e=c._a;switch(a){case"Q":null!=b&&(e[Db]=3*(C(b)-1));break;case"M":case"MM":null!=b&&(e[Db]=C(b)-1);break;case"MMM":case"MMMM":d=c._locale.monthsParse(b,a,c._strict),null!=d?e[Db]=d:c._pf.invalidMonth=b;break;case"D":case"DD":null!=b&&(e[Eb]=C(b));break;case"Do":null!=b&&(e[Eb]=C(parseInt(b.match(/\d{1,2}/)[0],10)));break;case"DDD":case"DDDD":null!=b&&(c._dayOfYear=C(b));break;case"YY":e[Cb]=vb.parseTwoDigitYear(b);break;case"YYYY":case"YYYYY":case"YYYYYY":e[Cb]=C(b);break;case"a":case"A":c._meridiem=b;break;case"h":case"hh":c._pf.bigHour=!0;case"H":case"HH":e[Fb]=C(b);break;case"m":case"mm":e[Gb]=C(b);break;case"s":case"ss":e[Hb]=C(b);break;case"S":case"SS":case"SSS":case"SSSS":e[Ib]=C(1e3*("0."+b));break;case"x":c._d=new Date(C(b));break;case"X":c._d=new Date(1e3*parseFloat(b));break;case"Z":case"ZZ":c._useUTC=!0,c._tzm=S(b);break;case"dd":case"ddd":case"dddd":d=c._locale.weekdaysParse(b),null!=d?(c._w=c._w||{},c._w.d=d):c._pf.invalidWeekday=b;break;case"w":case"ww":case"W":case"WW":case"d":case"e":case"E":a=a.substr(0,1);case"gggg":case"GGGG":case"GGGGG":a=a.substr(0,2),b&&(c._w=c._w||{},c._w[a]=C(b));break;case"gg":case"GG":c._w=c._w||{},c._w[a]=vb.parseTwoDigitYear(b)}}function U(a){var c,d,e,f,g,h,i;c=a._w,null!=c.GG||null!=c.W||null!=c.E?(g=1,h=4,d=b(c.GG,a._a[Cb],jb(vb(),1,4).year),e=b(c.W,1),f=b(c.E,1)):(g=a._locale._week.dow,h=a._locale._week.doy,d=b(c.gg,a._a[Cb],jb(vb(),g,h).year),e=b(c.w,1),null!=c.d?(f=c.d,g>f&&++e):f=null!=c.e?c.e+g:g),i=kb(d,e,f,h,g),a._a[Cb]=i.year,a._dayOfYear=i.dayOfYear}function V(a){var c,d,e,f,g=[];if(!a._d){for(e=X(a),a._w&&null==a._a[Eb]&&null==a._a[Db]&&U(a),a._dayOfYear&&(f=b(a._a[Cb],e[Cb]),a._dayOfYear>F(f)&&(a._pf._overflowDayOfYear=!0),d=fb(f,0,a._dayOfYear),a._a[Db]=d.getUTCMonth(),a._a[Eb]=d.getUTCDate()),c=0;3>c&&null==a._a[c];++c)a._a[c]=g[c]=e[c];for(;7>c;c++)a._a[c]=g[c]=null==a._a[c]?2===c?1:0:a._a[c];24===a._a[Fb]&&0===a._a[Gb]&&0===a._a[Hb]&&0===a._a[Ib]&&(a._nextDay=!0,a._a[Fb]=0),a._d=(a._useUTC?fb:eb).apply(null,g),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[Fb]=24)}}function W(a){var b;a._d||(b=A(a._i),a._a=[b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],V(a))}function X(a){var b=new Date;return a._useUTC?[b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate()]:[b.getFullYear(),b.getMonth(),b.getDate()]}function Y(b){if(b._f===vb.ISO_8601)return void ab(b);b._a=[],b._pf.empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Q(b._f,b._locale).match(Pb)||[],c=0;c0&&b._pf.unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),rc[f]?(d?b._pf.empty=!1:b._pf.unusedTokens.push(f),T(f,d,b)):b._strict&&!d&&b._pf.unusedTokens.push(f);b._pf.charsLeftOver=i-j,h.length>0&&b._pf.unusedInput.push(h),b._pf.bigHour===!0&&b._a[Fb]<=12&&(b._pf.bigHour=a),b._a[Fb]=k(b._locale,b._a[Fb],b._meridiem),V(b),H(b)}function Z(a){return a.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e})}function $(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function _(a){var b,c,e,f,g;if(0===a._f.length)return a._pf.invalidFormat=!0,void(a._d=new Date(0/0));for(f=0;fg)&&(e=g,c=b));o(a,c||b)}function ab(a){var b,c,d=a._i,e=fc.exec(d);if(e){for(a._pf.iso=!0,b=0,c=hc.length;c>b;b++)if(hc[b][1].exec(d)){a._f=hc[b][0]+(e[6]||" ");break}for(b=0,c=ic.length;c>b;b++)if(ic[b][1].exec(d)){a._f+=ic[b][0];break}d.match(Xb)&&(a._f+="Z"),Y(a)}else a._isValid=!1}function bb(a){ab(a),a._isValid===!1&&(delete a._isValid,vb.createFromInputFallback(a))}function cb(a,b){var c,d=[];for(c=0;ca&&h.setFullYear(a),h}function fb(a){var b=new Date(Date.UTC.apply(null,arguments));return 1970>a&&b.setUTCFullYear(a),b}function gb(a,b){if("string"==typeof a)if(isNaN(a)){if(a=b.weekdaysParse(a),"number"!=typeof a)return null}else a=parseInt(a,10);return a}function hb(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function ib(a,b,c){var d=vb.duration(a).abs(),e=Ab(d.as("s")),f=Ab(d.as("m")),g=Ab(d.as("h")),h=Ab(d.as("d")),i=Ab(d.as("M")),j=Ab(d.as("y")),k=e0,k[4]=c,hb.apply({},k)}function jb(a,b,c){var d,e=c-b,f=c-a.day();return f>e&&(f-=7),e-7>f&&(f+=7),d=vb(a).add(f,"d"),{week:Math.ceil(d.dayOfYear()/7),year:d.year()}}function kb(a,b,c,d,e){var f,g,h=fb(a,0,1).getUTCDay();return h=0===h?7:h,c=null!=c?c:e,f=e-h+(h>d?7:0)-(e>h?7:0),g=7*(b-1)+(c-e)+f+1,{year:g>0?a:a-1,dayOfYear:g>0?g:F(a-1)+g}}function lb(b){var c,d=b._i,e=b._f;return b._locale=b._locale||vb.localeData(b._l),null===d||e===a&&""===d?vb.invalid({nullInput:!0}):("string"==typeof d&&(b._i=d=b._locale.preparse(d)),vb.isMoment(d)?new m(d,!0):(e?w(e)?_(b):Y(b):db(b),c=new m(b),c._nextDay&&(c.add(1,"d"),c._nextDay=a),c))}function mb(a,b){var c,d;if(1===b.length&&w(b[0])&&(b=b[0]),!b.length)return vb();for(c=b[0],d=1;d=0?"+":"-";return b+r(Math.abs(a),6)},gg:function(){return r(this.weekYear()%100,2)},gggg:function(){return r(this.weekYear(),4)},ggggg:function(){return r(this.weekYear(),5)},GG:function(){return r(this.isoWeekYear()%100,2)},GGGG:function(){return r(this.isoWeekYear(),4)},GGGGG:function(){return r(this.isoWeekYear(),5)},e:function(){return this.weekday()},E:function(){return this.isoWeekday()},a:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!0)},A:function(){return this.localeData().meridiem(this.hours(),this.minutes(),!1)},H:function(){return this.hours()},h:function(){return this.hours()%12||12},m:function(){return this.minutes()},s:function(){return this.seconds()},S:function(){return C(this.milliseconds()/100)},SS:function(){return r(C(this.milliseconds()/10),2)},SSS:function(){return r(this.milliseconds(),3)},SSSS:function(){return r(this.milliseconds(),3)},Z:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+":"+r(C(a)%60,2)},ZZ:function(){var a=this.utcOffset(),b="+";return 0>a&&(a=-a,b="-"),b+r(C(a/60),2)+r(C(a)%60,2)},z:function(){return this.zoneAbbr()},zz:function(){return this.zoneName()},x:function(){return this.valueOf()},X:function(){return this.unix()},Q:function(){return this.quarter()}},sc={},tc=["months","monthsShort","weekdays","weekdaysShort","weekdaysMin"],uc=!1;pc.length;)xb=pc.pop(),rc[xb+"o"]=i(rc[xb],xb);for(;qc.length;)xb=qc.pop(),rc[xb+xb]=h(rc[xb],2);rc.DDDD=h(rc.DDD,3),o(l.prototype,{set:function(a){var b,c;for(c in a)b=a[c],"function"==typeof b?this[c]=b:this["_"+c]=b;this._ordinalParseLenient=new RegExp(this._ordinalParse.source+"|"+/\d{1,2}/.source)},_months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),months:function(a){return this._months[a.month()]},_monthsShort:"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),monthsShort:function(a){return this._monthsShort[a.month()]},monthsParse:function(a,b,c){var d,e,f;for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;12>d;d++){if(e=vb.utc([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}},_weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),weekdays:function(a){return this._weekdays[a.day()]},_weekdaysShort:"Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),weekdaysShort:function(a){return this._weekdaysShort[a.day()]},_weekdaysMin:"Su_Mo_Tu_We_Th_Fr_Sa".split("_"),weekdaysMin:function(a){return this._weekdaysMin[a.day()]},weekdaysParse:function(a){var b,c,d;for(this._weekdaysParse||(this._weekdaysParse=[]),b=0;7>b;b++)if(this._weekdaysParse[b]||(c=vb([2e3,1]).day(b),d="^"+this.weekdays(c,"")+"|^"+this.weekdaysShort(c,"")+"|^"+this.weekdaysMin(c,""),this._weekdaysParse[b]=new RegExp(d.replace(".",""),"i")),this._weekdaysParse[b].test(a))return b},_longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY LT",LLLL:"dddd, MMMM D, YYYY LT"},longDateFormat:function(a){var b=this._longDateFormat[a];return!b&&this._longDateFormat[a.toUpperCase()]&&(b=this._longDateFormat[a.toUpperCase()].replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a]=b),b},isPM:function(a){return"p"===(a+"").toLowerCase().charAt(0)},_meridiemParse:/[ap]\.?m?\.?/i,meridiem:function(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"},_calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},calendar:function(a,b,c){var d=this._calendar[a];return"function"==typeof d?d.apply(b,[c]):d},_relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},relativeTime:function(a,b,c,d){var e=this._relativeTime[c];return"function"==typeof e?e(a,b,c,d):e.replace(/%d/i,a)},pastFuture:function(a,b){var c=this._relativeTime[a>0?"future":"past"];return"function"==typeof c?c(b):c.replace(/%s/i,b)},ordinal:function(a){return this._ordinal.replace("%d",a)},_ordinal:"%d",_ordinalParse:/\d{1,2}/,preparse:function(a){return a},postformat:function(a){return a},week:function(a){return jb(a,this._week.dow,this._week.doy).week},_week:{dow:0,doy:6},firstDayOfWeek:function(){return this._week.dow},firstDayOfYear:function(){return this._week.doy},_invalidDate:"Invalid date",invalidDate:function(){return this._invalidDate}}),vb=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._i=b,g._f=c,g._l=e,g._strict=f,g._isUTC=!1,g._pf=d(),lb(g)},vb.suppressDeprecationWarnings=!1,vb.createFromInputFallback=f("moment construction falls back to js Date. This is discouraged and will be removed in upcoming major release. Please refer to https://github.com/moment/moment/issues/1407 for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),vb.min=function(){var a=[].slice.call(arguments,0);return mb("isBefore",a)},vb.max=function(){var a=[].slice.call(arguments,0);return mb("isAfter",a)},vb.utc=function(b,c,e,f){var g;return"boolean"==typeof e&&(f=e,e=a),g={},g._isAMomentObject=!0,g._useUTC=!0,g._isUTC=!0,g._l=e,g._i=b,g._f=c,g._strict=f,g._pf=d(),lb(g).utc()},vb.unix=function(a){return vb(1e3*a)},vb.duration=function(a,b){var d,e,f,g,h=a,i=null;return vb.isDuration(a)?h={ms:a._milliseconds,d:a._days,M:a._months}:"number"==typeof a?(h={},b?h[b]=a:h.milliseconds=a):(i=Nb.exec(a))?(d="-"===i[1]?-1:1,h={y:0,d:C(i[Eb])*d,h:C(i[Fb])*d,m:C(i[Gb])*d,s:C(i[Hb])*d,ms:C(i[Ib])*d}):(i=Ob.exec(a))?(d="-"===i[1]?-1:1,f=function(a){var b=a&&parseFloat(a.replace(",","."));return(isNaN(b)?0:b)*d},h={y:f(i[2]),M:f(i[3]),d:f(i[4]),h:f(i[5]),m:f(i[6]),s:f(i[7]),w:f(i[8])}):null==h?h={}:"object"==typeof h&&("from"in h||"to"in h)&&(g=t(vb(h.from),vb(h.to)),h={},h.ms=g.milliseconds,h.M=g.months),e=new n(h),vb.isDuration(a)&&c(a,"_locale")&&(e._locale=a._locale),e},vb.version=yb,vb.defaultFormat=gc,vb.ISO_8601=function(){},vb.momentProperties=Kb,vb.updateOffset=function(){},vb.relativeTimeThreshold=function(b,c){return oc[b]===a?!1:c===a?oc[b]:(oc[b]=c,!0)},vb.lang=f("moment.lang is deprecated. Use moment.locale instead.",function(a,b){return vb.locale(a,b)}),vb.locale=function(a,b){var c;return a&&(c="undefined"!=typeof b?vb.defineLocale(a,b):vb.localeData(a),c&&(vb.duration._locale=vb._locale=c)),vb._locale._abbr},vb.defineLocale=function(a,b){return null!==b?(b.abbr=a,Jb[a]||(Jb[a]=new l),Jb[a].set(b),vb.locale(a),Jb[a]):(delete Jb[a],null)},vb.langData=f("moment.langData is deprecated. Use moment.localeData instead.",function(a){return vb.localeData(a)}),vb.localeData=function(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return vb._locale;if(!w(a)){if(b=L(a))return b;a=[a]}return K(a)},vb.isMoment=function(a){return a instanceof m||null!=a&&c(a,"_isAMomentObject")},vb.isDuration=function(a){return a instanceof n};for(xb=tc.length-1;xb>=0;--xb)B(tc[xb]);vb.normalizeUnits=function(a){return z(a)},vb.invalid=function(a){var b=vb.utc(0/0);return null!=a?o(b._pf,a):b._pf.userInvalidated=!0,b},vb.parseZone=function(){return vb.apply(null,arguments).parseZone()},vb.parseTwoDigitYear=function(a){return C(a)+(C(a)>68?1900:2e3)},vb.isDate=x,o(vb.fn=m.prototype,{clone:function(){return vb(this)},valueOf:function(){return+this._d-6e4*(this._offset||0)},unix:function(){return Math.floor(+this/1e3)},toString:function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},toDate:function(){return this._offset?new Date(+this):this._d},toISOString:function(){var a=vb(this).utc();return 00:!1},parsingFlags:function(){return o({},this._pf)},invalidAt:function(){return this._pf.overflow},utc:function(a){return this.utcOffset(0,a)},local:function(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(this._dateUtcOffset(),"m")),this},format:function(a){var b=P(this,a||vb.defaultFormat);return this.localeData().postformat(b)},add:u(1,"add"),subtract:u(-1,"subtract"),diff:function(a,b,c){var d,e,f=M(a,this),g=6e4*(f.utcOffset()-this.utcOffset());return b=z(b),"year"===b||"month"===b||"quarter"===b?(e=j(this,f),"quarter"===b?e/=3:"year"===b&&(e/=12)):(d=this-f,e="second"===b?d/1e3:"minute"===b?d/6e4:"hour"===b?d/36e5:"day"===b?(d-g)/864e5:"week"===b?(d-g)/6048e5:d),c?e:q(e)},from:function(a,b){return vb.duration({to:this,from:a}).locale(this.locale()).humanize(!b)},fromNow:function(a){return this.from(vb(),a)},calendar:function(a){var b=a||vb(),c=M(b,this).startOf("day"),d=this.diff(c,"days",!0),e=-6>d?"sameElse":-1>d?"lastWeek":0>d?"lastDay":1>d?"sameDay":2>d?"nextDay":7>d?"nextWeek":"sameElse";return this.format(this.localeData().calendar(e,this,vb(b)))},isLeapYear:function(){return G(this.year())},isDST:function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},day:function(a){var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=gb(a,this.localeData()),this.add(a-b,"d")):b},month:qb("Month",!0),startOf:function(a){switch(a=z(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a?this.weekday(0):"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this},endOf:function(b){return b=z(b),b===a||"millisecond"===b?this:this.startOf(b).add(1,"isoWeek"===b?"week":b).subtract(1,"ms")},isAfter:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+this>+a):(c=vb.isMoment(a)?+a:+vb(a),c<+this.clone().startOf(b))},isBefore:function(a,b){var c;return b=z("undefined"!=typeof b?b:"millisecond"),"millisecond"===b?(a=vb.isMoment(a)?a:vb(a),+a>+this):(c=vb.isMoment(a)?+a:+vb(a),+this.clone().endOf(b)a?this:a}),max:f("moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548",function(a){return a=vb.apply(null,arguments),a>this?this:a}),zone:f("moment().zone is deprecated, use moment().utcOffset instead. https://github.com/moment/moment/issues/1779",function(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}),utcOffset:function(a,b){var c,d=this._offset||0;return null!=a?("string"==typeof a&&(a=S(a)),Math.abs(a)<16&&(a=60*a),!this._isUTC&&b&&(c=this._dateUtcOffset()),this._offset=a,this._isUTC=!0,null!=c&&this.add(c,"m"),d!==a&&(!b||this._changeInProgress?v(this,vb.duration(a-d,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,vb.updateOffset(this,!0),this._changeInProgress=null)),this):this._isUTC?d:this._dateUtcOffset()},isLocal:function(){return!this._isUTC},isUtcOffset:function(){return this._isUTC},isUtc:function(){return this._isUTC&&0===this._offset},zoneAbbr:function(){return this._isUTC?"UTC":""},zoneName:function(){return this._isUTC?"Coordinated Universal Time":""},parseZone:function(){return this._tzm?this.utcOffset(this._tzm):"string"==typeof this._i&&this.utcOffset(S(this._i)),this},hasAlignedHourOffset:function(a){return a=a?vb(a).utcOffset():0,(this.utcOffset()-a)%60===0},daysInMonth:function(){return D(this.year(),this.month())},dayOfYear:function(a){var b=Ab((vb(this).startOf("day")-vb(this).startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")},quarter:function(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)},weekYear:function(a){var b=jb(this,this.localeData()._week.dow,this.localeData()._week.doy).year;return null==a?b:this.add(a-b,"y")},isoWeekYear:function(a){var b=jb(this,1,4).year;return null==a?b:this.add(a-b,"y")},week:function(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")},isoWeek:function(a){var b=jb(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")},weekday:function(a){var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")},isoWeekday:function(a){return null==a?this.day()||7:this.day(this.day()%7?a:a-7)},isoWeeksInYear:function(){return E(this.year(),1,4)},weeksInYear:function(){var a=this.localeData()._week;return E(this.year(),a.dow,a.doy)},get:function(a){return a=z(a),this[a]()},set:function(a,b){var c;if("object"==typeof a)for(c in a)this.set(c,a[c]);else a=z(a),"function"==typeof this[a]&&this[a](b);return this},locale:function(b){var c;return b===a?this._locale._abbr:(c=vb.localeData(b),null!=c&&(this._locale=c),this)},lang:f("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(b){return b===a?this.localeData():this.locale(b)}),localeData:function(){return this._locale},_dateUtcOffset:function(){return 15*-Math.round(this._d.getTimezoneOffset()/15)}}),vb.fn.millisecond=vb.fn.milliseconds=qb("Milliseconds",!1),vb.fn.second=vb.fn.seconds=qb("Seconds",!1),vb.fn.minute=vb.fn.minutes=qb("Minutes",!1),vb.fn.hour=vb.fn.hours=qb("Hours",!0),vb.fn.date=qb("Date",!0),vb.fn.dates=f("dates accessor is deprecated. Use date instead.",qb("Date",!0)),vb.fn.year=qb("FullYear",!0),vb.fn.years=f("years accessor is deprecated. Use year instead.",qb("FullYear",!0)),vb.fn.days=vb.fn.day,vb.fn.months=vb.fn.month,vb.fn.weeks=vb.fn.week,vb.fn.isoWeeks=vb.fn.isoWeek,vb.fn.quarters=vb.fn.quarter,vb.fn.toJSON=vb.fn.toISOString,vb.fn.isUTC=vb.fn.isUtc,o(vb.duration.fn=n.prototype,{_bubble:function(){var a,b,c,d=this._milliseconds,e=this._days,f=this._months,g=this._data,h=0;g.milliseconds=d%1e3,a=q(d/1e3),g.seconds=a%60,b=q(a/60),g.minutes=b%60,c=q(b/60),g.hours=c%24,e+=q(c/24),h=q(rb(e)),e-=q(sb(h)),f+=q(e/30),e%=30,h+=q(f/12),f%=12,g.days=e,g.months=f,g.years=h},abs:function(){return this._milliseconds=Math.abs(this._milliseconds),this._days=Math.abs(this._days),this._months=Math.abs(this._months),this._data.milliseconds=Math.abs(this._data.milliseconds),this._data.seconds=Math.abs(this._data.seconds),this._data.minutes=Math.abs(this._data.minutes),this._data.hours=Math.abs(this._data.hours),this._data.months=Math.abs(this._data.months),this._data.years=Math.abs(this._data.years),this},weeks:function(){return q(this.days()/7)},valueOf:function(){return this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*C(this._months/12) },humanize:function(a){var b=ib(this,!a,this.localeData());return a&&(b=this.localeData().pastFuture(+this,b)),this.localeData().postformat(b)},add:function(a,b){var c=vb.duration(a,b);return this._milliseconds+=c._milliseconds,this._days+=c._days,this._months+=c._months,this._bubble(),this},subtract:function(a,b){var c=vb.duration(a,b);return this._milliseconds-=c._milliseconds,this._days-=c._days,this._months-=c._months,this._bubble(),this},get:function(a){return a=z(a),this[a.toLowerCase()+"s"]()},as:function(a){var b,c;if(a=z(a),"month"===a||"year"===a)return b=this._days+this._milliseconds/864e5,c=this._months+12*rb(b),"month"===a?c:c/12;switch(b=this._days+Math.round(sb(this._months/12)),a){case"week":return b/7+this._milliseconds/6048e5;case"day":return b+this._milliseconds/864e5;case"hour":return 24*b+this._milliseconds/36e5;case"minute":return 24*b*60+this._milliseconds/6e4;case"second":return 24*b*60*60+this._milliseconds/1e3;case"millisecond":return Math.floor(24*b*60*60*1e3)+this._milliseconds;default:throw new Error("Unknown unit "+a)}},lang:vb.fn.lang,locale:vb.fn.locale,toIsoString:f("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",function(){return this.toISOString()}),toISOString:function(){var a=Math.abs(this.years()),b=Math.abs(this.months()),c=Math.abs(this.days()),d=Math.abs(this.hours()),e=Math.abs(this.minutes()),f=Math.abs(this.seconds()+this.milliseconds()/1e3);return this.asSeconds()?(this.asSeconds()<0?"-":"")+"P"+(a?a+"Y":"")+(b?b+"M":"")+(c?c+"D":"")+(d||e||f?"T":"")+(d?d+"H":"")+(e?e+"M":"")+(f?f+"S":""):"P0D"},localeData:function(){return this._locale},toJSON:function(){return this.toISOString()}}),vb.duration.fn.toString=vb.duration.fn.toISOString;for(xb in kc)c(kc,xb)&&tb(xb.toLowerCase());vb.duration.fn.asMilliseconds=function(){return this.as("ms")},vb.duration.fn.asSeconds=function(){return this.as("s")},vb.duration.fn.asMinutes=function(){return this.as("m")},vb.duration.fn.asHours=function(){return this.as("h")},vb.duration.fn.asDays=function(){return this.as("d")},vb.duration.fn.asWeeks=function(){return this.as("weeks")},vb.duration.fn.asMonths=function(){return this.as("M")},vb.duration.fn.asYears=function(){return this.as("y")},vb.locale("en",{ordinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===C(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),Lb?module.exports=vb:"function"==typeof define&&define.amd?(define(function(a,b,c){return c.config&&c.config()&&c.config().noGlobal===!0&&(zb.moment=wb),vb}),ub(!0)):ub()}).call(this);PK!"daterangepicker/daterangepicker.jsnu[/** * @version: 1.3.21 * @author: Dan Grossman http://www.dangrossman.info/ * @copyright: Copyright (c) 2012-2015 Dan Grossman. All rights reserved. * @license: Licensed under the MIT license. See http://www.opensource.org/licenses/mit-license.php * @website: https://www.improvely.com/ */ (function(root, factory) { if (typeof define === 'function' && define.amd) { define(['moment', 'jquery', 'exports'], function(momentjs, $, exports) { root.daterangepicker = factory(root, exports, momentjs, $); }); } else if (typeof exports !== 'undefined') { var momentjs = require('moment'); var jQuery; try { jQuery = require('jquery'); } catch (err) { jQuery = window.jQuery; if (!jQuery) throw new Error('jQuery dependency not found'); } factory(root, exports, momentjs, jQuery); // Finally, as a browser global. } else { root.daterangepicker = factory(root, {}, root.moment, (root.jQuery || root.Zepto || root.ender || root.$)); } }(this, function(root, daterangepicker, moment, $) { var DateRangePicker = function (element, options, cb) { // by default, the daterangepicker element is placed at the bottom of HTML body this.parentEl = 'body'; //element that triggered the date range picker this.element = $(element); //tracks visible state this.isShowing = false; //create the picker HTML object var DRPTemplate = ''; //custom options if (typeof options !== 'object' || options === null) options = {}; this.parentEl = (typeof options === 'object' && options.parentEl && $(options.parentEl).length) ? $(options.parentEl) : $(this.parentEl); this.container = $(DRPTemplate).appendTo(this.parentEl); this.setOptions(options, cb); //event listeners this.container.find('.calendar') .on('click.daterangepicker', '.prev', $.proxy(this.clickPrev, this)) .on('click.daterangepicker', '.next', $.proxy(this.clickNext, this)) .on('click.daterangepicker', 'td.available', $.proxy(this.clickDate, this)) .on('mouseenter.daterangepicker', 'td.available', $.proxy(this.hoverDate, this)) .on('mouseleave.daterangepicker', 'td.available', $.proxy(this.updateFormInputs, this)) .on('change.daterangepicker', 'select.yearselect', $.proxy(this.updateMonthYear, this)) .on('change.daterangepicker', 'select.monthselect', $.proxy(this.updateMonthYear, this)) .on('change.daterangepicker', 'select.hourselect,select.minuteselect,select.secondselect,select.ampmselect', $.proxy(this.updateTime, this)); this.container.find('.ranges') .on('click.daterangepicker', 'button.applyBtn', $.proxy(this.clickApply, this)) .on('click.daterangepicker', 'button.cancelBtn', $.proxy(this.clickCancel, this)) .on('click.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.showCalendars, this)) .on('change.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.inputsChanged, this)) .on('keydown.daterangepicker', '.daterangepicker_start_input,.daterangepicker_end_input', $.proxy(this.inputsKeydown, this)) .on('click.daterangepicker', 'li', $.proxy(this.clickRange, this)) .on('mouseenter.daterangepicker', 'li', $.proxy(this.enterRange, this)) .on('mouseleave.daterangepicker', 'li', $.proxy(this.updateFormInputs, this)); if (this.element.is('input')) { this.element.on({ 'click.daterangepicker': $.proxy(this.show, this), 'focus.daterangepicker': $.proxy(this.show, this), 'keyup.daterangepicker': $.proxy(this.updateFromControl, this), 'keydown.daterangepicker': $.proxy(this.keydown, this) }); } else { this.element.on('click.daterangepicker', $.proxy(this.toggle, this)); } }; DateRangePicker.prototype = { constructor: DateRangePicker, setOptions: function(options, callback) { this.startDate = moment().startOf('day'); this.endDate = moment().endOf('day'); this.timeZone = moment().utcOffset(); this.minDate = false; this.maxDate = false; this.dateLimit = false; this.showDropdowns = false; this.showWeekNumbers = false; this.timePicker = false; this.timePickerSeconds = false; this.timePickerIncrement = 30; this.timePicker12Hour = true; this.singleDatePicker = false; this.ranges = {}; this.opens = 'right'; if (this.element.hasClass('pull-right')) this.opens = 'left'; this.drops = 'down'; if (this.element.hasClass('dropup')) this.drops = 'up'; this.buttonClasses = ['btn', 'btn-small btn-sm']; this.applyClass = 'btn-success'; this.cancelClass = 'btn-default'; this.format = 'MM/DD/YYYY'; this.separator = ' - '; this.locale = { applyLabel: 'Apply', cancelLabel: 'Cancel', fromLabel: 'From', toLabel: 'To', weekLabel: 'W', customRangeLabel: 'Custom Range', daysOfWeek: moment.weekdaysMin(), monthNames: moment.monthsShort(), firstDay: moment.localeData()._week.dow }; this.cb = function () { }; if (typeof options.format === 'string') this.format = options.format; if (typeof options.separator === 'string') this.separator = options.separator; if (typeof options.startDate === 'string') this.startDate = moment(options.startDate, this.format); if (typeof options.endDate === 'string') this.endDate = moment(options.endDate, this.format); if (typeof options.minDate === 'string') this.minDate = moment(options.minDate, this.format); if (typeof options.maxDate === 'string') this.maxDate = moment(options.maxDate, this.format); if (typeof options.startDate === 'object') this.startDate = moment(options.startDate); if (typeof options.endDate === 'object') this.endDate = moment(options.endDate); if (typeof options.minDate === 'object') this.minDate = moment(options.minDate); if (typeof options.maxDate === 'object') this.maxDate = moment(options.maxDate); if (typeof options.applyClass === 'string') this.applyClass = options.applyClass; if (typeof options.cancelClass === 'string') this.cancelClass = options.cancelClass; if (typeof options.dateLimit === 'object') this.dateLimit = options.dateLimit; if (typeof options.locale === 'object') { if (typeof options.locale.daysOfWeek === 'object') { // Create a copy of daysOfWeek to avoid modification of original // options object for reusability in multiple daterangepicker instances this.locale.daysOfWeek = options.locale.daysOfWeek.slice(); } if (typeof options.locale.monthNames === 'object') { this.locale.monthNames = options.locale.monthNames.slice(); } if (typeof options.locale.firstDay === 'number') { this.locale.firstDay = options.locale.firstDay; } if (typeof options.locale.applyLabel === 'string') { this.locale.applyLabel = options.locale.applyLabel; } if (typeof options.locale.cancelLabel === 'string') { this.locale.cancelLabel = options.locale.cancelLabel; } if (typeof options.locale.fromLabel === 'string') { this.locale.fromLabel = options.locale.fromLabel; } if (typeof options.locale.toLabel === 'string') { this.locale.toLabel = options.locale.toLabel; } if (typeof options.locale.weekLabel === 'string') { this.locale.weekLabel = options.locale.weekLabel; } if (typeof options.locale.customRangeLabel === 'string') { this.locale.customRangeLabel = options.locale.customRangeLabel; } } if (typeof options.opens === 'string') this.opens = options.opens; if (typeof options.drops === 'string') this.drops = options.drops; if (typeof options.showWeekNumbers === 'boolean') { this.showWeekNumbers = options.showWeekNumbers; } if (typeof options.buttonClasses === 'string') { this.buttonClasses = [options.buttonClasses]; } if (typeof options.buttonClasses === 'object') { this.buttonClasses = options.buttonClasses; } if (typeof options.showDropdowns === 'boolean') { this.showDropdowns = options.showDropdowns; } if (typeof options.singleDatePicker === 'boolean') { this.singleDatePicker = options.singleDatePicker; if (this.singleDatePicker) { this.endDate = this.startDate.clone(); } } if (typeof options.timePicker === 'boolean') { this.timePicker = options.timePicker; } if (typeof options.timePickerSeconds === 'boolean') { this.timePickerSeconds = options.timePickerSeconds; } if (typeof options.timePickerIncrement === 'number') { this.timePickerIncrement = options.timePickerIncrement; } if (typeof options.timePicker12Hour === 'boolean') { this.timePicker12Hour = options.timePicker12Hour; } // update day names order to firstDay if (this.locale.firstDay != 0) { var iterator = this.locale.firstDay; while (iterator > 0) { this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()); iterator--; } } var start, end, range; //if no start/end dates set, check if an input element contains initial values if (typeof options.startDate === 'undefined' && typeof options.endDate === 'undefined') { if ($(this.element).is('input[type=text]')) { var val = $(this.element).val(), split = val.split(this.separator); start = end = null; if (split.length == 2) { start = moment(split[0], this.format); end = moment(split[1], this.format); } else if (this.singleDatePicker && val !== "") { start = moment(val, this.format); end = moment(val, this.format); } if (start !== null && end !== null) { this.startDate = start; this.endDate = end; } } } // bind the time zone used to build the calendar to either the timeZone passed in through the options or the zone of the startDate (which will be the local time zone by default) if (typeof options.timeZone === 'string' || typeof options.timeZone === 'number') { if (typeof options.timeZone === 'string' && typeof moment.tz !== 'undefined') { this.timeZone = moment.tz.zone(options.timeZone).parse(new Date) * -1; // Offset is positive if the timezone is behind UTC and negative if it is ahead. } else { this.timeZone = options.timeZone; } this.startDate.utcOffset(this.timeZone); this.endDate.utcOffset(this.timeZone); } else { this.timeZone = moment(this.startDate).utcOffset(); } if (typeof options.ranges === 'object') { for (range in options.ranges) { if (typeof options.ranges[range][0] === 'string') start = moment(options.ranges[range][0], this.format); else start = moment(options.ranges[range][0]); if (typeof options.ranges[range][1] === 'string') end = moment(options.ranges[range][1], this.format); else end = moment(options.ranges[range][1]); // If we have a min/max date set, bound this range // to it, but only if it would otherwise fall // outside of the min/max. if (this.minDate && start.isBefore(this.minDate)) start = moment(this.minDate); if (this.maxDate && end.isAfter(this.maxDate)) end = moment(this.maxDate); // If the end of the range is before the minimum (if min is set) OR // the start of the range is after the max (also if set) don't display this // range option. if ((this.minDate && end.isBefore(this.minDate)) || (this.maxDate && start.isAfter(this.maxDate))) { continue; } this.ranges[range] = [start, end]; } var list = '
    '; for (range in this.ranges) { list += '
  • ' + range + '
  • '; } list += '
  • ' + this.locale.customRangeLabel + '
  • '; list += '
'; this.container.find('.ranges ul').remove(); this.container.find('.ranges').prepend(list); } if (typeof callback === 'function') { this.cb = callback; } if (!this.timePicker) { this.startDate = this.startDate.startOf('day'); this.endDate = this.endDate.endOf('day'); } if (this.singleDatePicker) { this.opens = 'right'; this.container.addClass('single'); this.container.find('.calendar.right').show(); this.container.find('.calendar.left').hide(); if (!this.timePicker) { this.container.find('.ranges').hide(); } else { this.container.find('.ranges .daterangepicker_start_input, .ranges .daterangepicker_end_input').hide(); } if (!this.container.find('.calendar.right').hasClass('single')) this.container.find('.calendar.right').addClass('single'); } else { this.container.removeClass('single'); this.container.find('.calendar.right').removeClass('single'); this.container.find('.ranges').show(); } this.oldStartDate = this.startDate.clone(); this.oldEndDate = this.endDate.clone(); this.oldChosenLabel = this.chosenLabel; this.leftCalendar = { month: moment([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute(), this.startDate.second()]), calendar: [] }; this.rightCalendar = { month: moment([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute(), this.endDate.second()]), calendar: [] }; if (this.opens == 'right' || this.opens == 'center') { //swap calendar positions var first = this.container.find('.calendar.first'); var second = this.container.find('.calendar.second'); if (second.hasClass('single')) { second.removeClass('single'); first.addClass('single'); } first.removeClass('left').addClass('right'); second.removeClass('right').addClass('left'); if (this.singleDatePicker) { first.show(); second.hide(); } } if (typeof options.ranges === 'undefined' && !this.singleDatePicker) { this.container.addClass('show-calendar'); } this.container.removeClass('opensleft opensright').addClass('opens' + this.opens); this.updateView(); this.updateCalendars(); //apply CSS classes and labels to buttons var c = this.container; $.each(this.buttonClasses, function (idx, val) { c.find('button').addClass(val); }); this.container.find('.daterangepicker_start_input label').html(this.locale.fromLabel); this.container.find('.daterangepicker_end_input label').html(this.locale.toLabel); if (this.applyClass.length) this.container.find('.applyBtn').addClass(this.applyClass); if (this.cancelClass.length) this.container.find('.cancelBtn').addClass(this.cancelClass); this.container.find('.applyBtn').html(this.locale.applyLabel); this.container.find('.cancelBtn').html(this.locale.cancelLabel); }, setStartDate: function(startDate) { if (typeof startDate === 'string') this.startDate = moment(startDate, this.format).utcOffset(this.timeZone); if (typeof startDate === 'object') this.startDate = moment(startDate); if (!this.timePicker) this.startDate = this.startDate.startOf('day'); this.oldStartDate = this.startDate.clone(); this.updateView(); this.updateCalendars(); this.updateInputText(); }, setEndDate: function(endDate) { if (typeof endDate === 'string') this.endDate = moment(endDate, this.format).utcOffset(this.timeZone); if (typeof endDate === 'object') this.endDate = moment(endDate); if (!this.timePicker) this.endDate = this.endDate.endOf('day'); this.oldEndDate = this.endDate.clone(); this.updateView(); this.updateCalendars(); this.updateInputText(); }, updateView: function () { this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); this.updateFormInputs(); }, updateFormInputs: function () { this.container.find('input[name=daterangepicker_start]').val(this.startDate.format(this.format)); this.container.find('input[name=daterangepicker_end]').val(this.endDate.format(this.format)); if (this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate)) { this.container.find('button.applyBtn').removeAttr('disabled'); } else { this.container.find('button.applyBtn').attr('disabled', 'disabled'); } }, updateFromControl: function () { if (!this.element.is('input')) return; if (!this.element.val().length) return; var dateString = this.element.val().split(this.separator), start = null, end = null; if(dateString.length === 2) { start = moment(dateString[0], this.format).utcOffset(this.timeZone); end = moment(dateString[1], this.format).utcOffset(this.timeZone); } if (this.singleDatePicker || start === null || end === null) { start = moment(this.element.val(), this.format).utcOffset(this.timeZone); end = start; } if (end.isBefore(start)) return; this.oldStartDate = this.startDate.clone(); this.oldEndDate = this.endDate.clone(); this.startDate = start; this.endDate = end; if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) this.notify(); this.updateCalendars(); }, keydown: function (e) { //hide on tab or enter if ((e.keyCode === 9) || (e.keyCode === 13)) { this.hide(); } }, notify: function () { this.updateView(); this.cb(this.startDate, this.endDate, this.chosenLabel); }, move: function () { var parentOffset = { top: 0, left: 0 }, containerTop; var parentRightEdge = $(window).width(); if (!this.parentEl.is('body')) { parentOffset = { top: this.parentEl.offset().top - this.parentEl.scrollTop(), left: this.parentEl.offset().left - this.parentEl.scrollLeft() }; parentRightEdge = this.parentEl[0].clientWidth + this.parentEl.offset().left; } if (this.drops == 'up') containerTop = this.element.offset().top - this.container.outerHeight() - parentOffset.top; else containerTop = this.element.offset().top + this.element.outerHeight() - parentOffset.top; this.container[this.drops == 'up' ? 'addClass' : 'removeClass']('dropup'); if (this.opens == 'left') { this.container.css({ top: containerTop, right: parentRightEdge - this.element.offset().left - this.element.outerWidth(), left: 'auto' }); if (this.container.offset().left < 0) { this.container.css({ right: 'auto', left: 9 }); } } else if (this.opens == 'center') { this.container.css({ top: containerTop, left: this.element.offset().left - parentOffset.left + this.element.outerWidth() / 2 - this.container.outerWidth() / 2, right: 'auto' }); if (this.container.offset().left < 0) { this.container.css({ right: 'auto', left: 9 }); } } else { this.container.css({ top: containerTop, left: this.element.offset().left - parentOffset.left, right: 'auto' }); if (this.container.offset().left + this.container.outerWidth() > $(window).width()) { this.container.css({ left: 'auto', right: 0 }); } } }, toggle: function (e) { if (this.element.hasClass('active')) { this.hide(); } else { this.show(); } }, show: function (e) { if (this.isShowing) return; this.element.addClass('active'); this.container.show(); this.move(); // Create a click proxy that is private to this instance of datepicker, for unbinding this._outsideClickProxy = $.proxy(function (e) { this.outsideClick(e); }, this); // Bind global datepicker mousedown for hiding and $(document) .on('mousedown.daterangepicker', this._outsideClickProxy) // also support mobile devices .on('touchend.daterangepicker', this._outsideClickProxy) // also explicitly play nice with Bootstrap dropdowns, which stopPropagation when clicking them .on('click.daterangepicker', '[data-toggle=dropdown]', this._outsideClickProxy) // and also close when focus changes to outside the picker (eg. tabbing between controls) .on('focusin.daterangepicker', this._outsideClickProxy); this.isShowing = true; this.element.trigger('show.daterangepicker', this); }, outsideClick: function (e) { var target = $(e.target); // if the page is clicked anywhere except within the daterangerpicker/button // itself then call this.hide() if ( // ie modal dialog fix e.type == "focusin" || target.closest(this.element).length || target.closest(this.container).length || target.closest('.calendar-date').length ) return; this.hide(); }, hide: function (e) { if (!this.isShowing) return; $(document) .off('.daterangepicker'); this.element.removeClass('active'); this.container.hide(); if (!this.startDate.isSame(this.oldStartDate) || !this.endDate.isSame(this.oldEndDate)) this.notify(); this.oldStartDate = this.startDate.clone(); this.oldEndDate = this.endDate.clone(); this.isShowing = false; this.element.trigger('hide.daterangepicker', this); }, enterRange: function (e) { // mouse pointer has entered a range label var label = e.target.innerHTML; if (label == this.locale.customRangeLabel) { this.updateView(); } else { var dates = this.ranges[label]; this.container.find('input[name=daterangepicker_start]').val(dates[0].format(this.format)); this.container.find('input[name=daterangepicker_end]').val(dates[1].format(this.format)); } }, showCalendars: function() { this.container.addClass('show-calendar'); this.move(); this.element.trigger('showCalendar.daterangepicker', this); }, hideCalendars: function() { this.container.removeClass('show-calendar'); this.element.trigger('hideCalendar.daterangepicker', this); }, // when a date is typed into the start to end date textboxes inputsChanged: function (e) { var el = $(e.target); var date = moment(el.val(), this.format); if (!date.isValid()) return; var startDate, endDate; if (el.attr('name') === 'daterangepicker_start') { startDate = (false !== this.minDate && date.isBefore(this.minDate)) ? this.minDate : date; endDate = this.endDate; } else { startDate = this.startDate; endDate = (false !== this.maxDate && date.isAfter(this.maxDate)) ? this.maxDate : date; } this.setCustomDates(startDate, endDate); }, inputsKeydown: function(e) { if (e.keyCode === 13) { this.inputsChanged(e); this.notify(); } }, updateInputText: function() { if (this.element.is('input') && !this.singleDatePicker) { this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)); this.element.trigger('change'); } else if (this.element.is('input')) { this.element.val(this.endDate.format(this.format)); this.element.trigger('change'); } }, clickRange: function (e) { var label = e.target.innerHTML; this.chosenLabel = label; if (label == this.locale.customRangeLabel) { this.showCalendars(); } else { var dates = this.ranges[label]; this.startDate = dates[0]; this.endDate = dates[1]; if (!this.timePicker) { this.startDate.startOf('day'); this.endDate.endOf('day'); } this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()); this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()); this.updateCalendars(); this.updateInputText(); this.hideCalendars(); this.hide(); this.element.trigger('apply.daterangepicker', this); } }, clickPrev: function (e) { var cal = $(e.target).parents('.calendar'); if (cal.hasClass('left')) { this.leftCalendar.month.subtract(1, 'month'); } else { this.rightCalendar.month.subtract(1, 'month'); } this.updateCalendars(); }, clickNext: function (e) { var cal = $(e.target).parents('.calendar'); if (cal.hasClass('left')) { this.leftCalendar.month.add(1, 'month'); } else { this.rightCalendar.month.add(1, 'month'); } this.updateCalendars(); }, hoverDate: function (e) { var title = $(e.target).attr('data-title'); var row = title.substr(1, 1); var col = title.substr(3, 1); var cal = $(e.target).parents('.calendar'); if (cal.hasClass('left')) { this.container.find('input[name=daterangepicker_start]').val(this.leftCalendar.calendar[row][col].format(this.format)); } else { this.container.find('input[name=daterangepicker_end]').val(this.rightCalendar.calendar[row][col].format(this.format)); } }, setCustomDates: function(startDate, endDate) { this.chosenLabel = this.locale.customRangeLabel; if (startDate.isAfter(endDate)) { var difference = this.endDate.diff(this.startDate); endDate = moment(startDate).add(difference, 'ms'); if (this.maxDate && endDate.isAfter(this.maxDate)) { endDate = this.maxDate.clone(); } } this.startDate = startDate; this.endDate = endDate; this.updateView(); this.updateCalendars(); }, clickDate: function (e) { var title = $(e.target).attr('data-title'); var row = title.substr(1, 1); var col = title.substr(3, 1); var cal = $(e.target).parents('.calendar'); var startDate, endDate; if (cal.hasClass('left')) { startDate = this.leftCalendar.calendar[row][col]; endDate = this.endDate; if (typeof this.dateLimit === 'object') { var maxDate = moment(startDate).add(this.dateLimit).startOf('day'); if (endDate.isAfter(maxDate)) { endDate = maxDate; } } } else { startDate = this.startDate; endDate = this.rightCalendar.calendar[row][col]; if (typeof this.dateLimit === 'object') { var minDate = moment(endDate).subtract(this.dateLimit).startOf('day'); if (startDate.isBefore(minDate)) { startDate = minDate; } } } if (this.singleDatePicker && cal.hasClass('left')) { endDate = startDate.clone(); } else if (this.singleDatePicker && cal.hasClass('right')) { startDate = endDate.clone(); } cal.find('td').removeClass('active'); $(e.target).addClass('active'); this.setCustomDates(startDate, endDate); if (!this.timePicker) endDate.endOf('day'); if (this.singleDatePicker && !this.timePicker) this.clickApply(); }, clickApply: function (e) { this.updateInputText(); this.hide(); this.element.trigger('apply.daterangepicker', this); }, clickCancel: function (e) { this.startDate = this.oldStartDate; this.endDate = this.oldEndDate; this.chosenLabel = this.oldChosenLabel; this.updateView(); this.updateCalendars(); this.hide(); this.element.trigger('cancel.daterangepicker', this); }, updateMonthYear: function (e) { var isLeft = $(e.target).closest('.calendar').hasClass('left'), leftOrRight = isLeft ? 'left' : 'right', cal = this.container.find('.calendar.'+leftOrRight); // Month must be Number for new moment versions var month = parseInt(cal.find('.monthselect').val(), 10); var year = cal.find('.yearselect').val(); if (!isLeft && !this.singleDatePicker) { if (year < this.startDate.year() || (year == this.startDate.year() && month < this.startDate.month())) { month = this.startDate.month(); year = this.startDate.year(); } } if (this.minDate) { if (year < this.minDate.year() || (year == this.minDate.year() && month < this.minDate.month())) { month = this.minDate.month(); year = this.minDate.year(); } } if (this.maxDate) { if (year > this.maxDate.year() || (year == this.maxDate.year() && month > this.maxDate.month())) { month = this.maxDate.month(); year = this.maxDate.year(); } } this[leftOrRight+'Calendar'].month.month(month).year(year); this.updateCalendars(); }, updateTime: function(e) { var cal = $(e.target).closest('.calendar'), isLeft = cal.hasClass('left'); var hour = parseInt(cal.find('.hourselect').val(), 10); var minute = parseInt(cal.find('.minuteselect').val(), 10); var second = 0; if (this.timePickerSeconds) { second = parseInt(cal.find('.secondselect').val(), 10); } if (this.timePicker12Hour) { var ampm = cal.find('.ampmselect').val(); if (ampm === 'PM' && hour < 12) hour += 12; if (ampm === 'AM' && hour === 12) hour = 0; } if (isLeft) { var start = this.startDate.clone(); start.hour(hour); start.minute(minute); start.second(second); this.startDate = start; this.leftCalendar.month.hour(hour).minute(minute).second(second); if (this.singleDatePicker) this.endDate = start.clone(); } else { var end = this.endDate.clone(); end.hour(hour); end.minute(minute); end.second(second); this.endDate = end; if (this.singleDatePicker) this.startDate = end.clone(); this.rightCalendar.month.hour(hour).minute(minute).second(second); } this.updateView(); this.updateCalendars(); }, updateCalendars: function () { this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), this.leftCalendar.month.second(), 'left'); this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), this.rightCalendar.month.second(), 'right'); this.container.find('.calendar.left').empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate, 'left')); this.container.find('.calendar.right').empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.singleDatePicker ? this.minDate : this.startDate, this.maxDate, 'right')); this.container.find('.ranges li').removeClass('active'); var customRange = true; var i = 0; for (var range in this.ranges) { if (this.timePicker) { if (this.startDate.isSame(this.ranges[range][0]) && this.endDate.isSame(this.ranges[range][1])) { customRange = false; this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') .addClass('active').html(); } } else { //ignore times when comparing dates if time picker is not enabled if (this.startDate.format('YYYY-MM-DD') == this.ranges[range][0].format('YYYY-MM-DD') && this.endDate.format('YYYY-MM-DD') == this.ranges[range][1].format('YYYY-MM-DD')) { customRange = false; this.chosenLabel = this.container.find('.ranges li:eq(' + i + ')') .addClass('active').html(); } } i++; } if (customRange) { this.chosenLabel = this.container.find('.ranges li:last').addClass('active').html(); this.showCalendars(); } }, buildCalendar: function (month, year, hour, minute, second, side) { var daysInMonth = moment([year, month]).daysInMonth(); var firstDay = moment([year, month, 1]); var lastDay = moment([year, month, daysInMonth]); var lastMonth = moment(firstDay).subtract(1, 'month').month(); var lastYear = moment(firstDay).subtract(1, 'month').year(); var daysInLastMonth = moment([lastYear, lastMonth]).daysInMonth(); var dayOfWeek = firstDay.day(); var i; //initialize a 6 rows x 7 columns array for the calendar var calendar = []; calendar.firstDay = firstDay; calendar.lastDay = lastDay; for (i = 0; i < 6; i++) { calendar[i] = []; } //populate the calendar with date objects var startDay = daysInLastMonth - dayOfWeek + this.locale.firstDay + 1; if (startDay > daysInLastMonth) startDay -= 7; if (dayOfWeek == this.locale.firstDay) startDay = daysInLastMonth - 6; var curDate = moment([lastYear, lastMonth, startDay, 12, minute, second]).utcOffset(this.timeZone); var col, row; for (i = 0, col = 0, row = 0; i < 42; i++, col++, curDate = moment(curDate).add(24, 'hour')) { if (i > 0 && col % 7 === 0) { col = 0; row++; } calendar[row][col] = curDate.clone().hour(hour); curDate.hour(12); if (this.minDate && calendar[row][col].format('YYYY-MM-DD') == this.minDate.format('YYYY-MM-DD') && calendar[row][col].isBefore(this.minDate) && side == 'left') { calendar[row][col] = this.minDate.clone(); } if (this.maxDate && calendar[row][col].format('YYYY-MM-DD') == this.maxDate.format('YYYY-MM-DD') && calendar[row][col].isAfter(this.maxDate) && side == 'right') { calendar[row][col] = this.maxDate.clone(); } } return calendar; }, renderDropdowns: function (selected, minDate, maxDate) { var currentMonth = selected.month(); var currentYear = selected.year(); var maxYear = (maxDate && maxDate.year()) || (currentYear + 5); var minYear = (minDate && minDate.year()) || (currentYear - 50); var monthHtml = '"; var yearHtml = ''; return monthHtml + yearHtml; }, renderCalendar: function (calendar, selected, minDate, maxDate, side) { var html = '
'; html += ''; html += ''; html += ''; // add empty cell for week number if (this.showWeekNumbers) html += ''; if (!minDate || minDate.isBefore(calendar.firstDay)) { html += ''; } else { html += ''; } var dateHtml = this.locale.monthNames[calendar[1][1].month()] + calendar[1][1].format(" YYYY"); if (this.showDropdowns) { dateHtml = this.renderDropdowns(calendar[1][1], minDate, maxDate); } html += ''; if (!maxDate || maxDate.isAfter(calendar.lastDay)) { html += ''; } else { html += ''; } html += ''; html += ''; // add week number label if (this.showWeekNumbers) html += ''; $.each(this.locale.daysOfWeek, function (index, dayOfWeek) { html += ''; }); html += ''; html += ''; html += ''; for (var row = 0; row < 6; row++) { html += ''; // add week number if (this.showWeekNumbers) html += ''; for (var col = 0; col < 7; col++) { var cname = 'available '; cname += (calendar[row][col].month() == calendar[1][1].month()) ? '' : 'off'; if ((minDate && calendar[row][col].isBefore(minDate, 'day')) || (maxDate && calendar[row][col].isAfter(maxDate, 'day'))) { cname = ' off disabled '; } else if (calendar[row][col].format('YYYY-MM-DD') == selected.format('YYYY-MM-DD')) { cname += ' active '; if (calendar[row][col].format('YYYY-MM-DD') == this.startDate.format('YYYY-MM-DD')) { cname += ' start-date '; } if (calendar[row][col].format('YYYY-MM-DD') == this.endDate.format('YYYY-MM-DD')) { cname += ' end-date '; } } else if (calendar[row][col] >= this.startDate && calendar[row][col] <= this.endDate) { cname += ' in-range '; if (calendar[row][col].isSame(this.startDate)) { cname += ' start-date '; } if (calendar[row][col].isSame(this.endDate)) { cname += ' end-date '; } } var title = 'r' + row + 'c' + col; html += ''; } html += ''; } html += ''; html += '
' + dateHtml + '
' + this.locale.weekLabel + '' + dayOfWeek + '
' + calendar[row][0].week() + '' + calendar[row][col].date() + '
'; html += '
'; var i; if (this.timePicker) { html += '
'; html += ' : '; html += ' '; if (this.timePickerSeconds) { html += ': '; } if (this.timePicker12Hour) { html += ''; } html += '
'; } return html; }, remove: function() { this.container.remove(); this.element.off('.daterangepicker'); this.element.removeData('daterangepicker'); } }; $.fn.daterangepicker = function (options, cb) { this.each(function () { var el = $(this); if (el.data('daterangepicker')) el.data('daterangepicker').remove(); el.data('daterangepicker', new DateRangePicker(el, options, cb)); }); return this; }; })); PK!7daterangepicker/moment.jsnu[//! moment.js //! version : 2.9.0 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com (function (undefined) { /************************************ Constants ************************************/ var moment, VERSION = '2.9.0', // the global-scope this is NOT the global object in Node.js globalScope = (typeof global !== 'undefined' && (typeof window === 'undefined' || window === global.window)) ? global : this, oldGlobalMoment, round = Math.round, hasOwnProperty = Object.prototype.hasOwnProperty, i, YEAR = 0, MONTH = 1, DATE = 2, HOUR = 3, MINUTE = 4, SECOND = 5, MILLISECOND = 6, // internal storage for locale config files locales = {}, // extra moment internal properties (plugins register props here) momentProperties = [], // check for nodeJS hasModule = (typeof module !== 'undefined' && module && module.exports), // ASP.NET json date format regex aspNetJsonRegex = /^\/?Date\((\-?\d+)/i, aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/, // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/, // format tokens formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|x|X|zz?|ZZ?|.)/g, localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, // parsing token regexes parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99 parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999 parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999 parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999 parseTokenDigits = /\d+/, // nonzero number of digits parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic. parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z parseTokenT = /T/i, // T (ISO separator) parseTokenOffsetMs = /[\+\-]?\d+/, // 1234567890123 parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123 //strict parsing regexes parseTokenOneDigit = /\d/, // 0 - 9 parseTokenTwoDigits = /\d\d/, // 00 - 99 parseTokenThreeDigits = /\d{3}/, // 000 - 999 parseTokenFourDigits = /\d{4}/, // 0000 - 9999 parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999 parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf // iso 8601 regex // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, isoFormat = 'YYYY-MM-DDTHH:mm:ssZ', isoDates = [ ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/], ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/], ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/], ['GGGG-[W]WW', /\d{4}-W\d{2}/], ['YYYY-DDD', /\d{4}-\d{3}/] ], // iso time formats and regexes isoTimes = [ ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/], ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/], ['HH:mm', /(T| )\d\d:\d\d/], ['HH', /(T| )\d\d/] ], // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-', '15', '30'] parseTimezoneChunker = /([\+\-]|\d\d)/gi, // getter and setter names proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'), unitMillisecondFactors = { 'Milliseconds' : 1, 'Seconds' : 1e3, 'Minutes' : 6e4, 'Hours' : 36e5, 'Days' : 864e5, 'Months' : 2592e6, 'Years' : 31536e6 }, unitAliases = { ms : 'millisecond', s : 'second', m : 'minute', h : 'hour', d : 'day', D : 'date', w : 'week', W : 'isoWeek', M : 'month', Q : 'quarter', y : 'year', DDD : 'dayOfYear', e : 'weekday', E : 'isoWeekday', gg: 'weekYear', GG: 'isoWeekYear' }, camelFunctions = { dayofyear : 'dayOfYear', isoweekday : 'isoWeekday', isoweek : 'isoWeek', weekyear : 'weekYear', isoweekyear : 'isoWeekYear' }, // format function strings formatFunctions = {}, // default relative time thresholds relativeTimeThresholds = { s: 45, // seconds to minute m: 45, // minutes to hour h: 22, // hours to day d: 26, // days to month M: 11 // months to year }, // tokens to ordinalize and pad ordinalizeTokens = 'DDD w W M D d'.split(' '), paddedTokens = 'M D H h m s w W'.split(' '), formatTokenFunctions = { M : function () { return this.month() + 1; }, MMM : function (format) { return this.localeData().monthsShort(this, format); }, MMMM : function (format) { return this.localeData().months(this, format); }, D : function () { return this.date(); }, DDD : function () { return this.dayOfYear(); }, d : function () { return this.day(); }, dd : function (format) { return this.localeData().weekdaysMin(this, format); }, ddd : function (format) { return this.localeData().weekdaysShort(this, format); }, dddd : function (format) { return this.localeData().weekdays(this, format); }, w : function () { return this.week(); }, W : function () { return this.isoWeek(); }, YY : function () { return leftZeroFill(this.year() % 100, 2); }, YYYY : function () { return leftZeroFill(this.year(), 4); }, YYYYY : function () { return leftZeroFill(this.year(), 5); }, YYYYYY : function () { var y = this.year(), sign = y >= 0 ? '+' : '-'; return sign + leftZeroFill(Math.abs(y), 6); }, gg : function () { return leftZeroFill(this.weekYear() % 100, 2); }, gggg : function () { return leftZeroFill(this.weekYear(), 4); }, ggggg : function () { return leftZeroFill(this.weekYear(), 5); }, GG : function () { return leftZeroFill(this.isoWeekYear() % 100, 2); }, GGGG : function () { return leftZeroFill(this.isoWeekYear(), 4); }, GGGGG : function () { return leftZeroFill(this.isoWeekYear(), 5); }, e : function () { return this.weekday(); }, E : function () { return this.isoWeekday(); }, a : function () { return this.localeData().meridiem(this.hours(), this.minutes(), true); }, A : function () { return this.localeData().meridiem(this.hours(), this.minutes(), false); }, H : function () { return this.hours(); }, h : function () { return this.hours() % 12 || 12; }, m : function () { return this.minutes(); }, s : function () { return this.seconds(); }, S : function () { return toInt(this.milliseconds() / 100); }, SS : function () { return leftZeroFill(toInt(this.milliseconds() / 10), 2); }, SSS : function () { return leftZeroFill(this.milliseconds(), 3); }, SSSS : function () { return leftZeroFill(this.milliseconds(), 3); }, Z : function () { var a = this.utcOffset(), b = '+'; if (a < 0) { a = -a; b = '-'; } return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2); }, ZZ : function () { var a = this.utcOffset(), b = '+'; if (a < 0) { a = -a; b = '-'; } return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2); }, z : function () { return this.zoneAbbr(); }, zz : function () { return this.zoneName(); }, x : function () { return this.valueOf(); }, X : function () { return this.unix(); }, Q : function () { return this.quarter(); } }, deprecations = {}, lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'], updateInProgress = false; // Pick the first defined of two or three arguments. dfl comes from // default. function dfl(a, b, c) { switch (arguments.length) { case 2: return a != null ? a : b; case 3: return a != null ? a : b != null ? b : c; default: throw new Error('Implement me'); } } function hasOwnProp(a, b) { return hasOwnProperty.call(a, b); } function defaultParsingFlags() { // We need to deep clone this object, and es5 standard is not very // helpful. return { empty : false, unusedTokens : [], unusedInput : [], overflow : -2, charsLeftOver : 0, nullInput : false, invalidMonth : null, invalidFormat : false, userInvalidated : false, iso: false }; } function printMsg(msg) { if (moment.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) { console.warn('Deprecation warning: ' + msg); } } function deprecate(msg, fn) { var firstTime = true; return extend(function () { if (firstTime) { printMsg(msg); firstTime = false; } return fn.apply(this, arguments); }, fn); } function deprecateSimple(name, msg) { if (!deprecations[name]) { printMsg(msg); deprecations[name] = true; } } function padToken(func, count) { return function (a) { return leftZeroFill(func.call(this, a), count); }; } function ordinalizeToken(func, period) { return function (a) { return this.localeData().ordinal(func.call(this, a), period); }; } function monthDiff(a, b) { // difference in months var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), // b is in (anchor - 1 month, anchor + 1 month) anchor = a.clone().add(wholeMonthDiff, 'months'), anchor2, adjust; if (b - anchor < 0) { anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor - anchor2); } else { anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); // linear across the month adjust = (b - anchor) / (anchor2 - anchor); } return -(wholeMonthDiff + adjust); } while (ordinalizeTokens.length) { i = ordinalizeTokens.pop(); formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i); } while (paddedTokens.length) { i = paddedTokens.pop(); formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2); } formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3); function meridiemFixWrap(locale, hour, meridiem) { var isPm; if (meridiem == null) { // nothing to do return hour; } if (locale.meridiemHour != null) { return locale.meridiemHour(hour, meridiem); } else if (locale.isPM != null) { // Fallback isPm = locale.isPM(meridiem); if (isPm && hour < 12) { hour += 12; } if (!isPm && hour === 12) { hour = 0; } return hour; } else { // thie is not supposed to happen return hour; } } /************************************ Constructors ************************************/ function Locale() { } // Moment prototype object function Moment(config, skipOverflow) { if (skipOverflow !== false) { checkOverflow(config); } copyConfig(this, config); this._d = new Date(+config._d); // Prevent infinite loop in case updateOffset creates new moment // objects. if (updateInProgress === false) { updateInProgress = true; moment.updateOffset(this); updateInProgress = false; } } // Duration Constructor function Duration(duration) { var normalizedInput = normalizeObjectUnits(duration), years = normalizedInput.year || 0, quarters = normalizedInput.quarter || 0, months = normalizedInput.month || 0, weeks = normalizedInput.week || 0, days = normalizedInput.day || 0, hours = normalizedInput.hour || 0, minutes = normalizedInput.minute || 0, seconds = normalizedInput.second || 0, milliseconds = normalizedInput.millisecond || 0; // representation for dateAddRemove this._milliseconds = +milliseconds + seconds * 1e3 + // 1000 minutes * 6e4 + // 1000 * 60 hours * 36e5; // 1000 * 60 * 60 // Because of dateAddRemove treats 24 hours as different from a // day when working around DST, we need to store them separately this._days = +days + weeks * 7; // It is impossible translate months into days without knowing // which months you are are talking about, so we have to store // it separately. this._months = +months + quarters * 3 + years * 12; this._data = {}; this._locale = moment.localeData(); this._bubble(); } /************************************ Helpers ************************************/ function extend(a, b) { for (var i in b) { if (hasOwnProp(b, i)) { a[i] = b[i]; } } if (hasOwnProp(b, 'toString')) { a.toString = b.toString; } if (hasOwnProp(b, 'valueOf')) { a.valueOf = b.valueOf; } return a; } function copyConfig(to, from) { var i, prop, val; if (typeof from._isAMomentObject !== 'undefined') { to._isAMomentObject = from._isAMomentObject; } if (typeof from._i !== 'undefined') { to._i = from._i; } if (typeof from._f !== 'undefined') { to._f = from._f; } if (typeof from._l !== 'undefined') { to._l = from._l; } if (typeof from._strict !== 'undefined') { to._strict = from._strict; } if (typeof from._tzm !== 'undefined') { to._tzm = from._tzm; } if (typeof from._isUTC !== 'undefined') { to._isUTC = from._isUTC; } if (typeof from._offset !== 'undefined') { to._offset = from._offset; } if (typeof from._pf !== 'undefined') { to._pf = from._pf; } if (typeof from._locale !== 'undefined') { to._locale = from._locale; } if (momentProperties.length > 0) { for (i in momentProperties) { prop = momentProperties[i]; val = from[prop]; if (typeof val !== 'undefined') { to[prop] = val; } } } return to; } function absRound(number) { if (number < 0) { return Math.ceil(number); } else { return Math.floor(number); } } // left zero fill a number // see http://jsperf.com/left-zero-filling for performance comparison function leftZeroFill(number, targetLength, forceSign) { var output = '' + Math.abs(number), sign = number >= 0; while (output.length < targetLength) { output = '0' + output; } return (sign ? (forceSign ? '+' : '') : '-') + output; } function positiveMomentsDifference(base, other) { var res = {milliseconds: 0, months: 0}; res.months = other.month() - base.month() + (other.year() - base.year()) * 12; if (base.clone().add(res.months, 'M').isAfter(other)) { --res.months; } res.milliseconds = +other - +(base.clone().add(res.months, 'M')); return res; } function momentsDifference(base, other) { var res; other = makeAs(other, base); if (base.isBefore(other)) { res = positiveMomentsDifference(base, other); } else { res = positiveMomentsDifference(other, base); res.milliseconds = -res.milliseconds; res.months = -res.months; } return res; } // TODO: remove 'name' arg after deprecation is removed function createAdder(direction, name) { return function (val, period) { var dur, tmp; //invert the arguments, but complain about it if (period !== null && !isNaN(+period)) { deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).'); tmp = val; val = period; period = tmp; } val = typeof val === 'string' ? +val : val; dur = moment.duration(val, period); addOrSubtractDurationFromMoment(this, dur, direction); return this; }; } function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) { var milliseconds = duration._milliseconds, days = duration._days, months = duration._months; updateOffset = updateOffset == null ? true : updateOffset; if (milliseconds) { mom._d.setTime(+mom._d + milliseconds * isAdding); } if (days) { rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding); } if (months) { rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding); } if (updateOffset) { moment.updateOffset(mom, days || months); } } // check if is an array function isArray(input) { return Object.prototype.toString.call(input) === '[object Array]'; } function isDate(input) { return Object.prototype.toString.call(input) === '[object Date]' || input instanceof Date; } // compare two arrays, return the number of differences function compareArrays(array1, array2, dontConvert) { var len = Math.min(array1.length, array2.length), lengthDiff = Math.abs(array1.length - array2.length), diffs = 0, i; for (i = 0; i < len; i++) { if ((dontConvert && array1[i] !== array2[i]) || (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { diffs++; } } return diffs + lengthDiff; } function normalizeUnits(units) { if (units) { var lowered = units.toLowerCase().replace(/(.)s$/, '$1'); units = unitAliases[units] || camelFunctions[lowered] || lowered; } return units; } function normalizeObjectUnits(inputObject) { var normalizedInput = {}, normalizedProp, prop; for (prop in inputObject) { if (hasOwnProp(inputObject, prop)) { normalizedProp = normalizeUnits(prop); if (normalizedProp) { normalizedInput[normalizedProp] = inputObject[prop]; } } } return normalizedInput; } function makeList(field) { var count, setter; if (field.indexOf('week') === 0) { count = 7; setter = 'day'; } else if (field.indexOf('month') === 0) { count = 12; setter = 'month'; } else { return; } moment[field] = function (format, index) { var i, getter, method = moment._locale[field], results = []; if (typeof format === 'number') { index = format; format = undefined; } getter = function (i) { var m = moment().utc().set(setter, i); return method.call(moment._locale, m, format || ''); }; if (index != null) { return getter(index); } else { for (i = 0; i < count; i++) { results.push(getter(i)); } return results; } }; } function toInt(argumentForCoercion) { var coercedNumber = +argumentForCoercion, value = 0; if (coercedNumber !== 0 && isFinite(coercedNumber)) { if (coercedNumber >= 0) { value = Math.floor(coercedNumber); } else { value = Math.ceil(coercedNumber); } } return value; } function daysInMonth(year, month) { return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); } function weeksInYear(year, dow, doy) { return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week; } function daysInYear(year) { return isLeapYear(year) ? 366 : 365; } function isLeapYear(year) { return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; } function checkOverflow(m) { var overflow; if (m._a && m._pf.overflow === -2) { overflow = m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH : m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE : m._a[HOUR] < 0 || m._a[HOUR] > 24 || (m._a[HOUR] === 24 && (m._a[MINUTE] !== 0 || m._a[SECOND] !== 0 || m._a[MILLISECOND] !== 0)) ? HOUR : m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE : m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND : m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND : -1; if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { overflow = DATE; } m._pf.overflow = overflow; } } function isValid(m) { if (m._isValid == null) { m._isValid = !isNaN(m._d.getTime()) && m._pf.overflow < 0 && !m._pf.empty && !m._pf.invalidMonth && !m._pf.nullInput && !m._pf.invalidFormat && !m._pf.userInvalidated; if (m._strict) { m._isValid = m._isValid && m._pf.charsLeftOver === 0 && m._pf.unusedTokens.length === 0 && m._pf.bigHour === undefined; } } return m._isValid; } function normalizeLocale(key) { return key ? key.toLowerCase().replace('_', '-') : key; } // pick the locale from the array // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root function chooseLocale(names) { var i = 0, j, next, locale, split; while (i < names.length) { split = normalizeLocale(names[i]).split('-'); j = split.length; next = normalizeLocale(names[i + 1]); next = next ? next.split('-') : null; while (j > 0) { locale = loadLocale(split.slice(0, j).join('-')); if (locale) { return locale; } if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { //the next array item is better than a shallower substring of this one break; } j--; } i++; } return null; } function loadLocale(name) { var oldLocale = null; if (!locales[name] && hasModule) { try { oldLocale = moment.locale(); require('./locale/' + name); // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales moment.locale(oldLocale); } catch (e) { } } return locales[name]; } // Return a moment from input, that is local/utc/utcOffset equivalent to // model. function makeAs(input, model) { var res, diff; if (model._isUTC) { res = model.clone(); diff = (moment.isMoment(input) || isDate(input) ? +input : +moment(input)) - (+res); // Use low-level api, because this fn is low-level api. res._d.setTime(+res._d + diff); moment.updateOffset(res, false); return res; } else { return moment(input).local(); } } /************************************ Locale ************************************/ extend(Locale.prototype, { set : function (config) { var prop, i; for (i in config) { prop = config[i]; if (typeof prop === 'function') { this[i] = prop; } else { this['_' + i] = prop; } } // Lenient ordinal parsing accepts just a number in addition to // number + (possibly) stuff coming from _ordinalParseLenient. this._ordinalParseLenient = new RegExp(this._ordinalParse.source + '|' + /\d{1,2}/.source); }, _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'), months : function (m) { return this._months[m.month()]; }, _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), monthsShort : function (m) { return this._monthsShort[m.month()]; }, monthsParse : function (monthName, format, strict) { var i, mom, regex; if (!this._monthsParse) { this._monthsParse = []; this._longMonthsParse = []; this._shortMonthsParse = []; } for (i = 0; i < 12; i++) { // make the regex if we don't have it already mom = moment.utc([2000, i]); if (strict && !this._longMonthsParse[i]) { this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); } if (!strict && !this._monthsParse[i]) { regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { return i; } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { return i; } else if (!strict && this._monthsParse[i].test(monthName)) { return i; } } }, _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'), weekdays : function (m) { return this._weekdays[m.day()]; }, _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), weekdaysShort : function (m) { return this._weekdaysShort[m.day()]; }, _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), weekdaysMin : function (m) { return this._weekdaysMin[m.day()]; }, weekdaysParse : function (weekdayName) { var i, mom, regex; if (!this._weekdaysParse) { this._weekdaysParse = []; } for (i = 0; i < 7; i++) { // make the regex if we don't have it already if (!this._weekdaysParse[i]) { mom = moment([2000, 1]).day(i); regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); } // test the regex if (this._weekdaysParse[i].test(weekdayName)) { return i; } } }, _longDateFormat : { LTS : 'h:mm:ss A', LT : 'h:mm A', L : 'MM/DD/YYYY', LL : 'MMMM D, YYYY', LLL : 'MMMM D, YYYY LT', LLLL : 'dddd, MMMM D, YYYY LT' }, longDateFormat : function (key) { var output = this._longDateFormat[key]; if (!output && this._longDateFormat[key.toUpperCase()]) { output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) { return val.slice(1); }); this._longDateFormat[key] = output; } return output; }, isPM : function (input) { // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays // Using charAt should be more compatible. return ((input + '').toLowerCase().charAt(0) === 'p'); }, _meridiemParse : /[ap]\.?m?\.?/i, meridiem : function (hours, minutes, isLower) { if (hours > 11) { return isLower ? 'pm' : 'PM'; } else { return isLower ? 'am' : 'AM'; } }, _calendar : { sameDay : '[Today at] LT', nextDay : '[Tomorrow at] LT', nextWeek : 'dddd [at] LT', lastDay : '[Yesterday at] LT', lastWeek : '[Last] dddd [at] LT', sameElse : 'L' }, calendar : function (key, mom, now) { var output = this._calendar[key]; return typeof output === 'function' ? output.apply(mom, [now]) : output; }, _relativeTime : { future : 'in %s', past : '%s ago', s : 'a few seconds', m : 'a minute', mm : '%d minutes', h : 'an hour', hh : '%d hours', d : 'a day', dd : '%d days', M : 'a month', MM : '%d months', y : 'a year', yy : '%d years' }, relativeTime : function (number, withoutSuffix, string, isFuture) { var output = this._relativeTime[string]; return (typeof output === 'function') ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number); }, pastFuture : function (diff, output) { var format = this._relativeTime[diff > 0 ? 'future' : 'past']; return typeof format === 'function' ? format(output) : format.replace(/%s/i, output); }, ordinal : function (number) { return this._ordinal.replace('%d', number); }, _ordinal : '%d', _ordinalParse : /\d{1,2}/, preparse : function (string) { return string; }, postformat : function (string) { return string; }, week : function (mom) { return weekOfYear(mom, this._week.dow, this._week.doy).week; }, _week : { dow : 0, // Sunday is the first day of the week. doy : 6 // The week that contains Jan 1st is the first week of the year. }, firstDayOfWeek : function () { return this._week.dow; }, firstDayOfYear : function () { return this._week.doy; }, _invalidDate: 'Invalid date', invalidDate: function () { return this._invalidDate; } }); /************************************ Formatting ************************************/ function removeFormattingTokens(input) { if (input.match(/\[[\s\S]/)) { return input.replace(/^\[|\]$/g, ''); } return input.replace(/\\/g, ''); } function makeFormatFunction(format) { var array = format.match(formattingTokens), i, length; for (i = 0, length = array.length; i < length; i++) { if (formatTokenFunctions[array[i]]) { array[i] = formatTokenFunctions[array[i]]; } else { array[i] = removeFormattingTokens(array[i]); } } return function (mom) { var output = ''; for (i = 0; i < length; i++) { output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; } return output; }; } // format date using native date object function formatMoment(m, format) { if (!m.isValid()) { return m.localeData().invalidDate(); } format = expandFormat(format, m.localeData()); if (!formatFunctions[format]) { formatFunctions[format] = makeFormatFunction(format); } return formatFunctions[format](m); } function expandFormat(format, locale) { var i = 5; function replaceLongDateFormatTokens(input) { return locale.longDateFormat(input) || input; } localFormattingTokens.lastIndex = 0; while (i >= 0 && localFormattingTokens.test(format)) { format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); localFormattingTokens.lastIndex = 0; i -= 1; } return format; } /************************************ Parsing ************************************/ // get the regex to find the next token function getParseRegexForToken(token, config) { var a, strict = config._strict; switch (token) { case 'Q': return parseTokenOneDigit; case 'DDDD': return parseTokenThreeDigits; case 'YYYY': case 'GGGG': case 'gggg': return strict ? parseTokenFourDigits : parseTokenOneToFourDigits; case 'Y': case 'G': case 'g': return parseTokenSignedNumber; case 'YYYYYY': case 'YYYYY': case 'GGGGG': case 'ggggg': return strict ? parseTokenSixDigits : parseTokenOneToSixDigits; case 'S': if (strict) { return parseTokenOneDigit; } /* falls through */ case 'SS': if (strict) { return parseTokenTwoDigits; } /* falls through */ case 'SSS': if (strict) { return parseTokenThreeDigits; } /* falls through */ case 'DDD': return parseTokenOneToThreeDigits; case 'MMM': case 'MMMM': case 'dd': case 'ddd': case 'dddd': return parseTokenWord; case 'a': case 'A': return config._locale._meridiemParse; case 'x': return parseTokenOffsetMs; case 'X': return parseTokenTimestampMs; case 'Z': case 'ZZ': return parseTokenTimezone; case 'T': return parseTokenT; case 'SSSS': return parseTokenDigits; case 'MM': case 'DD': case 'YY': case 'GG': case 'gg': case 'HH': case 'hh': case 'mm': case 'ss': case 'ww': case 'WW': return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits; case 'M': case 'D': case 'd': case 'H': case 'h': case 'm': case 's': case 'w': case 'W': case 'e': case 'E': return parseTokenOneOrTwoDigits; case 'Do': return strict ? config._locale._ordinalParse : config._locale._ordinalParseLenient; default : a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i')); return a; } } function utcOffsetFromString(string) { string = string || ''; var possibleTzMatches = (string.match(parseTokenTimezone) || []), tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [], parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0], minutes = +(parts[1] * 60) + toInt(parts[2]); return parts[0] === '+' ? minutes : -minutes; } // function to convert string input to date function addTimeToArrayFromToken(token, input, config) { var a, datePartArray = config._a; switch (token) { // QUARTER case 'Q': if (input != null) { datePartArray[MONTH] = (toInt(input) - 1) * 3; } break; // MONTH case 'M' : // fall through to MM case 'MM' : if (input != null) { datePartArray[MONTH] = toInt(input) - 1; } break; case 'MMM' : // fall through to MMMM case 'MMMM' : a = config._locale.monthsParse(input, token, config._strict); // if we didn't find a month name, mark the date as invalid. if (a != null) { datePartArray[MONTH] = a; } else { config._pf.invalidMonth = input; } break; // DAY OF MONTH case 'D' : // fall through to DD case 'DD' : if (input != null) { datePartArray[DATE] = toInt(input); } break; case 'Do' : if (input != null) { datePartArray[DATE] = toInt(parseInt( input.match(/\d{1,2}/)[0], 10)); } break; // DAY OF YEAR case 'DDD' : // fall through to DDDD case 'DDDD' : if (input != null) { config._dayOfYear = toInt(input); } break; // YEAR case 'YY' : datePartArray[YEAR] = moment.parseTwoDigitYear(input); break; case 'YYYY' : case 'YYYYY' : case 'YYYYYY' : datePartArray[YEAR] = toInt(input); break; // AM / PM case 'a' : // fall through to A case 'A' : config._meridiem = input; // config._isPm = config._locale.isPM(input); break; // HOUR case 'h' : // fall through to hh case 'hh' : config._pf.bigHour = true; /* falls through */ case 'H' : // fall through to HH case 'HH' : datePartArray[HOUR] = toInt(input); break; // MINUTE case 'm' : // fall through to mm case 'mm' : datePartArray[MINUTE] = toInt(input); break; // SECOND case 's' : // fall through to ss case 'ss' : datePartArray[SECOND] = toInt(input); break; // MILLISECOND case 'S' : case 'SS' : case 'SSS' : case 'SSSS' : datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000); break; // UNIX OFFSET (MILLISECONDS) case 'x': config._d = new Date(toInt(input)); break; // UNIX TIMESTAMP WITH MS case 'X': config._d = new Date(parseFloat(input) * 1000); break; // TIMEZONE case 'Z' : // fall through to ZZ case 'ZZ' : config._useUTC = true; config._tzm = utcOffsetFromString(input); break; // WEEKDAY - human case 'dd': case 'ddd': case 'dddd': a = config._locale.weekdaysParse(input); // if we didn't get a weekday name, mark the date as invalid if (a != null) { config._w = config._w || {}; config._w['d'] = a; } else { config._pf.invalidWeekday = input; } break; // WEEK, WEEK DAY - numeric case 'w': case 'ww': case 'W': case 'WW': case 'd': case 'e': case 'E': token = token.substr(0, 1); /* falls through */ case 'gggg': case 'GGGG': case 'GGGGG': token = token.substr(0, 2); if (input) { config._w = config._w || {}; config._w[token] = toInt(input); } break; case 'gg': case 'GG': config._w = config._w || {}; config._w[token] = moment.parseTwoDigitYear(input); } } function dayOfYearFromWeekInfo(config) { var w, weekYear, week, weekday, dow, doy, temp; w = config._w; if (w.GG != null || w.W != null || w.E != null) { dow = 1; doy = 4; // TODO: We need to take the current isoWeekYear, but that depends on // how we interpret now (local, utc, fixed offset). So create // a now version of current config (take local/utc/offset flags, and // create now). weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year); week = dfl(w.W, 1); weekday = dfl(w.E, 1); } else { dow = config._locale._week.dow; doy = config._locale._week.doy; weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year); week = dfl(w.w, 1); if (w.d != null) { // weekday -- low day numbers are considered next week weekday = w.d; if (weekday < dow) { ++week; } } else if (w.e != null) { // local weekday -- counting starts from begining of week weekday = w.e + dow; } else { // default to begining of week weekday = dow; } } temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow); config._a[YEAR] = temp.year; config._dayOfYear = temp.dayOfYear; } // convert an array to a date. // the array should mirror the parameters below // note: all values past the year are optional and will default to the lowest possible value. // [year, month, day , hour, minute, second, millisecond] function dateFromConfig(config) { var i, date, input = [], currentDate, yearToUse; if (config._d) { return; } currentDate = currentDateArray(config); //compute day of the year from weeks and weekdays if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { dayOfYearFromWeekInfo(config); } //if the day of the year is set, figure out what it is if (config._dayOfYear) { yearToUse = dfl(config._a[YEAR], currentDate[YEAR]); if (config._dayOfYear > daysInYear(yearToUse)) { config._pf._overflowDayOfYear = true; } date = makeUTCDate(yearToUse, 0, config._dayOfYear); config._a[MONTH] = date.getUTCMonth(); config._a[DATE] = date.getUTCDate(); } // Default to current date. // * if no year, month, day of month are given, default to today // * if day of month is given, default month and year // * if month is given, default only year // * if year is given, don't default anything for (i = 0; i < 3 && config._a[i] == null; ++i) { config._a[i] = input[i] = currentDate[i]; } // Zero out whatever was not defaulted, including time for (; i < 7; i++) { config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; } // Check for 24:00:00.000 if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) { config._nextDay = true; config._a[HOUR] = 0; } config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input); // Apply timezone offset from input. The actual utcOffset can be changed // with parseZone. if (config._tzm != null) { config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); } if (config._nextDay) { config._a[HOUR] = 24; } } function dateFromObject(config) { var normalizedInput; if (config._d) { return; } normalizedInput = normalizeObjectUnits(config._i); config._a = [ normalizedInput.year, normalizedInput.month, normalizedInput.day || normalizedInput.date, normalizedInput.hour, normalizedInput.minute, normalizedInput.second, normalizedInput.millisecond ]; dateFromConfig(config); } function currentDateArray(config) { var now = new Date(); if (config._useUTC) { return [ now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate() ]; } else { return [now.getFullYear(), now.getMonth(), now.getDate()]; } } // date from string and format string function makeDateFromStringAndFormat(config) { if (config._f === moment.ISO_8601) { parseISO(config); return; } config._a = []; config._pf.empty = true; // This array is used to make a Date, either with `new Date` or `Date.UTC` var string = '' + config._i, i, parsedInput, tokens, token, skipped, stringLength = string.length, totalParsedInputLength = 0; tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; for (i = 0; i < tokens.length; i++) { token = tokens[i]; parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; if (parsedInput) { skipped = string.substr(0, string.indexOf(parsedInput)); if (skipped.length > 0) { config._pf.unusedInput.push(skipped); } string = string.slice(string.indexOf(parsedInput) + parsedInput.length); totalParsedInputLength += parsedInput.length; } // don't parse if it's not a known token if (formatTokenFunctions[token]) { if (parsedInput) { config._pf.empty = false; } else { config._pf.unusedTokens.push(token); } addTimeToArrayFromToken(token, parsedInput, config); } else if (config._strict && !parsedInput) { config._pf.unusedTokens.push(token); } } // add remaining unparsed input length to the string config._pf.charsLeftOver = stringLength - totalParsedInputLength; if (string.length > 0) { config._pf.unusedInput.push(string); } // clear _12h flag if hour is <= 12 if (config._pf.bigHour === true && config._a[HOUR] <= 12) { config._pf.bigHour = undefined; } // handle meridiem config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); dateFromConfig(config); checkOverflow(config); } function unescapeFormat(s) { return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { return p1 || p2 || p3 || p4; }); } // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript function regexpEscape(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); } // date from string and array of format strings function makeDateFromStringAndArray(config) { var tempConfig, bestMoment, scoreToBeat, i, currentScore; if (config._f.length === 0) { config._pf.invalidFormat = true; config._d = new Date(NaN); return; } for (i = 0; i < config._f.length; i++) { currentScore = 0; tempConfig = copyConfig({}, config); if (config._useUTC != null) { tempConfig._useUTC = config._useUTC; } tempConfig._pf = defaultParsingFlags(); tempConfig._f = config._f[i]; makeDateFromStringAndFormat(tempConfig); if (!isValid(tempConfig)) { continue; } // if there is any input that was not parsed add a penalty for that format currentScore += tempConfig._pf.charsLeftOver; //or tokens currentScore += tempConfig._pf.unusedTokens.length * 10; tempConfig._pf.score = currentScore; if (scoreToBeat == null || currentScore < scoreToBeat) { scoreToBeat = currentScore; bestMoment = tempConfig; } } extend(config, bestMoment || tempConfig); } // date from iso format function parseISO(config) { var i, l, string = config._i, match = isoRegex.exec(string); if (match) { config._pf.iso = true; for (i = 0, l = isoDates.length; i < l; i++) { if (isoDates[i][1].exec(string)) { // match[5] should be 'T' or undefined config._f = isoDates[i][0] + (match[6] || ' '); break; } } for (i = 0, l = isoTimes.length; i < l; i++) { if (isoTimes[i][1].exec(string)) { config._f += isoTimes[i][0]; break; } } if (string.match(parseTokenTimezone)) { config._f += 'Z'; } makeDateFromStringAndFormat(config); } else { config._isValid = false; } } // date from iso format or fallback function makeDateFromString(config) { parseISO(config); if (config._isValid === false) { delete config._isValid; moment.createFromInputFallback(config); } } function map(arr, fn) { var res = [], i; for (i = 0; i < arr.length; ++i) { res.push(fn(arr[i], i)); } return res; } function makeDateFromInput(config) { var input = config._i, matched; if (input === undefined) { config._d = new Date(); } else if (isDate(input)) { config._d = new Date(+input); } else if ((matched = aspNetJsonRegex.exec(input)) !== null) { config._d = new Date(+matched[1]); } else if (typeof input === 'string') { makeDateFromString(config); } else if (isArray(input)) { config._a = map(input.slice(0), function (obj) { return parseInt(obj, 10); }); dateFromConfig(config); } else if (typeof(input) === 'object') { dateFromObject(config); } else if (typeof(input) === 'number') { // from milliseconds config._d = new Date(input); } else { moment.createFromInputFallback(config); } } function makeDate(y, m, d, h, M, s, ms) { //can't just apply() to create a date: //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply var date = new Date(y, m, d, h, M, s, ms); //the date constructor doesn't accept years < 1970 if (y < 1970) { date.setFullYear(y); } return date; } function makeUTCDate(y) { var date = new Date(Date.UTC.apply(null, arguments)); if (y < 1970) { date.setUTCFullYear(y); } return date; } function parseWeekday(input, locale) { if (typeof input === 'string') { if (!isNaN(input)) { input = parseInt(input, 10); } else { input = locale.weekdaysParse(input); if (typeof input !== 'number') { return null; } } } return input; } /************************************ Relative Time ************************************/ // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); } function relativeTime(posNegDuration, withoutSuffix, locale) { var duration = moment.duration(posNegDuration).abs(), seconds = round(duration.as('s')), minutes = round(duration.as('m')), hours = round(duration.as('h')), days = round(duration.as('d')), months = round(duration.as('M')), years = round(duration.as('y')), args = seconds < relativeTimeThresholds.s && ['s', seconds] || minutes === 1 && ['m'] || minutes < relativeTimeThresholds.m && ['mm', minutes] || hours === 1 && ['h'] || hours < relativeTimeThresholds.h && ['hh', hours] || days === 1 && ['d'] || days < relativeTimeThresholds.d && ['dd', days] || months === 1 && ['M'] || months < relativeTimeThresholds.M && ['MM', months] || years === 1 && ['y'] || ['yy', years]; args[2] = withoutSuffix; args[3] = +posNegDuration > 0; args[4] = locale; return substituteTimeAgo.apply({}, args); } /************************************ Week of Year ************************************/ // firstDayOfWeek 0 = sun, 6 = sat // the day of the week that starts the week // (usually sunday or monday) // firstDayOfWeekOfYear 0 = sun, 6 = sat // the first week is the week that contains the first // of this day of the week // (eg. ISO weeks use thursday (4)) function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) { var end = firstDayOfWeekOfYear - firstDayOfWeek, daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(), adjustedMoment; if (daysToDayOfWeek > end) { daysToDayOfWeek -= 7; } if (daysToDayOfWeek < end - 7) { daysToDayOfWeek += 7; } adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd'); return { week: Math.ceil(adjustedMoment.dayOfYear() / 7), year: adjustedMoment.year() }; } //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) { var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear; d = d === 0 ? 7 : d; weekday = weekday != null ? weekday : firstDayOfWeek; daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0); dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1; return { year: dayOfYear > 0 ? year : year - 1, dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear }; } /************************************ Top Level Functions ************************************/ function makeMoment(config) { var input = config._i, format = config._f, res; config._locale = config._locale || moment.localeData(config._l); if (input === null || (format === undefined && input === '')) { return moment.invalid({nullInput: true}); } if (typeof input === 'string') { config._i = input = config._locale.preparse(input); } if (moment.isMoment(input)) { return new Moment(input, true); } else if (format) { if (isArray(format)) { makeDateFromStringAndArray(config); } else { makeDateFromStringAndFormat(config); } } else { makeDateFromInput(config); } res = new Moment(config); if (res._nextDay) { // Adding is smart enough around DST res.add(1, 'd'); res._nextDay = undefined; } return res; } moment = function (input, format, locale, strict) { var c; if (typeof(locale) === 'boolean') { strict = locale; locale = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c = {}; c._isAMomentObject = true; c._i = input; c._f = format; c._l = locale; c._strict = strict; c._isUTC = false; c._pf = defaultParsingFlags(); return makeMoment(c); }; moment.suppressDeprecationWarnings = false; moment.createFromInputFallback = deprecate( 'moment construction falls back to js Date. This is ' + 'discouraged and will be removed in upcoming major ' + 'release. Please refer to ' + 'https://github.com/moment/moment/issues/1407 for more info.', function (config) { config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); } ); // Pick a moment m from moments so that m[fn](other) is true for all // other. This relies on the function fn to be transitive. // // moments should either be an array of moment objects or an array, whose // first element is an array of moment objects. function pickBy(fn, moments) { var res, i; if (moments.length === 1 && isArray(moments[0])) { moments = moments[0]; } if (!moments.length) { return moment(); } res = moments[0]; for (i = 1; i < moments.length; ++i) { if (moments[i][fn](res)) { res = moments[i]; } } return res; } moment.min = function () { var args = [].slice.call(arguments, 0); return pickBy('isBefore', args); }; moment.max = function () { var args = [].slice.call(arguments, 0); return pickBy('isAfter', args); }; // creating with utc moment.utc = function (input, format, locale, strict) { var c; if (typeof(locale) === 'boolean') { strict = locale; locale = undefined; } // object construction must be done this way. // https://github.com/moment/moment/issues/1423 c = {}; c._isAMomentObject = true; c._useUTC = true; c._isUTC = true; c._l = locale; c._i = input; c._f = format; c._strict = strict; c._pf = defaultParsingFlags(); return makeMoment(c).utc(); }; // creating with unix timestamp (in seconds) moment.unix = function (input) { return moment(input * 1000); }; // duration moment.duration = function (input, key) { var duration = input, // matching against regexp is expensive, do it on demand match = null, sign, ret, parseIso, diffRes; if (moment.isDuration(input)) { duration = { ms: input._milliseconds, d: input._days, M: input._months }; } else if (typeof input === 'number') { duration = {}; if (key) { duration[key] = input; } else { duration.milliseconds = input; } } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; duration = { y: 0, d: toInt(match[DATE]) * sign, h: toInt(match[HOUR]) * sign, m: toInt(match[MINUTE]) * sign, s: toInt(match[SECOND]) * sign, ms: toInt(match[MILLISECOND]) * sign }; } else if (!!(match = isoDurationRegex.exec(input))) { sign = (match[1] === '-') ? -1 : 1; parseIso = function (inp) { // We'd normally use ~~inp for this, but unfortunately it also // converts floats to ints. // inp may be undefined, so careful calling replace on it. var res = inp && parseFloat(inp.replace(',', '.')); // apply sign while we're at it return (isNaN(res) ? 0 : res) * sign; }; duration = { y: parseIso(match[2]), M: parseIso(match[3]), d: parseIso(match[4]), h: parseIso(match[5]), m: parseIso(match[6]), s: parseIso(match[7]), w: parseIso(match[8]) }; } else if (duration == null) {// checks for null or undefined duration = {}; } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { diffRes = momentsDifference(moment(duration.from), moment(duration.to)); duration = {}; duration.ms = diffRes.milliseconds; duration.M = diffRes.months; } ret = new Duration(duration); if (moment.isDuration(input) && hasOwnProp(input, '_locale')) { ret._locale = input._locale; } return ret; }; // version number moment.version = VERSION; // default format moment.defaultFormat = isoFormat; // constant that refers to the ISO standard moment.ISO_8601 = function () {}; // Plugins that add properties should also add the key here (null value), // so we can properly clone ourselves. moment.momentProperties = momentProperties; // This function will be called whenever a moment is mutated. // It is intended to keep the offset in sync with the timezone. moment.updateOffset = function () {}; // This function allows you to set a threshold for relative time strings moment.relativeTimeThreshold = function (threshold, limit) { if (relativeTimeThresholds[threshold] === undefined) { return false; } if (limit === undefined) { return relativeTimeThresholds[threshold]; } relativeTimeThresholds[threshold] = limit; return true; }; moment.lang = deprecate( 'moment.lang is deprecated. Use moment.locale instead.', function (key, value) { return moment.locale(key, value); } ); // This function will load locale and then set the global locale. If // no arguments are passed in, it will simply return the current global // locale key. moment.locale = function (key, values) { var data; if (key) { if (typeof(values) !== 'undefined') { data = moment.defineLocale(key, values); } else { data = moment.localeData(key); } if (data) { moment.duration._locale = moment._locale = data; } } return moment._locale._abbr; }; moment.defineLocale = function (name, values) { if (values !== null) { values.abbr = name; if (!locales[name]) { locales[name] = new Locale(); } locales[name].set(values); // backwards compat for now: also set the locale moment.locale(name); return locales[name]; } else { // useful for testing delete locales[name]; return null; } }; moment.langData = deprecate( 'moment.langData is deprecated. Use moment.localeData instead.', function (key) { return moment.localeData(key); } ); // returns locale data moment.localeData = function (key) { var locale; if (key && key._locale && key._locale._abbr) { key = key._locale._abbr; } if (!key) { return moment._locale; } if (!isArray(key)) { //short-circuit everything else locale = loadLocale(key); if (locale) { return locale; } key = [key]; } return chooseLocale(key); }; // compare moment object moment.isMoment = function (obj) { return obj instanceof Moment || (obj != null && hasOwnProp(obj, '_isAMomentObject')); }; // for typechecking Duration objects moment.isDuration = function (obj) { return obj instanceof Duration; }; for (i = lists.length - 1; i >= 0; --i) { makeList(lists[i]); } moment.normalizeUnits = function (units) { return normalizeUnits(units); }; moment.invalid = function (flags) { var m = moment.utc(NaN); if (flags != null) { extend(m._pf, flags); } else { m._pf.userInvalidated = true; } return m; }; moment.parseZone = function () { return moment.apply(null, arguments).parseZone(); }; moment.parseTwoDigitYear = function (input) { return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); }; moment.isDate = isDate; /************************************ Moment Prototype ************************************/ extend(moment.fn = Moment.prototype, { clone : function () { return moment(this); }, valueOf : function () { return +this._d - ((this._offset || 0) * 60000); }, unix : function () { return Math.floor(+this / 1000); }, toString : function () { return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); }, toDate : function () { return this._offset ? new Date(+this) : this._d; }, toISOString : function () { var m = moment(this).utc(); if (0 < m.year() && m.year() <= 9999) { if ('function' === typeof Date.prototype.toISOString) { // native implementation is ~50x faster, use it when we can return this.toDate().toISOString(); } else { return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); } } else { return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'); } }, toArray : function () { var m = this; return [ m.year(), m.month(), m.date(), m.hours(), m.minutes(), m.seconds(), m.milliseconds() ]; }, isValid : function () { return isValid(this); }, isDSTShifted : function () { if (this._a) { return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0; } return false; }, parsingFlags : function () { return extend({}, this._pf); }, invalidAt: function () { return this._pf.overflow; }, utc : function (keepLocalTime) { return this.utcOffset(0, keepLocalTime); }, local : function (keepLocalTime) { if (this._isUTC) { this.utcOffset(0, keepLocalTime); this._isUTC = false; if (keepLocalTime) { this.subtract(this._dateUtcOffset(), 'm'); } } return this; }, format : function (inputString) { var output = formatMoment(this, inputString || moment.defaultFormat); return this.localeData().postformat(output); }, add : createAdder(1, 'add'), subtract : createAdder(-1, 'subtract'), diff : function (input, units, asFloat) { var that = makeAs(input, this), zoneDiff = (that.utcOffset() - this.utcOffset()) * 6e4, anchor, diff, output, daysAdjust; units = normalizeUnits(units); if (units === 'year' || units === 'month' || units === 'quarter') { output = monthDiff(this, that); if (units === 'quarter') { output = output / 3; } else if (units === 'year') { output = output / 12; } } else { diff = this - that; output = units === 'second' ? diff / 1e3 : // 1000 units === 'minute' ? diff / 6e4 : // 1000 * 60 units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60 units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst diff; } return asFloat ? output : absRound(output); }, from : function (time, withoutSuffix) { return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); }, fromNow : function (withoutSuffix) { return this.from(moment(), withoutSuffix); }, calendar : function (time) { // We want to compare the start of today, vs this. // Getting start-of-today depends on whether we're locat/utc/offset // or not. var now = time || moment(), sod = makeAs(now, this).startOf('day'), diff = this.diff(sod, 'days', true), format = diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse'; return this.format(this.localeData().calendar(format, this, moment(now))); }, isLeapYear : function () { return isLeapYear(this.year()); }, isDST : function () { return (this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset()); }, day : function (input) { var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); if (input != null) { input = parseWeekday(input, this.localeData()); return this.add(input - day, 'd'); } else { return day; } }, month : makeAccessor('Month', true), startOf : function (units) { units = normalizeUnits(units); // the following switch intentionally omits break keywords // to utilize falling through the cases. switch (units) { case 'year': this.month(0); /* falls through */ case 'quarter': case 'month': this.date(1); /* falls through */ case 'week': case 'isoWeek': case 'day': this.hours(0); /* falls through */ case 'hour': this.minutes(0); /* falls through */ case 'minute': this.seconds(0); /* falls through */ case 'second': this.milliseconds(0); /* falls through */ } // weeks are a special case if (units === 'week') { this.weekday(0); } else if (units === 'isoWeek') { this.isoWeekday(1); } // quarters are also special if (units === 'quarter') { this.month(Math.floor(this.month() / 3) * 3); } return this; }, endOf: function (units) { units = normalizeUnits(units); if (units === undefined || units === 'millisecond') { return this; } return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms'); }, isAfter: function (input, units) { var inputMs; units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); if (units === 'millisecond') { input = moment.isMoment(input) ? input : moment(input); return +this > +input; } else { inputMs = moment.isMoment(input) ? +input : +moment(input); return inputMs < +this.clone().startOf(units); } }, isBefore: function (input, units) { var inputMs; units = normalizeUnits(typeof units !== 'undefined' ? units : 'millisecond'); if (units === 'millisecond') { input = moment.isMoment(input) ? input : moment(input); return +this < +input; } else { inputMs = moment.isMoment(input) ? +input : +moment(input); return +this.clone().endOf(units) < inputMs; } }, isBetween: function (from, to, units) { return this.isAfter(from, units) && this.isBefore(to, units); }, isSame: function (input, units) { var inputMs; units = normalizeUnits(units || 'millisecond'); if (units === 'millisecond') { input = moment.isMoment(input) ? input : moment(input); return +this === +input; } else { inputMs = +moment(input); return +(this.clone().startOf(units)) <= inputMs && inputMs <= +(this.clone().endOf(units)); } }, min: deprecate( 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548', function (other) { other = moment.apply(null, arguments); return other < this ? this : other; } ), max: deprecate( 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548', function (other) { other = moment.apply(null, arguments); return other > this ? this : other; } ), zone : deprecate( 'moment().zone is deprecated, use moment().utcOffset instead. ' + 'https://github.com/moment/moment/issues/1779', function (input, keepLocalTime) { if (input != null) { if (typeof input !== 'string') { input = -input; } this.utcOffset(input, keepLocalTime); return this; } else { return -this.utcOffset(); } } ), // keepLocalTime = true means only change the timezone, without // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset // +0200, so we adjust the time as needed, to be valid. // // Keeping the time actually adds/subtracts (one hour) // from the actual represented time. That is why we call updateOffset // a second time. In case it wants us to change the offset again // _changeInProgress == true case, then we have to adjust, because // there is no such time in the given timezone. utcOffset : function (input, keepLocalTime) { var offset = this._offset || 0, localAdjust; if (input != null) { if (typeof input === 'string') { input = utcOffsetFromString(input); } if (Math.abs(input) < 16) { input = input * 60; } if (!this._isUTC && keepLocalTime) { localAdjust = this._dateUtcOffset(); } this._offset = input; this._isUTC = true; if (localAdjust != null) { this.add(localAdjust, 'm'); } if (offset !== input) { if (!keepLocalTime || this._changeInProgress) { addOrSubtractDurationFromMoment(this, moment.duration(input - offset, 'm'), 1, false); } else if (!this._changeInProgress) { this._changeInProgress = true; moment.updateOffset(this, true); this._changeInProgress = null; } } return this; } else { return this._isUTC ? offset : this._dateUtcOffset(); } }, isLocal : function () { return !this._isUTC; }, isUtcOffset : function () { return this._isUTC; }, isUtc : function () { return this._isUTC && this._offset === 0; }, zoneAbbr : function () { return this._isUTC ? 'UTC' : ''; }, zoneName : function () { return this._isUTC ? 'Coordinated Universal Time' : ''; }, parseZone : function () { if (this._tzm) { this.utcOffset(this._tzm); } else if (typeof this._i === 'string') { this.utcOffset(utcOffsetFromString(this._i)); } return this; }, hasAlignedHourOffset : function (input) { if (!input) { input = 0; } else { input = moment(input).utcOffset(); } return (this.utcOffset() - input) % 60 === 0; }, daysInMonth : function () { return daysInMonth(this.year(), this.month()); }, dayOfYear : function (input) { var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1; return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); }, quarter : function (input) { return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); }, weekYear : function (input) { var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year; return input == null ? year : this.add((input - year), 'y'); }, isoWeekYear : function (input) { var year = weekOfYear(this, 1, 4).year; return input == null ? year : this.add((input - year), 'y'); }, week : function (input) { var week = this.localeData().week(this); return input == null ? week : this.add((input - week) * 7, 'd'); }, isoWeek : function (input) { var week = weekOfYear(this, 1, 4).week; return input == null ? week : this.add((input - week) * 7, 'd'); }, weekday : function (input) { var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; return input == null ? weekday : this.add(input - weekday, 'd'); }, isoWeekday : function (input) { // behaves the same as moment#day except // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) // as a setter, sunday should belong to the previous week. return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7); }, isoWeeksInYear : function () { return weeksInYear(this.year(), 1, 4); }, weeksInYear : function () { var weekInfo = this.localeData()._week; return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); }, get : function (units) { units = normalizeUnits(units); return this[units](); }, set : function (units, value) { var unit; if (typeof units === 'object') { for (unit in units) { this.set(unit, units[unit]); } } else { units = normalizeUnits(units); if (typeof this[units] === 'function') { this[units](value); } } return this; }, // If passed a locale key, it will set the locale for this // instance. Otherwise, it will return the locale configuration // variables for this instance. locale : function (key) { var newLocaleData; if (key === undefined) { return this._locale._abbr; } else { newLocaleData = moment.localeData(key); if (newLocaleData != null) { this._locale = newLocaleData; } return this; } }, lang : deprecate( 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) { if (key === undefined) { return this.localeData(); } else { return this.locale(key); } } ), localeData : function () { return this._locale; }, _dateUtcOffset : function () { // On Firefox.24 Date#getTimezoneOffset returns a floating point. // https://github.com/moment/moment/pull/1871 return -Math.round(this._d.getTimezoneOffset() / 15) * 15; } }); function rawMonthSetter(mom, value) { var dayOfMonth; // TODO: Move this out of here! if (typeof value === 'string') { value = mom.localeData().monthsParse(value); // TODO: Another silent failure? if (typeof value !== 'number') { return mom; } } dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); return mom; } function rawGetter(mom, unit) { return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit](); } function rawSetter(mom, unit, value) { if (unit === 'Month') { return rawMonthSetter(mom, value); } else { return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); } } function makeAccessor(unit, keepTime) { return function (value) { if (value != null) { rawSetter(this, unit, value); moment.updateOffset(this, keepTime); return this; } else { return rawGetter(this, unit); } }; } moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false); moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false); moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false); // Setting the hour should keep the time, because the user explicitly // specified which hour he wants. So trying to maintain the same hour (in // a new timezone) makes sense. Adding/subtracting hours does not follow // this rule. moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true); // moment.fn.month is defined separately moment.fn.date = makeAccessor('Date', true); moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true)); moment.fn.year = makeAccessor('FullYear', true); moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true)); // add plural methods moment.fn.days = moment.fn.day; moment.fn.months = moment.fn.month; moment.fn.weeks = moment.fn.week; moment.fn.isoWeeks = moment.fn.isoWeek; moment.fn.quarters = moment.fn.quarter; // add aliased format methods moment.fn.toJSON = moment.fn.toISOString; // alias isUtc for dev-friendliness moment.fn.isUTC = moment.fn.isUtc; /************************************ Duration Prototype ************************************/ function daysToYears (days) { // 400 years have 146097 days (taking into account leap year rules) return days * 400 / 146097; } function yearsToDays (years) { // years * 365 + absRound(years / 4) - // absRound(years / 100) + absRound(years / 400); return years * 146097 / 400; } extend(moment.duration.fn = Duration.prototype, { _bubble : function () { var milliseconds = this._milliseconds, days = this._days, months = this._months, data = this._data, seconds, minutes, hours, years = 0; // The following code bubbles up values, see the tests for // examples of what that means. data.milliseconds = milliseconds % 1000; seconds = absRound(milliseconds / 1000); data.seconds = seconds % 60; minutes = absRound(seconds / 60); data.minutes = minutes % 60; hours = absRound(minutes / 60); data.hours = hours % 24; days += absRound(hours / 24); // Accurately convert days to years, assume start from year 0. years = absRound(daysToYears(days)); days -= absRound(yearsToDays(years)); // 30 days to a month // TODO (iskren): Use anchor date (like 1st Jan) to compute this. months += absRound(days / 30); days %= 30; // 12 months -> 1 year years += absRound(months / 12); months %= 12; data.days = days; data.months = months; data.years = years; }, abs : function () { this._milliseconds = Math.abs(this._milliseconds); this._days = Math.abs(this._days); this._months = Math.abs(this._months); this._data.milliseconds = Math.abs(this._data.milliseconds); this._data.seconds = Math.abs(this._data.seconds); this._data.minutes = Math.abs(this._data.minutes); this._data.hours = Math.abs(this._data.hours); this._data.months = Math.abs(this._data.months); this._data.years = Math.abs(this._data.years); return this; }, weeks : function () { return absRound(this.days() / 7); }, valueOf : function () { return this._milliseconds + this._days * 864e5 + (this._months % 12) * 2592e6 + toInt(this._months / 12) * 31536e6; }, humanize : function (withSuffix) { var output = relativeTime(this, !withSuffix, this.localeData()); if (withSuffix) { output = this.localeData().pastFuture(+this, output); } return this.localeData().postformat(output); }, add : function (input, val) { // supports only 2.0-style add(1, 's') or add(moment) var dur = moment.duration(input, val); this._milliseconds += dur._milliseconds; this._days += dur._days; this._months += dur._months; this._bubble(); return this; }, subtract : function (input, val) { var dur = moment.duration(input, val); this._milliseconds -= dur._milliseconds; this._days -= dur._days; this._months -= dur._months; this._bubble(); return this; }, get : function (units) { units = normalizeUnits(units); return this[units.toLowerCase() + 's'](); }, as : function (units) { var days, months; units = normalizeUnits(units); if (units === 'month' || units === 'year') { days = this._days + this._milliseconds / 864e5; months = this._months + daysToYears(days) * 12; return units === 'month' ? months : months / 12; } else { // handle milliseconds separately because of floating point math errors (issue #1867) days = this._days + Math.round(yearsToDays(this._months / 12)); switch (units) { case 'week': return days / 7 + this._milliseconds / 6048e5; case 'day': return days + this._milliseconds / 864e5; case 'hour': return days * 24 + this._milliseconds / 36e5; case 'minute': return days * 24 * 60 + this._milliseconds / 6e4; case 'second': return days * 24 * 60 * 60 + this._milliseconds / 1000; // Math.floor prevents floating point math errors here case 'millisecond': return Math.floor(days * 24 * 60 * 60 * 1000) + this._milliseconds; default: throw new Error('Unknown unit ' + units); } } }, lang : moment.fn.lang, locale : moment.fn.locale, toIsoString : deprecate( 'toIsoString() is deprecated. Please use toISOString() instead ' + '(notice the capitals)', function () { return this.toISOString(); } ), toISOString : function () { // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js var years = Math.abs(this.years()), months = Math.abs(this.months()), days = Math.abs(this.days()), hours = Math.abs(this.hours()), minutes = Math.abs(this.minutes()), seconds = Math.abs(this.seconds() + this.milliseconds() / 1000); if (!this.asSeconds()) { // this is the same as C#'s (Noda) and python (isodate)... // but not other JS (goog.date) return 'P0D'; } return (this.asSeconds() < 0 ? '-' : '') + 'P' + (years ? years + 'Y' : '') + (months ? months + 'M' : '') + (days ? days + 'D' : '') + ((hours || minutes || seconds) ? 'T' : '') + (hours ? hours + 'H' : '') + (minutes ? minutes + 'M' : '') + (seconds ? seconds + 'S' : ''); }, localeData : function () { return this._locale; }, toJSON : function () { return this.toISOString(); } }); moment.duration.fn.toString = moment.duration.fn.toISOString; function makeDurationGetter(name) { moment.duration.fn[name] = function () { return this._data[name]; }; } for (i in unitMillisecondFactors) { if (hasOwnProp(unitMillisecondFactors, i)) { makeDurationGetter(i.toLowerCase()); } } moment.duration.fn.asMilliseconds = function () { return this.as('ms'); }; moment.duration.fn.asSeconds = function () { return this.as('s'); }; moment.duration.fn.asMinutes = function () { return this.as('m'); }; moment.duration.fn.asHours = function () { return this.as('h'); }; moment.duration.fn.asDays = function () { return this.as('d'); }; moment.duration.fn.asWeeks = function () { return this.as('weeks'); }; moment.duration.fn.asMonths = function () { return this.as('M'); }; moment.duration.fn.asYears = function () { return this.as('y'); }; /************************************ Default Locale ************************************/ // Set default locale, other locale will inherit from English. moment.locale('en', { ordinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal : function (number) { var b = number % 10, output = (toInt(number % 100 / 10) === 1) ? 'th' : (b === 1) ? 'st' : (b === 2) ? 'nd' : (b === 3) ? 'rd' : 'th'; return number + output; } }); /* EMBED_LOCALES */ /************************************ Exposing Moment ************************************/ function makeGlobal(shouldDeprecate) { /*global ender:false */ if (typeof ender !== 'undefined') { return; } oldGlobalMoment = globalScope.moment; if (shouldDeprecate) { globalScope.moment = deprecate( 'Accessing Moment through the global scope is ' + 'deprecated, and will be removed in an upcoming ' + 'release.', moment); } else { globalScope.moment = moment; } } // CommonJS module is defined if (hasModule) { module.exports = moment; } else if (typeof define === 'function' && define.amd) { define(function (require, exports, module) { if (module.config && module.config() && module.config().noGlobal === true) { // release the global variable globalScope.moment = oldGlobalMoment; } return moment; }); makeGlobal(true); } else { makeGlobal(); } }).call(this); PK!W&datatables/dataTables.bootstrap.min.jsnu[/*! DataTables Bootstrap 3 integration ©2011-2014 SpryMedia Ltd - datatables.net/license */ (function(l,q){var e=function(b,c){b.extend(!0,c.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-5'i><'col-sm-7'p>>",renderer:"bootstrap"});b.extend(c.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"});c.ext.renderer.pageButton.bootstrap=function(g,e,r,s,i,m){var t=new c.Api(g),u=g.oClasses,j=g.oLanguage.oPaginate,d,f,n=0,p=function(c,e){var k,h,o,a,l=function(a){a.preventDefault(); b(a.currentTarget).hasClass("disabled")||t.page(a.data.action).draw(!1)};k=0;for(h=e.length;k",{"class":u.sPageButton+" "+ f,id:0===r&&"string"===typeof a?g.sTableId+"_"+a:null}).append(b("",{href:"#","aria-controls":g.sTableId,"data-dt-idx":n,tabindex:g.iTabIndex}).html(d)).appendTo(c),g.oApi._fnBindAction(o,{action:a},l),n++)}},h;try{h=b(q.activeElement).data("dt-idx")}catch(l){}p(b(e).empty().html('
    ').children("ul"),s);h&&b(e).find("[data-dt-idx="+h+"]").focus()};c.TableTools&&(b.extend(!0,c.TableTools.classes,{container:"DTTT btn-group",buttons:{normal:"btn btn-default",disabled:"disabled"}, collection:{container:"DTTT_dropdown dropdown-menu",buttons:{normal:"",disabled:"disabled"}},print:{info:"DTTT_print_info"},select:{row:"active"}}),b.extend(!0,c.TableTools.DEFAULTS.oTags,{collection:{container:"ul",button:"li",liner:"a"}}))};"function"===typeof define&&define.amd?define(["jquery","datatables"],e):"object"===typeof exports?e(require("jquery"),require("datatables")):jQuery&&e(jQuery,jQuery.fn.dataTable)})(window,document); PK!t{Zѕ77,datatables/jquery.dataTables_themeroller.cssnu[/* * Table styles */ table.dataTable { width: 100%; margin: 0 auto; clear: both; border-collapse: separate; border-spacing: 0; /* * Header and footer styles */ /* * Body styles */ } table.dataTable thead th, table.dataTable thead td, table.dataTable tfoot th, table.dataTable tfoot td { padding: 4px 10px; } table.dataTable thead th, table.dataTable tfoot th { font-weight: bold; } table.dataTable thead th:active, table.dataTable thead td:active { outline: none; } table.dataTable thead .sorting_asc, table.dataTable thead .sorting_desc, table.dataTable thead .sorting { cursor: pointer; *cursor: hand; } table.dataTable thead th div.DataTables_sort_wrapper { position: relative; padding-right: 10px; } table.dataTable thead th div.DataTables_sort_wrapper span { position: absolute; top: 50%; margin-top: -8px; right: -5px; } table.dataTable thead th.ui-state-default { border-right-width: 0; } table.dataTable thead th.ui-state-default:last-child { border-right-width: 1px; } table.dataTable tbody tr { background-color: #ffffff; } table.dataTable tbody tr.selected { background-color: #B0BED9; } table.dataTable tbody th, table.dataTable tbody td { padding: 8px 10px; } table.dataTable th.center, table.dataTable td.center, table.dataTable td.dataTables_empty { text-align: center; } table.dataTable th.right, table.dataTable td.right { text-align: right; } table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td { border-top: 1px solid #ddd; } table.dataTable.row-border tbody tr:first-child th, table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th, table.dataTable.display tbody tr:first-child td { border-top: none; } table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td { border-top: 1px solid #ddd; border-right: 1px solid #ddd; } table.dataTable.cell-border tbody tr th:first-child, table.dataTable.cell-border tbody tr td:first-child { border-left: 1px solid #ddd; } table.dataTable.cell-border tbody tr:first-child th, table.dataTable.cell-border tbody tr:first-child td { border-top: none; } table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd { background-color: #f9f9f9; } table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected { background-color: #abb9d3; } table.dataTable.hover tbody tr:hover, table.dataTable.hover tbody tr.odd:hover, table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover, table.dataTable.display tbody tr.odd:hover, table.dataTable.display tbody tr.even:hover { background-color: whitesmoke; } table.dataTable.hover tbody tr:hover.selected, table.dataTable.hover tbody tr.odd:hover.selected, table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected, table.dataTable.display tbody tr.odd:hover.selected, table.dataTable.display tbody tr.even:hover.selected { background-color: #a9b7d1; } table.dataTable.order-column tbody tr > .sorting_1, table.dataTable.order-column tbody tr > .sorting_2, table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1, table.dataTable.display tbody tr > .sorting_2, table.dataTable.display tbody tr > .sorting_3 { background-color: #f9f9f9; } table.dataTable.order-column tbody tr.selected > .sorting_1, table.dataTable.order-column tbody tr.selected > .sorting_2, table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1, table.dataTable.display tbody tr.selected > .sorting_2, table.dataTable.display tbody tr.selected > .sorting_3 { background-color: #acbad4; } table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 { background-color: #f1f1f1; } table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 { background-color: #f3f3f3; } table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 { background-color: whitesmoke; } table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 { background-color: #a6b3cd; } table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 { background-color: #a7b5ce; } table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 { background-color: #a9b6d0; } table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 { background-color: #f9f9f9; } table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 { background-color: #fbfbfb; } table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 { background-color: #fdfdfd; } table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 { background-color: #acbad4; } table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 { background-color: #adbbd6; } table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 { background-color: #afbdd8; } table.dataTable.display tbody tr:hover > .sorting_1, table.dataTable.display tbody tr.odd:hover > .sorting_1, table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1, table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1, table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 { background-color: #eaeaea; } table.dataTable.display tbody tr:hover > .sorting_2, table.dataTable.display tbody tr.odd:hover > .sorting_2, table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2, table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2, table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 { background-color: #ebebeb; } table.dataTable.display tbody tr:hover > .sorting_3, table.dataTable.display tbody tr.odd:hover > .sorting_3, table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3, table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3, table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 { background-color: #eeeeee; } table.dataTable.display tbody tr:hover.selected > .sorting_1, table.dataTable.display tbody tr.odd:hover.selected > .sorting_1, table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 { background-color: #a1aec7; } table.dataTable.display tbody tr:hover.selected > .sorting_2, table.dataTable.display tbody tr.odd:hover.selected > .sorting_2, table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 { background-color: #a2afc8; } table.dataTable.display tbody tr:hover.selected > .sorting_3, table.dataTable.display tbody tr.odd:hover.selected > .sorting_3, table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 { background-color: #a4b2cb; } table.dataTable.nowrap th, table.dataTable.nowrap td { white-space: nowrap; } table.dataTable.compact thead th, table.dataTable.compact thead td { padding: 5px 9px; } table.dataTable.compact tfoot th, table.dataTable.compact tfoot td { padding: 5px 9px 3px 9px; } table.dataTable.compact tbody th, table.dataTable.compact tbody td { padding: 4px 5px; } table.dataTable th.dt-left, table.dataTable td.dt-left { text-align: left; } table.dataTable th.dt-center, table.dataTable td.dt-center, table.dataTable td.dataTables_empty { text-align: center; } table.dataTable th.dt-right, table.dataTable td.dt-right { text-align: right; } table.dataTable th.dt-justify, table.dataTable td.dt-justify { text-align: justify; } table.dataTable th.dt-nowrap, table.dataTable td.dt-nowrap { white-space: nowrap; } table.dataTable thead th.dt-head-left, table.dataTable thead td.dt-head-left, table.dataTable tfoot th.dt-head-left, table.dataTable tfoot td.dt-head-left { text-align: left; } table.dataTable thead th.dt-head-center, table.dataTable thead td.dt-head-center, table.dataTable tfoot th.dt-head-center, table.dataTable tfoot td.dt-head-center { text-align: center; } table.dataTable thead th.dt-head-right, table.dataTable thead td.dt-head-right, table.dataTable tfoot th.dt-head-right, table.dataTable tfoot td.dt-head-right { text-align: right; } table.dataTable thead th.dt-head-justify, table.dataTable thead td.dt-head-justify, table.dataTable tfoot th.dt-head-justify, table.dataTable tfoot td.dt-head-justify { text-align: justify; } table.dataTable thead th.dt-head-nowrap, table.dataTable thead td.dt-head-nowrap, table.dataTable tfoot th.dt-head-nowrap, table.dataTable tfoot td.dt-head-nowrap { white-space: nowrap; } table.dataTable tbody th.dt-body-left, table.dataTable tbody td.dt-body-left { text-align: left; } table.dataTable tbody th.dt-body-center, table.dataTable tbody td.dt-body-center { text-align: center; } table.dataTable tbody th.dt-body-right, table.dataTable tbody td.dt-body-right { text-align: right; } table.dataTable tbody th.dt-body-justify, table.dataTable tbody td.dt-body-justify { text-align: justify; } table.dataTable tbody th.dt-body-nowrap, table.dataTable tbody td.dt-body-nowrap { white-space: nowrap; } table.dataTable, table.dataTable th, table.dataTable td { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; } /* * Control feature layout */ .dataTables_wrapper { position: relative; clear: both; *zoom: 1; zoom: 1; } .dataTables_wrapper .dataTables_length { float: left; } .dataTables_wrapper .dataTables_filter { float: right; text-align: right; } .dataTables_wrapper .dataTables_filter input { margin-left: 0.5em; } .dataTables_wrapper .dataTables_info { clear: both; float: left; padding-top: 0.55em; } .dataTables_wrapper .dataTables_paginate { float: right; text-align: right; } .dataTables_wrapper .dataTables_paginate .fg-button { box-sizing: border-box; display: inline-block; min-width: 1.5em; padding: 0.5em; margin-left: 2px; text-align: center; text-decoration: none !important; cursor: pointer; *cursor: hand; color: #333 !important; border: 1px solid transparent; } .dataTables_wrapper .dataTables_paginate .fg-button:active { outline: none; } .dataTables_wrapper .dataTables_paginate .fg-button:first-child { border-top-left-radius: 3px; border-bottom-left-radius: 3px; } .dataTables_wrapper .dataTables_paginate .fg-button:last-child { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .dataTables_wrapper .dataTables_processing { position: absolute; top: 50%; left: 50%; width: 100%; height: 40px; margin-left: -50%; margin-top: -25px; padding-top: 20px; text-align: center; font-size: 1.2em; background-color: white; background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0))); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); /* Chrome10+,Safari5.1+ */ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); /* FF3.6+ */ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); /* IE10+ */ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); /* Opera 11.10+ */ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%); /* W3C */ } .dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter, .dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_processing, .dataTables_wrapper .dataTables_paginate { color: #333; } .dataTables_wrapper .dataTables_scroll { clear: both; } .dataTables_wrapper .dataTables_scrollBody { *margin-top: -1px; -webkit-overflow-scrolling: touch; } .dataTables_wrapper .ui-widget-header { font-weight: normal; } .dataTables_wrapper .ui-toolbar { padding: 8px; } .dataTables_wrapper:after { visibility: hidden; display: block; content: ""; clear: both; height: 0; } @media screen and (max-width: 767px) { .dataTables_wrapper .dataTables_length, .dataTables_wrapper .dataTables_filter, .dataTables_wrapper .dataTables_info, .dataTables_wrapper .dataTables_paginate { float: none; text-align: center; } .dataTables_wrapper .dataTables_filter, .dataTables_wrapper .dataTables_paginate { margin-top: 0.5em; } } PK!?u4u4$datatables/jquery.dataTables.min.cssnu[table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc{cursor:pointer;*cursor:hand}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc_disabled{background-repeat:no-repeat;background-position:center right}table.dataTable thead .sorting{background-image:url("../images/sort_both.png")}table.dataTable thead .sorting_asc{background-image:url("../images/sort_asc.png")}table.dataTable thead .sorting_desc{background-image:url("../images/sort_desc.png")}table.dataTable thead .sorting_asc_disabled{background-image:url("../images/sort_asc_disabled.png")}table.dataTable thead .sorting_desc_disabled{background-image:url("../images/sort_desc_disabled.png")}table.dataTable tbody tr{background-color:#fff}table.dataTable tbody tr.selected{background-color:#B0BED9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.display tbody tr:hover{background-color:#f5f5f5}table.dataTable.hover tbody tr:hover.selected,table.dataTable.display tbody tr:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:#f5f5f5}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:4px 17px 4px 4px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:4px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{margin-left:0.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:0.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:0.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:0.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;*cursor:hand;color:#333 !important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333 !important;border:1px solid #cacaca;background-color:#fff;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #fff), color-stop(100%, #dcdcdc));background:-webkit-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-moz-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-ms-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:-o-linear-gradient(top, #fff 0%, #dcdcdc 100%);background:linear-gradient(to bottom, #fff 0%, #dcdcdc 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255,255,255,0)), color-stop(25%, rgba(255,255,255,0.9)), color-stop(75%, rgba(255,255,255,0.9)), color-stop(100%, rgba(255,255,255,0)));background:-webkit-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:-o-linear-gradient(left, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%);background:linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.9) 25%, rgba(255,255,255,0.9) 75%, rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:0.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:0.5em}} PK!X@@<datatables/extensions/AutoFill/examples/fill-horizontal.htmlnu[ AutoFill example - Horizontal fill

    AutoFill example Horizontal fill

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').DataTable(); new $.fn.dataTable.AutoFill( table, { mode: 'x' } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!K#AA>datatables/extensions/AutoFill/examples/complete-callback.htmlnu[ AutoFill example - Complete callback

    AutoFill example Complete callback

    AutoFill provides a number of customisable callback functions so you can tailor it's actions to exactly what you need. This example shows the use of the complete callback function which is executed at the end of an auto-fill drag, providing information about the cells that were altered.

    For a complete description of the complete callback, please refer to the AutoFill documentation.

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').dataTable(); new $.fn.dataTable.AutoFill( table, { complete: function ( altered ) { var last = altered[ altered.length-1 ]; alert( altered.length+' cells were altered in this auto-fill. The '+ 'value of the last cell altered was: '+last.oldValue+' and is '+ 'now '+last.newValue ); } } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK! D D:datatables/extensions/AutoFill/examples/step-callback.htmlnu[ AutoFill example - Step callback

    AutoFill example Step callback

    By default, AutoFill will increment cells that contain numbers by a single digit for each cell that is iterated over (try the Age column below for example). This behaviour can be disabled completely using the increment column option, but it can also be modified to suit your requirements through use of the step column callback function.

    The step callback is executed for each cell in the auto-fill set and gives complete control over how data is incremented. The example below shows the step function being used on the Salary column to increment by 100, rather than 1 for each cell.

    For a complete description of the step callback, please refer to the AutoFill documentation.

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').dataTable(); new $.fn.dataTable.AutoFill( table, { columnDefs: [ { targets: -1, step: function ( cell, read, last, i, x, y ) { var val = parseInt( (last || read).replace(/[$,]/g, ''), 10 ); val += (x<0 || y<0 ? -100 : 100); // - if going back up, + if going down // Format for the currency column return '$'+val.toString().replace( /\B(?=(\d{3})+(?!\d))/g, ',' ); } } ] } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!+@@4datatables/extensions/AutoFill/examples/columns.htmlnu[ AutoFill example - Column options

    AutoFill example Column options

    Columns can be enabled (which they are by default) and disabled from providing the end user with AutoFill abilities by using either columns or columnDefs and the enable option. These two arrays work in exactly the same way as in DataTables.

    This example shows how disabling columns counting from the right hand side of the table can be achieved. In this case, the last three columns.

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').dataTable(); new $.fn.dataTable.AutoFill( table, { "columnDefs": [ { enable: false, targets: [-1, -2] }, { increment: false, targets: 3 } ] } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!Iļ??3datatables/extensions/AutoFill/examples/simple.htmlnu[ AutoFill example - Basic initialisation

    AutoFill example Basic initialisation

    AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in information over the selected cells and incrementing numbers as needed.

    AutoFill is initialised using the $.fn.dataTable.AutoFill function as shown in the example below. It requires one parameter, the DataTable instance that AutoFill is to operate on, and optionally a second configuration parameter, which is shown in the other AutoFill examples.

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').DataTable(); new $.fn.dataTable.AutoFill( table ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!f43@@6datatables/extensions/AutoFill/examples/fill-both.htmlnu[ AutoFill example - Horizontal and vertical fill

    AutoFill example Horizontal and vertical fill

    By default AutoFill will allow the fill to operate only on a single column at a time (i.e. vertically). However, it has the ability to provide the fill either horizontally, over both axis or limited to just one axis depending on the direction of the drag. This option is provided by the mode sanitisation option.

    In this case it is set to both (i.e. both horizontal and vertical axis) to provide the filler along a row, rather than a column.

    For the full range of options and syntax for mode please refer to the AutoFill documentation.

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').DataTable(); new $.fn.dataTable.AutoFill( table, { mode: 'both' } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!Y4??6datatables/extensions/AutoFill/examples/scrolling.htmlnu[ AutoFill example - Scrolling DataTable

    AutoFill example Scrolling DataTable

    When dragging an AutoFill handle, the table (if DataTables scrolling is enabled) or the window will be automatically scrolled, as you approach the edge of the scrolling component. The example below shows the effect with DataTables scrolling (and also window if needed).

    Name Position Office Age Start date Salary
    Name Position Office Age Start date Salary
    Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800
    Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750
    Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000
    Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060
    Airi Satou Accountant Tokyo 33 2008/11/28 $162,700
    Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000
    Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500
    Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900
    Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500
    Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600
    Jena Gaines Office Manager London 30 2008/12/19 $90,560
    Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000
    Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600
    Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500
    Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750
    Michael Silva Marketing Designer London 66 2012/11/27 $198,500
    Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000
    Gloria Little Systems Administrator New York 59 2009/04/10 $237,500
    Bradley Greer Software Engineer London 41 2012/10/13 $132,000
    Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500
    Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000
    Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000
    Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450
    Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600
    Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000
    Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575
    Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650
    Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850
    Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000
    Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000
    Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400
    Suki Burks Developer London 53 2009/10/22 $114,500
    Prescott Bartlett Technical Author London 27 2011/05/07 $145,000
    Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500
    Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050
    Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675
    Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500
    Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850
    Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500
    Timothy Mooney Office Manager London 37 2008/12/11 $136,200
    Jackson Bradshaw Director New York 65 2008/09/26 $645,750
    Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500
    Bruno Nash Software Engineer London 38 2011/05/03 $163,500
    Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575
    Thor Walton Developer New York 61 2013/08/11 $98,540
    Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500
    Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575
    Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250
    Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000
    Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650
    Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600
    Hermione Butler Regional Director London 47 2011/03/21 $356,250
    Lael Greer Systems Administrator London 21 2009/02/27 $103,500
    Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500
    Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000
    Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000
    Donna Snider Customer Support New York 27 2011/01/25 $112,000
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var table = $('#example').dataTable( { scrollY: 200, scrollCollapse: false, paginate: false } ); new $.fn.dataTable.AutoFill( table ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK! 2datatables/extensions/AutoFill/examples/index.htmlnu[ AutoFill examples - AutoFill examples

    AutoFill example AutoFill examples

    AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in information over the selected cells and incrementing numbers as needed.

    Thanks to Phoniax AS for their sponsorship of this plug-in for DataTables.

    PK!R۴V#V#<datatables/extensions/AutoFill/js/dataTables.autoFill.min.jsnu[/*! AutoFill 1.2.1 ©2008-2014 SpryMedia Ltd - datatables.net/license */ (function(o,j,m){var l=function(c,k){var h=function(d,b){if(!(this instanceof h))throw"Warning: AutoFill must be initialised with the keyword 'new'";if(!c.fn.dataTableExt.fnVersionCheck("1.7.0"))throw"Warning: AutoFill requires DataTables 1.7 or greater";this.c={};this.s={filler:{height:0,width:0},border:{width:2},drag:{startX:-1,startY:-1,startTd:null,endTd:null,dragging:!1},screen:{interval:null,y:0,height:0,scrollTop:0},scroller:{top:0,bottom:0},columns:[]};this.dom={table:null,filler:null,borderTop:null, borderRight:null,borderBottom:null,borderLeft:null,currentTarget:null};this.fnSettings=function(){return this.s};this._fnInit(d,b);return this};h.prototype={_fnInit:function(d,b){var a=this;this.s.dt=k.Api?(new k.Api(d)).settings()[0]:d.fnSettings();this.s.init=b||{};this.dom.table=this.s.dt.nTable;c.extend(!0,this.c,h.defaults,b);this._initColumns();var e=c("
    ",{"class":"AutoFill_filler"}).appendTo("body");this.dom.filler=e[0];this.s.filler.height=e.height();this.s.filler.width=e.width();e[0].style.display= "none";var g,f=j.body;""!==a.s.dt.oScroll.sY&&(a.s.dt.nTable.parentNode.style.position="relative",f=a.s.dt.nTable.parentNode);g=c("
    ",{"class":"AutoFill_border"});this.dom.borderTop=g.clone().appendTo(f)[0];this.dom.borderRight=g.clone().appendTo(f)[0];this.dom.borderBottom=g.clone().appendTo(f)[0];this.dom.borderLeft=g.clone().appendTo(f)[0];e.on("mousedown.DTAF",function(b){this.onselectstart=function(){return false};a._fnFillerDragStart.call(a,b);return false});c("tbody",this.dom.table).on("mouseover.DTAF mouseout.DTAF", ">tr>td, >tr>th",function(b){a._fnFillerDisplay.call(a,b)});c(this.dom.table).on("destroy.dt.DTAF",function(){e.off("mousedown.DTAF").remove();c("tbody",this.dom.table).off("mouseover.DTAF mouseout.DTAF")})},_initColumns:function(){var d=this,b,a,e=this.s.dt,g=this.s.init;b=0;for(a=e.aoColumns.length;bg.left&&(f=g.left-a,i=e.left+c(d).outerWidth(),j=e.left+c(d).outerWidth()-g.left+2*a);""!==this.s.dt.oScroll.sY&&(a=c(this.s.dt.nTable.parentNode).offset(),e=c(this.s.dt.nTable.parentNode).scrollTop(), g=c(this.s.dt.nTable.parentNode).scrollLeft(),f-=a.left-g,i-=a.left-g,n-=a.top-e,h-=a.top-e);a=this.dom.borderTop.style;a.top=n+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderBottom.style;a.top=h+"px";a.left=f+"px";a.height=this.s.border.width+"px";a.width=j+"px";a=this.dom.borderLeft.style;a.top=n+"px";a.left=f+"px";a.height=k+"px";a.width=this.s.border.width+"px";a=this.dom.borderRight.style;a.top=n+"px";a.left=i+"px";a.height=k+"px";a.width=this.s.border.width+ "px"},_fnFillerDragStart:function(d){var b=this,a=this.dom.currentTarget;this.s.drag.dragging=!0;b.dom.borderTop.style.display="block";b.dom.borderRight.style.display="block";b.dom.borderBottom.style.display="block";b.dom.borderLeft.style.display="block";var e=this._fnTargetCoords(a);this.s.drag.startX=e.x;this.s.drag.startY=e.y;this.s.drag.startTd=a;this.s.drag.endTd=a;this._fnUpdateBorder(a,a);c(j).bind("mousemove.AutoFill",function(a){b._fnFillerDragMove.call(b,a)});c(j).bind("mouseup.AutoFill", function(a){b._fnFillerFinish.call(b,a)});this.s.screen.y=d.pageY;this.s.screen.height=c(o).height();this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom=this.s.scroller.top+c(this.s.dt.nTable.parentNode).height());this.s.screen.interval=setInterval(function(){var a=c(j).scrollTop();b.s.screen.y=b.s.screen.y+(a-b.s.screen.scrollTop);b.s.screen.height-b.s.screen.y+a<50?c("html, body").animate({scrollTop:a+ 50},240,"linear"):b.s.screen.y-a<50&&c("html, body").animate({scrollTop:a-50},240,"linear");b.s.dt.oScroll.sY!==""&&(b.s.screen.y>b.s.scroller.bottom-50?c(b.s.dt.nTable.parentNode).animate({scrollTop:c(b.s.dt.nTable.parentNode).scrollTop()+50},240,"linear"):b.s.screen.ytr:eq("+b.y+")>td:eq("+this.s.drag.startX+")",this.dom.table)[0]);"x"==this.c.mode&&b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]);"either"==this.c.mode&&(b.x!=this.s.drag.startX?d.target=c("tbody>tr:eq("+this.s.drag.startY+")>td:eq("+b.x+")",this.dom.table)[0]:b.y!=this.s.drag.startY&&(d.target=c("tbody>tr:eq("+b.y+")>td:eq("+this.s.drag.startX+ ")",this.dom.table)[0]));"both"!==this.c.mode&&(b=this._fnTargetCoords(d.target));var a=this.s.drag;a.endTd=d.target;b.y>=this.s.drag.startY?this._fnUpdateBorder(a.startTd,a.endTd):this._fnUpdateBorder(a.endTd,a.startTd);this._fnFillerPosition(d.target)}this.s.screen.y=d.pageY;this.s.screen.scrollTop=c(j).scrollTop();""!==this.s.dt.oScroll.sY&&(this.s.scroller.scrollTop=c(this.s.dt.nTable.parentNode).scrollTop(),this.s.scroller.top=c(this.s.dt.nTable.parentNode).offset().top,this.s.scroller.bottom= this.s.scroller.top+c(this.s.dt.nTable.parentNode).height())},_fnFillerFinish:function(){var d=this,b,a;c(j).unbind("mousemove.AutoFill mouseup.AutoFill");this.dom.borderTop.style.display="none";this.dom.borderRight.style.display="none";this.dom.borderBottom.style.display="none";this.dom.borderLeft.style.display="none";this.s.drag.dragging=!1;clearInterval(this.s.screen.interval);var e=[],g=this.dom.table,f=this._fnTargetCoords(this.s.drag.startTd),i=this._fnTargetCoords(this.s.drag.endTd),h=function(a){return d.s.dt.oApi._fnVisibleToColumnIndex(d.s.dt, a)};if(f.y<=i.y)for(b=f.y;b<=i.y;b++)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(b=f.y;b>=i.y;b--)if(f.x<=i.x)for(a=f.x;a<=i.x;a++)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:a-f.x,y:b-f.y,colIdx:h(a)});else for(a=f.x;a>=i.x;a--)e.push({node:c("tbody>tr:eq("+b+")>td:eq("+a+")",g)[0],x:f.x-a,y:f.y- b,colIdx:h(a)});if(!(1>=e.length)){var g=[],m;b=0;for(a=e.length;bg||0>f?-1:1)):a===m?b:a}}};return h};"function"===typeof define&&define.amd? define(["jquery","datatables"],l):"object"===typeof exports?l(require("jquery"),require("datatables")):jQuery&&!jQuery.fn.dataTable.AutoFill&&l(jQuery,jQuery.fn.dataTable)})(window,document); PK! uXuX8datatables/extensions/AutoFill/js/dataTables.autoFill.jsnu[/*! AutoFill 1.2.1 * ©2008-2014 SpryMedia Ltd - datatables.net/license */ /** * @summary AutoFill * @description Add Excel like click and drag auto-fill options to DataTables * @version 1.2.1 * @file dataTables.autoFill.js * @author SpryMedia Ltd (www.sprymedia.co.uk) * @contact www.sprymedia.co.uk/contact * @copyright Copyright 2010-2014 SpryMedia Ltd. * * This source file is free software, available under the following license: * MIT license - http://datatables.net/license/mit * * This source file is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. * * For details please refer to: http://www.datatables.net */ (function( window, document, undefined ) { var factory = function( $, DataTable ) { "use strict"; /** * AutoFill provides Excel like auto-fill features for a DataTable * * @class AutoFill * @constructor * @param {object} oTD DataTables settings object * @param {object} oConfig Configuration object for AutoFill */ var AutoFill = function( oDT, oConfig ) { /* Sanity check that we are a new instance */ if ( ! (this instanceof AutoFill) ) { throw( "Warning: AutoFill must be initialised with the keyword 'new'" ); } if ( ! $.fn.dataTableExt.fnVersionCheck('1.7.0') ) { throw( "Warning: AutoFill requires DataTables 1.7 or greater"); } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Public class variables * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ this.c = {}; /** * @namespace Settings object which contains customisable information for AutoFill instance */ this.s = { /** * @namespace Cached information about the little dragging icon (the filler) */ "filler": { "height": 0, "width": 0 }, /** * @namespace Cached information about the border display */ "border": { "width": 2 }, /** * @namespace Store for live information for the current drag */ "drag": { "startX": -1, "startY": -1, "startTd": null, "endTd": null, "dragging": false }, /** * @namespace Data cache for information that we need for scrolling the screen when we near * the edges */ "screen": { "interval": null, "y": 0, "height": 0, "scrollTop": 0 }, /** * @namespace Data cache for the position of the DataTables scrolling element (when scrolling * is enabled) */ "scroller": { "top": 0, "bottom": 0 }, /** * @namespace Information stored for each column. An array of objects */ "columns": [] }; /** * @namespace Common and useful DOM elements for the class instance */ this.dom = { "table": null, "filler": null, "borderTop": null, "borderRight": null, "borderBottom": null, "borderLeft": null, "currentTarget": null }; /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Public class methods * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Retreieve the settings object from an instance * @method fnSettings * @returns {object} AutoFill settings object */ this.fnSettings = function () { return this.s; }; /* Constructor logic */ this._fnInit( oDT, oConfig ); return this; }; AutoFill.prototype = { /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Private methods (they are of course public in JS, but recommended as private) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Initialisation * @method _fnInit * @param {object} dt DataTables settings object * @param {object} config Configuration object for AutoFill * @returns void */ "_fnInit": function ( dt, config ) { var that = this, i, iLen; // Use DataTables API to get the settings allowing selectors, instances // etc to be used, or for backwards compatibility get from the old // fnSettings method this.s.dt = DataTable.Api ? new DataTable.Api( dt ).settings()[0] : dt.fnSettings(); this.s.init = config || {}; this.dom.table = this.s.dt.nTable; $.extend( true, this.c, AutoFill.defaults, config ); /* Add and configure the columns */ this._initColumns(); /* Auto Fill click and drag icon */ var filler = $('
    ', { 'class': 'AutoFill_filler' } ) .appendTo( 'body' ); this.dom.filler = filler[0]; // Get the height / width of the click element this.s.filler.height = filler.height(); this.s.filler.width = filler.width(); filler[0].style.display = "none"; /* Border display - one div for each side. We can't just use a single * one with a border, as we want the events to effectively pass through * the transparent bit of the box */ var border; var appender = document.body; if ( that.s.dt.oScroll.sY !== "" ) { that.s.dt.nTable.parentNode.style.position = "relative"; appender = that.s.dt.nTable.parentNode; } border = $('
    ', { "class": "AutoFill_border" } ); this.dom.borderTop = border.clone().appendTo( appender )[0]; this.dom.borderRight = border.clone().appendTo( appender )[0]; this.dom.borderBottom = border.clone().appendTo( appender )[0]; this.dom.borderLeft = border.clone().appendTo( appender )[0]; /* Events */ filler.on( 'mousedown.DTAF', function (e) { this.onselectstart = function() { return false; }; that._fnFillerDragStart.call( that, e ); return false; } ); $('tbody', this.dom.table).on( 'mouseover.DTAF mouseout.DTAF', '>tr>td, >tr>th', function (e) { that._fnFillerDisplay.call( that, e ); } ); $(this.dom.table).on( 'destroy.dt.DTAF', function () { filler.off( 'mousedown.DTAF' ).remove(); $('tbody', this.dom.table).off( 'mouseover.DTAF mouseout.DTAF' ); } ); }, _initColumns: function ( ) { var that = this; var i, ien; var dt = this.s.dt; var config = this.s.init; for ( i=0, ien=dt.aoColumns.length ; i offsetEnd.left) { x1 = offsetEnd.left - border; x2 = offsetStart.left + $(nStart).outerWidth(); width = offsetStart.left + $(nStart).outerWidth() - offsetEnd.left + (2*border); } if ( this.s.dt.oScroll.sY !== "" ) { /* The border elements are inside the DT scroller - so position relative to that */ var offsetScroll = $(this.s.dt.nTable.parentNode).offset(), scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(), scrollLeft = $(this.s.dt.nTable.parentNode).scrollLeft(); x1 -= offsetScroll.left - scrollLeft; x2 -= offsetScroll.left - scrollLeft; y1 -= offsetScroll.top - scrollTop; y2 -= offsetScroll.top - scrollTop; } /* Top */ oStyle = this.dom.borderTop.style; oStyle.top = y1+"px"; oStyle.left = x1+"px"; oStyle.height = this.s.border.width+"px"; oStyle.width = width+"px"; /* Bottom */ oStyle = this.dom.borderBottom.style; oStyle.top = y2+"px"; oStyle.left = x1+"px"; oStyle.height = this.s.border.width+"px"; oStyle.width = width+"px"; /* Left */ oStyle = this.dom.borderLeft.style; oStyle.top = y1+"px"; oStyle.left = x1+"px"; oStyle.height = height+"px"; oStyle.width = this.s.border.width+"px"; /* Right */ oStyle = this.dom.borderRight.style; oStyle.top = y1+"px"; oStyle.left = x2+"px"; oStyle.height = height+"px"; oStyle.width = this.s.border.width+"px"; }, /** * Mouse down event handler for starting a drag * @method _fnFillerDragStart * @param {Object} e Event object * @returns void */ "_fnFillerDragStart": function (e) { var that = this; var startingTd = this.dom.currentTarget; this.s.drag.dragging = true; that.dom.borderTop.style.display = "block"; that.dom.borderRight.style.display = "block"; that.dom.borderBottom.style.display = "block"; that.dom.borderLeft.style.display = "block"; var coords = this._fnTargetCoords( startingTd ); this.s.drag.startX = coords.x; this.s.drag.startY = coords.y; this.s.drag.startTd = startingTd; this.s.drag.endTd = startingTd; this._fnUpdateBorder( startingTd, startingTd ); $(document).bind('mousemove.AutoFill', function (e) { that._fnFillerDragMove.call( that, e ); } ); $(document).bind('mouseup.AutoFill', function (e) { that._fnFillerFinish.call( that, e ); } ); /* Scrolling information cache */ this.s.screen.y = e.pageY; this.s.screen.height = $(window).height(); this.s.screen.scrollTop = $(document).scrollTop(); if ( this.s.dt.oScroll.sY !== "" ) { this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); } /* Scrolling handler - we set an interval (which is cancelled on mouse up) which will fire * regularly and see if we need to do any scrolling */ this.s.screen.interval = setInterval( function () { var iScrollTop = $(document).scrollTop(); var iScrollDelta = iScrollTop - that.s.screen.scrollTop; that.s.screen.y += iScrollDelta; if ( that.s.screen.height - that.s.screen.y + iScrollTop < 50 ) { $('html, body').animate( { "scrollTop": iScrollTop + 50 }, 240, 'linear' ); } else if ( that.s.screen.y - iScrollTop < 50 ) { $('html, body').animate( { "scrollTop": iScrollTop - 50 }, 240, 'linear' ); } if ( that.s.dt.oScroll.sY !== "" ) { if ( that.s.screen.y > that.s.scroller.bottom - 50 ) { $(that.s.dt.nTable.parentNode).animate( { "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() + 50 }, 240, 'linear' ); } else if ( that.s.screen.y < that.s.scroller.top + 50 ) { $(that.s.dt.nTable.parentNode).animate( { "scrollTop": $(that.s.dt.nTable.parentNode).scrollTop() - 50 }, 240, 'linear' ); } } }, 250 ); }, /** * Mouse move event handler for during a move. See if we want to update the display based on the * new cursor position * @method _fnFillerDragMove * @param {Object} e Event object * @returns void */ "_fnFillerDragMove": function (e) { if ( e.target && e.target.nodeName.toUpperCase() == "TD" && e.target != this.s.drag.endTd ) { var coords = this._fnTargetCoords( e.target ); if ( this.c.mode == "y" && coords.x != this.s.drag.startX ) { e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; } if ( this.c.mode == "x" && coords.y != this.s.drag.startY ) { e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; } if ( this.c.mode == "either") { if(coords.x != this.s.drag.startX ) { e.target = $('tbody>tr:eq('+this.s.drag.startY+')>td:eq('+coords.x+')', this.dom.table)[0]; } else if ( coords.y != this.s.drag.startY ) { e.target = $('tbody>tr:eq('+coords.y+')>td:eq('+this.s.drag.startX+')', this.dom.table)[0]; } } // update coords if ( this.c.mode !== "both" ) { coords = this._fnTargetCoords( e.target ); } var drag = this.s.drag; drag.endTd = e.target; if ( coords.y >= this.s.drag.startY ) { this._fnUpdateBorder( drag.startTd, drag.endTd ); } else { this._fnUpdateBorder( drag.endTd, drag.startTd ); } this._fnFillerPosition( e.target ); } /* Update the screen information so we can perform scrolling */ this.s.screen.y = e.pageY; this.s.screen.scrollTop = $(document).scrollTop(); if ( this.s.dt.oScroll.sY !== "" ) { this.s.scroller.scrollTop = $(this.s.dt.nTable.parentNode).scrollTop(); this.s.scroller.top = $(this.s.dt.nTable.parentNode).offset().top; this.s.scroller.bottom = this.s.scroller.top + $(this.s.dt.nTable.parentNode).height(); } }, /** * Mouse release handler - end the drag and take action to update the cells with the needed values * @method _fnFillerFinish * @param {Object} e Event object * @returns void */ "_fnFillerFinish": function (e) { var that = this, i, iLen, j; $(document).unbind('mousemove.AutoFill mouseup.AutoFill'); this.dom.borderTop.style.display = "none"; this.dom.borderRight.style.display = "none"; this.dom.borderBottom.style.display = "none"; this.dom.borderLeft.style.display = "none"; this.s.drag.dragging = false; clearInterval( this.s.screen.interval ); var cells = []; var table = this.dom.table; var coordsStart = this._fnTargetCoords( this.s.drag.startTd ); var coordsEnd = this._fnTargetCoords( this.s.drag.endTd ); var columnIndex = function ( visIdx ) { return that.s.dt.oApi._fnVisibleToColumnIndex( that.s.dt, visIdx ); }; // xxx - urgh - there must be a way of reducing this... if ( coordsStart.y <= coordsEnd.y ) { for ( i=coordsStart.y ; i<=coordsEnd.y ; i++ ) { if ( coordsStart.x <= coordsEnd.x ) { for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { cells.push( { node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], x: j - coordsStart.x, y: i - coordsStart.y, colIdx: columnIndex( j ) } ); } } else { for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { cells.push( { node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], x: j - coordsStart.x, y: i - coordsStart.y, colIdx: columnIndex( j ) } ); } } } } else { for ( i=coordsStart.y ; i>=coordsEnd.y ; i-- ) { if ( coordsStart.x <= coordsEnd.x ) { for ( j=coordsStart.x ; j<=coordsEnd.x ; j++ ) { cells.push( { node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], x: j - coordsStart.x, y: i - coordsStart.y, colIdx: columnIndex( j ) } ); } } else { for ( j=coordsStart.x ; j>=coordsEnd.x ; j-- ) { cells.push( { node: $('tbody>tr:eq('+i+')>td:eq('+j+')', table)[0], x: coordsStart.x - j, y: coordsStart.y - i, colIdx: columnIndex( j ) } ); } } } } // An auto-fill requires 2 or more cells if ( cells.length <= 1 ) { return; } var edited = []; var previous; for ( i=0, iLen=cells.length ; iPK!a0datatables/extensions/AutoFill/images/filler.pngnu[PNG  IHDR 5+tEXtSoftwareAdobe ImageReadyqe<"iTXtXML:com.adobe.xmp mп.IDATxb`@g 0b#D?X JBP?@9Pp0 FFF"L,hvXigD`ȾĆ)] X41AC܁d Cӌn4\\O0"lIENDB`PK!Q44)datatables/extensions/AutoFill/Readme.txtnu[# AutoFill AutoFill gives an Excel like option to a DataTable to click and drag over multiple cells, filling in information over the selected cells and incrementing numbers as needed. Key features include: * Click and drag cell content insertion * Automatic incrementing of numeric information * Enable and disable on any column * Detailed callback functions for customisation * Support for both DataTables and browser window scrolling # Installation To use AutoFill, first download DataTables ( http://datatables.net/download ) and place the unzipped AutoFill package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. # Basic usage AutoFill is initialised using the `$.fn.dataTable.AutoFill` constructor. For example: ```js $(document).ready( function () { var table = $('#example').dataTable(); new $.fn.dataTable.AutoFill( table ); } ); ``` # Documentation / support * Documentation: http://datatables.net/extensions/autofill/ * DataTables support forums: http://datatables.net/forums # GitHub If you fancy getting involved with the development of AutoFill and help make it better, please refer to its GitHub repo: https://github.com/DataTables/AutoFill PK!y+:datatables/extensions/AutoFill/css/dataTables.autoFill.cssnu[/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * AutoFill styles */ div.AutoFill_filler { display: none; position: absolute; height: 14px; width: 14px; background: url(../images/filler.png) no-repeat center center; z-index: 1002; } div.AutoFill_border { display: none; position: absolute; background-color: #0063dc; z-index: 1001; box-shadow: 0px 0px 5px #76b4ff; -moz-box-shadow: 0px 0px 5px #76b4ff; -webkit-box-shadow: 0px 0px 5px #76b4ff; } PK!tXX>datatables/extensions/AutoFill/css/dataTables.autoFill.min.cssnu[div.AutoFill_filler{display:none;position:absolute;height:14px;width:14px;background:url(../images/filler.png) no-repeat center center;z-index:1002}div.AutoFill_border{display:none;position:absolute;background-color:#0063dc;z-index:1001;box-shadow:0px 0px 5px #76b4ff;-moz-box-shadow:0px 0px 5px #76b4ff;-webkit-box-shadow:0px 0px 5px #76b4ff} PK!] 444datatables/extensions/AutoFill/4u3geo/class.api2.phpnu[PK!,H**9datatables/extensions/Scroller/examples/state_saving.htmlnu[ Scroller example - State saving

    Scroller example State saving

    Scroller will automatically integrate with DataTables in order to save the scrolling position of the table, if state saving is enabled in the DataTable (stateSaveDT). This example shows that in practice - to demonstrate, scroll the table and then reload the page.

    ID First name Last name ZIP / Post code Country
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { $('#example').DataTable( { ajax: "data/2500.txt", deferRender: true, dom: "frtiS", scrollY: 200, scrollCollapse: true, stateSave: true } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!b4:datatables/extensions/Scroller/examples/api_scrolling.htmlnu[ Scroller example - API

    Scroller example API

    This example shows a trivial use of the API methods that Scroller adds to the DataTables API to scroll to a row once the table's data has been loaded. In this case scroller().scrollToRow() is used to jump to row 1000.

    ID First name Last name ZIP / Post code Country
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { $('#example').DataTable( { ajax: "data/2500.txt", deferRender: true, dom: "frtiS", scrollY: 200, scrollCollapse: true, initComplete: function () { var api = this.api(); api.scroller().scrollToRow( 1000 ); } } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!Z4datatables/extensions/Scroller/examples/data/ssp.phpnu[ 'id', 'dt' => 0 ), array( 'db' => 'firstname', 'dt' => 1 ), array( 'db' => 'surname', 'dt' => 2 ), array( 'db' => 'zip', 'dt' => 3 ), array( 'db' => 'country', 'dt' => 4 ) ); // SQL server connection information $sql_details = array( 'user' => '', 'pass' => '', 'db' => '', 'host' => '' ); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * If you just want to use the basic configuration for DataTables with PHP * server-side, there is no need to edit below this line. */ require( '../../../../examples/server_side/scripts/ssp.class.php' ); echo json_encode( SSP::simple( $_GET, $sql_details, $table, $primaryKey, $columns ) ); PK! ++5datatables/extensions/Scroller/examples/data/2500.txtnu[{ "aaData": [ [ "1", "Armand", "Warren", "56045", "Taiwan, Province of China" ], [ "2", "Xenos", "Salas", "71090", "Liberia" ], [ "3", "Virginia", "Whitaker", "62723", "Nicaragua" ], [ "4", "Kato", "Patrick", "97662", "Palau" ], [ "5", "Penelope", "Hensley", "76634", "Greenland" ], [ "6", "Georgia", "Erickson", "81358", "Bolivia" ], [ "7", "Shad", "Pena", "20600", "Palestinian Territory, Occupied" ], [ "8", "Tanisha", "Humphrey", "93371", "Kenya" ], [ "9", "Claire", "Espinoza", "I8S 2S8", "Panama" ], [ "10", "Raya", "Tucker", "O8D 8W7", "Botswana" ], [ "11", "Otto", "Briggs", "57590", "Anguilla" ], [ "12", "Logan", "Burt", "53041", "Venezuela" ], [ "13", "Cooper", "Pennington", "36994", "France" ], [ "14", "Kristen", "Peterson", "52917", "Sao Tome and Principe" ], [ "15", "Jordan", "Velasquez", "08884", "Switzerland" ], [ "16", "Zelda", "Freeman", "F9H 1J9", "Holy See (Vatican City State)" ], [ "17", "Mary", "Pacheco", "A7Y 6X9", "Niger" ], [ "18", "Tiger", "Robles", "44533", "Malaysia" ], [ "19", "Zelenia", "Buckner", "Q8N 6E5", "Malawi" ], [ "20", "Coby", "Johnston", "N6I 2O9", "Rwanda" ], [ "21", "Gillian", "Strickland", "12258", "Cook Islands" ], [ "22", "Alfreda", "Mcbride", "K5A 3B6", "Nigeria" ], [ "23", "Laith", "Ford", "19072", "Czech Republic" ], [ "24", "Autumn", "Barton", "U9D 9F4", "Angola" ], [ "25", "Nadine", "Britt", "G4U 8L0", "Liechtenstein" ], [ "26", "Xaviera", "Hart", "T1N 7D2", "Mali" ], [ "27", "Neil", "Page", "T3E 9F4", "Korea" ], [ "28", "Rose", "French", "B7T 8M2", "French Polynesia" ], [ "29", "Alyssa", "Poole", "S1L 2T5", "Yemen" ], [ "30", "Chantale", "Lynch", "97316", "United States" ], [ "31", "Jermaine", "Dawson", "A3H 7A1", "American Samoa" ], [ "32", "Ann", "Giles", "54258", "Korea" ], [ "33", "Jerry", "Carr", "04901", "South Georgia and The South Sandwich Islands" ], [ "34", "Lionel", "Hooper", "67970", "Bahrain" ], [ "35", "Alyssa", "Hewitt", "R3K 2V8", "Paraguay" ], [ "36", "Lisandra", "Sheppard", "71886", "Seychelles" ], [ "37", "Kylan", "Harrison", "96763", "Italy" ], [ "38", "Kaitlin", "Montgomery", "V5K 5U8", "Niger" ], [ "39", "Heidi", "Boyd", "B3C 8M9", "Papua New Guinea" ], [ "40", "Rinah", "Case", "W7M 5K1", "Mali" ], [ "41", "Thaddeus", "Maynard", "E4V 6W6", "Egypt" ], [ "42", "Lacota", "Ray", "T3J 8D8", "United Kingdom" ], [ "43", "Olympia", "Cortez", "F8C 7I5", "Palau" ], [ "44", "Wendy", "Rojas", "N8T 4K6", "Cook Islands" ], [ "45", "Arden", "Kelley", "V9N 2T6", "India" ], [ "46", "Colorado", "Lindsey", "96703", "Chad" ], [ "47", "Alika", "Weaver", "F6V 1I1", "Bulgaria" ], [ "48", "Phoebe", "Mack", "E4B 1X2", "El Salvador" ], [ "49", "Sybill", "Bridges", "Z2G 6A2", "Somalia" ], [ "50", "Trevor", "Larsen", "K1R 3B9", "United Arab Emirates" ], [ "51", "Maya", "Battle", "70881", "Australia" ], [ "52", "Charity", "Walton", "I4I 5R9", "Swaziland" ], [ "53", "Lane", "Sloan", "79076", "Nauru" ], [ "54", "Christopher", "Watson", "35116", "Suriname" ], [ "55", "Clementine", "Shelton", "98232", "Venezuela" ], [ "56", "Basil", "Hood", "J9I 1R2", "Tonga" ], [ "57", "Meghan", "Pacheco", "H5Z 6B1", "Dominican Republic" ], [ "58", "Brennan", "Potts", "51743", "Turkey" ], [ "59", "Lawrence", "Duran", "63266", "Uruguay" ], [ "60", "Ina", "Head", "S8P 9J5", "Romania" ], [ "61", "Castor", "Jacobson", "C9F 6C9", "Albania" ], [ "62", "Daquan", "Holden", "38571", "Ireland" ], [ "63", "Donna", "Valencia", "J7B 3I0", "Portugal" ], [ "64", "Kessie", "Phelps", "61063", "Georgia" ], [ "65", "Dillon", "Garcia", "13652", "Holy See (Vatican City State)" ], [ "66", "Russell", "Sweeney", "T8P 2O6", "Saint Kitts and Nevis" ], [ "67", "Zelda", "Berg", "84946", "Afghanistan" ], [ "68", "Dexter", "Mann", "73596", "Thailand" ], [ "69", "Maisie", "Miller", "X3M 6C1", "Seychelles" ], [ "70", "Lynn", "Mitchell", "N5B 3Z9", "Wallis and Futuna" ], [ "71", "Gay", "Medina", "66692", "Germany" ], [ "72", "Olga", "Clark", "M6B 7B6", "Kuwait" ], [ "73", "Brianna", "Obrien", "Z6Z 5R3", "Bahrain" ], [ "74", "Daria", "Byers", "R9T 4N7", "Ghana" ], [ "75", "Chiquita", "Barker", "28435", "Ireland" ], [ "76", "Gray", "Salazar", "58618", "Chile" ], [ "77", "Delilah", "Kirby", "42811", "Oman" ], [ "78", "Xanthus", "Holland", "B8Q 9C4", "Antigua and Barbuda" ], [ "79", "Reuben", "Brennan", "44693", "Czech Republic" ], [ "80", "Alden", "Long", "94236", "Slovakia" ], [ "81", "Blythe", "Bender", "04812", "Guam" ], [ "82", "Aileen", "Burgess", "47942", "Djibouti" ], [ "83", "Zeus", "Craig", "43002", "Nicaragua" ], [ "84", "Jade", "Garza", "F2X 8F3", "New Zealand" ], [ "85", "Noah", "Barrera", "K9C 8U0", "Malawi" ], [ "86", "Quyn", "Robertson", "H3X 6J9", "Bosnia and Herzegovina" ], [ "87", "Serena", "Cabrera", "83671", "Slovenia" ], [ "88", "Charity", "Chase", "T9Q 7C4", "Solomon Islands" ], [ "89", "Athena", "Grimes", "62801", "Aruba" ], [ "90", "Mallory", "Middleton", "D2V 1M5", "Italy" ], [ "91", "Xenos", "Jones", "46642", "Singapore" ], [ "92", "Tate", "Gregory", "66538", "Zimbabwe" ], [ "93", "Blaze", "Taylor", "70282", "Paraguay" ], [ "94", "Jena", "Duncan", "63057", "Cambodia" ], [ "95", "Thaddeus", "Chase", "66762", "Netherlands Antilles" ], [ "96", "Guinevere", "Mcgee", "O9G 4S2", "Lebanon" ], [ "97", "Kermit", "Ramsey", "41214", "Dominican Republic" ], [ "98", "Josephine", "Gallagher", "04960", "French Southern Territories" ], [ "99", "Amela", "Morales", "M9I 1X5", "Sudan" ], [ "100", "Rina", "Yates", "G3T 7M9", "Dominica" ], [ "101", "Orson", "Norris", "21660", "Sierra Leone" ], [ "102", "Graiden", "Silva", "98191", "Saint Lucia" ], [ "103", "Amaya", "Hood", "45779", "India" ], [ "104", "Fatima", "Fitzpatrick", "I4R 9Q8", "Viet Nam" ], [ "105", "Judith", "Stokes", "97596", "Sudan" ], [ "106", "Jared", "Vaughn", "75521", "Benin" ], [ "107", "Mira", "Morgan", "35169", "Martinique" ], [ "108", "Walter", "Perkins", "28618", "San Marino" ], [ "109", "Megan", "Maxwell", "K6X 3J4", "Oman" ], [ "110", "Christine", "Christensen", "M7S 8G8", "Netherlands Antilles" ], [ "111", "Tanner", "Guerra", "S3K 6Y5", "Finland" ], [ "112", "Meghan", "Rowland", "K7U 3A1", "Rwanda" ], [ "113", "Patrick", "Mitchell", "V3F 5C4", "Oman" ], [ "114", "Jackson", "Sanders", "83229", "Greenland" ], [ "115", "Omar", "Savage", "14082", "Korea" ], [ "116", "Ulla", "Larsen", "Q2P 4L8", "French Southern Territories" ], [ "117", "Hop", "Gates", "D9G 9J4", "Poland" ], [ "118", "Astra", "Mendoza", "R3D 2H9", "Saint Vincent and The Grenadines" ], [ "119", "Denise", "Cardenas", "73138", "Sao Tome and Principe" ], [ "120", "Melodie", "Roberts", "L1G 4H2", "India" ], [ "121", "Cedric", "Joseph", "M4V 8O9", "Korea, Republic of" ], [ "122", "Linda", "Horn", "24465", "Bosnia and Herzegovina" ], [ "123", "Mary", "Lyons", "22324", "Norfolk Island" ], [ "124", "Ciara", "Mcknight", "30784", "Anguilla" ], [ "125", "Vaughan", "Santiago", "65037", "Guyana" ], [ "126", "Lamar", "Shepherd", "58040", "France" ], [ "127", "Xavier", "Webster", "68321", "Afghanistan" ], [ "128", "Ainsley", "Banks", "46902", "Pakistan" ], [ "129", "Alika", "Love", "L5O 4B3", "Iran, Islamic Republic of" ], [ "130", "Maite", "Dickson", "37405", "Saint Kitts and Nevis" ], [ "131", "Kimberley", "Morrow", "F7C 7J0", "Lebanon" ], [ "132", "Eugenia", "Stafford", "36282", "Nicaragua" ], [ "133", "Mira", "Gill", "K1T 8U1", "Uruguay" ], [ "134", "Herman", "Francis", "C2G 8G9", "Northern Mariana Islands" ], [ "135", "Veronica", "Peters", "74146", "Cook Islands" ], [ "136", "Axel", "Cochran", "32240", "Central African Republic" ], [ "137", "Edan", "Howe", "51862", "Mali" ], [ "138", "Ignacia", "Bruce", "Q8T 5Q1", "Sao Tome and Principe" ], [ "139", "Jana", "Mcguire", "89412", "Czech Republic" ], [ "140", "Alice", "Underwood", "74535", "Slovakia" ], [ "141", "Tobias", "Kent", "33601", "South Georgia and The South Sandwich Islands" ], [ "142", "Nasim", "Coleman", "19377", "United States Minor Outlying Islands" ], [ "143", "Geoffrey", "Byers", "85753", "Netherlands Antilles" ], [ "144", "Odette", "Sawyer", "55418", "Tunisia" ], [ "145", "Chaney", "Flowers", "F4W 7O7", "Maldives" ], [ "146", "Shelly", "Glover", "M5Y 4A6", "Taiwan, Province of China" ], [ "147", "Uriel", "Thornton", "Z6Q 5B7", "Myanmar" ], [ "148", "Clio", "Nicholson", "Y8S 7P2", "Martinique" ], [ "149", "Jana", "Foley", "B1O 9J5", "United Arab Emirates" ], [ "150", "Fulton", "Rasmussen", "39194", "Solomon Islands" ], [ "151", "Lisandra", "Boyd", "J2Z 2V7", "French Guiana" ], [ "152", "Brennan", "Lopez", "Q4M 7Y4", "Burkina Faso" ], [ "153", "Martha", "Washington", "M7S 4U6", "Iran, Islamic Republic of" ], [ "154", "Dara", "Ramos", "07799", "Portugal" ], [ "155", "Virginia", "Harris", "01246", "Bermuda" ], [ "156", "Maryam", "Patrick", "Y3J 4Y0", "Rwanda" ], [ "157", "Shana", "Mullen", "61169", "Togo" ], [ "158", "Rowan", "Hahn", "K6D 5T4", "Guinea-bissau" ], [ "159", "Hermione", "Shepherd", "M4F 7T6", "Ireland" ], [ "160", "Jada", "Bright", "P1Z 7E6", "French Southern Territories" ], [ "161", "Scarlet", "Bray", "57161", "Austria" ], [ "162", "Haviva", "Conner", "M4T 8O4", "Bermuda" ], [ "163", "Myra", "Briggs", "Q4B 6L7", "Kenya" ], [ "164", "Hall", "Floyd", "40411", "Bangladesh" ], [ "165", "Kyle", "Marquez", "J4T 7C6", "Djibouti" ], [ "166", "Claudia", "Long", "R7B 1T6", "Macedonia" ], [ "167", "Hasad", "Clemons", "94009", "Bosnia and Herzegovina" ], [ "168", "Kameko", "Reeves", "G4V 6D5", "Singapore" ], [ "169", "Angelica", "Bailey", "Z3Y 7I0", "Micronesia" ], [ "170", "Shelley", "Jennings", "O3A 9H0", "Christmas Island" ], [ "171", "Rafael", "Randolph", "Y4L 8B5", "Germany" ], [ "172", "Winter", "Kinney", "A3K 9A7", "Saint Lucia" ], [ "173", "Brian", "Larsen", "53752", "Comoros" ], [ "174", "Melvin", "Cooper", "72416", "Czech Republic" ], [ "175", "Gil", "Valencia", "95798", "Uganda" ], [ "176", "Uma", "Cummings", "84649", "Jordan" ], [ "177", "Micah", "Shannon", "H9L 8R6", "Ghana" ], [ "178", "Ahmed", "Weiss", "05291", "American Samoa" ], [ "179", "Hop", "Foster", "W9C 7J7", "Panama" ], [ "180", "Todd", "Barnett", "T9R 7J4", "Seychelles" ], [ "181", "Byron", "Meyers", "J4G 9P2", "Congo" ], [ "182", "Hadassah", "Barnett", "U1A 8V3", "Paraguay" ], [ "183", "Hermione", "Luna", "L4G 2E5", "New Zealand" ], [ "184", "Marsden", "Alvarado", "U1V 1Y4", "Aruba" ], [ "185", "Britanni", "Gregory", "C8O 2T4", "Kazakhstan" ], [ "186", "Brenda", "Oneil", "R9Q 9B7", "Gibraltar" ], [ "187", "Reuben", "Hopkins", "C2D 9D0", "Bhutan" ], [ "188", "Sonia", "Sandoval", "Y2G 5I0", "Guatemala" ], [ "189", "Yasir", "Holcomb", "A1H 6Y3", "Angola" ], [ "190", "Aristotle", "Rosa", "51870", "Indonesia" ], [ "191", "Uriah", "Blair", "X8K 1B9", "Suriname" ], [ "192", "Vaughan", "Sharp", "L2F 5N8", "Faroe Islands" ], [ "193", "Cooper", "Beard", "80399", "United States Minor Outlying Islands" ], [ "194", "Riley", "Greene", "44728", "Russian Federation" ], [ "195", "Rashad", "Flowers", "L6N 8U7", "Mongolia" ], [ "196", "Yvonne", "Wilson", "18599", "Svalbard and Jan Mayen" ], [ "197", "Martena", "Ayers", "A8Z 5F7", "Oman" ], [ "198", "Eagan", "Cline", "T9P 4L4", "Solomon Islands" ], [ "199", "Dawn", "Carrillo", "T6O 6E5", "Malawi" ], [ "200", "Ali", "Singleton", "G6F 3B4", "Italy" ], [ "201", "Christopher", "Beach", "01655", "Palau" ], [ "202", "Emma", "Cummings", "W1B 4R6", "Dominica" ], [ "203", "Ishmael", "Gray", "76928", "Egypt" ], [ "204", "Megan", "Hines", "F7X 2X5", "New Zealand" ], [ "205", "Emmanuel", "Steele", "09729", "Netherlands" ], [ "206", "Alea", "Burris", "08485", "Guatemala" ], [ "207", "Martina", "Todd", "46863", "Christmas Island" ], [ "208", "Len", "Valentine", "S6Z 5S8", "Slovenia" ], [ "209", "Jorden", "Salazar", "U4D 8H6", "Austria" ], [ "210", "Yvette", "Bradford", "17275", "Heard Island and Mcdonald Islands" ], [ "211", "Elvis", "Mcmahon", "27586", "Marshall Islands" ], [ "212", "Gray", "Bonner", "N4V 3U9", "Moldova" ], [ "213", "Yoshi", "Singleton", "86603", "United Kingdom" ], [ "214", "Amena", "Burks", "93820", "Reunion" ], [ "215", "Ocean", "Maldonado", "72026", "Ireland" ], [ "216", "Allen", "Foley", "75363", "Kiribati" ], [ "217", "Duncan", "Jimenez", "H3H 3G6", "Oman" ], [ "218", "Ira", "Maxwell", "53136", "French Polynesia" ], [ "219", "Astra", "Moon", "D7W 8G2", "Dominican Republic" ], [ "220", "Orson", "Myers", "06049", "Mali" ], [ "221", "Brandon", "Estes", "D2B 7P2", "Kenya" ], [ "222", "Halee", "Luna", "54733", "Moldova" ], [ "223", "Jillian", "Gonzalez", "E8W 3L9", "Ecuador" ], [ "224", "Julie", "Acosta", "X7M 1T2", "Equatorial Guinea" ], [ "225", "Quemby", "Foster", "48596", "Eritrea" ], [ "226", "Erich", "Chavez", "W4P 7G8", "Mayotte" ], [ "227", "Roary", "Mcknight", "K9K 2K4", "Chile" ], [ "228", "Mufutau", "Henderson", "81377", "Mayotte" ], [ "229", "Herman", "Ferguson", "69405", "Japan" ], [ "230", "Abdul", "Franks", "L1V 8X2", "Portugal" ], [ "231", "Dominic", "Logan", "98770", "Saint Lucia" ], [ "232", "Isadora", "Solis", "Y3A 6H5", "Portugal" ], [ "233", "Lester", "Davis", "30339", "British Indian Ocean Territory" ], [ "234", "Joel", "Rojas", "N8E 5T9", "Bahrain" ], [ "235", "Quinlan", "Carroll", "55785", "Australia" ], [ "236", "Guinevere", "Pickett", "A7Y 3V3", "Netherlands Antilles" ], [ "237", "Nita", "Hopkins", "88370", "Albania" ], [ "238", "Hayley", "Buckley", "F1V 7P5", "Togo" ], [ "239", "Colorado", "Reyes", "18798", "Congo" ], [ "240", "Tashya", "Bartlett", "48537", "Sierra Leone" ], [ "241", "Isabella", "Keith", "48878", "Kiribati" ], [ "242", "Jessica", "Noble", "D6C 9T9", "Svalbard and Jan Mayen" ], [ "243", "Cairo", "Edwards", "40598", "Nepal" ], [ "244", "Camille", "Bradley", "I4U 8F6", "Fiji" ], [ "245", "Quin", "Mcgee", "O5D 2P0", "Poland" ], [ "246", "Rina", "Guzman", "44940", "Bahrain" ], [ "247", "Glenna", "Kirkland", "Z1L 4W2", "San Marino" ], [ "248", "Tarik", "Todd", "77228", "Turks and Caicos Islands" ], [ "249", "Yardley", "Burris", "M6U 9D7", "New Caledonia" ], [ "250", "Hashim", "Casey", "17722", "Lesotho" ], [ "251", "Maggie", "Raymond", "62540", "Uganda" ], [ "252", "Christian", "Mcdonald", "R8K 2M1", "United Arab Emirates" ], [ "253", "Colt", "Cobb", "75393", "Moldova" ], [ "254", "Aline", "Graves", "I1C 9I6", "Holy See (Vatican City State)" ], [ "255", "Farrah", "Cannon", "H5W 2Y0", "Bhutan" ], [ "256", "Wynne", "Ayers", "B6X 6Y8", "Western Sahara" ], [ "257", "Teegan", "Avery", "33643", "San Marino" ], [ "258", "Shana", "Sloan", "K9P 9V7", "Gabon" ], [ "259", "Britanney", "Cook", "Y5D 6K7", "Romania" ], [ "260", "Kuame", "Schroeder", "12859", "Syrian Arab Republic" ], [ "261", "Valentine", "Joseph", "P2S 6T6", "Mayotte" ], [ "262", "Joelle", "Keller", "U6F 3T7", "Fiji" ], [ "263", "Elaine", "Hickman", "28056", "Tuvalu" ], [ "264", "Ivor", "Malone", "H2Z 5X5", "Virgin Islands, British" ], [ "265", "Maris", "Jefferson", "12474", "Czech Republic" ], [ "266", "Josephine", "Zimmerman", "Z5J 2I4", "Angola" ], [ "267", "Baker", "Wooten", "X4K 2L8", "Austria" ], [ "268", "Alyssa", "Mitchell", "97712", "Antarctica" ], [ "269", "Carlos", "Pearson", "85838", "Gambia" ], [ "270", "Luke", "Richardson", "73867", "Christmas Island" ], [ "271", "Davis", "Gardner", "U2E 4D9", "Chile" ], [ "272", "Thomas", "Conner", "92487", "Mozambique" ], [ "273", "Kieran", "Baird", "X9G 6G1", "Iceland" ], [ "274", "Cheyenne", "Morris", "F5V 4S2", "Greece" ], [ "275", "Hillary", "Reeves", "89804", "Slovakia" ], [ "276", "Ryder", "Long", "32725", "New Caledonia" ], [ "277", "Ariel", "Colon", "50675", "Estonia" ], [ "278", "Vanna", "Hess", "79057", "Saudi Arabia" ], [ "279", "Hayley", "Cherry", "B5E 9X4", "United States Minor Outlying Islands" ], [ "280", "Knox", "Blair", "75626", "Central African Republic" ], [ "281", "Astra", "Mcdaniel", "24493", "Bermuda" ], [ "282", "Teegan", "Ford", "A8U 1K9", "Iran, Islamic Republic of" ], [ "283", "Harrison", "Jackson", "43519", "Marshall Islands" ], [ "284", "Melyssa", "Lawson", "O7E 8E6", "Belize" ], [ "285", "Shaine", "Francis", "Q5K 5I4", "India" ], [ "286", "August", "Reed", "S9R 1O8", "Ghana" ], [ "287", "Aphrodite", "Zimmerman", "28336", "Lesotho" ], [ "288", "Declan", "Walters", "08662", "Rwanda" ], [ "289", "Brody", "Pate", "G2G 9D9", "Serbia and Montenegro" ], [ "290", "Bradley", "Odom", "L2R 6Z9", "Jordan" ], [ "291", "Phillip", "Cleveland", "E4D 1B7", "Paraguay" ], [ "292", "Silas", "Wiggins", "F9F 5X3", "Bahrain" ], [ "293", "Keely", "Donaldson", "B5H 7F2", "Vanuatu" ], [ "294", "Hammett", "Lancaster", "H2P 4E6", "Svalbard and Jan Mayen" ], [ "295", "Kiara", "Clarke", "50885", "Thailand" ], [ "296", "Ayanna", "Wiley", "20773", "Morocco" ], [ "297", "Tashya", "Stanley", "F5J 5R9", "New Caledonia" ], [ "298", "Margaret", "Barker", "J5A 9N8", "Marshall Islands" ], [ "299", "Xandra", "English", "92299", "Korea, Republic of" ], [ "300", "Jane", "Brock", "86140", "Yemen" ], [ "301", "Lunea", "Garrett", "96730", "New Caledonia" ], [ "302", "Slade", "Everett", "16105", "Malawi" ], [ "303", "Scott", "Booker", "G8V 2R4", "Macedonia" ], [ "304", "Candice", "Decker", "E5R 2D4", "China" ], [ "305", "Armando", "Bridges", "87959", "Falkland Islands (Malvinas)" ], [ "306", "Clayton", "Whitley", "Q6O 4M7", "British Indian Ocean Territory" ], [ "307", "Driscoll", "Duncan", "M2J 9V5", "Argentina" ], [ "308", "Devin", "Stafford", "L8F 2V7", "Svalbard and Jan Mayen" ], [ "309", "Bell", "York", "E5B 7X5", "Lebanon" ], [ "310", "Haley", "Becker", "19759", "Bhutan" ], [ "311", "Chava", "Santiago", "04396", "Israel" ], [ "312", "David", "Mccall", "62087", "Norfolk Island" ], [ "313", "Clinton", "Jacobson", "06168", "Guam" ], [ "314", "Melvin", "Kaufman", "C4E 9N6", "Gambia" ], [ "315", "Dai", "Shepherd", "37490", "Saudi Arabia" ], [ "316", "Zahir", "Chase", "44340", "Turkey" ], [ "317", "Leilani", "Parrish", "62576", "Cocos (Keeling) Islands" ], [ "318", "Oleg", "Wilkins", "Z7S 8Z4", "Latvia" ], [ "319", "Pearl", "Pena", "82526", "Saudi Arabia" ], [ "320", "Kelly", "Moody", "W7U 5Y3", "Burundi" ], [ "321", "Marcia", "Kennedy", "85952", "Panama" ], [ "322", "Cailin", "Burnett", "M2Z 3L5", "Guyana" ], [ "323", "Ciara", "Small", "X6C 6M6", "Tanzania, United Republic of" ], [ "324", "Lillian", "Massey", "Z8A 5U5", "Algeria" ], [ "325", "Garrett", "Elliott", "R5P 6T0", "Canada" ], [ "326", "Inga", "Daniels", "40156", "Cocos (Keeling) Islands" ], [ "327", "Barry", "Pena", "03593", "Tonga" ], [ "328", "Penelope", "Mcintyre", "29293", "Burkina Faso" ], [ "329", "Dante", "Kirk", "74038", "Lesotho" ], [ "330", "Owen", "Cole", "17968", "Rwanda" ], [ "331", "Brittany", "Edwards", "24507", "Paraguay" ], [ "332", "Zeph", "Bentley", "12000", "Guam" ], [ "333", "Ruth", "Palmer", "E8V 9A5", "Ghana" ], [ "334", "Driscoll", "Ellis", "X1X 2N5", "Angola" ], [ "335", "Mohammad", "Guerra", "Y9N 3Y5", "Mongolia" ], [ "336", "Clio", "Baldwin", "67557", "Morocco" ], [ "337", "Virginia", "Duncan", "J8D 4T2", "Haiti" ], [ "338", "Dieter", "Sanchez", "H7E 2H4", "Romania" ], [ "339", "Quinn", "Hurst", "K4E 2X6", "Reunion" ], [ "340", "Coby", "Kelly", "S1H 8N0", "Equatorial Guinea" ], [ "341", "Raja", "Solis", "S5G 9T5", "Grenada" ], [ "342", "Jordan", "Riddle", "J7M 5X3", "Svalbard and Jan Mayen" ], [ "343", "Dora", "Knox", "25054", "Libyan Arab Jamahiriya" ], [ "344", "Brendan", "Reilly", "U9U 3F7", "Armenia" ], [ "345", "Melyssa", "Reyes", "11285", "Viet Nam" ], [ "346", "Knox", "Rivera", "N8Z 7J0", "Nepal" ], [ "347", "Quynn", "Irwin", "26524", "Chile" ], [ "348", "Colin", "Coleman", "22833", "United Arab Emirates" ], [ "349", "Sybil", "Delgado", "99947", "Belize" ], [ "350", "Macaulay", "Salinas", "48521", "Heard Island and Mcdonald Islands" ], [ "351", "Garrison", "Hogan", "68950", "India" ], [ "352", "Ronan", "Guerra", "55445", "Angola" ], [ "353", "Regina", "Andrews", "H3E 3T0", "Central African Republic" ], [ "354", "Colorado", "Joyce", "V6X 5K8", "Anguilla" ], [ "355", "Basia", "Banks", "85049", "Grenada" ], [ "356", "Adena", "Berg", "04135", "New Caledonia" ], [ "357", "Wade", "Richardson", "C8M 9J3", "Dominican Republic" ], [ "358", "Cody", "Montoya", "22018", "Solomon Islands" ], [ "359", "Faith", "Barnett", "61475", "China" ], [ "360", "Cody", "Witt", "C8I 2Q8", "Congo" ], [ "361", "Brenden", "Carlson", "74007", "Marshall Islands" ], [ "362", "Gil", "Brooks", "U4S 5N1", "Saint Vincent and The Grenadines" ], [ "363", "Kirestin", "Watts", "H8I 1D5", "Myanmar" ], [ "364", "Amelia", "Gilliam", "11461", "Chile" ], [ "365", "Noelani", "Rhodes", "83320", "Cuba" ], [ "366", "Len", "Trevino", "W9F 2U5", "Armenia" ], [ "367", "Galvin", "Middleton", "86707", "Thailand" ], [ "368", "Germaine", "Bridges", "90283", "Japan" ], [ "369", "Rose", "Hines", "W7L 7Q6", "Congo" ], [ "370", "Hop", "Mueller", "I3E 2X8", "Angola" ], [ "371", "Iliana", "Williamson", "56758", "Lebanon" ], [ "372", "Raja", "Price", "49603", "Armenia" ], [ "373", "Jeanette", "Hatfield", "E3K 5N5", "India" ], [ "374", "Brittany", "Christensen", "04750", "Uruguay" ], [ "375", "Inga", "Prince", "D4X 6J5", "Switzerland" ], [ "376", "Cherokee", "Ballard", "U1O 1M0", "Rwanda" ], [ "377", "Deirdre", "Watson", "46983", "Sri Lanka" ], [ "378", "Amanda", "Parrish", "99838", "Hong Kong" ], [ "379", "Leo", "Shannon", "L3N 3J0", "Brunei Darussalam" ], [ "380", "Kimberly", "Clemons", "88734", "South Africa" ], [ "381", "Seth", "Langley", "D6A 1Q9", "Guyana" ], [ "382", "Carol", "Blankenship", "X5N 2A7", "Angola" ], [ "383", "Dora", "Flores", "F8F 1O5", "Poland" ], [ "384", "Chava", "Dickson", "P8B 6W6", "Comoros" ], [ "385", "Trevor", "Mcdowell", "31382", "Solomon Islands" ], [ "386", "Alec", "Valentine", "P2R 4K7", "Greenland" ], [ "387", "Philip", "Jenkins", "Q7X 5U5", "Aruba" ], [ "388", "Kim", "Bowen", "69873", "Saint Kitts and Nevis" ], [ "389", "Allegra", "Oconnor", "X3Y 1X3", "Holy See (Vatican City State)" ], [ "390", "Daria", "Briggs", "A7Z 7P4", "Serbia and Montenegro" ], [ "391", "Amelia", "Wiley", "D4S 1G5", "Montserrat" ], [ "392", "Erica", "Aguirre", "H5L 2O3", "Andorra" ], [ "393", "Kibo", "Sawyer", "30638", "Guyana" ], [ "394", "Jackson", "Meyers", "P4N 9D6", "Bangladesh" ], [ "395", "Kirk", "Baxter", "F3M 7S6", "Estonia" ], [ "396", "Sybil", "Christian", "B3Q 2X0", "South Georgia and The South Sandwich Islands" ], [ "397", "Ina", "Mercer", "N4S 1K8", "Korea" ], [ "398", "Kiara", "Whitehead", "86023", "Nicaragua" ], [ "399", "Vielka", "Hays", "29845", "Malta" ], [ "400", "Stacey", "Carlson", "53218", "Cook Islands" ], [ "401", "Selma", "Lloyd", "78256", "Turkey" ], [ "402", "Rhoda", "Mcintosh", "G8X 1C8", "Guatemala" ], [ "403", "Teagan", "Ochoa", "99752", "Barbados" ], [ "404", "Rebecca", "Carver", "82661", "Saint Kitts and Nevis" ], [ "405", "Yael", "Woodward", "66095", "Niger" ], [ "406", "Calvin", "Huffman", "82172", "Somalia" ], [ "407", "Sopoline", "Walters", "K5L 3I7", "Spain" ], [ "408", "Hollee", "Powell", "05572", "Samoa" ], [ "409", "Fiona", "Frank", "74456", "Timor-leste" ], [ "410", "Alana", "Hubbard", "76011", "Lithuania" ], [ "411", "Lillian", "Garcia", "J5Z 2O5", "Sierra Leone" ], [ "412", "Tad", "Mcleod", "B6A 8Z4", "Australia" ], [ "413", "Hadassah", "Hall", "47417", "China" ], [ "414", "Regan", "Summers", "X4L 4I6", "Honduras" ], [ "415", "Herrod", "Erickson", "R8G 3V0", "Israel" ], [ "416", "Autumn", "Rojas", "31205", "Cocos (Keeling) Islands" ], [ "417", "Castor", "Mooney", "92737", "Grenada" ], [ "418", "Wesley", "Holman", "57125", "Greenland" ], [ "419", "Kitra", "Wooten", "Q6X 4Y0", "Mongolia" ], [ "420", "Buckminster", "Rice", "U8B 7B8", "Tokelau" ], [ "421", "Xavier", "Hardin", "18280", "Iran, Islamic Republic of" ], [ "422", "Sopoline", "Fleming", "78437", "Singapore" ], [ "423", "Sydney", "Salinas", "23801", "Cook Islands" ], [ "424", "Bethany", "Rosales", "89650", "United States" ], [ "425", "Deirdre", "Hensley", "F3X 1B7", "Micronesia" ], [ "426", "Bernard", "Vargas", "S4D 9T0", "Uzbekistan" ], [ "427", "Merrill", "Compton", "17713", "Suriname" ], [ "428", "Carly", "Baird", "D3H 5G3", "United States Minor Outlying Islands" ], [ "429", "Grace", "Phelps", "64695", "Nauru" ], [ "430", "Kareem", "Stone", "65572", "Netherlands" ], [ "431", "Susan", "Newton", "04627", "Anguilla" ], [ "432", "Laura", "Miranda", "E1G 2R7", "Finland" ], [ "433", "Madaline", "Pugh", "J9A 9M5", "Senegal" ], [ "434", "Sophia", "Mendez", "33789", "Timor-leste" ], [ "435", "Roary", "Greene", "61774", "Canada" ], [ "436", "Amos", "Gilliam", "94933", "Sri Lanka" ], [ "437", "Ivory", "Joyner", "15379", "San Marino" ], [ "438", "Jorden", "Robbins", "43400", "Russian Federation" ], [ "439", "Merritt", "Holcomb", "R1I 3C7", "Brazil" ], [ "440", "Iliana", "Johnston", "U9W 8N2", "Trinidad and Tobago" ], [ "441", "Ivana", "Patterson", "G5O 6A5", "Georgia" ], [ "442", "Sydney", "Mccullough", "W9M 2H5", "American Samoa" ], [ "443", "Alvin", "Fulton", "X8A 8R5", "Antigua and Barbuda" ], [ "444", "Alfreda", "Lopez", "42499", "Montserrat" ], [ "445", "Ethan", "Bird", "W9A 8M1", "British Indian Ocean Territory" ], [ "446", "Zeus", "Logan", "01682", "San Marino" ], [ "447", "Nehru", "Andrews", "W8J 3C8", "Dominican Republic" ], [ "448", "Donna", "Booth", "64754", "Nepal" ], [ "449", "Cruz", "Bruce", "17429", "Burundi" ], [ "450", "Ronan", "Saunders", "69957", "South Africa" ], [ "451", "Jordan", "Barnes", "D8K 9L8", "Dominica" ], [ "452", "Carly", "Love", "D8Z 3P4", "Mauritania" ], [ "453", "Mari", "George", "60260", "Japan" ], [ "454", "Karly", "Hodges", "15790", "South Georgia and The South Sandwich Islands" ], [ "455", "Rana", "Logan", "M1R 6Y6", "Bosnia and Herzegovina" ], [ "456", "Theodore", "Sims", "C7A 8T2", "Barbados" ], [ "457", "Quin", "Thompson", "26884", "Bouvet Island" ], [ "458", "Kimberley", "Sloan", "S5T 8E3", "Costa Rica" ], [ "459", "Upton", "Valenzuela", "Z6J 6Q1", "Macao" ], [ "460", "Clinton", "Williams", "Z3O 7C4", "Germany" ], [ "461", "Samson", "Mathis", "G1T 1V9", "Senegal" ], [ "462", "Michelle", "Frost", "87113", "Serbia and Montenegro" ], [ "463", "Tyrone", "Coffey", "80705", "Albania" ], [ "464", "Alea", "Delaney", "E4S 4K4", "Guyana" ], [ "465", "Dominique", "Schwartz", "81368", "Falkland Islands (Malvinas)" ], [ "466", "Benedict", "Norton", "D1C 9C8", "Cyprus" ], [ "467", "Vaughan", "Stein", "R7K 1L8", "Egypt" ], [ "468", "Charles", "Foley", "20434", "Anguilla" ], [ "469", "Arden", "Ramos", "54065", "Gibraltar" ], [ "470", "Dillon", "Patel", "L6H 1H6", "Liberia" ], [ "471", "Gretchen", "Davenport", "57188", "Equatorial Guinea" ], [ "472", "Ivy", "Randall", "52617", "Costa Rica" ], [ "473", "Brett", "Baird", "45791", "Hungary" ], [ "474", "Wyoming", "Sparks", "11266", "Luxembourg" ], [ "475", "Rashad", "Roy", "47012", "Guam" ], [ "476", "Sopoline", "Le", "M1G 2P8", "United Arab Emirates" ], [ "477", "Ursa", "Haynes", "53774", "British Indian Ocean Territory" ], [ "478", "Maia", "Vincent", "26773", "New Caledonia" ], [ "479", "Salvador", "Pace", "S9E 2C4", "Egypt" ], [ "480", "Bethany", "Wilcox", "F2H 7N0", "Uzbekistan" ], [ "481", "Sara", "Brooks", "08176", "Holy See (Vatican City State)" ], [ "482", "Lillith", "Sampson", "75576", "British Indian Ocean Territory" ], [ "483", "Brynne", "Browning", "N4K 7P6", "Peru" ], [ "484", "Beck", "Tran", "06815", "Cambodia" ], [ "485", "Peter", "Hurley", "05770", "Rwanda" ], [ "486", "Buffy", "Sharpe", "H8F 8G6", "Georgia" ], [ "487", "Harrison", "Cross", "Y1A 1R8", "United Kingdom" ], [ "488", "Ursa", "Wolf", "J8C 9Q8", "French Polynesia" ], [ "489", "Nayda", "Vasquez", "05523", "Taiwan, Province of China" ], [ "490", "Gretchen", "Walters", "28628", "Seychelles" ], [ "491", "Adrian", "Hickman", "17956", "El Salvador" ], [ "492", "Laura", "Moon", "32103", "Myanmar" ], [ "493", "Kellie", "Barnett", "L5Z 2U8", "Saint Helena" ], [ "494", "Illana", "Stanton", "Z5D 2G0", "Australia" ], [ "495", "Jescie", "Santiago", "D9L 4B5", "Cambodia" ], [ "496", "Laura", "Hopkins", "X6V 9S5", "Netherlands Antilles" ], [ "497", "Vielka", "Harding", "U6A 9T2", "Cambodia" ], [ "498", "Walter", "Gentry", "L3X 9Q9", "Slovenia" ], [ "499", "Sara", "Atkinson", "67146", "Guinea" ], [ "500", "Yolanda", "Chambers", "Q8D 3W0", "Zimbabwe" ], [ "501", "Josiah", "Villarreal", "I1V 6Y7", "Burkina Faso" ], [ "502", "Hayfa", "Bowman", "77148", "Saudi Arabia" ], [ "503", "Colette", "Conley", "41232", "Estonia" ], [ "504", "Lana", "Doyle", "32962", "Cuba" ], [ "505", "Keegan", "Goodwin", "M2P 1X3", "Cocos (Keeling) Islands" ], [ "506", "Nina", "Cross", "49580", "Germany" ], [ "507", "Xenos", "Cervantes", "K6X 7W8", "Mauritius" ], [ "508", "Jared", "Hester", "30156", "Uzbekistan" ], [ "509", "Damon", "Curry", "U2J 2D8", "Pitcairn" ], [ "510", "Amery", "Savage", "O1S 2Z4", "Turkmenistan" ], [ "511", "Brian", "Wilkinson", "J6O 4T0", "Luxembourg" ], [ "512", "Ivory", "Mckinney", "L3E 8M2", "Lithuania" ], [ "513", "Eric", "Dalton", "Y1L 6F4", "Ethiopia" ], [ "514", "Brandon", "Callahan", "K6Q 9B4", "Haiti" ], [ "515", "Phillip", "Mclean", "18836", "Ethiopia" ], [ "516", "Carly", "Greer", "16811", "Mayotte" ], [ "517", "Stone", "Ware", "58795", "Moldova" ], [ "518", "Xena", "Hayden", "97158", "Chad" ], [ "519", "Catherine", "Leonard", "77868", "Azerbaijan" ], [ "520", "Bernard", "Horton", "04270", "Yemen" ], [ "521", "Olga", "Richmond", "89169", "Lebanon" ], [ "522", "Iris", "Cummings", "78836", "Falkland Islands (Malvinas)" ], [ "523", "Beau", "Mccall", "78638", "Monaco" ], [ "524", "Michael", "Humphrey", "Q1A 2W9", "Tokelau" ], [ "525", "Oren", "Stevens", "F4V 9G7", "Heard Island and Mcdonald Islands" ], [ "526", "Ima", "Shelton", "19295", "Mozambique" ], [ "527", "Merritt", "Morrison", "K6W 5R0", "Georgia" ], [ "528", "Vera", "Cherry", "54993", "Angola" ], [ "529", "Grant", "Turner", "B4V 2J0", "Saint Helena" ], [ "530", "Odette", "Snyder", "N9L 2V8", "Chad" ], [ "531", "Uma", "Stewart", "E9A 6X9", "Bhutan" ], [ "532", "Kylee", "Best", "11393", "Malaysia" ], [ "533", "Nicholas", "Mercado", "85179", "Switzerland" ], [ "534", "Nathaniel", "Stuart", "M1Q 6Z6", "Mongolia" ], [ "535", "Ruth", "Conrad", "T7G 9V6", "Guadeloupe" ], [ "536", "Deanna", "Dudley", "79721", "Kiribati" ], [ "537", "David", "Thornton", "C6R 2G3", "Netherlands Antilles" ], [ "538", "Jane", "Ashley", "48711", "Rwanda" ], [ "539", "Nero", "Curry", "20590", "Denmark" ], [ "540", "Kellie", "Poole", "46053", "Martinique" ], [ "541", "Freya", "Burch", "W5R 8Y5", "Northern Mariana Islands" ], [ "542", "Maxwell", "Mcbride", "D4W 4M3", "Paraguay" ], [ "543", "Dawn", "Sargent", "85956", "Gibraltar" ], [ "544", "Lilah", "Matthews", "J4D 8A9", "Montserrat" ], [ "545", "Salvador", "Burns", "28067", "Bhutan" ], [ "546", "Ezekiel", "Ayala", "67153", "Wallis and Futuna" ], [ "547", "Evan", "Barker", "83026", "Puerto Rico" ], [ "548", "Jemima", "Case", "U3S 7N6", "Georgia" ], [ "549", "Belle", "Mcconnell", "H4S 9F8", "Angola" ], [ "550", "Doris", "Mays", "57387", "Tonga" ], [ "551", "Carson", "Buchanan", "20457", "Guatemala" ], [ "552", "Calista", "Lamb", "26851", "Gibraltar" ], [ "553", "Remedios", "Haley", "A9K 5M1", "Tokelau" ], [ "554", "Odette", "Mccarty", "Y8B 3V4", "Marshall Islands" ], [ "555", "Libby", "Pugh", "93261", "Netherlands" ], [ "556", "Bo", "Maldonado", "C1H 1K7", "Oman" ], [ "557", "Cameron", "Beasley", "41821", "Northern Mariana Islands" ], [ "558", "Chadwick", "Crosby", "62855", "New Caledonia" ], [ "559", "Steven", "Barrett", "92102", "Pakistan" ], [ "560", "Jonas", "Valdez", "N3V 4R9", "Bulgaria" ], [ "561", "Harlan", "Larsen", "Z8F 6A0", "Cayman Islands" ], [ "562", "Iola", "Joyner", "D1J 4C3", "Italy" ], [ "563", "Abra", "Medina", "Q9O 5J2", "Cambodia" ], [ "564", "Solomon", "Davidson", "91317", "Turkmenistan" ], [ "565", "Alisa", "Kim", "33036", "Austria" ], [ "566", "Deacon", "Silva", "Z5L 6M0", "Djibouti" ], [ "567", "Bree", "Landry", "43135", "Czech Republic" ], [ "568", "Molly", "Leach", "71714", "Botswana" ], [ "569", "Idona", "Cain", "A2J 1R8", "South Georgia and The South Sandwich Islands" ], [ "570", "Aileen", "Salinas", "90344", "Uzbekistan" ], [ "571", "Dominique", "Cooper", "31803", "Sao Tome and Principe" ], [ "572", "Lunea", "Pollard", "S9R 7B0", "Sweden" ], [ "573", "Leo", "Combs", "W7E 8T4", "Ukraine" ], [ "574", "Illiana", "Donovan", "D8K 3R4", "Palau" ], [ "575", "Orlando", "Vaughan", "Q4I 3E3", "Bosnia and Herzegovina" ], [ "576", "Yuri", "Blake", "I9W 5U5", "Seychelles" ], [ "577", "Amanda", "Baldwin", "19752", "Turkmenistan" ], [ "578", "Hanna", "Emerson", "73316", "Antigua and Barbuda" ], [ "579", "Xyla", "Atkins", "11151", "Uganda" ], [ "580", "Nathaniel", "Patterson", "00391", "Portugal" ], [ "581", "Naida", "Cote", "17484", "Mauritius" ], [ "582", "Scarlett", "Little", "V8N 8A6", "Sao Tome and Principe" ], [ "583", "Odessa", "Kerr", "56456", "Sweden" ], [ "584", "Kamal", "Richardson", "F6S 4I1", "Algeria" ], [ "585", "Griffith", "Morton", "I5H 2Z0", "Vanuatu" ], [ "586", "Orli", "Santana", "48213", "Burundi" ], [ "587", "Courtney", "Cook", "R3O 3A9", "Cape Verde" ], [ "588", "Jolene", "Wallace", "F6Q 7W8", "Zambia" ], [ "589", "Bert", "Sharp", "X7T 7Z8", "Paraguay" ], [ "590", "Ila", "Carver", "E4M 7P4", "Paraguay" ], [ "591", "Merrill", "Wall", "49416", "Fiji" ], [ "592", "Hanae", "Espinoza", "Y6D 6K8", "Turkey" ], [ "593", "Stephanie", "Bond", "Z1Q 3P3", "Algeria" ], [ "594", "Lionel", "Leonard", "U8O 7G6", "Nauru" ], [ "595", "Faith", "Ramirez", "75181", "Slovakia" ], [ "596", "Fritz", "Glass", "62878", "El Salvador" ], [ "597", "Raya", "Gardner", "L3E 2C7", "India" ], [ "598", "Brynne", "Price", "W1S 6O9", "Lithuania" ], [ "599", "Karen", "Gray", "O4X 8F6", "Albania" ], [ "600", "Perry", "Goodwin", "44266", "Libyan Arab Jamahiriya" ], [ "601", "Dylan", "Glover", "76573", "Estonia" ], [ "602", "Melinda", "Holloway", "07861", "Grenada" ], [ "603", "Rahim", "Robinson", "D7M 1E8", "Madagascar" ], [ "604", "Ori", "Oconnor", "10386", "Antarctica" ], [ "605", "Candace", "Preston", "03610", "Denmark" ], [ "606", "Wing", "Howe", "E6U 3H2", "Burundi" ], [ "607", "Lucy", "Eaton", "26436", "Guinea" ], [ "608", "Ignatius", "Blevins", "93597", "Serbia and Montenegro" ], [ "609", "Nadine", "Franco", "80096", "Tonga" ], [ "610", "Shoshana", "Walters", "S4F 5O8", "Micronesia" ], [ "611", "Remedios", "Buckner", "29213", "Antigua and Barbuda" ], [ "612", "Adam", "Horne", "F8V 1V8", "Oman" ], [ "613", "Kieran", "Saunders", "I7A 7Y5", "Japan" ], [ "614", "Isabelle", "Fletcher", "K2K 3K5", "Norway" ], [ "615", "Ryder", "Ballard", "38518", "Tanzania, United Republic of" ], [ "616", "Nina", "Guerrero", "61142", "Saint Kitts and Nevis" ], [ "617", "Sheila", "Poole", "E2H 6I6", "Denmark" ], [ "618", "Melyssa", "Mcdaniel", "08247", "Netherlands Antilles" ], [ "619", "Leila", "Vang", "Q5Z 3S1", "United States Minor Outlying Islands" ], [ "620", "Grady", "Aguilar", "R1I 8I8", "Slovenia" ], [ "621", "Plato", "Terrell", "23916", "Kuwait" ], [ "622", "Rama", "Perkins", "56506", "Russian Federation" ], [ "623", "Boris", "Chaney", "66737", "Antigua and Barbuda" ], [ "624", "Edward", "Clarke", "30722", "Iraq" ], [ "625", "Skyler", "Wise", "53248", "Taiwan, Province of China" ], [ "626", "Uta", "Cox", "85242", "Malawi" ], [ "627", "Lesley", "Watkins", "26710", "Estonia" ], [ "628", "Gray", "Harrison", "C5L 9Y7", "Nepal" ], [ "629", "Joan", "Flores", "J5Q 2B9", "Tajikistan" ], [ "630", "Reece", "Lott", "85152", "Algeria" ], [ "631", "Jerome", "Faulkner", "V1K 3N2", "Kiribati" ], [ "632", "Jackson", "Hudson", "85932", "Botswana" ], [ "633", "Uma", "Booker", "79755", "Senegal" ], [ "634", "Katelyn", "Gillespie", "Q8P 4V9", "Eritrea" ], [ "635", "Clio", "Tillman", "67552", "Liberia" ], [ "636", "Anjolie", "Nixon", "36615", "Botswana" ], [ "637", "Nell", "Lee", "T9S 4R3", "French Southern Territories" ], [ "638", "Anthony", "Aguirre", "85443", "Morocco" ], [ "639", "Aaron", "Green", "90326", "Faroe Islands" ], [ "640", "Galvin", "Yang", "A4X 8H6", "Ukraine" ], [ "641", "Yoshi", "Strickland", "52538", "Brazil" ], [ "642", "Brenden", "Kirkland", "X7P 8V9", "Turks and Caicos Islands" ], [ "643", "Bree", "Stone", "U4L 2H2", "Hong Kong" ], [ "644", "Quin", "Tanner", "U4A 1X4", "Faroe Islands" ], [ "645", "Camilla", "Heath", "91749", "Andorra" ], [ "646", "Xaviera", "Bullock", "I4U 7W0", "Libyan Arab Jamahiriya" ], [ "647", "Kay", "Rowe", "59689", "Iceland" ], [ "648", "Lance", "Bond", "66558", "Spain" ], [ "649", "Fredericka", "Langley", "48782", "Cayman Islands" ], [ "650", "Charles", "Avila", "42037", "Papua New Guinea" ], [ "651", "Ramona", "Rios", "T5M 3E1", "Argentina" ], [ "652", "Ezekiel", "Young", "W8X 4S7", "French Polynesia" ], [ "653", "Celeste", "Dodson", "19140", "Benin" ], [ "654", "Frances", "Mcintosh", "91246", "Swaziland" ], [ "655", "Deanna", "Hyde", "J8P 3T5", "Croatia" ], [ "656", "Dahlia", "Blair", "45364", "Kazakhstan" ], [ "657", "Jade", "Hayes", "I5Q 3S9", "Malawi" ], [ "658", "Robin", "Bullock", "G9Q 2P8", "Ireland" ], [ "659", "Nasim", "Bond", "I2V 8N4", "Macedonia" ], [ "660", "Axel", "Pickett", "18370", "Saint Vincent and The Grenadines" ], [ "661", "Pearl", "Lee", "G1R 3R8", "Poland" ], [ "662", "Garth", "Meyers", "90308", "Georgia" ], [ "663", "Ivory", "Rios", "S8F 8R5", "Mexico" ], [ "664", "Jerome", "Lambert", "N1Q 6R8", "Saint Lucia" ], [ "665", "Meredith", "Clark", "27720", "Cocos (Keeling) Islands" ], [ "666", "Armando", "Holcomb", "M6D 4X0", "Oman" ], [ "667", "Rowan", "Page", "00307", "Nauru" ], [ "668", "Kyla", "Brown", "F4W 4C5", "Holy See (Vatican City State)" ], [ "669", "Leigh", "Sosa", "28499", "Uruguay" ], [ "670", "Shafira", "Forbes", "26526", "Honduras" ], [ "671", "Maxine", "Mueller", "90923", "Kazakhstan" ], [ "672", "Joy", "Sargent", "K6T 3W5", "Malawi" ], [ "673", "Lamar", "Roberts", "R5F 9C8", "Poland" ], [ "674", "Madonna", "Love", "15514", "Cyprus" ], [ "675", "Uriel", "Ware", "Z6V 5J1", "Singapore" ], [ "676", "Bevis", "Erickson", "M3X 9M8", "Brunei Darussalam" ], [ "677", "Grant", "Velasquez", "96942", "Antarctica" ], [ "678", "Lars", "Bullock", "14772", "Guyana" ], [ "679", "Maryam", "Jones", "01854", "Togo" ], [ "680", "Blythe", "Goodwin", "51731", "New Caledonia" ], [ "681", "Kane", "Wiggins", "55727", "Kiribati" ], [ "682", "Brian", "Rosales", "25896", "Cape Verde" ], [ "683", "Blaze", "Leach", "P6J 3E5", "Northern Mariana Islands" ], [ "684", "Cameron", "Neal", "82248", "Marshall Islands" ], [ "685", "Lydia", "Cunningham", "Q1V 8P7", "San Marino" ], [ "686", "Troy", "Cook", "32106", "British Indian Ocean Territory" ], [ "687", "Alexander", "Valenzuela", "S8Z 6B2", "Guadeloupe" ], [ "688", "Garth", "Beck", "46344", "Cook Islands" ], [ "689", "Hillary", "Nunez", "29462", "Sri Lanka" ], [ "690", "Hunter", "Sawyer", "W9M 6T4", "Saint Lucia" ], [ "691", "Jaquelyn", "Everett", "T1X 2U2", "Guinea-bissau" ], [ "692", "Indira", "Ortega", "43047", "Italy" ], [ "693", "Josiah", "Hinton", "N5F 5Y8", "Andorra" ], [ "694", "Bruno", "Gay", "E3U 3D9", "Palau" ], [ "695", "Melissa", "Blackburn", "S4V 1K2", "Virgin Islands, U.S." ], [ "696", "Zeus", "Dawson", "K5S 6Z6", "Belgium" ], [ "697", "Castor", "Mcmahon", "H3R 1O8", "Cambodia" ], [ "698", "Elizabeth", "Beasley", "98178", "Northern Mariana Islands" ], [ "699", "Jescie", "Lee", "08056", "Eritrea" ], [ "700", "Dennis", "Chapman", "T4O 1Q2", "Bangladesh" ], [ "701", "Basia", "Wallace", "U3Y 7C1", "Pitcairn" ], [ "702", "Dante", "Brewer", "53544", "Bosnia and Herzegovina" ], [ "703", "Adrienne", "Glenn", "32378", "Austria" ], [ "704", "Kellie", "Acevedo", "51723", "Italy" ], [ "705", "Scarlet", "Mclaughlin", "43509", "Kiribati" ], [ "706", "Lillith", "Mullins", "S6L 4Y6", "Kyrgyzstan" ], [ "707", "Maxine", "Atkins", "Z5T 5R5", "Denmark" ], [ "708", "Nicholas", "Rose", "40286", "Macedonia" ], [ "709", "Zenia", "Pugh", "28682", "Venezuela" ], [ "710", "Keely", "Turner", "34939", "New Zealand" ], [ "711", "Maisie", "Walton", "S6M 5C5", "Cameroon" ], [ "712", "Michelle", "Salinas", "T7A 9N6", "Nicaragua" ], [ "713", "Reece", "Clements", "73923", "Austria" ], [ "714", "Eliana", "Fox", "V3Y 5T4", "Denmark" ], [ "715", "Kennedy", "Mullins", "43213", "Virgin Islands, British" ], [ "716", "Alea", "Glover", "M6P 3Z5", "Turkmenistan" ], [ "717", "Scarlett", "Hunt", "41461", "Montserrat" ], [ "718", "Rooney", "Kane", "T8A 3E2", "Madagascar" ], [ "719", "Cairo", "Ray", "L6M 1E7", "Canada" ], [ "720", "Wendy", "Burks", "R8V 8F5", "Virgin Islands, U.S." ], [ "721", "Christine", "Suarez", "67369", "Georgia" ], [ "722", "Graiden", "Le", "K4M 9V5", "New Caledonia" ], [ "723", "Zane", "Nunez", "60548", "Haiti" ], [ "724", "Ali", "Bell", "U4Y 4C3", "Togo" ], [ "725", "Marsden", "Leon", "39374", "Venezuela" ], [ "726", "Holmes", "Kidd", "B6K 7Q9", "Iraq" ], [ "727", "Cameron", "Gardner", "88627", "Brazil" ], [ "728", "Ava", "George", "K1Z 7Y2", "Monaco" ], [ "729", "Chantale", "Holland", "H1B 9L8", "Afghanistan" ], [ "730", "Alika", "Middleton", "W8X 7O1", "Korea" ], [ "731", "Cameran", "Zimmerman", "78576", "Benin" ], [ "732", "Barrett", "Blair", "51161", "Virgin Islands, U.S." ], [ "733", "Brielle", "Ballard", "59538", "Iceland" ], [ "734", "Teagan", "Morales", "40107", "Kenya" ], [ "735", "Lunea", "Cantu", "14690", "Oman" ], [ "736", "Robin", "Gilmore", "17972", "Nauru" ], [ "737", "Hall", "Mccarty", "86141", "China" ], [ "738", "Olga", "Rasmussen", "58309", "Virgin Islands, British" ], [ "739", "Mark", "Griffin", "51542", "Argentina" ], [ "740", "Medge", "Carrillo", "23192", "Pitcairn" ], [ "741", "Susan", "Mosley", "32128", "Turkmenistan" ], [ "742", "Zelda", "Valdez", "46831", "New Caledonia" ], [ "743", "Ruth", "Donaldson", "F9I 7G7", "Ukraine" ], [ "744", "Kirby", "Workman", "36679", "Rwanda" ], [ "745", "Alexa", "King", "66513", "Liberia" ], [ "746", "Ronan", "Gross", "K2S 6D0", "Saint Lucia" ], [ "747", "Kylee", "Dillon", "P7Y 1I5", "Faroe Islands" ], [ "748", "Brenda", "Weaver", "99365", "Uzbekistan" ], [ "749", "Aristotle", "Orr", "43451", "Canada" ], [ "750", "Jaquelyn", "Tyler", "B9Q 7P5", "Brunei Darussalam" ], [ "751", "Madeline", "Stewart", "D4D 2J4", "Zimbabwe" ], [ "752", "Lacota", "Glass", "89124", "Israel" ], [ "753", "Adrian", "Ashley", "N8M 4L1", "Sri Lanka" ], [ "754", "Ignatius", "Waller", "12053", "Thailand" ], [ "755", "Raven", "Stevens", "88768", "Estonia" ], [ "756", "Carly", "Camacho", "27075", "Vanuatu" ], [ "757", "Lee", "Calderon", "19501", "Pitcairn" ], [ "758", "Amos", "Briggs", "I6A 3L8", "Saint Kitts and Nevis" ], [ "759", "Cheryl", "Valencia", "90517", "Denmark" ], [ "760", "Kenyon", "Franco", "B2S 2E2", "Western Sahara" ], [ "761", "Damian", "Acosta", "A2S 6D0", "Bahamas" ], [ "762", "Brenda", "Zamora", "T9E 7L3", "Finland" ], [ "763", "Connor", "Atkinson", "03975", "Sierra Leone" ], [ "764", "Kaseem", "Waters", "A2K 2X0", "China" ], [ "765", "Zephania", "Whitfield", "A4Z 9P7", "Eritrea" ], [ "766", "Emmanuel", "Ballard", "G1M 6Y2", "Finland" ], [ "767", "Amos", "Walters", "43184", "Oman" ], [ "768", "Urielle", "Browning", "19959", "Panama" ], [ "769", "TaShya", "Summers", "B9V 3Y3", "Micronesia" ], [ "770", "Jermaine", "Mcgee", "X8A 4E1", "Cape Verde" ], [ "771", "Chaney", "Berry", "G2H 2C8", "Uganda" ], [ "772", "Jaime", "May", "49723", "Eritrea" ], [ "773", "Olga", "Cohen", "13403", "Macao" ], [ "774", "Jacob", "Vaughn", "U7G 1V5", "Greece" ], [ "775", "Kelly", "Mcdonald", "Z3B 5G7", "Kiribati" ], [ "776", "Emi", "Gilbert", "W1L 2M4", "Nicaragua" ], [ "777", "Francis", "Nunez", "K4U 6M5", "Lithuania" ], [ "778", "Noel", "Nelson", "Z5T 1Y0", "Nauru" ], [ "779", "Ora", "Ellison", "Y5I 4R8", "Burundi" ], [ "780", "Kirby", "Glass", "J5X 2E3", "Argentina" ], [ "781", "Hayley", "Tate", "V1T 6B6", "Greece" ], [ "782", "Mohammad", "Leblanc", "E3S 5R3", "Oman" ], [ "783", "Lionel", "Todd", "A1Z 9E1", "Macedonia" ], [ "784", "Courtney", "Mckay", "D4I 8Z3", "Fiji" ], [ "785", "Reagan", "West", "84159", "Equatorial Guinea" ], [ "786", "Noel", "Strickland", "Q7K 6S3", "Mozambique" ], [ "787", "Lara", "Porter", "49872", "Nigeria" ], [ "788", "Kyra", "Haley", "I9E 2K3", "Dominican Republic" ], [ "789", "Wynter", "Beasley", "66330", "Heard Island and Mcdonald Islands" ], [ "790", "Vladimir", "Briggs", "99538", "Burkina Faso" ], [ "791", "Rafael", "Campbell", "V8L 2S6", "Algeria" ], [ "792", "Buffy", "Wilder", "N3U 2X0", "Bahrain" ], [ "793", "Nyssa", "Dawson", "38434", "Spain" ], [ "794", "Sylvia", "Swanson", "39714", "Azerbaijan" ], [ "795", "Jolie", "Diaz", "A1J 5I1", "Cuba" ], [ "796", "Rosalyn", "Mcdaniel", "F3T 6E2", "Benin" ], [ "797", "Nelle", "Prince", "K1M 4U6", "Maldives" ], [ "798", "Luke", "Knight", "05930", "Seychelles" ], [ "799", "Macaulay", "Conway", "79707", "American Samoa" ], [ "800", "Freya", "Webb", "U2H 2D7", "Ireland" ], [ "801", "Clinton", "Meyers", "S9I 7N2", "Malta" ], [ "802", "Rudyard", "Chandler", "40347", "Bahrain" ], [ "803", "Courtney", "Hoover", "12325", "French Polynesia" ], [ "804", "Melissa", "Davenport", "K7P 1S8", "Canada" ], [ "805", "Noelle", "Nieves", "87427", "Martinique" ], [ "806", "Myles", "Hart", "V6T 1W0", "Niue" ], [ "807", "Jasper", "Campos", "78143", "Faroe Islands" ], [ "808", "Ariana", "Valentine", "J4X 2D4", "Ecuador" ], [ "809", "Vanna", "Fletcher", "M4Z 1F9", "Faroe Islands" ], [ "810", "Elijah", "Harper", "Y1B 7E4", "New Zealand" ], [ "811", "Leilani", "Nunez", "K9W 4F0", "United Arab Emirates" ], [ "812", "Maia", "Huber", "V4L 8M6", "United Kingdom" ], [ "813", "Richard", "Riddle", "U8C 8Q2", "Niue" ], [ "814", "Harper", "Blanchard", "10904", "Cameroon" ], [ "815", "Aurelia", "Trujillo", "01646", "Dominican Republic" ], [ "816", "Anthony", "Owen", "J2I 2B4", "Palestinian Territory, Occupied" ], [ "817", "Kelsie", "Roy", "M3J 6K3", "Maldives" ], [ "818", "James", "Pearson", "94810", "Mexico" ], [ "819", "Igor", "Marshall", "Y8M 2D6", "Palau" ], [ "820", "Aquila", "Willis", "20354", "Samoa" ], [ "821", "Randall", "Sheppard", "73577", "Sierra Leone" ], [ "822", "Gray", "Myers", "53651", "Gibraltar" ], [ "823", "Dana", "Camacho", "89571", "Reunion" ], [ "824", "Berk", "Hopper", "17794", "Cook Islands" ], [ "825", "Shannon", "Barry", "70536", "Bouvet Island" ], [ "826", "Dahlia", "Herman", "F8L 1Q3", "Lesotho" ], [ "827", "Gillian", "Hayes", "O2C 7X8", "Tajikistan" ], [ "828", "Leo", "Bolton", "P6V 6E1", "Dominica" ], [ "829", "Vivien", "Best", "E5E 6N8", "Cuba" ], [ "830", "Clayton", "Bradley", "E7R 3M5", "Zimbabwe" ], [ "831", "Lesley", "Collins", "16592", "Mali" ], [ "832", "Holly", "Hensley", "49080", "Tunisia" ], [ "833", "Larissa", "Velazquez", "41068", "Haiti" ], [ "834", "Delilah", "Mejia", "A5I 9Q9", "Croatia" ], [ "835", "Drew", "Roberson", "U7E 3R1", "Somalia" ], [ "836", "Jenette", "Patel", "64084", "Denmark" ], [ "837", "Gillian", "Cleveland", "05659", "Syrian Arab Republic" ], [ "838", "Noelle", "Lara", "U1N 6V6", "Sri Lanka" ], [ "839", "Celeste", "Rollins", "26590", "Mayotte" ], [ "840", "Elvis", "Fletcher", "M8V 6J4", "Bahamas" ], [ "841", "Caesar", "Hays", "E3D 3T7", "Malta" ], [ "842", "Rama", "Weber", "25880", "Malta" ], [ "843", "Lael", "Page", "57135", "Anguilla" ], [ "844", "Omar", "Hammond", "90213", "Belarus" ], [ "845", "Simone", "Mcintosh", "L5P 1S0", "Bhutan" ], [ "846", "Gay", "Harper", "56404", "Virgin Islands, U.S." ], [ "847", "Joel", "Holman", "C1F 1C4", "Saint Lucia" ], [ "848", "Clayton", "Pennington", "57003", "Kazakhstan" ], [ "849", "Susan", "Mckee", "I5U 8F2", "Taiwan, Province of China" ], [ "850", "Jenna", "Stein", "P2K 6L4", "Reunion" ], [ "851", "Madonna", "Joyner", "Q4Q 4K6", "Guadeloupe" ], [ "852", "Deirdre", "Ingram", "N7U 3N9", "Monaco" ], [ "853", "Juliet", "Hodges", "U2Q 2T0", "Uzbekistan" ], [ "854", "Naomi", "Rice", "O6T 2Z1", "Nicaragua" ], [ "855", "Leila", "Alvarado", "Z2V 7L3", "Suriname" ], [ "856", "George", "Leon", "L6M 1V2", "Norway" ], [ "857", "Rama", "Cruz", "Y2S 7K6", "Kenya" ], [ "858", "Clarke", "Mckinney", "34622", "Viet Nam" ], [ "859", "Savannah", "Bailey", "L3O 1U6", "Solomon Islands" ], [ "860", "Maxwell", "Gibson", "R9K 9Q1", "Virgin Islands, British" ], [ "861", "Devin", "Humphrey", "74821", "Costa Rica" ], [ "862", "Kadeem", "Larsen", "43178", "Luxembourg" ], [ "863", "Elvis", "Todd", "O3O 3G9", "Azerbaijan" ], [ "864", "Levi", "Montoya", "G1Y 1N8", "Venezuela" ], [ "865", "Risa", "Barnes", "86118", "Benin" ], [ "866", "Dillon", "Riggs", "O3Y 8V2", "Greenland" ], [ "867", "Stewart", "Marshall", "V8G 8S2", "Mexico" ], [ "868", "Camden", "Goff", "N3W 2L0", "Bahrain" ], [ "869", "Sheila", "Meadows", "T6K 7M2", "Yemen" ], [ "870", "Hop", "Berger", "Q8B 9R7", "Germany" ], [ "871", "Charissa", "Wilkerson", "08090", "Burundi" ], [ "872", "Raphael", "Carey", "03667", "United Kingdom" ], [ "873", "Micah", "Hood", "T9N 4T5", "Georgia" ], [ "874", "Cathleen", "Mccall", "N6H 6N3", "Tanzania, United Republic of" ], [ "875", "Lisandra", "Poole", "S7O 1J1", "Greece" ], [ "876", "Stone", "Blackwell", "90654", "Serbia and Montenegro" ], [ "877", "Serena", "Mann", "32305", "Trinidad and Tobago" ], [ "878", "Scarlet", "Turner", "D7Y 8N4", "Oman" ], [ "879", "Zenaida", "Carrillo", "60361", "Montserrat" ], [ "880", "Jaime", "Dalton", "F4E 6R5", "Iraq" ], [ "881", "Wesley", "Drake", "D8J 9U2", "Bulgaria" ], [ "882", "Armand", "Chandler", "X8Z 9E6", "Saint Kitts and Nevis" ], [ "883", "Inez", "Dillard", "59975", "Eritrea" ], [ "884", "Roanna", "Floyd", "65958", "Bolivia" ], [ "885", "Timon", "Dalton", "O3Q 5B5", "Colombia" ], [ "886", "Ifeoma", "Lamb", "J9A 9X0", "Papua New Guinea" ], [ "887", "Brody", "Cash", "75525", "Kazakhstan" ], [ "888", "Dawn", "Wise", "G7X 5J3", "Samoa" ], [ "889", "Chaney", "Bartlett", "11112", "Ecuador" ], [ "890", "Galvin", "Merritt", "59635", "Bahrain" ], [ "891", "Cynthia", "Nash", "U5P 1H4", "Switzerland" ], [ "892", "Tara", "Austin", "Q6X 8U0", "Burundi" ], [ "893", "Roanna", "Petty", "28524", "Northern Mariana Islands" ], [ "894", "Palmer", "Mcdowell", "78234", "United States Minor Outlying Islands" ], [ "895", "Sade", "Patton", "28984", "Czech Republic" ], [ "896", "Yoko", "Compton", "62165", "Saint Kitts and Nevis" ], [ "897", "Regan", "Mccarthy", "C5D 6G0", "Lebanon" ], [ "898", "Norman", "Nixon", "E4C 4G0", "Virgin Islands, U.S." ], [ "899", "Jocelyn", "Baldwin", "X9R 2B3", "Macedonia" ], [ "900", "Jaquelyn", "Berg", "N6X 6E1", "Saint Lucia" ], [ "901", "Zane", "Nelson", "G9P 4J8", "Macao" ], [ "902", "Judith", "Elliott", "R4I 4O3", "Iraq" ], [ "903", "Maia", "Ellis", "S9V 6P0", "Bahrain" ], [ "904", "Mechelle", "Stevens", "43406", "Bouvet Island" ], [ "905", "Sylvester", "Duran", "K5D 8W5", "Costa Rica" ], [ "906", "Unity", "Cooke", "64362", "Ecuador" ], [ "907", "Karly", "Velazquez", "43286", "Guam" ], [ "908", "Damian", "Yates", "84910", "Thailand" ], [ "909", "Linus", "Gross", "31808", "Israel" ], [ "910", "Cooper", "Franco", "36700", "Yemen" ], [ "911", "Gail", "Jones", "09157", "Turkey" ], [ "912", "Hayfa", "Bennett", "59422", "France" ], [ "913", "Hermione", "Barber", "I6W 8Z5", "Mozambique" ], [ "914", "Hedy", "Stevens", "35535", "Cuba" ], [ "915", "Galvin", "Frederick", "J2W 9A3", "Virgin Islands, British" ], [ "916", "Lamar", "Rush", "P4O 3H4", "Austria" ], [ "917", "Brenda", "Walter", "K8Q 9H9", "Tajikistan" ], [ "918", "Ria", "Guy", "12801", "Gibraltar" ], [ "919", "Bruno", "Lynch", "I6U 7D0", "Greenland" ], [ "920", "Kirk", "Pearson", "66242", "Falkland Islands (Malvinas)" ], [ "921", "Owen", "Sosa", "61483", "Martinique" ], [ "922", "Rajah", "Mccarty", "G9K 6L2", "Faroe Islands" ], [ "923", "Erasmus", "Malone", "D6H 7H5", "Sierra Leone" ], [ "924", "Raja", "Hale", "85590", "Guadeloupe" ], [ "925", "Logan", "Christensen", "Y6L 8Z0", "Guatemala" ], [ "926", "Kirestin", "Griffith", "47900", "Micronesia" ], [ "927", "Kato", "Reeves", "93779", "Uruguay" ], [ "928", "Jonah", "Suarez", "13708", "Spain" ], [ "929", "Adam", "Lynn", "E1P 1L3", "Indonesia" ], [ "930", "Quinn", "Mckinney", "99683", "Faroe Islands" ], [ "931", "Whilemina", "Macias", "32145", "Iceland" ], [ "932", "Gillian", "Osborne", "L3L 6G0", "Italy" ], [ "933", "Venus", "Zamora", "28318", "Comoros" ], [ "934", "Allegra", "Eaton", "P5X 9S0", "Antarctica" ], [ "935", "Driscoll", "Preston", "R3L 9R0", "Niue" ], [ "936", "Joel", "Spencer", "12006", "Monaco" ], [ "937", "Lucius", "Sharp", "B8V 6U7", "Dominica" ], [ "938", "Curran", "Robinson", "82216", "Romania" ], [ "939", "Kerry", "Espinoza", "N4B 7Q1", "Guatemala" ], [ "940", "Isaac", "Kline", "85674", "Costa Rica" ], [ "941", "Neil", "Harrison", "I5A 2S2", "Greenland" ], [ "942", "Ezra", "Rodriguez", "D6P 5Q3", "Angola" ], [ "943", "Galvin", "Jefferson", "D6H 7G0", "Macedonia" ], [ "944", "Joseph", "Hahn", "Z8V 9B5", "Uganda" ], [ "945", "Naida", "Hammond", "40105", "Philippines" ], [ "946", "Brenna", "Everett", "41704", "Indonesia" ], [ "947", "Rae", "Parks", "79077", "Sweden" ], [ "948", "Jessica", "Richard", "Y3I 5R3", "Uganda" ], [ "949", "Rachel", "Marks", "16157", "Cameroon" ], [ "950", "Maxwell", "Ferguson", "V6A 6M0", "Ukraine" ], [ "951", "Alyssa", "Beard", "13936", "Antarctica" ], [ "952", "Camille", "Gill", "V9Q 9P7", "New Caledonia" ], [ "953", "Cora", "Bond", "M9X 1A4", "Seychelles" ], [ "954", "Peter", "Acosta", "07937", "Chile" ], [ "955", "Ella", "Poole", "A3F 9Z1", "Panama" ], [ "956", "Ashely", "Guerrero", "37436", "Central African Republic" ], [ "957", "Mikayla", "Johnston", "L9W 5T8", "Cameroon" ], [ "958", "Ora", "Weaver", "65897", "Turks and Caicos Islands" ], [ "959", "Timon", "Barnes", "R6J 1J7", "Djibouti" ], [ "960", "Jamalia", "Wade", "22211", "United States" ], [ "961", "Bradley", "Haney", "K1H 1Q1", "Western Sahara" ], [ "962", "Lance", "Le", "H4R 9T7", "Botswana" ], [ "963", "Ethan", "Rich", "T8N 1C6", "Netherlands" ], [ "964", "Jeanette", "Carver", "G1E 5C8", "Cook Islands" ], [ "965", "Ocean", "Marquez", "15084", "Pakistan" ], [ "966", "Ifeoma", "Cleveland", "R9D 6M1", "French Guiana" ], [ "967", "Sylvia", "Herring", "U4R 8P1", "Thailand" ], [ "968", "Clare", "Huffman", "Q5G 2Q0", "Niger" ], [ "969", "Colton", "Leach", "V3F 9W6", "Syrian Arab Republic" ], [ "970", "Maryam", "Hoover", "Y7U 6N3", "Slovakia" ], [ "971", "Nola", "Snider", "54275", "Bosnia and Herzegovina" ], [ "972", "Kameko", "Cote", "M3C 8N0", "Cambodia" ], [ "973", "Julian", "Pugh", "B6E 7J7", "Mauritania" ], [ "974", "Xena", "Lott", "52294", "Estonia" ], [ "975", "Fuller", "Kirk", "65396", "Qatar" ], [ "976", "Lance", "Knox", "78074", "Serbia and Montenegro" ], [ "977", "Hedwig", "Beck", "T5P 4C8", "Dominican Republic" ], [ "978", "Martena", "Diaz", "65420", "Saint Pierre and Miquelon" ], [ "979", "Shafira", "David", "74843", "Senegal" ], [ "980", "Shafira", "Clark", "T6F 5C7", "Mongolia" ], [ "981", "Georgia", "Booth", "28183", "Japan" ], [ "982", "Cameron", "Austin", "I2J 1R1", "Bahrain" ], [ "983", "Vanna", "Hyde", "82434", "Croatia" ], [ "984", "Deanna", "Park", "68486", "Zimbabwe" ], [ "985", "Grady", "Freeman", "U4O 1Q9", "Belarus" ], [ "986", "Sandra", "Knapp", "31413", "Sudan" ], [ "987", "Dorian", "Joseph", "90768", "Lithuania" ], [ "988", "Adria", "Bonner", "15899", "Mongolia" ], [ "989", "Sebastian", "Guzman", "G9L 9G5", "Yemen" ], [ "990", "Angelica", "Puckett", "W8D 8W8", "Virgin Islands, U.S." ], [ "991", "Connor", "Parks", "26175", "Virgin Islands, U.S." ], [ "992", "Yardley", "Griffith", "H3L 2U3", "Saint Pierre and Miquelon" ], [ "993", "Charissa", "Beck", "30611", "Zambia" ], [ "994", "Calvin", "Russo", "79906", "Chile" ], [ "995", "Yoshi", "Durham", "N2J 8M8", "China" ], [ "996", "Finn", "Buck", "Q9F 9Z8", "Iraq" ], [ "997", "Kessie", "Holden", "C4A 1J0", "Syrian Arab Republic" ], [ "998", "Chloe", "Richards", "63091", "Canada" ], [ "999", "Uriel", "Snyder", "95487", "Pakistan" ], [ "1000", "Maite", "Cash", "90705", "Syrian Arab Republic" ], [ "1001", "Cameron", "Schwartz", "82778", "Taiwan, Province of China" ], [ "1002", "Faith", "Jimenez", "J6K 2P9", "Saint Pierre and Miquelon" ], [ "1003", "Otto", "Hancock", "34535", "Andorra" ], [ "1004", "Harlan", "Blackwell", "N8Y 4E6", "Qatar" ], [ "1005", "Fitzgerald", "Gilliam", "Y9J 6J5", "Burkina Faso" ], [ "1006", "Lev", "Ballard", "01956", "American Samoa" ], [ "1007", "Freya", "Brown", "01190", "Portugal" ], [ "1008", "Harding", "Osborn", "14814", "San Marino" ], [ "1009", "Alexander", "Howard", "81842", "Reunion" ], [ "1010", "Ori", "Marsh", "77738", "Saint Helena" ], [ "1011", "Brennan", "Rich", "18690", "Cambodia" ], [ "1012", "Dawn", "Christensen", "Y8F 7R3", "Mali" ], [ "1013", "Ahmed", "Pearson", "62230", "Sudan" ], [ "1014", "Tanek", "Head", "25744", "Kiribati" ], [ "1015", "Meredith", "Cantu", "E6X 2L1", "Kenya" ], [ "1016", "Levi", "Fisher", "I9Y 9G2", "Djibouti" ], [ "1017", "Katell", "Cameron", "10278", "Denmark" ], [ "1018", "Ina", "Orr", "P7H 2O3", "Congo" ], [ "1019", "Beck", "Hayden", "15115", "Saint Lucia" ], [ "1020", "Cassady", "Wagner", "R9H 8C5", "Estonia" ], [ "1021", "Amena", "Herrera", "13286", "Bahrain" ], [ "1022", "Tarik", "Gross", "C3X 3W0", "Azerbaijan" ], [ "1023", "Marshall", "Collier", "13416", "Dominica" ], [ "1024", "Kirestin", "Callahan", "15429", "Micronesia" ], [ "1025", "Sasha", "Rice", "O6H 6X2", "Denmark" ], [ "1026", "Ross", "Gonzalez", "D3B 3R5", "Sudan" ], [ "1027", "Veda", "Arnold", "56611", "Swaziland" ], [ "1028", "Ferdinand", "Macias", "P1Q 3I2", "Colombia" ], [ "1029", "Mohammad", "Reed", "74005", "Bhutan" ], [ "1030", "Reagan", "Sandoval", "19275", "Pitcairn" ], [ "1031", "Debra", "Nelson", "85945", "Ukraine" ], [ "1032", "Cleo", "Robertson", "84072", "Guadeloupe" ], [ "1033", "Tanya", "Vance", "C1F 7F1", "Romania" ], [ "1034", "Desirae", "Wooten", "74659", "Mongolia" ], [ "1035", "Hiram", "Estes", "Q5Z 5A0", "Namibia" ], [ "1036", "Medge", "Weiss", "67079", "Azerbaijan" ], [ "1037", "Hu", "Chase", "87562", "Cuba" ], [ "1038", "Shafira", "Everett", "18983", "Georgia" ], [ "1039", "Mannix", "Lamb", "45542", "Venezuela" ], [ "1040", "Germaine", "Harvey", "I9G 1U0", "Falkland Islands (Malvinas)" ], [ "1041", "Brenna", "Leonard", "55573", "New Zealand" ], [ "1042", "Kylie", "Rivas", "U9J 3O9", "Djibouti" ], [ "1043", "Alexandra", "Rich", "T4O 6S6", "Cuba" ], [ "1044", "Dorian", "Spears", "00456", "Brazil" ], [ "1045", "Laurel", "Abbott", "45449", "Switzerland" ], [ "1046", "Gabriel", "Drake", "U1S 5O2", "Trinidad and Tobago" ], [ "1047", "Priscilla", "Mercer", "01401", "Serbia and Montenegro" ], [ "1048", "Darius", "Hoffman", "49694", "Greece" ], [ "1049", "Caesar", "Patton", "42322", "Suriname" ], [ "1050", "Susan", "Clayton", "W1G 5C3", "Maldives" ], [ "1051", "Zane", "Dunlap", "73722", "Oman" ], [ "1052", "Leah", "Fuentes", "60412", "Luxembourg" ], [ "1053", "Yardley", "Hansen", "03194", "Mauritius" ], [ "1054", "Ingrid", "Talley", "37315", "Solomon Islands" ], [ "1055", "Demetria", "Evans", "30587", "Tajikistan" ], [ "1056", "Ignacia", "Alford", "01282", "Bouvet Island" ], [ "1057", "Destiny", "Wade", "L5R 3V3", "Uganda" ], [ "1058", "Alden", "Mason", "V7D 2V6", "Dominican Republic" ], [ "1059", "Pamela", "Wilcox", "L1I 6I1", "Canada" ], [ "1060", "Melvin", "Buckley", "05478", "Hungary" ], [ "1061", "Eve", "Holcomb", "B6B 8T1", "Cook Islands" ], [ "1062", "Arthur", "Weeks", "R5P 7U2", "Bangladesh" ], [ "1063", "Marah", "Levine", "10075", "Somalia" ], [ "1064", "Keiko", "Freeman", "90950", "Faroe Islands" ], [ "1065", "Dorian", "Rose", "T5M 4Z0", "Fiji" ], [ "1066", "Desirae", "Velez", "T4E 8K2", "Afghanistan" ], [ "1067", "Rebekah", "Lucas", "T9A 8V5", "Tunisia" ], [ "1068", "Sylvester", "Copeland", "W6R 3B6", "Jamaica" ], [ "1069", "Alea", "Preston", "31050", "Netherlands Antilles" ], [ "1070", "Aphrodite", "Gordon", "T7C 6T8", "Sao Tome and Principe" ], [ "1071", "Yael", "Delaney", "G9W 9P1", "Mexico" ], [ "1072", "Sierra", "Perez", "R3O 8H0", "Slovenia" ], [ "1073", "Avram", "Briggs", "05221", "Norfolk Island" ], [ "1074", "Troy", "Poole", "W7Q 8O5", "Malta" ], [ "1075", "Gavin", "Sandoval", "37352", "Greece" ], [ "1076", "Nerea", "Stokes", "N2Q 6S9", "United States" ], [ "1077", "Genevieve", "Ramirez", "53829", "Mali" ], [ "1078", "Oliver", "Boone", "M1Q 8V9", "Bolivia" ], [ "1079", "Lars", "Ramirez", "L2R 6V2", "Bosnia and Herzegovina" ], [ "1080", "Abbot", "Horton", "R1R 1V8", "Netherlands Antilles" ], [ "1081", "Abra", "Avila", "41608", "Congo" ], [ "1082", "Candice", "Christian", "13930", "Faroe Islands" ], [ "1083", "Flavia", "Miranda", "93964", "Estonia" ], [ "1084", "Medge", "Drake", "Q7C 2E2", "Belize" ], [ "1085", "Lee", "Montgomery", "H3T 4Q6", "Costa Rica" ], [ "1086", "Aline", "Ratliff", "99839", "Macao" ], [ "1087", "Shafira", "Fox", "A9S 7C8", "Palestinian Territory, Occupied" ], [ "1088", "Orson", "Greene", "K9L 7R8", "Myanmar" ], [ "1089", "Henry", "Joyner", "55853", "South Africa" ], [ "1090", "Keely", "Boyer", "08996", "Liberia" ], [ "1091", "Jerome", "Jones", "31770", "Saint Lucia" ], [ "1092", "Hermione", "Dunlap", "U2R 7R2", "Moldova" ], [ "1093", "Lenore", "Powers", "73772", "Tunisia" ], [ "1094", "Alden", "Newman", "V4C 3O8", "Bhutan" ], [ "1095", "Jasper", "Blevins", "K2H 5W0", "Paraguay" ], [ "1096", "Robert", "Bender", "R5F 1H9", "Philippines" ], [ "1097", "Bo", "Richard", "N5R 6T2", "Trinidad and Tobago" ], [ "1098", "Iliana", "Mcpherson", "23758", "Bangladesh" ], [ "1099", "Alfreda", "Camacho", "35387", "Saint Helena" ], [ "1100", "Kirsten", "Giles", "14079", "Romania" ], [ "1101", "Harlan", "Crawford", "84847", "French Polynesia" ], [ "1102", "Wynne", "Bauer", "W9D 6F6", "Kazakhstan" ], [ "1103", "Connor", "Melton", "E2F 4Q2", "Angola" ], [ "1104", "Evelyn", "Barry", "I9H 8W7", "Turkmenistan" ], [ "1105", "Barry", "Stephens", "07823", "Gibraltar" ], [ "1106", "Ferris", "Farrell", "I7H 5Z6", "Saint Vincent and The Grenadines" ], [ "1107", "Ursa", "Carr", "31124", "Chad" ], [ "1108", "Laith", "Johnson", "10428", "Cyprus" ], [ "1109", "Harlan", "Frank", "J6K 7I6", "Gambia" ], [ "1110", "Gregory", "Ratliff", "P1C 8H2", "Chile" ], [ "1111", "Rina", "Holloway", "Y7N 1E7", "Estonia" ], [ "1112", "Maris", "Joyner", "T6R 2H9", "France" ], [ "1113", "Galvin", "Webster", "V8E 9U4", "Croatia" ], [ "1114", "Farrah", "Bean", "H2B 8E2", "Palestinian Territory, Occupied" ], [ "1115", "Martha", "Schroeder", "14485", "Georgia" ], [ "1116", "Mari", "Boone", "D4C 1Q0", "Comoros" ], [ "1117", "Nadine", "Mercado", "35046", "Syrian Arab Republic" ], [ "1118", "Isadora", "Keith", "R5H 8Y7", "Mayotte" ], [ "1119", "Quinn", "William", "V8Q 3Y6", "India" ], [ "1120", "Justina", "Gilbert", "11271", "Yemen" ], [ "1121", "Jordan", "Hull", "F4Z 7R8", "Lesotho" ], [ "1122", "Mechelle", "Davenport", "A9Z 8P2", "Bermuda" ], [ "1123", "Isabelle", "Webster", "60972", "Zimbabwe" ], [ "1124", "Armand", "Butler", "Y3F 4H9", "Nicaragua" ], [ "1125", "Herman", "Beach", "Q8N 6V3", "Cape Verde" ], [ "1126", "Brianna", "Love", "D9B 2W8", "Sierra Leone" ], [ "1127", "Joy", "Brown", "O7V 7C1", "Djibouti" ], [ "1128", "Amena", "Moss", "P8D 1L9", "Andorra" ], [ "1129", "Zeph", "Whitehead", "01513", "Tanzania, United Republic of" ], [ "1130", "Logan", "Matthews", "73541", "Finland" ], [ "1131", "Amela", "Gregory", "65323", "Swaziland" ], [ "1132", "Zoe", "Owen", "V5L 5O6", "Zambia" ], [ "1133", "September", "Hewitt", "R8K 4G9", "Congo" ], [ "1134", "Holly", "Walter", "S2E 3M4", "Serbia and Montenegro" ], [ "1135", "Zeph", "Beach", "J6Z 8B5", "Ecuador" ], [ "1136", "Morgan", "Decker", "M9H 8I5", "Uruguay" ], [ "1137", "Malcolm", "Maldonado", "S6F 8X6", "Netherlands" ], [ "1138", "Fay", "Day", "B9R 1U7", "Seychelles" ], [ "1139", "Charles", "Juarez", "62791", "Virgin Islands, U.S." ], [ "1140", "Amery", "Stout", "L9A 1F8", "Central African Republic" ], [ "1141", "Irene", "Ferrell", "52649", "Norway" ], [ "1142", "Dean", "Stout", "N5C 2S8", "Uruguay" ], [ "1143", "Eric", "Baxter", "82082", "Chile" ], [ "1144", "Shelley", "Larsen", "Y4T 4P3", "Antarctica" ], [ "1145", "Rigel", "Ellis", "E3S 6K8", "Zimbabwe" ], [ "1146", "Maite", "Rosa", "F6C 5Q9", "Zambia" ], [ "1147", "Serena", "Blanchard", "99373", "Estonia" ], [ "1148", "Melanie", "Berger", "C5P 4E2", "Mozambique" ], [ "1149", "Noah", "Spence", "B8H 7X7", "Martinique" ], [ "1150", "Elliott", "Pierce", "W5B 8V7", "Swaziland" ], [ "1151", "Ahmed", "Chang", "E9X 7J0", "Bulgaria" ], [ "1152", "Ross", "Figueroa", "22458", "China" ], [ "1153", "Gary", "Calderon", "V3C 4J8", "Algeria" ], [ "1154", "Montana", "Franklin", "94093", "Haiti" ], [ "1155", "Rae", "Curry", "45477", "Morocco" ], [ "1156", "Jillian", "Hogan", "N8L 4B5", "Iceland" ], [ "1157", "Mia", "Kaufman", "54758", "Burkina Faso" ], [ "1158", "Remedios", "Wilkerson", "75420", "Saint Vincent and The Grenadines" ], [ "1159", "Xanthus", "Baldwin", "13961", "Congo" ], [ "1160", "Madeline", "Gates", "76351", "Saint Helena" ], [ "1161", "Leroy", "Craig", "12770", "Finland" ], [ "1162", "Melanie", "Carpenter", "C3B 8L4", "Mayotte" ], [ "1163", "Ashely", "Mcneil", "E7E 9K5", "French Southern Territories" ], [ "1164", "Karina", "Mcneil", "39956", "United Arab Emirates" ], [ "1165", "Nina", "Mills", "92913", "Saint Kitts and Nevis" ], [ "1166", "Ashton", "Singleton", "73890", "Libyan Arab Jamahiriya" ], [ "1167", "Meghan", "Black", "31814", "Armenia" ], [ "1168", "Jolene", "Pope", "U6K 7O6", "Venezuela" ], [ "1169", "Abel", "Boyd", "37110", "Botswana" ], [ "1170", "Tiger", "Coffey", "Y6P 3S4", "Faroe Islands" ], [ "1171", "Aileen", "Rowe", "F7G 8D9", "Netherlands Antilles" ], [ "1172", "Bryar", "Forbes", "T2N 5H6", "Saint Vincent and The Grenadines" ], [ "1173", "Vera", "Hoffman", "36299", "Guadeloupe" ], [ "1174", "Hadassah", "Wright", "S8J 5B2", "Peru" ], [ "1175", "Bruce", "Blair", "Q8E 7K6", "Cape Verde" ], [ "1176", "Brianna", "Wolf", "V8S 5A6", "Bahamas" ], [ "1177", "Kimberley", "Reed", "17652", "Tajikistan" ], [ "1178", "Colin", "Phelps", "42334", "Brunei Darussalam" ], [ "1179", "Gil", "Britt", "U3N 6C2", "Swaziland" ], [ "1180", "Hasad", "Pena", "09526", "United States" ], [ "1181", "Violet", "Dixon", "48691", "Micronesia" ], [ "1182", "Uriel", "Bowen", "Z7F 7A7", "Uzbekistan" ], [ "1183", "Madeline", "Keller", "18227", "Iran, Islamic Republic of" ], [ "1184", "Buffy", "Mckee", "23861", "Ethiopia" ], [ "1185", "Doris", "Martin", "V8N 8O7", "Liberia" ], [ "1186", "Mia", "Burke", "64582", "Virgin Islands, British" ], [ "1187", "William", "Kemp", "63587", "Tuvalu" ], [ "1188", "Stacy", "Quinn", "01390", "Nauru" ], [ "1189", "Halla", "Solomon", "31138", "Pakistan" ], [ "1190", "Kasimir", "Rodriguez", "67823", "Costa Rica" ], [ "1191", "Davis", "Lawrence", "27918", "Rwanda" ], [ "1192", "Nigel", "Bryan", "L5U 2U9", "Seychelles" ], [ "1193", "Ivana", "Stone", "94862", "Niue" ], [ "1194", "Naomi", "Yang", "68985", "Haiti" ], [ "1195", "Roanna", "Brown", "51196", "India" ], [ "1196", "Colorado", "Chavez", "45634", "Brazil" ], [ "1197", "Illana", "Levy", "V1A 7R8", "Jordan" ], [ "1198", "Ali", "Lowe", "N8K 1Y5", "Hungary" ], [ "1199", "Virginia", "Witt", "Y3O 5W8", "Azerbaijan" ], [ "1200", "Howard", "Flores", "I9C 3Q7", "Fiji" ], [ "1201", "Walter", "Odom", "78418", "Thailand" ], [ "1202", "Thor", "Craig", "00935", "Jamaica" ], [ "1203", "Petra", "Barry", "E5L 5K5", "Finland" ], [ "1204", "Lev", "Ellison", "I6S 1K1", "Mongolia" ], [ "1205", "Roth", "Osborne", "15014", "Swaziland" ], [ "1206", "Lucius", "Baldwin", "12766", "China" ], [ "1207", "Candice", "Hyde", "B5E 4B8", "Bahamas" ], [ "1208", "Maggy", "Bailey", "76781", "Northern Mariana Islands" ], [ "1209", "Beatrice", "Gregory", "S5S 8S4", "Rwanda" ], [ "1210", "Adrian", "Bowman", "58500", "Vanuatu" ], [ "1211", "Brenden", "Chandler", "50326", "Thailand" ], [ "1212", "Jada", "Richmond", "15990", "Saint Vincent and The Grenadines" ], [ "1213", "Sawyer", "Page", "G2W 7R7", "Somalia" ], [ "1214", "Haley", "Jordan", "U7X 4U2", "Equatorial Guinea" ], [ "1215", "Ruby", "Watson", "30990", "Romania" ], [ "1216", "Jocelyn", "Knowles", "78987", "Lebanon" ], [ "1217", "Preston", "Stevenson", "F3L 9B3", "Mali" ], [ "1218", "Kimberly", "Merritt", "38779", "Venezuela" ], [ "1219", "Herrod", "Burke", "56225", "French Guiana" ], [ "1220", "Solomon", "Shannon", "67980", "Cape Verde" ], [ "1221", "Bradley", "Stokes", "10213", "Botswana" ], [ "1222", "Grace", "Kinney", "67923", "Montserrat" ], [ "1223", "Celeste", "Clark", "S7M 6I2", "Guatemala" ], [ "1224", "Patricia", "Frank", "05615", "Venezuela" ], [ "1225", "Madonna", "Alford", "10878", "Brunei Darussalam" ], [ "1226", "May", "Rios", "N7O 2L0", "Georgia" ], [ "1227", "Driscoll", "Roach", "Y7F 9F8", "Palestinian Territory, Occupied" ], [ "1228", "Idona", "Cruz", "T6Q 8L4", "Iraq" ], [ "1229", "Sydney", "Delacruz", "69511", "United Arab Emirates" ], [ "1230", "Gillian", "Huff", "52624", "French Southern Territories" ], [ "1231", "Minerva", "Rosario", "29195", "Andorra" ], [ "1232", "Kerry", "Alvarado", "L3Q 2V5", "Portugal" ], [ "1233", "Amos", "Bass", "26389", "Holy See (Vatican City State)" ], [ "1234", "Deanna", "Parks", "57376", "Estonia" ], [ "1235", "Fitzgerald", "Green", "M3P 9N2", "Slovenia" ], [ "1236", "Sade", "Hinton", "35561", "Barbados" ], [ "1237", "Suki", "Parsons", "44591", "Syrian Arab Republic" ], [ "1238", "Orli", "Weeks", "K2W 9L4", "Peru" ], [ "1239", "Nicholas", "Copeland", "I5W 7A4", "French Guiana" ], [ "1240", "Guy", "Vang", "22277", "Pitcairn" ], [ "1241", "Hunter", "Goodman", "72290", "Malaysia" ], [ "1242", "Noble", "Rich", "I3B 6T9", "Gibraltar" ], [ "1243", "Delilah", "Zamora", "96328", "New Zealand" ], [ "1244", "Sybil", "Mercer", "93665", "Namibia" ], [ "1245", "Scarlett", "Brock", "Z2E 3J2", "Central African Republic" ], [ "1246", "Channing", "Alexander", "W5V 8D2", "San Marino" ], [ "1247", "Carolyn", "Boyle", "Q5Z 9E6", "Gabon" ], [ "1248", "Irene", "Jennings", "F3H 4O6", "Saint Helena" ], [ "1249", "Bianca", "Pratt", "66354", "Malaysia" ], [ "1250", "Dexter", "Cole", "56106", "French Southern Territories" ], [ "1251", "Berk", "Velez", "26759", "Lesotho" ], [ "1252", "Barrett", "Richardson", "59446", "Cocos (Keeling) Islands" ], [ "1253", "Scarlet", "Jacobs", "G9A 7L6", "Dominica" ], [ "1254", "Aiko", "Brooks", "R6R 9E4", "Liberia" ], [ "1255", "Jacob", "Moore", "P2Y 6P3", "Cambodia" ], [ "1256", "Madeline", "Bishop", "D4I 2E7", "Dominican Republic" ], [ "1257", "Jarrod", "Evans", "C9O 7V7", "Taiwan, Province of China" ], [ "1258", "Beverly", "Witt", "64850", "Denmark" ], [ "1259", "Karyn", "Rhodes", "D6G 5Z3", "Cape Verde" ], [ "1260", "Imani", "Quinn", "01897", "Macao" ], [ "1261", "Athena", "Eaton", "03568", "Syrian Arab Republic" ], [ "1262", "Raymond", "Valdez", "21037", "Romania" ], [ "1263", "Christopher", "Ferguson", "64945", "Indonesia" ], [ "1264", "Latifah", "Harris", "91381", "Suriname" ], [ "1265", "Dacey", "Wagner", "81483", "Qatar" ], [ "1266", "Summer", "Myers", "H6A 1G5", "Angola" ], [ "1267", "Jasmine", "Rivera", "Y4W 8P2", "Virgin Islands, British" ], [ "1268", "Cairo", "Massey", "Q6Y 7A7", "Poland" ], [ "1269", "Jena", "Hill", "89480", "United States Minor Outlying Islands" ], [ "1270", "Ava", "Benson", "L9H 8V1", "Sri Lanka" ], [ "1271", "Gillian", "Mercado", "A9W 6V5", "Norway" ], [ "1272", "Peter", "Marquez", "I5B 3W9", "Guyana" ], [ "1273", "Price", "Coleman", "X8G 2S0", "Burkina Faso" ], [ "1274", "Shana", "Harper", "L2B 3U9", "Malaysia" ], [ "1275", "Serina", "Matthews", "58061", "Lithuania" ], [ "1276", "Aretha", "Bryant", "Y8J 7A5", "Tonga" ], [ "1277", "Wesley", "Craig", "20141", "Australia" ], [ "1278", "Martena", "Mercer", "P6X 2L9", "Sudan" ], [ "1279", "Tamara", "Dennis", "D3H 9R0", "Mali" ], [ "1280", "Phelan", "Pena", "D2H 2H7", "United States Minor Outlying Islands" ], [ "1281", "Rebecca", "Kinney", "B5Z 9S4", "Antarctica" ], [ "1282", "Josephine", "Delgado", "81010", "Algeria" ], [ "1283", "Kieran", "Estes", "70093", "Bermuda" ], [ "1284", "Tamara", "Williamson", "90905", "French Guiana" ], [ "1285", "Dora", "Serrano", "W8K 6R5", "Nauru" ], [ "1286", "Morgan", "Bass", "B6F 8R2", "Madagascar" ], [ "1287", "Margaret", "Austin", "D2C 2C1", "Belgium" ], [ "1288", "Nasim", "Berry", "J9X 7M5", "Heard Island and Mcdonald Islands" ], [ "1289", "Jelani", "Rutledge", "34552", "Bolivia" ], [ "1290", "Cassady", "Hardin", "I2K 4H6", "Hong Kong" ], [ "1291", "Jenette", "Thornton", "44943", "Uganda" ], [ "1292", "Alexandra", "Sims", "93937", "Australia" ], [ "1293", "Ross", "Higgins", "61993", "Nicaragua" ], [ "1294", "Penelope", "Henson", "90344", "Trinidad and Tobago" ], [ "1295", "Yoshi", "Blackwell", "C8D 1T4", "Costa Rica" ], [ "1296", "Daria", "Rodriquez", "X3C 6L0", "Iceland" ], [ "1297", "Wesley", "Waller", "43947", "Myanmar" ], [ "1298", "Adam", "Hayden", "88969", "Italy" ], [ "1299", "Charity", "William", "46439", "Greece" ], [ "1300", "Ronan", "Hopper", "51955", "Zambia" ], [ "1301", "Geraldine", "Hatfield", "W9S 7T5", "Luxembourg" ], [ "1302", "Barry", "Nicholson", "79625", "Liechtenstein" ], [ "1303", "Donovan", "Ortiz", "68119", "Macao" ], [ "1304", "Jeanette", "Cooper", "D5P 9L2", "Sri Lanka" ], [ "1305", "Isadora", "Stephenson", "P4X 4H5", "Mauritania" ], [ "1306", "Hall", "Hays", "J2Z 2H1", "Svalbard and Jan Mayen" ], [ "1307", "Idola", "Roberson", "89249", "Niue" ], [ "1308", "Olympia", "Dennis", "69498", "Guinea" ], [ "1309", "Naida", "Palmer", "19840", "Gambia" ], [ "1310", "Maxine", "Rollins", "87856", "Belize" ], [ "1311", "Rooney", "Phelps", "48424", "Italy" ], [ "1312", "Shelly", "Edwards", "O7O 1U4", "Mali" ], [ "1313", "Cassidy", "Holcomb", "98785", "Colombia" ], [ "1314", "Sybil", "Moran", "F3C 6E4", "Switzerland" ], [ "1315", "Mufutau", "Larson", "00276", "British Indian Ocean Territory" ], [ "1316", "Fiona", "Bryant", "U7Y 7N6", "Cocos (Keeling) Islands" ], [ "1317", "Lenore", "Boyle", "H5G 6P9", "Sudan" ], [ "1318", "Ignacia", "Avila", "Y5M 1S2", "Romania" ], [ "1319", "Wendy", "Stein", "25422", "Taiwan, Province of China" ], [ "1320", "Garrison", "Bass", "B9J 6D9", "Romania" ], [ "1321", "Curran", "Roy", "X2F 4P2", "Taiwan, Province of China" ], [ "1322", "Oliver", "Beach", "N6J 1C5", "Kazakhstan" ], [ "1323", "Bo", "Duran", "D5C 5C2", "Eritrea" ], [ "1324", "Tashya", "Morrow", "N2J 7O9", "Rwanda" ], [ "1325", "Cheryl", "Powell", "72413", "Niger" ], [ "1326", "Justin", "Roth", "18779", "Brunei Darussalam" ], [ "1327", "Nathaniel", "Foster", "04955", "Bermuda" ], [ "1328", "Candace", "Nunez", "G7Z 1N2", "Moldova" ], [ "1329", "Nero", "West", "K3Q 6B3", "Myanmar" ], [ "1330", "Brendan", "Mcintyre", "C4E 5H7", "Argentina" ], [ "1331", "Chaney", "Stafford", "V3X 8J4", "Benin" ], [ "1332", "Sylvia", "Velez", "95851", "Iraq" ], [ "1333", "Azalia", "Castro", "55986", "Israel" ], [ "1334", "Emily", "Hogan", "74667", "Botswana" ], [ "1335", "Buckminster", "Hurst", "N9C 2X6", "Reunion" ], [ "1336", "Rinah", "Rodriquez", "31896", "Guinea-bissau" ], [ "1337", "Nash", "Barnett", "Y8X 7H5", "China" ], [ "1338", "Xanthus", "Barker", "11212", "Trinidad and Tobago" ], [ "1339", "Minerva", "Huber", "M6M 9U3", "Equatorial Guinea" ], [ "1340", "Kaseem", "Tillman", "86565", "Bulgaria" ], [ "1341", "Cassidy", "Dejesus", "93205", "Sierra Leone" ], [ "1342", "Sheila", "Munoz", "26473", "Benin" ], [ "1343", "Florence", "Yates", "M5O 1J1", "Russian Federation" ], [ "1344", "Isadora", "Wagner", "88381", "Philippines" ], [ "1345", "Hilel", "Kramer", "E5D 4F5", "Lebanon" ], [ "1346", "Stewart", "Lawson", "67313", "Malaysia" ], [ "1347", "Ira", "Duffy", "52841", "Greece" ], [ "1348", "Ignatius", "Robinson", "10035", "Russian Federation" ], [ "1349", "Baxter", "Carroll", "92288", "Albania" ], [ "1350", "Palmer", "James", "N5X 5B1", "Germany" ], [ "1351", "Ava", "Eaton", "76497", "Egypt" ], [ "1352", "Kiona", "Smith", "09402", "Belize" ], [ "1353", "Brian", "Barlow", "00156", "Panama" ], [ "1354", "Nolan", "Rosa", "J2O 9W2", "Uruguay" ], [ "1355", "Teegan", "Burnett", "02401", "Italy" ], [ "1356", "Erin", "Knox", "95496", "Egypt" ], [ "1357", "Amela", "Sanford", "59890", "Virgin Islands, U.S." ], [ "1358", "Quemby", "Hensley", "17698", "Tuvalu" ], [ "1359", "Ava", "York", "J1M 1A0", "Nigeria" ], [ "1360", "Vivien", "Ware", "N9S 1W6", "Bahamas" ], [ "1361", "Nyssa", "Lamb", "97964", "Estonia" ], [ "1362", "Brenna", "Slater", "L4P 5V6", "British Indian Ocean Territory" ], [ "1363", "Kennan", "Larsen", "M2A 4X0", "Angola" ], [ "1364", "Linda", "Luna", "P8C 4S8", "Gambia" ], [ "1365", "Boris", "Poole", "U7J 4G1", "Aruba" ], [ "1366", "Lyle", "Cote", "F5J 3Y2", "Somalia" ], [ "1367", "Oleg", "Knapp", "K4C 5T8", "Guinea" ], [ "1368", "Hanae", "Brown", "51395", "Nepal" ], [ "1369", "India", "Hyde", "E8P 7E8", "Belize" ], [ "1370", "Madeson", "Hodge", "23265", "Gambia" ], [ "1371", "Thaddeus", "Hester", "Y7S 5W1", "Saint Helena" ], [ "1372", "Aaron", "Kemp", "A1Q 8R3", "Albania" ], [ "1373", "Aurelia", "Thornton", "P8T 9D4", "Swaziland" ], [ "1374", "Preston", "Sharpe", "97472", "Niue" ], [ "1375", "Grace", "Gregory", "51767", "Burkina Faso" ], [ "1376", "Nicole", "Hicks", "81040", "Burkina Faso" ], [ "1377", "Hall", "Randall", "X1C 7A8", "Cambodia" ], [ "1378", "Burke", "Silva", "57219", "Romania" ], [ "1379", "Talon", "Kline", "28200", "Argentina" ], [ "1380", "Cassady", "Duncan", "Y2M 8F5", "Kenya" ], [ "1381", "Brielle", "Reed", "06254", "Greece" ], [ "1382", "Claire", "Stein", "50289", "Viet Nam" ], [ "1383", "Fleur", "Cabrera", "30131", "Indonesia" ], [ "1384", "Ella", "Ellison", "Q7Q 4R2", "Netherlands Antilles" ], [ "1385", "Zachery", "Wolf", "A9Q 6A8", "Jamaica" ], [ "1386", "Emerson", "Brewer", "Y4R 9M9", "Bosnia and Herzegovina" ], [ "1387", "Sarah", "Brooks", "27281", "Pitcairn" ], [ "1388", "Kylan", "Garrison", "S8E 7L8", "Djibouti" ], [ "1389", "Guinevere", "Mills", "75612", "Comoros" ], [ "1390", "Claudia", "Stevenson", "73390", "Colombia" ], [ "1391", "Valentine", "Burton", "Z9P 7R8", "Nauru" ], [ "1392", "Raymond", "Mclean", "L8W 2K5", "Brunei Darussalam" ], [ "1393", "Juliet", "Combs", "88712", "Samoa" ], [ "1394", "Lawrence", "Williamson", "32528", "Netherlands Antilles" ], [ "1395", "Inga", "Rivers", "12850", "Kuwait" ], [ "1396", "Mira", "Zimmerman", "D1I 1W2", "Ireland" ], [ "1397", "Hilda", "Stafford", "11054", "Cuba" ], [ "1398", "Tanek", "Kim", "88590", "Cayman Islands" ], [ "1399", "Bryar", "Mcintyre", "H6F 4S5", "Russian Federation" ], [ "1400", "Sean", "Reed", "P2V 8J9", "Malta" ], [ "1401", "Serena", "Henderson", "Z5C 8A0", "Madagascar" ], [ "1402", "Hedley", "Parks", "L8S 6F4", "Angola" ], [ "1403", "Alice", "Quinn", "06084", "Senegal" ], [ "1404", "Linda", "Burgess", "H1E 7C0", "Turkmenistan" ], [ "1405", "Hilda", "Burns", "Q9Q 4S2", "Kyrgyzstan" ], [ "1406", "Griffith", "Watts", "D4J 7N2", "United States Minor Outlying Islands" ], [ "1407", "Camden", "Glenn", "12939", "Russian Federation" ], [ "1408", "Tallulah", "Rush", "G9V 3N2", "Turkey" ], [ "1409", "Hasad", "Salinas", "H3F 7P9", "Cameroon" ], [ "1410", "Violet", "Chavez", "T2H 9C6", "Virgin Islands, U.S." ], [ "1411", "Declan", "Hurley", "32614", "Iran, Islamic Republic of" ], [ "1412", "Robin", "Dean", "34266", "Northern Mariana Islands" ], [ "1413", "Mariko", "Avila", "B8F 8Y5", "Burundi" ], [ "1414", "Bradley", "Pugh", "11453", "Sri Lanka" ], [ "1415", "Herman", "Hernandez", "F3C 6S2", "Chile" ], [ "1416", "Montana", "Wynn", "B3M 8M2", "Aruba" ], [ "1417", "Erin", "Melton", "17022", "France" ], [ "1418", "Zachery", "Small", "L5O 7O1", "French Southern Territories" ], [ "1419", "Melanie", "Rivera", "07922", "Korea" ], [ "1420", "Blossom", "Chase", "75493", "Mauritius" ], [ "1421", "Stephanie", "Taylor", "U8K 3I9", "Bahamas" ], [ "1422", "Carter", "Fulton", "T4F 8D1", "Turks and Caicos Islands" ], [ "1423", "Celeste", "Medina", "75629", "Lebanon" ], [ "1424", "Katell", "Guzman", "15409", "United Arab Emirates" ], [ "1425", "Howard", "Rowland", "29003", "Liberia" ], [ "1426", "Reece", "Taylor", "W8G 7P7", "Samoa" ], [ "1427", "Bradley", "Peterson", "52568", "Singapore" ], [ "1428", "Ulric", "Hancock", "07437", "Bolivia" ], [ "1429", "Francis", "Rogers", "15904", "Albania" ], [ "1430", "Tatiana", "Mccray", "19604", "Belize" ], [ "1431", "Merrill", "Rowe", "68539", "Ethiopia" ], [ "1432", "Kiara", "Taylor", "F6D 8V7", "Burkina Faso" ], [ "1433", "Buffy", "Shannon", "61880", "Kiribati" ], [ "1434", "Amber", "Farmer", "K5F 1J7", "Barbados" ], [ "1435", "Blake", "Wilkins", "O1L 2G2", "Virgin Islands, U.S." ], [ "1436", "Aimee", "Fulton", "18626", "Chad" ], [ "1437", "Kai", "Montgomery", "U6S 4W7", "Costa Rica" ], [ "1438", "Latifah", "Bell", "74589", "Chad" ], [ "1439", "Ronan", "Herring", "01710", "Palestinian Territory, Occupied" ], [ "1440", "Macy", "Skinner", "78054", "Gibraltar" ], [ "1441", "Ignatius", "Berg", "59756", "Liechtenstein" ], [ "1442", "Prescott", "Pratt", "V6H 6P4", "Kuwait" ], [ "1443", "Deborah", "Hebert", "11480", "Liberia" ], [ "1444", "Quentin", "Jones", "G8W 8U6", "Slovenia" ], [ "1445", "Duncan", "Parsons", "Z9F 5G8", "Cambodia" ], [ "1446", "Sheila", "George", "18033", "Trinidad and Tobago" ], [ "1447", "Alyssa", "Padilla", "V3O 6C3", "Qatar" ], [ "1448", "Amelia", "Orr", "51943", "Canada" ], [ "1449", "Bethany", "Thomas", "33451", "Liberia" ], [ "1450", "Kellie", "Pitts", "G4S 1Q3", "Panama" ], [ "1451", "Stone", "Stout", "L4C 9N0", "Latvia" ], [ "1452", "Brynne", "Bailey", "B1M 4O0", "Ukraine" ], [ "1453", "Aquila", "Hurley", "41312", "United Kingdom" ], [ "1454", "David", "Bradshaw", "11152", "Denmark" ], [ "1455", "Ryan", "Gates", "Z7O 1U0", "Austria" ], [ "1456", "Kyle", "Weber", "39871", "Guyana" ], [ "1457", "Declan", "Moore", "K3B 6L2", "Gibraltar" ], [ "1458", "Theodore", "Hickman", "W8E 6K1", "Mauritius" ], [ "1459", "Rebekah", "Merritt", "44042", "Mauritania" ], [ "1460", "Meredith", "Powell", "98238", "Bhutan" ], [ "1461", "Paki", "Simmons", "34122", "Norway" ], [ "1462", "Carissa", "Ballard", "20095", "Antarctica" ], [ "1463", "James", "Wilson", "96376", "Venezuela" ], [ "1464", "Pamela", "Gamble", "U7F 7B6", "Turkmenistan" ], [ "1465", "Rogan", "Davenport", "E6S 4R7", "French Polynesia" ], [ "1466", "Daphne", "Pearson", "G2H 9M0", "American Samoa" ], [ "1467", "Maxwell", "Nash", "87205", "Guadeloupe" ], [ "1468", "Hayes", "Salazar", "55712", "American Samoa" ], [ "1469", "Justin", "Conner", "03924", "United Kingdom" ], [ "1470", "Blythe", "Joyner", "T6H 3M0", "Montserrat" ], [ "1471", "Herrod", "Spears", "19474", "Philippines" ], [ "1472", "Yvette", "Joyce", "R7Y 7B8", "Botswana" ], [ "1473", "Chloe", "Reid", "K4Y 1R2", "Philippines" ], [ "1474", "MacKensie", "Branch", "J5E 3X8", "Saint Kitts and Nevis" ], [ "1475", "Nasim", "Buchanan", "M4E 4D2", "Portugal" ], [ "1476", "Aileen", "Rasmussen", "H2V 3F4", "Dominica" ], [ "1477", "Nicole", "Mullins", "U6Q 9X5", "New Caledonia" ], [ "1478", "David", "Luna", "11935", "Svalbard and Jan Mayen" ], [ "1479", "Germaine", "Massey", "G3N 4C7", "Colombia" ], [ "1480", "Matthew", "Knowles", "V4D 4Z0", "Turkey" ], [ "1481", "Timon", "Rowe", "14024", "Morocco" ], [ "1482", "Gail", "Young", "68293", "Bhutan" ], [ "1483", "Mariam", "Mejia", "O3P 4Q7", "Singapore" ], [ "1484", "Carla", "Norris", "D7A 3F1", "Liberia" ], [ "1485", "Ainsley", "Donaldson", "H4Z 1Q8", "Tanzania, United Republic of" ], [ "1486", "Avye", "Raymond", "44808", "Namibia" ], [ "1487", "Amanda", "Sargent", "O7F 3S4", "Afghanistan" ], [ "1488", "Tiger", "Chambers", "I3K 7H4", "United States" ], [ "1489", "Dylan", "Ford", "04043", "Solomon Islands" ], [ "1490", "Kaitlin", "Franklin", "99451", "Namibia" ], [ "1491", "Hayes", "Craft", "D6H 4Y6", "Christmas Island" ], [ "1492", "Nolan", "Sullivan", "31246", "United States Minor Outlying Islands" ], [ "1493", "Jennifer", "Romero", "E7I 1R7", "Latvia" ], [ "1494", "Deanna", "Wall", "36109", "Nepal" ], [ "1495", "Dara", "Valenzuela", "18359", "Martinique" ], [ "1496", "Iris", "Blanchard", "84392", "Turks and Caicos Islands" ], [ "1497", "Rhea", "Burgess", "T7Y 7C5", "Liberia" ], [ "1498", "Karina", "Small", "B2F 2X5", "Bermuda" ], [ "1499", "Victor", "Case", "49492", "Vanuatu" ], [ "1500", "Rose", "Terry", "B4G 8I0", "Timor-leste" ], [ "1501", "Wyatt", "Berg", "K3B 5N2", "Vanuatu" ], [ "1502", "Zephania", "Herrera", "E6R 2A5", "Romania" ], [ "1503", "Felix", "Johns", "X8U 2P1", "Angola" ], [ "1504", "Melyssa", "George", "M4J 5X8", "Uzbekistan" ], [ "1505", "Robert", "Spears", "61322", "Papua New Guinea" ], [ "1506", "Myra", "Wood", "50638", "Afghanistan" ], [ "1507", "Sean", "Kerr", "40094", "Guadeloupe" ], [ "1508", "Wesley", "Mcclain", "H7F 1H3", "Mongolia" ], [ "1509", "Ishmael", "Hoover", "42503", "Czech Republic" ], [ "1510", "Ocean", "Parker", "L3Z 8G0", "Guyana" ], [ "1511", "Berk", "Clay", "B6Q 7V7", "Botswana" ], [ "1512", "Daquan", "Harrison", "78004", "Niger" ], [ "1513", "Ramona", "Burris", "66986", "Palau" ], [ "1514", "Jaden", "Miranda", "80086", "Madagascar" ], [ "1515", "Solomon", "Kirk", "R7M 3M3", "Slovenia" ], [ "1516", "Tanek", "Rosales", "X5B 5D0", "Tonga" ], [ "1517", "Jack", "Cooke", "46356", "French Southern Territories" ], [ "1518", "Naomi", "Sykes", "76541", "Marshall Islands" ], [ "1519", "Moana", "Vinson", "K4R 3U7", "Saint Pierre and Miquelon" ], [ "1520", "Kaye", "Sweet", "S6S 2G0", "Dominican Republic" ], [ "1521", "Bruno", "Beard", "20686", "Israel" ], [ "1522", "Helen", "Richards", "66393", "Argentina" ], [ "1523", "Gisela", "Owens", "S8Q 4L3", "Haiti" ], [ "1524", "Ivy", "Garrett", "P6G 8S8", "United Arab Emirates" ], [ "1525", "Malik", "Osborne", "78332", "Tajikistan" ], [ "1526", "Whoopi", "Franco", "T3T 5Y1", "Serbia and Montenegro" ], [ "1527", "Basil", "Baker", "61233", "Cuba" ], [ "1528", "Linda", "King", "31410", "Falkland Islands (Malvinas)" ], [ "1529", "Allegra", "Hobbs", "F2C 9M8", "Andorra" ], [ "1530", "Kirsten", "Elliott", "T8C 4X3", "Haiti" ], [ "1531", "Joseph", "Ortiz", "40165", "Falkland Islands (Malvinas)" ], [ "1532", "Pearl", "Mccormick", "93914", "Falkland Islands (Malvinas)" ], [ "1533", "Fritz", "Austin", "A3S 7C8", "Canada" ], [ "1534", "Lunea", "Hickman", "25676", "Cameroon" ], [ "1535", "Inga", "Cortez", "14707", "Comoros" ], [ "1536", "Claudia", "Long", "74877", "Tokelau" ], [ "1537", "Judah", "Williamson", "S9N 6F0", "Paraguay" ], [ "1538", "Eve", "Beasley", "K8Z 5H7", "Honduras" ], [ "1539", "Tad", "Lang", "29577", "Equatorial Guinea" ], [ "1540", "Jack", "Lawson", "46631", "Costa Rica" ], [ "1541", "Vaughan", "Barron", "N9L 9T4", "Chile" ], [ "1542", "Solomon", "Bowman", "05734", "Cocos (Keeling) Islands" ], [ "1543", "Nash", "Giles", "64600", "Denmark" ], [ "1544", "Xander", "Eaton", "84933", "Bosnia and Herzegovina" ], [ "1545", "Hanna", "Hull", "61062", "Namibia" ], [ "1546", "Lee", "Gaines", "V7H 6H7", "Suriname" ], [ "1547", "Brian", "Sutton", "60055", "Timor-leste" ], [ "1548", "Azalia", "Henson", "D9J 8E4", "Antarctica" ], [ "1549", "Russell", "Avila", "01774", "China" ], [ "1550", "Marsden", "Leblanc", "30201", "New Caledonia" ], [ "1551", "Tad", "Nichols", "K5V 6N1", "Monaco" ], [ "1552", "Eliana", "Savage", "06807", "Central African Republic" ], [ "1553", "Madeline", "Conway", "83513", "Latvia" ], [ "1554", "Kai", "Caldwell", "S1K 2Q2", "Indonesia" ], [ "1555", "Wynne", "Goodman", "U9Y 8P7", "Gibraltar" ], [ "1556", "Nora", "Dudley", "52688", "Netherlands Antilles" ], [ "1557", "Anastasia", "Gates", "T7T 8C8", "Morocco" ], [ "1558", "Lester", "Good", "76376", "Heard Island and Mcdonald Islands" ], [ "1559", "Craig", "Skinner", "S7B 3Z6", "Madagascar" ], [ "1560", "Kibo", "Craft", "M5C 2I9", "Hong Kong" ], [ "1561", "Carlos", "Buck", "89343", "Northern Mariana Islands" ], [ "1562", "Ivor", "Mooney", "M9D 2Y3", "Korea" ], [ "1563", "Armand", "Shields", "E8O 7X6", "Uzbekistan" ], [ "1564", "Grace", "Weeks", "G5B 3W5", "Nicaragua" ], [ "1565", "Reagan", "Mann", "J2E 5I1", "San Marino" ], [ "1566", "Quin", "Nolan", "Q9E 2Q0", "Turkey" ], [ "1567", "Kareem", "Jefferson", "91393", "Zambia" ], [ "1568", "Erica", "Mccoy", "C3P 3L0", "Viet Nam" ], [ "1569", "Sybill", "Larsen", "J3U 3L9", "Sierra Leone" ], [ "1570", "Angela", "Weber", "46559", "Croatia" ], [ "1571", "Mannix", "Noel", "94029", "Belgium" ], [ "1572", "Martina", "Travis", "20063", "Solomon Islands" ], [ "1573", "Dominic", "Whitehead", "83547", "Gibraltar" ], [ "1574", "Vladimir", "Hunter", "L3I 4G7", "Reunion" ], [ "1575", "Farrah", "Alexander", "18538", "Croatia" ], [ "1576", "Hop", "Burns", "X1C 7J6", "Saint Lucia" ], [ "1577", "Zelda", "Trevino", "L8P 7E9", "Guinea" ], [ "1578", "Nehru", "Decker", "Q1P 4Q9", "Western Sahara" ], [ "1579", "Shay", "Goff", "68576", "Sweden" ], [ "1580", "Dominic", "Martin", "C1M 9P2", "Denmark" ], [ "1581", "Heather", "Doyle", "Y7R 9H1", "Iran, Islamic Republic of" ], [ "1582", "Honorato", "Rojas", "29414", "India" ], [ "1583", "Florence", "England", "64669", "China" ], [ "1584", "Zane", "Reyes", "84771", "Heard Island and Mcdonald Islands" ], [ "1585", "Scarlett", "Poole", "36928", "Algeria" ], [ "1586", "Dieter", "Brennan", "Y8V 5L2", "Colombia" ], [ "1587", "Jamal", "Whitney", "33428", "Turkey" ], [ "1588", "Evan", "Guy", "72119", "Slovakia" ], [ "1589", "Candace", "Bauer", "C8L 1P2", "Macedonia" ], [ "1590", "Naomi", "Pennington", "17350", "Tonga" ], [ "1591", "Celeste", "Banks", "R8R 4C8", "Anguilla" ], [ "1592", "Basil", "Elliott", "80065", "Singapore" ], [ "1593", "Darryl", "Wise", "33140", "Brunei Darussalam" ], [ "1594", "Marny", "Walls", "S1K 4V1", "Western Sahara" ], [ "1595", "Anastasia", "Meyer", "Z1F 8C2", "El Salvador" ], [ "1596", "Brynne", "Rivera", "48070", "Mexico" ], [ "1597", "Macey", "Johnston", "X9E 9J5", "Guadeloupe" ], [ "1598", "Bethany", "Marks", "46648", "Bhutan" ], [ "1599", "Kiayada", "Glass", "13661", "Christmas Island" ], [ "1600", "Veda", "Bowers", "D7S 1S9", "Korea" ], [ "1601", "Dante", "Kirk", "58404", "Guinea" ], [ "1602", "Judah", "Sloan", "04528", "Andorra" ], [ "1603", "Serena", "Giles", "12139", "Papua New Guinea" ], [ "1604", "Chase", "Hull", "27203", "Guinea-bissau" ], [ "1605", "Wallace", "Poole", "58919", "Christmas Island" ], [ "1606", "Deacon", "Lynn", "Z1H 9G4", "Kenya" ], [ "1607", "Igor", "Duncan", "X2V 2X1", "Christmas Island" ], [ "1608", "Walker", "Hopkins", "67256", "Bosnia and Herzegovina" ], [ "1609", "Serena", "Burnett", "Q4C 7Q0", "Canada" ], [ "1610", "Hedwig", "Burgess", "O2J 7A5", "Rwanda" ], [ "1611", "Amal", "Richmond", "34506", "Australia" ], [ "1612", "Rhona", "Gomez", "W2C 3I7", "Oman" ], [ "1613", "Kai", "Acosta", "N2O 7M2", "Uganda" ], [ "1614", "Henry", "Roman", "78113", "Guadeloupe" ], [ "1615", "Chester", "Good", "88809", "Norway" ], [ "1616", "Cleo", "Tanner", "73924", "Uganda" ], [ "1617", "Emi", "Lloyd", "59746", "South Africa" ], [ "1618", "Christopher", "Lopez", "76264", "Libyan Arab Jamahiriya" ], [ "1619", "Yvonne", "Mathews", "68655", "Saint Lucia" ], [ "1620", "Kimberly", "Mullen", "D6J 9G3", "Virgin Islands, British" ], [ "1621", "Hanna", "Slater", "F8F 9K5", "Montserrat" ], [ "1622", "Laura", "Dennis", "J6U 2G3", "Viet Nam" ], [ "1623", "Rogan", "Richards", "R1D 1B3", "Argentina" ], [ "1624", "Mira", "Rodriquez", "C3D 3E5", "Guinea" ], [ "1625", "Ezra", "Myers", "Y7Z 7X2", "Kuwait" ], [ "1626", "Jocelyn", "Martin", "E2F 3F2", "Algeria" ], [ "1627", "Denton", "Lee", "80903", "Congo" ], [ "1628", "Grace", "Leach", "86865", "Spain" ], [ "1629", "Clark", "Morrow", "12834", "Northern Mariana Islands" ], [ "1630", "Armando", "Calhoun", "I3I 1D4", "Spain" ], [ "1631", "George", "Decker", "R1B 6Q9", "Mali" ], [ "1632", "Jerome", "Salazar", "03831", "Faroe Islands" ], [ "1633", "Logan", "Santiago", "46269", "Hungary" ], [ "1634", "Gavin", "Tate", "Y3L 6G5", "Italy" ], [ "1635", "Chloe", "Jennings", "D9B 2H9", "Cambodia" ], [ "1636", "Rashad", "Knox", "T1V 4G5", "Germany" ], [ "1637", "Jin", "Roberts", "82928", "Azerbaijan" ], [ "1638", "Amity", "Guerrero", "F4G 2L4", "Viet Nam" ], [ "1639", "Carter", "Roberson", "53651", "Niue" ], [ "1640", "Slade", "Carson", "H9E 1G1", "Guyana" ], [ "1641", "Buckminster", "Christensen", "F5J 6T5", "Algeria" ], [ "1642", "Fallon", "Peters", "D9Y 5Q4", "Ethiopia" ], [ "1643", "Amy", "Barry", "D6F 3R4", "New Caledonia" ], [ "1644", "Calvin", "Buck", "18354", "Macedonia" ], [ "1645", "Kaye", "Haynes", "D9K 1X8", "Italy" ], [ "1646", "Shea", "Hammond", "R7P 3X8", "Guam" ], [ "1647", "Kiara", "Franks", "01185", "Mozambique" ], [ "1648", "Armando", "Oneil", "88972", "Bahrain" ], [ "1649", "Lesley", "Allen", "05171", "Belgium" ], [ "1650", "Ignatius", "Barrett", "94084", "Georgia" ], [ "1651", "Graham", "Maldonado", "76354", "Dominican Republic" ], [ "1652", "Briar", "Roman", "P9M 3A9", "Cayman Islands" ], [ "1653", "Germane", "Colon", "U3X 7S9", "Brazil" ], [ "1654", "Alvin", "Mcpherson", "58411", "Guinea" ], [ "1655", "Belle", "Sandoval", "87172", "Cyprus" ], [ "1656", "Eric", "Caldwell", "63246", "Guinea" ], [ "1657", "Nadine", "Dale", "T6E 4B0", "Denmark" ], [ "1658", "Dora", "Jimenez", "85463", "Nauru" ], [ "1659", "Mohammad", "Strickland", "H8B 9G2", "Japan" ], [ "1660", "Reagan", "Preston", "G5E 8S5", "Honduras" ], [ "1661", "Tamekah", "Daniel", "Z3X 6Q6", "Belarus" ], [ "1662", "Halee", "Mills", "23332", "Mayotte" ], [ "1663", "Courtney", "England", "09751", "Saint Kitts and Nevis" ], [ "1664", "Dai", "Arnold", "A2N 9J4", "Argentina" ], [ "1665", "Priscilla", "Reyes", "G2B 5M4", "Azerbaijan" ], [ "1666", "Brenda", "Stanley", "I6O 3I1", "Hungary" ], [ "1667", "Kasper", "Washington", "H4K 8K7", "Serbia and Montenegro" ], [ "1668", "Suki", "Hendricks", "L1K 5O9", "Norway" ], [ "1669", "Rebekah", "Mccormick", "89543", "Slovenia" ], [ "1670", "Oprah", "Rodriquez", "90034", "Costa Rica" ], [ "1671", "Ivory", "Matthews", "T9J 2A7", "Panama" ], [ "1672", "Ferris", "Garner", "93583", "Niue" ], [ "1673", "Melvin", "White", "X5U 9N8", "Nigeria" ], [ "1674", "Henry", "Swanson", "E7V 2C9", "Northern Mariana Islands" ], [ "1675", "Hadassah", "Eaton", "52798", "Albania" ], [ "1676", "Lisandra", "Sykes", "90838", "Namibia" ], [ "1677", "Honorato", "Bradshaw", "W3D 1Z9", "United States" ], [ "1678", "Aurelia", "Paul", "Z6E 6W9", "Malaysia" ], [ "1679", "Arthur", "Mann", "74673", "Bhutan" ], [ "1680", "Melissa", "Hernandez", "11742", "Dominican Republic" ], [ "1681", "Bert", "Mosley", "N2K 5U5", "Kuwait" ], [ "1682", "Sigourney", "Sharpe", "30204", "South Africa" ], [ "1683", "Ifeoma", "Woods", "39850", "Haiti" ], [ "1684", "Tyler", "Medina", "K6L 9V8", "Indonesia" ], [ "1685", "Karleigh", "Griffin", "G8Z 6W2", "Canada" ], [ "1686", "Brianna", "Collins", "11919", "New Caledonia" ], [ "1687", "Allistair", "Hampton", "O1X 2N7", "Cocos (Keeling) Islands" ], [ "1688", "Carla", "Manning", "76866", "Svalbard and Jan Mayen" ], [ "1689", "Jakeem", "Brewer", "Y1T 1D7", "Comoros" ], [ "1690", "Price", "Guerrero", "S7Z 8O1", "Christmas Island" ], [ "1691", "Harlan", "Sandoval", "58527", "Czech Republic" ], [ "1692", "Marcia", "Robinson", "64662", "Uganda" ], [ "1693", "Sylvester", "Hewitt", "81468", "Honduras" ], [ "1694", "Dawn", "Wood", "77743", "Malawi" ], [ "1695", "Farrah", "Nielsen", "E4N 9A9", "Christmas Island" ], [ "1696", "Tanisha", "Benjamin", "L2J 3G7", "Cape Verde" ], [ "1697", "Cherokee", "Atkins", "L7D 2L5", "Moldova" ], [ "1698", "Madaline", "Elliott", "H7K 8R4", "Barbados" ], [ "1699", "Odysseus", "Roy", "65008", "Slovakia" ], [ "1700", "Eaton", "Stein", "Z2V 7H0", "Moldova" ], [ "1701", "Rachel", "Hurley", "L6L 2B2", "Antigua and Barbuda" ], [ "1702", "Stacey", "Hardin", "O9U 1B7", "Montserrat" ], [ "1703", "Grady", "Montgomery", "75852", "Guinea-bissau" ], [ "1704", "Serena", "Douglas", "F5M 8Z6", "Mauritius" ], [ "1705", "Ralph", "Duke", "H7X 3M9", "Tunisia" ], [ "1706", "Charles", "Moody", "86445", "Pitcairn" ], [ "1707", "Mariam", "Lara", "07952", "United Kingdom" ], [ "1708", "Whitney", "Garza", "74001", "Norfolk Island" ], [ "1709", "Beverly", "Thornton", "69847", "Canada" ], [ "1710", "Helen", "Gentry", "Z8S 7U4", "Reunion" ], [ "1711", "Janna", "Gould", "W6C 6E1", "Burundi" ], [ "1712", "Jana", "Hooper", "A1R 9Y0", "Yemen" ], [ "1713", "Zachary", "Nicholson", "49616", "Gabon" ], [ "1714", "Julian", "Davis", "37608", "Anguilla" ], [ "1715", "Gay", "Knox", "51952", "Croatia" ], [ "1716", "Iola", "Moses", "16601", "French Polynesia" ], [ "1717", "Allegra", "Holder", "C9R 8J3", "Dominican Republic" ], [ "1718", "Cecilia", "Shannon", "62624", "Reunion" ], [ "1719", "Cora", "Peterson", "I9V 5P5", "Chad" ], [ "1720", "Stewart", "Mathews", "A5H 1E1", "Mexico" ], [ "1721", "Kathleen", "Lynn", "82408", "Honduras" ], [ "1722", "William", "Schneider", "25823", "Tajikistan" ], [ "1723", "Alice", "Mcconnell", "50155", "Russian Federation" ], [ "1724", "Timon", "Dillon", "93171", "Croatia" ], [ "1725", "Tanek", "Ellison", "Y7Q 5B1", "Malawi" ], [ "1726", "Tamekah", "Cummings", "03764", "Afghanistan" ], [ "1727", "Charlotte", "Chaney", "U7Y 7B0", "Kyrgyzstan" ], [ "1728", "Jason", "Conway", "37713", "Martinique" ], [ "1729", "Graiden", "Combs", "40454", "Turkmenistan" ], [ "1730", "Virginia", "Ortiz", "K9N 2Q4", "Malta" ], [ "1731", "Thomas", "Cannon", "W1H 3T9", "Cuba" ], [ "1732", "Galena", "Dominguez", "68072", "India" ], [ "1733", "Vaughan", "Petty", "15200", "Lesotho" ], [ "1734", "Buffy", "Saunders", "K1W 3B1", "Burkina Faso" ], [ "1735", "Chava", "Hill", "93461", "Iran, Islamic Republic of" ], [ "1736", "Sage", "Hampton", "R8Y 8J1", "Malta" ], [ "1737", "Nathaniel", "Whitney", "89097", "Ukraine" ], [ "1738", "Hector", "Hayden", "70774", "Netherlands" ], [ "1739", "Mercedes", "Freeman", "80848", "Croatia" ], [ "1740", "Vance", "Spencer", "25484", "Guyana" ], [ "1741", "Josephine", "Stevens", "E4D 9D1", "Netherlands Antilles" ], [ "1742", "Barbara", "Mcclure", "22602", "Cambodia" ], [ "1743", "Sydney", "Holder", "X4G 1Z7", "British Indian Ocean Territory" ], [ "1744", "Velma", "Evans", "83914", "New Zealand" ], [ "1745", "Francis", "Lane", "12545", "Serbia and Montenegro" ], [ "1746", "Garrison", "Brock", "19993", "Eritrea" ], [ "1747", "Quentin", "Santiago", "07085", "Norfolk Island" ], [ "1748", "Ivory", "Wilkerson", "79440", "Libyan Arab Jamahiriya" ], [ "1749", "Karyn", "Buckner", "D1Y 7D8", "Cocos (Keeling) Islands" ], [ "1750", "Mari", "Bright", "24721", "Pakistan" ], [ "1751", "Dexter", "Garrison", "X3X 7G3", "Western Sahara" ], [ "1752", "Venus", "Acevedo", "V2F 8C0", "Poland" ], [ "1753", "Nayda", "Camacho", "F6H 6J5", "Northern Mariana Islands" ], [ "1754", "Avye", "Hartman", "G6V 2H0", "Hong Kong" ], [ "1755", "Kerry", "Baird", "M3Q 7B7", "Russian Federation" ], [ "1756", "Uma", "Herman", "C9A 4P3", "Libyan Arab Jamahiriya" ], [ "1757", "Amaya", "Roman", "97179", "Iceland" ], [ "1758", "Bruce", "Joyce", "18344", "Denmark" ], [ "1759", "Jarrod", "Alvarez", "59269", "Liberia" ], [ "1760", "Olivia", "Reilly", "99058", "Malaysia" ], [ "1761", "Benedict", "Hensley", "23105", "Uganda" ], [ "1762", "Lavinia", "Hunter", "44729", "Maldives" ], [ "1763", "Bradley", "Gomez", "65125", "Belize" ], [ "1764", "Keely", "Burris", "18390", "Brunei Darussalam" ], [ "1765", "Autumn", "England", "E5D 7A5", "Kyrgyzstan" ], [ "1766", "Jane", "Blair", "S1W 4O0", "Bangladesh" ], [ "1767", "Chancellor", "Barrett", "E9F 1I1", "Fiji" ], [ "1768", "Whitney", "Morin", "G5T 4E7", "Aruba" ], [ "1769", "Madeline", "Sparks", "W7L 7E0", "Belize" ], [ "1770", "Dale", "Estes", "82712", "Guam" ], [ "1771", "Hakeem", "Buck", "O6K 1I8", "Singapore" ], [ "1772", "Alexandra", "Burns", "12697", "Portugal" ], [ "1773", "Winifred", "Gill", "Z8B 8B8", "Uruguay" ], [ "1774", "Gail", "Gomez", "S1V 3N8", "American Samoa" ], [ "1775", "Moana", "Brady", "18835", "Wallis and Futuna" ], [ "1776", "Martha", "Oliver", "81962", "Bolivia" ], [ "1777", "Nayda", "Wooten", "00071", "Palau" ], [ "1778", "Bryar", "Collier", "50631", "Mexico" ], [ "1779", "Penelope", "Bradshaw", "A6A 9M2", "Lebanon" ], [ "1780", "Wyatt", "Lara", "75486", "Slovenia" ], [ "1781", "Wang", "Odonnell", "N5X 1N5", "Bahamas" ], [ "1782", "Chiquita", "Harrell", "21691", "Guadeloupe" ], [ "1783", "Byron", "Blankenship", "M8A 3L4", "Syrian Arab Republic" ], [ "1784", "Holmes", "Stokes", "81039", "Mauritania" ], [ "1785", "Naomi", "Phillips", "56287", "Switzerland" ], [ "1786", "Quyn", "Johnson", "D2T 6B7", "Czech Republic" ], [ "1787", "Gillian", "Sanders", "50542", "Colombia" ], [ "1788", "Hope", "Benjamin", "67423", "Bolivia" ], [ "1789", "Bryar", "Dean", "U9V 9E5", "Guatemala" ], [ "1790", "Karyn", "Swanson", "S6H 3R8", "Israel" ], [ "1791", "Amena", "David", "02286", "French Polynesia" ], [ "1792", "Ira", "Joyner", "37335", "Cayman Islands" ], [ "1793", "Tanek", "Oneil", "75041", "Slovenia" ], [ "1794", "Dolan", "Miles", "K7Q 9U8", "Maldives" ], [ "1795", "Wang", "Keith", "88116", "Congo" ], [ "1796", "Wylie", "Bryant", "93369", "Andorra" ], [ "1797", "Heather", "Bryant", "78015", "French Polynesia" ], [ "1798", "Regina", "Wagner", "29087", "Virgin Islands, British" ], [ "1799", "Nathan", "Bush", "J5S 9L0", "Viet Nam" ], [ "1800", "Charity", "Dawson", "29508", "Greece" ], [ "1801", "Ulric", "Guzman", "I6R 6P6", "Micronesia" ], [ "1802", "Keefe", "Scott", "J1R 8T6", "Uzbekistan" ], [ "1803", "Florence", "Price", "U7P 8F6", "Taiwan, Province of China" ], [ "1804", "Griffith", "England", "92557", "China" ], [ "1805", "Kay", "Nielsen", "85991", "Suriname" ], [ "1806", "Tamekah", "Blackburn", "47324", "Panama" ], [ "1807", "Indira", "Crosby", "64463", "Trinidad and Tobago" ], [ "1808", "Pamela", "Vasquez", "K2Q 9A1", "Ghana" ], [ "1809", "Patricia", "Haley", "51509", "Jordan" ], [ "1810", "Nevada", "Prince", "41315", "Tokelau" ], [ "1811", "Martin", "Wilkerson", "Y8X 4Y5", "Palestinian Territory, Occupied" ], [ "1812", "Deirdre", "Castaneda", "X1S 5E2", "Bahrain" ], [ "1813", "Cara", "Flynn", "68372", "Azerbaijan" ], [ "1814", "Sylvia", "Alexander", "E5F 9M5", "Svalbard and Jan Mayen" ], [ "1815", "Macon", "Suarez", "69866", "Tunisia" ], [ "1816", "Hammett", "Haney", "09768", "Bangladesh" ], [ "1817", "Geoffrey", "Simmons", "61986", "Burundi" ], [ "1818", "Danielle", "Kelly", "71568", "Mali" ], [ "1819", "Wing", "Brown", "U4D 6L1", "Uzbekistan" ], [ "1820", "Len", "Barber", "40311", "Suriname" ], [ "1821", "Richard", "Wilson", "W9E 6D7", "Finland" ], [ "1822", "Keaton", "Hayes", "55696", "Slovakia" ], [ "1823", "Dora", "Chaney", "57297", "United States Minor Outlying Islands" ], [ "1824", "Alexandra", "Pruitt", "17207", "Turkmenistan" ], [ "1825", "Deanna", "Gomez", "C9M 9K0", "Paraguay" ], [ "1826", "Laura", "Downs", "74422", "Antigua and Barbuda" ], [ "1827", "Jolene", "Lucas", "K9E 6U4", "Tokelau" ], [ "1828", "Lucy", "Marquez", "L1N 4O4", "Argentina" ], [ "1829", "Abbot", "Bishop", "G8W 7I1", "Guinea-bissau" ], [ "1830", "Aaron", "Bowman", "K8A 5K7", "Greece" ], [ "1831", "Candace", "Lee", "58901", "Turks and Caicos Islands" ], [ "1832", "Larissa", "Allen", "O1I 4X0", "Belgium" ], [ "1833", "Linda", "Malone", "31211", "United Arab Emirates" ], [ "1834", "Grace", "Daugherty", "62610", "Cyprus" ], [ "1835", "Kyra", "Berry", "T2F 3E5", "Netherlands Antilles" ], [ "1836", "Hadassah", "Willis", "C7H 5V4", "El Salvador" ], [ "1837", "Kyle", "Fitzgerald", "X1V 2R9", "Croatia" ], [ "1838", "Graiden", "Atkinson", "L9Q 6H8", "Thailand" ], [ "1839", "Raymond", "Fletcher", "59574", "Argentina" ], [ "1840", "Keaton", "Barnett", "O2G 6B4", "Papua New Guinea" ], [ "1841", "Farrah", "Kramer", "21928", "Netherlands Antilles" ], [ "1842", "Christian", "Sellers", "55504", "Timor-leste" ], [ "1843", "Keith", "Cohen", "D9T 7D0", "Italy" ], [ "1844", "Karleigh", "Bruce", "F2A 5H9", "Montserrat" ], [ "1845", "Julie", "Avery", "T4T 3Y7", "Nepal" ], [ "1846", "Hollee", "Deleon", "47524", "Oman" ], [ "1847", "Charity", "Booker", "61071", "Cocos (Keeling) Islands" ], [ "1848", "Flynn", "Bond", "E8L 9D2", "Afghanistan" ], [ "1849", "Sybill", "Roth", "16453", "Saudi Arabia" ], [ "1850", "Alyssa", "Juarez", "04466", "Singapore" ], [ "1851", "Jennifer", "Odonnell", "59277", "Tuvalu" ], [ "1852", "Carissa", "Byrd", "80861", "Palau" ], [ "1853", "Coby", "Barrett", "04665", "Congo" ], [ "1854", "Bertha", "Paul", "46442", "Andorra" ], [ "1855", "Hayden", "Dennis", "K7E 3O1", "France" ], [ "1856", "Kadeem", "Berry", "39544", "Vanuatu" ], [ "1857", "Clayton", "Burns", "C2A 6W5", "Andorra" ], [ "1858", "Breanna", "Hardy", "12284", "Norway" ], [ "1859", "Yael", "Hester", "69399", "Hong Kong" ], [ "1860", "Hunter", "Harding", "M4O 6N5", "Bosnia and Herzegovina" ], [ "1861", "Breanna", "Sutton", "N2C 6K3", "Singapore" ], [ "1862", "Bo", "Huffman", "54558", "Taiwan, Province of China" ], [ "1863", "Zena", "Potts", "80326", "Czech Republic" ], [ "1864", "Lucian", "Sykes", "D4M 6M5", "Trinidad and Tobago" ], [ "1865", "Gabriel", "Shepherd", "77631", "Bahrain" ], [ "1866", "Vivian", "Gould", "29510", "Norway" ], [ "1867", "Ina", "Sherman", "08122", "Portugal" ], [ "1868", "Constance", "Parsons", "D6E 9J8", "Armenia" ], [ "1869", "Tallulah", "Woodard", "51380", "Bahamas" ], [ "1870", "Amos", "Morris", "37846", "Switzerland" ], [ "1871", "Charles", "Kinney", "45961", "Marshall Islands" ], [ "1872", "Colby", "Camacho", "02978", "Niger" ], [ "1873", "Ora", "Hays", "B6F 9Z9", "Martinique" ], [ "1874", "Ariel", "Cannon", "04559", "Burundi" ], [ "1875", "Beatrice", "Hull", "66569", "Saint Pierre and Miquelon" ], [ "1876", "Stacey", "Morrow", "53760", "Zimbabwe" ], [ "1877", "Naida", "Thomas", "43434", "Virgin Islands, U.S." ], [ "1878", "Holly", "Holcomb", "31997", "Kazakhstan" ], [ "1879", "Lee", "Davenport", "99355", "Central African Republic" ], [ "1880", "Gary", "Higgins", "18703", "Norway" ], [ "1881", "Kay", "Wolf", "25509", "Switzerland" ], [ "1882", "Destiny", "Patel", "Q3X 2F8", "Ghana" ], [ "1883", "Clayton", "Middleton", "Y5C 1I8", "Antigua and Barbuda" ], [ "1884", "May", "Rivers", "26782", "Uzbekistan" ], [ "1885", "Hadassah", "Caldwell", "64493", "Chile" ], [ "1886", "Penelope", "Gentry", "V5N 7A6", "Kyrgyzstan" ], [ "1887", "James", "Boyle", "95421", "Indonesia" ], [ "1888", "Yuli", "Cardenas", "W4U 5U1", "Solomon Islands" ], [ "1889", "George", "Simpson", "30385", "Brazil" ], [ "1890", "Thaddeus", "Ferrell", "E6Z 2D4", "Norfolk Island" ], [ "1891", "Piper", "Morrow", "S6I 1L8", "Estonia" ], [ "1892", "Xaviera", "Heath", "L8I 5G1", "Afghanistan" ], [ "1893", "Odette", "Patton", "L2S 4I8", "Bosnia and Herzegovina" ], [ "1894", "Stewart", "Phillips", "E8E 5W6", "El Salvador" ], [ "1895", "Kellie", "Cooper", "77401", "Cape Verde" ], [ "1896", "Kathleen", "Salinas", "F3O 4Z9", "Sierra Leone" ], [ "1897", "Fallon", "Bennett", "X3P 7L1", "Macedonia" ], [ "1898", "Jesse", "Guerrero", "I2B 1Q0", "Finland" ], [ "1899", "Zenaida", "Mcguire", "M5R 1X6", "Kenya" ], [ "1900", "Carolyn", "Richards", "03060", "Paraguay" ], [ "1901", "Ulla", "Bruce", "20940", "Cambodia" ], [ "1902", "Adrian", "Shaffer", "M5O 9Y2", "Thailand" ], [ "1903", "Callum", "Russo", "L3U 5S8", "Holy See (Vatican City State)" ], [ "1904", "Echo", "Mathews", "49158", "Spain" ], [ "1905", "Driscoll", "Buckner", "70115", "Solomon Islands" ], [ "1906", "Nayda", "Phillips", "Y7D 4A9", "Singapore" ], [ "1907", "Piper", "Livingston", "51701", "Anguilla" ], [ "1908", "Zoe", "Hoover", "C8D 8W2", "Iraq" ], [ "1909", "Veronica", "Montoya", "G6B 9S4", "Egypt" ], [ "1910", "Kato", "Richmond", "41268", "Saint Helena" ], [ "1911", "Kevyn", "Lancaster", "71863", "Montserrat" ], [ "1912", "Rowan", "Carr", "90825", "Ethiopia" ], [ "1913", "Alec", "Wells", "C9P 8I7", "Netherlands" ], [ "1914", "Graham", "Shields", "S4B 5O9", "Norfolk Island" ], [ "1915", "Pearl", "Austin", "43642", "Bermuda" ], [ "1916", "Dana", "Pugh", "H4C 2A9", "Tuvalu" ], [ "1917", "Lucy", "Ellis", "31272", "Cameroon" ], [ "1918", "Logan", "Wright", "18651", "Honduras" ], [ "1919", "Chantale", "Velasquez", "A5D 3X2", "Burundi" ], [ "1920", "Linda", "Ingram", "R1P 1G8", "Myanmar" ], [ "1921", "Ginger", "Howell", "Q5D 4E6", "Pakistan" ], [ "1922", "Unity", "Lester", "P7M 7A4", "Gibraltar" ], [ "1923", "Brett", "Rutledge", "Q1E 2B4", "Thailand" ], [ "1924", "Stewart", "Morrow", "84299", "Mali" ], [ "1925", "Declan", "Aguilar", "35400", "Kenya" ], [ "1926", "Shad", "Simpson", "N8E 2U3", "Saint Pierre and Miquelon" ], [ "1927", "Alma", "Benton", "Q6C 5D2", "Pakistan" ], [ "1928", "Herman", "Bailey", "P5K 2X4", "Ireland" ], [ "1929", "Keegan", "Mendez", "19421", "Lesotho" ], [ "1930", "Erasmus", "Foreman", "J9T 1A2", "Panama" ], [ "1931", "Tarik", "Meyers", "Z8V 5F9", "Cape Verde" ], [ "1932", "Donovan", "Knox", "B8N 1G7", "Iceland" ], [ "1933", "Chloe", "Mccray", "67537", "United Arab Emirates" ], [ "1934", "Marvin", "Edwards", "21809", "Ukraine" ], [ "1935", "Freya", "Watkins", "80099", "Central African Republic" ], [ "1936", "Jerry", "Morgan", "C7U 7H5", "Guinea" ], [ "1937", "Yardley", "Marsh", "23654", "India" ], [ "1938", "Ava", "Mueller", "83374", "Greece" ], [ "1939", "Silas", "Joseph", "P5M 7F2", "Sweden" ], [ "1940", "Winifred", "Solis", "12335", "Viet Nam" ], [ "1941", "Virginia", "Cantu", "K4C 3S5", "Yemen" ], [ "1942", "Sade", "Cole", "40295", "Spain" ], [ "1943", "Ethan", "Hodges", "R7W 8X2", "Congo" ], [ "1944", "Barbara", "Day", "K6L 7S6", "Nigeria" ], [ "1945", "Conan", "Simon", "22124", "Guyana" ], [ "1946", "Lars", "Puckett", "R6Y 4N7", "Trinidad and Tobago" ], [ "1947", "Quin", "Ewing", "99053", "American Samoa" ], [ "1948", "Ali", "Haynes", "N6Z 7X0", "China" ], [ "1949", "Sara", "Wagner", "74544", "Chad" ], [ "1950", "Griffith", "Fuentes", "R1W 6Z9", "Slovenia" ], [ "1951", "Sharon", "Crane", "I2Z 9D6", "Philippines" ], [ "1952", "Marsden", "Acosta", "K6C 8C5", "Jordan" ], [ "1953", "Whoopi", "Villarreal", "E2O 1T5", "Svalbard and Jan Mayen" ], [ "1954", "Bruno", "Ball", "31931", "Barbados" ], [ "1955", "Ulric", "Young", "T4R 3M5", "Solomon Islands" ], [ "1956", "Noah", "Gonzalez", "L3O 6V5", "Mayotte" ], [ "1957", "Cheryl", "Gilliam", "F4Q 4H9", "Albania" ], [ "1958", "Bo", "Rowe", "67020", "Jamaica" ], [ "1959", "Kelly", "Alexander", "P8Y 9K5", "Somalia" ], [ "1960", "Hop", "Navarro", "O1G 9R6", "Cayman Islands" ], [ "1961", "Zachery", "Howard", "67147", "Fiji" ], [ "1962", "Elvis", "Daugherty", "X8V 7S7", "Jordan" ], [ "1963", "Mallory", "Hensley", "A5S 1U6", "Swaziland" ], [ "1964", "Fulton", "Williams", "P4C 4O5", "Viet Nam" ], [ "1965", "Madison", "Pittman", "F8G 1P9", "Chile" ], [ "1966", "Kermit", "Bradford", "W2T 6I5", "Uganda" ], [ "1967", "Gabriel", "Ballard", "N5M 6W0", "Andorra" ], [ "1968", "Jasmine", "Barber", "M2Z 7G5", "French Guiana" ], [ "1969", "Thane", "Koch", "21097", "Armenia" ], [ "1970", "Montana", "Oneal", "L2A 9Q6", "South Africa" ], [ "1971", "Brett", "Coleman", "79399", "Luxembourg" ], [ "1972", "Ivy", "Jimenez", "28549", "Senegal" ], [ "1973", "Shad", "Melton", "Z8N 4Z5", "Cook Islands" ], [ "1974", "Suki", "Vance", "H1A 1Z3", "Ireland" ], [ "1975", "Jin", "Hodges", "L2I 3T8", "France" ], [ "1976", "Diana", "Booth", "M3V 1S8", "Iran, Islamic Republic of" ], [ "1977", "Martha", "Nunez", "27837", "Northern Mariana Islands" ], [ "1978", "Silas", "Ayers", "17121", "United States" ], [ "1979", "Ainsley", "Whitaker", "42695", "Dominica" ], [ "1980", "Dillon", "Tucker", "N3R 3P3", "Botswana" ], [ "1981", "Lillian", "West", "57665", "Palau" ], [ "1982", "Talon", "Hart", "Z6T 4W3", "Serbia and Montenegro" ], [ "1983", "Desiree", "Booth", "Q1W 9S1", "Gambia" ], [ "1984", "Chastity", "Merrill", "F3B 9W7", "Puerto Rico" ], [ "1985", "Nichole", "Leon", "T7V 5D6", "Belize" ], [ "1986", "Rafael", "Washington", "87676", "Eritrea" ], [ "1987", "Samson", "Mathews", "G7Q 5V6", "Burkina Faso" ], [ "1988", "Jasper", "Campbell", "23791", "Thailand" ], [ "1989", "Mason", "Harrington", "R9R 5S3", "Nigeria" ], [ "1990", "Jameson", "Frederick", "R1N 4S0", "Guyana" ], [ "1991", "Cadman", "Woodard", "43080", "Gambia" ], [ "1992", "Catherine", "Gill", "W4W 8A4", "Philippines" ], [ "1993", "Yael", "Richards", "99504", "Kenya" ], [ "1994", "Porter", "Finley", "C8Z 5E0", "Brunei Darussalam" ], [ "1995", "Alden", "Merritt", "P4E 9F0", "Mali" ], [ "1996", "Kaye", "Andrews", "I5I 3A4", "Cayman Islands" ], [ "1997", "Luke", "Bryant", "F3Z 2U1", "Kuwait" ], [ "1998", "Heather", "Blackburn", "L1T 6B9", "Mongolia" ], [ "1999", "Gage", "Sykes", "L9Q 7E6", "Palestinian Territory, Occupied" ], [ "2000", "Kaseem", "Harris", "B9O 1C3", "Korea" ], [ "2001", "Quail", "Leonard", "88755", "Burkina Faso" ], [ "2002", "Dennis", "Craft", "13309", "Namibia" ], [ "2003", "Ivor", "Forbes", "C3P 2E1", "Malta" ], [ "2004", "Cade", "Herman", "R1E 5X9", "Sri Lanka" ], [ "2005", "Larissa", "Santiago", "57781", "Dominica" ], [ "2006", "Hyatt", "Tillman", "45071", "Ghana" ], [ "2007", "Timothy", "Rodgers", "F8W 9W0", "Andorra" ], [ "2008", "Hanae", "Powell", "F8B 7P7", "Luxembourg" ], [ "2009", "Ima", "Pennington", "Z5W 5N5", "Latvia" ], [ "2010", "Laurel", "Bell", "16805", "Venezuela" ], [ "2011", "Avye", "Long", "04794", "Dominica" ], [ "2012", "Lysandra", "Pierce", "H7O 3F4", "Zimbabwe" ], [ "2013", "Eve", "Pollard", "L5K 6E2", "Algeria" ], [ "2014", "Ina", "Mcdowell", "65712", "Saint Lucia" ], [ "2015", "Meredith", "Serrano", "V8M 6K7", "Libyan Arab Jamahiriya" ], [ "2016", "Daphne", "Irwin", "89933", "Mongolia" ], [ "2017", "Adam", "Henson", "F6U 9D5", "Chile" ], [ "2018", "Amery", "Hoover", "13408", "Mongolia" ], [ "2019", "Quamar", "Hendricks", "20310", "Gambia" ], [ "2020", "Ori", "Wheeler", "89005", "Nigeria" ], [ "2021", "Zena", "Douglas", "Z1O 6F9", "Serbia and Montenegro" ], [ "2022", "Buckminster", "Huffman", "R4V 9L2", "Mali" ], [ "2023", "Harlan", "Gamble", "U4I 7M4", "Guyana" ], [ "2024", "Dalton", "Cline", "63829", "Tonga" ], [ "2025", "Martha", "Weber", "Z9B 4T0", "Bangladesh" ], [ "2026", "Vernon", "Francis", "M5A 9X7", "Tokelau" ], [ "2027", "Janna", "Velazquez", "67406", "Qatar" ], [ "2028", "Fuller", "Keller", "80871", "Burkina Faso" ], [ "2029", "Jamal", "Spears", "42197", "Norfolk Island" ], [ "2030", "Christen", "Holcomb", "29806", "Norway" ], [ "2031", "Mary", "Carter", "C6W 9K9", "Belgium" ], [ "2032", "Colorado", "Austin", "62904", "Cook Islands" ], [ "2033", "Fritz", "Hunt", "X8G 2V0", "Morocco" ], [ "2034", "Isabella", "Bush", "17676", "Monaco" ], [ "2035", "Adam", "Gilliam", "H7K 9X3", "Indonesia" ], [ "2036", "John", "Austin", "O7X 4Z0", "Czech Republic" ], [ "2037", "Cassady", "Yates", "68835", "Christmas Island" ], [ "2038", "Ori", "Cantrell", "56920", "Guinea" ], [ "2039", "May", "Horn", "47805", "Kuwait" ], [ "2040", "Skyler", "Clarke", "64131", "Lebanon" ], [ "2041", "Levi", "Foster", "S5Q 4B2", "Germany" ], [ "2042", "Veda", "Wilkinson", "L7Z 9M8", "Niger" ], [ "2043", "Brendan", "Levine", "L5B 9P4", "Nepal" ], [ "2044", "Carson", "Sullivan", "93066", "United Arab Emirates" ], [ "2045", "Steven", "Spencer", "F1V 9A7", "Pitcairn" ], [ "2046", "Halla", "Michael", "N1U 1E7", "Seychelles" ], [ "2047", "Jamal", "Hobbs", "G3D 6J7", "New Caledonia" ], [ "2048", "Steel", "Bush", "U8F 6T2", "Belize" ], [ "2049", "Ahmed", "Dennis", "M6E 3P3", "Afghanistan" ], [ "2050", "Aspen", "Estes", "32157", "American Samoa" ], [ "2051", "Peter", "Kelly", "91773", "Morocco" ], [ "2052", "Xandra", "Grimes", "66702", "Tokelau" ], [ "2053", "Michael", "Battle", "J2J 2N5", "Honduras" ], [ "2054", "Steel", "Wiggins", "34625", "United States Minor Outlying Islands" ], [ "2055", "Holmes", "Christian", "45402", "Liechtenstein" ], [ "2056", "Charles", "Barrett", "O4N 9N8", "Lebanon" ], [ "2057", "Hermione", "Soto", "C8E 4H8", "Congo" ], [ "2058", "Elton", "Maxwell", "89033", "Madagascar" ], [ "2059", "Zelda", "Burks", "B7W 5G7", "Sweden" ], [ "2060", "Lynn", "David", "P3D 5K5", "Chad" ], [ "2061", "Margaret", "Neal", "47438", "Western Sahara" ], [ "2062", "David", "Vaughan", "E3L 8D9", "Tokelau" ], [ "2063", "Vladimir", "Mcfarland", "U9V 1B3", "Belgium" ], [ "2064", "Uriah", "Harrington", "77051", "United Arab Emirates" ], [ "2065", "Noel", "Merritt", "J3G 7S1", "Dominican Republic" ], [ "2066", "Christine", "Key", "54543", "Niger" ], [ "2067", "Illana", "Hendricks", "07584", "Montserrat" ], [ "2068", "Pearl", "Lewis", "U5D 2V3", "Libyan Arab Jamahiriya" ], [ "2069", "Victoria", "Bullock", "17462", "Mauritania" ], [ "2070", "Benedict", "Marsh", "61479", "Guyana" ], [ "2071", "Quemby", "Washington", "99774", "French Polynesia" ], [ "2072", "Shelley", "Noble", "U8S 5Z4", "Philippines" ], [ "2073", "Olivia", "Britt", "72344", "Holy See (Vatican City State)" ], [ "2074", "Oleg", "Hendrix", "67567", "Cuba" ], [ "2075", "Hermione", "Gutierrez", "J5K 2J1", "Mozambique" ], [ "2076", "Myra", "Dean", "03485", "Andorra" ], [ "2077", "Deacon", "Moore", "34501", "Tunisia" ], [ "2078", "Dai", "Baird", "B2P 4R0", "Cambodia" ], [ "2079", "Levi", "Melton", "K7T 4B1", "Zimbabwe" ], [ "2080", "Ocean", "Dalton", "66801", "Gabon" ], [ "2081", "Selma", "Harding", "D7N 3J9", "Kyrgyzstan" ], [ "2082", "Maisie", "Gill", "56324", "Morocco" ], [ "2083", "Hillary", "Horne", "Y6O 6G3", "Cyprus" ], [ "2084", "Joel", "Stokes", "77952", "Burundi" ], [ "2085", "Channing", "Patterson", "G6B 8H4", "China" ], [ "2086", "Elliott", "Cleveland", "H3J 9U9", "Namibia" ], [ "2087", "Petra", "Gay", "44314", "Palestinian Territory, Occupied" ], [ "2088", "May", "Hatfield", "48918", "Faroe Islands" ], [ "2089", "Jemima", "Francis", "14347", "Libyan Arab Jamahiriya" ], [ "2090", "Kyla", "Hale", "46200", "Cocos (Keeling) Islands" ], [ "2091", "Veda", "Bruce", "F5W 9A6", "Mauritania" ], [ "2092", "Sybill", "Avila", "58663", "Angola" ], [ "2093", "Charissa", "Salazar", "35271", "Faroe Islands" ], [ "2094", "Steven", "Allison", "E5L 4A3", "Wallis and Futuna" ], [ "2095", "Kane", "Parks", "D5C 6K7", "Norfolk Island" ], [ "2096", "Alika", "Bishop", "S3P 3O3", "China" ], [ "2097", "James", "Bonner", "33277", "Canada" ], [ "2098", "Yoko", "Foster", "B5J 6P9", "Croatia" ], [ "2099", "Ivy", "Riggs", "94420", "Kiribati" ], [ "2100", "Urielle", "Rosa", "V6W 2A0", "Falkland Islands (Malvinas)" ], [ "2101", "Armando", "Shepherd", "Y5C 5W6", "Panama" ], [ "2102", "Haley", "Ingram", "B4H 5U5", "Fiji" ], [ "2103", "Brielle", "Dyer", "P2S 4H7", "Malawi" ], [ "2104", "Francis", "Brady", "24239", "Uruguay" ], [ "2105", "Fiona", "Webster", "72015", "Belize" ], [ "2106", "Aiko", "Santos", "K4H 1N0", "Saint Vincent and The Grenadines" ], [ "2107", "Amir", "Rivas", "02737", "Papua New Guinea" ], [ "2108", "Mira", "Kerr", "W6E 6Y2", "Sri Lanka" ], [ "2109", "Harrison", "Jensen", "50193", "Heard Island and Mcdonald Islands" ], [ "2110", "Merrill", "Randall", "21534", "Colombia" ], [ "2111", "Benjamin", "Howe", "N8M 4N6", "Turkmenistan" ], [ "2112", "Melyssa", "Kidd", "97657", "Cameroon" ], [ "2113", "Henry", "Moore", "95626", "Botswana" ], [ "2114", "Nash", "Peters", "K3V 9F3", "Wallis and Futuna" ], [ "2115", "Iliana", "Holt", "E9F 2Q8", "Netherlands Antilles" ], [ "2116", "Naomi", "Hood", "P6D 2G3", "Anguilla" ], [ "2117", "Ainsley", "Barron", "94273", "New Caledonia" ], [ "2118", "Daphne", "Acevedo", "A9I 9E4", "Bermuda" ], [ "2119", "Kiona", "Keith", "62523", "Saint Lucia" ], [ "2120", "Kirsten", "Mcgee", "97481", "Macedonia" ], [ "2121", "Emerald", "Franklin", "Q2I 6D6", "Botswana" ], [ "2122", "Hall", "Schroeder", "I2D 9L7", "Kenya" ], [ "2123", "Amaya", "Lynch", "50534", "Costa Rica" ], [ "2124", "Randall", "Hanson", "B4R 2S3", "United Arab Emirates" ], [ "2125", "Sasha", "Clarke", "50972", "United States Minor Outlying Islands" ], [ "2126", "Susan", "Sutton", "Z4T 6K3", "Solomon Islands" ], [ "2127", "Hiram", "Torres", "C8O 5O7", "Botswana" ], [ "2128", "Melanie", "Calhoun", "87097", "New Zealand" ], [ "2129", "Courtney", "Sutton", "07944", "Spain" ], [ "2130", "Reuben", "Beard", "U6Z 8N5", "Faroe Islands" ], [ "2131", "Jarrod", "Payne", "94171", "Turkey" ], [ "2132", "Vincent", "Potts", "V5Z 9G9", "Madagascar" ], [ "2133", "Kaye", "Kent", "O1B 2Z9", "Fiji" ], [ "2134", "Carol", "Green", "78719", "Comoros" ], [ "2135", "Cairo", "Combs", "G3C 8F0", "Indonesia" ], [ "2136", "Ebony", "Parker", "77377", "Portugal" ], [ "2137", "Gary", "Shaffer", "F1B 9W7", "French Guiana" ], [ "2138", "Gay", "Jimenez", "05726", "Nepal" ], [ "2139", "Patience", "Bryan", "60437", "Macao" ], [ "2140", "Zenaida", "Bowen", "V3S 1G7", "Mauritania" ], [ "2141", "Isaac", "Aguirre", "X8S 9K4", "Bermuda" ], [ "2142", "Lacy", "Harrell", "67362", "Bhutan" ], [ "2143", "Jael", "Grimes", "95612", "Anguilla" ], [ "2144", "Catherine", "Galloway", "45834", "Suriname" ], [ "2145", "Donna", "Burt", "N8C 2M8", "Burkina Faso" ], [ "2146", "Colleen", "Ball", "N3E 4U8", "Libyan Arab Jamahiriya" ], [ "2147", "Lael", "Brady", "01369", "Macedonia" ], [ "2148", "Kermit", "Logan", "Y5P 8Q8", "Honduras" ], [ "2149", "Katelyn", "Orr", "R7X 9W3", "Switzerland" ], [ "2150", "Alisa", "Glenn", "17831", "Timor-leste" ], [ "2151", "Lee", "Bean", "89445", "Guam" ], [ "2152", "Maryam", "Cotton", "57924", "Gambia" ], [ "2153", "Amena", "Love", "X1Z 6F7", "Thailand" ], [ "2154", "Tallulah", "Case", "87477", "Ecuador" ], [ "2155", "Carlos", "Sanford", "F6S 8J6", "Iraq" ], [ "2156", "Quamar", "David", "D5F 2M8", "Gabon" ], [ "2157", "Cassady", "Mays", "12786", "Netherlands" ], [ "2158", "Jenna", "Rowland", "88845", "China" ], [ "2159", "Justin", "Tanner", "66071", "Nepal" ], [ "2160", "Riley", "Santiago", "F8K 2Y6", "Gabon" ], [ "2161", "Iris", "Gallegos", "K9C 3T9", "Niue" ], [ "2162", "Kato", "Osborn", "N4C 2L8", "Puerto Rico" ], [ "2163", "Imogene", "Schroeder", "79710", "United States Minor Outlying Islands" ], [ "2164", "Olympia", "Hebert", "D4W 1L0", "Saint Lucia" ], [ "2165", "Skyler", "Burnett", "B2R 5H7", "Antarctica" ], [ "2166", "Faith", "Sims", "88476", "Egypt" ], [ "2167", "Emily", "Odom", "U7O 2P6", "Kuwait" ], [ "2168", "Carly", "Washington", "46063", "Benin" ], [ "2169", "Jolene", "Meyer", "B2B 9A4", "Australia" ], [ "2170", "Ayanna", "Conrad", "84360", "Northern Mariana Islands" ], [ "2171", "Violet", "Blankenship", "W2B 3U1", "New Caledonia" ], [ "2172", "Rhona", "Gallegos", "10931", "Montserrat" ], [ "2173", "Alice", "Hodges", "96181", "Burkina Faso" ], [ "2174", "Brody", "Sandoval", "68959", "Pitcairn" ], [ "2175", "Isabella", "Dunlap", "U8U 7Y8", "Afghanistan" ], [ "2176", "Jordan", "Golden", "55152", "Guam" ], [ "2177", "Gillian", "Thomas", "75633", "Djibouti" ], [ "2178", "Hollee", "Clay", "79847", "Panama" ], [ "2179", "Dane", "Knapp", "89535", "Armenia" ], [ "2180", "Avram", "Martin", "T4S 4E2", "Madagascar" ], [ "2181", "Fuller", "Newman", "47317", "Jamaica" ], [ "2182", "Nina", "Berry", "81360", "Mongolia" ], [ "2183", "Akeem", "Pratt", "56230", "Colombia" ], [ "2184", "Lacy", "Hayes", "U7T 4F5", "Cyprus" ], [ "2185", "Alfonso", "Mcclure", "06797", "Swaziland" ], [ "2186", "Cedric", "Love", "64720", "Bermuda" ], [ "2187", "Astra", "Fernandez", "H3I 1B0", "Mongolia" ], [ "2188", "Iliana", "Durham", "R8C 7M8", "Spain" ], [ "2189", "Gwendolyn", "Livingston", "C7X 5L1", "Northern Mariana Islands" ], [ "2190", "Caldwell", "Anderson", "69099", "Kuwait" ], [ "2191", "Risa", "Mejia", "P7A 4U7", "Israel" ], [ "2192", "Dora", "Navarro", "L6G 2O8", "Ireland" ], [ "2193", "Kirk", "Dean", "I2T 3E6", "Pitcairn" ], [ "2194", "Jackson", "Harvey", "53467", "Myanmar" ], [ "2195", "Thane", "Ballard", "87240", "Solomon Islands" ], [ "2196", "Nadine", "Estes", "62003", "Malta" ], [ "2197", "Candace", "Nunez", "57223", "Virgin Islands, British" ], [ "2198", "Zelda", "Odom", "X4V 7F5", "Mongolia" ], [ "2199", "Wylie", "Ayala", "S4I 4Q4", "Djibouti" ], [ "2200", "Azalia", "Page", "57239", "Korea, Republic of" ], [ "2201", "Joshua", "Burch", "R7B 1N7", "Samoa" ], [ "2202", "Basil", "Ramos", "71614", "Tunisia" ], [ "2203", "Jessica", "Shields", "U2D 4X3", "Syrian Arab Republic" ], [ "2204", "Clio", "Singleton", "I1B 1B0", "Ghana" ], [ "2205", "Astra", "Dotson", "62378", "Turks and Caicos Islands" ], [ "2206", "Hamish", "Tucker", "E4Z 3N3", "Anguilla" ], [ "2207", "Rachel", "Matthews", "U4I 8M3", "Trinidad and Tobago" ], [ "2208", "Clayton", "Ball", "95319", "India" ], [ "2209", "Quinn", "Wilkinson", "Y6M 3Q7", "Virgin Islands, U.S." ], [ "2210", "Phelan", "Talley", "00543", "Philippines" ], [ "2211", "Carol", "Brock", "M6X 4E2", "Gibraltar" ], [ "2212", "Nomlanga", "Robles", "56511", "Viet Nam" ], [ "2213", "Adrian", "Clay", "79479", "France" ], [ "2214", "Sara", "Riley", "B9N 5P4", "Peru" ], [ "2215", "Christine", "Sweeney", "W1Z 4S4", "French Polynesia" ], [ "2216", "Leilani", "Johnston", "W1C 8M8", "American Samoa" ], [ "2217", "Melyssa", "Lambert", "V1B 4P6", "Iraq" ], [ "2218", "Talon", "Delacruz", "Y3N 9R2", "Bulgaria" ], [ "2219", "Garth", "Jennings", "59667", "Malta" ], [ "2220", "Naida", "Coleman", "45456", "Finland" ], [ "2221", "Indigo", "Lopez", "77160", "Pitcairn" ], [ "2222", "Asher", "French", "99064", "British Indian Ocean Territory" ], [ "2223", "Vivian", "Mcgowan", "46310", "Oman" ], [ "2224", "Gwendolyn", "Cervantes", "48905", "Cocos (Keeling) Islands" ], [ "2225", "Logan", "Reid", "87376", "Ethiopia" ], [ "2226", "Bryar", "Wolfe", "75860", "Comoros" ], [ "2227", "Demetrius", "Hutchinson", "97252", "Dominican Republic" ], [ "2228", "Freya", "Becker", "04872", "United States" ], [ "2229", "Abel", "Brooks", "I7O 1M1", "Comoros" ], [ "2230", "Silas", "Mcguire", "04101", "Indonesia" ], [ "2231", "Quinn", "Fletcher", "B6E 2B0", "Niger" ], [ "2232", "Rooney", "Holden", "29294", "Micronesia" ], [ "2233", "Iris", "Hale", "N7W 6E9", "Greenland" ], [ "2234", "Candace", "Barry", "U8I 5A4", "Germany" ], [ "2235", "Yetta", "Ball", "62055", "Switzerland" ], [ "2236", "Dai", "Bentley", "P2Y 4C5", "Dominica" ], [ "2237", "Gannon", "Dunlap", "45728", "Fiji" ], [ "2238", "Chelsea", "Mays", "36498", "Guinea" ], [ "2239", "Ruth", "Mcguire", "62924", "Maldives" ], [ "2240", "Melissa", "Durham", "D6S 1A2", "Armenia" ], [ "2241", "Eaton", "Salinas", "53689", "Somalia" ], [ "2242", "Driscoll", "Cunningham", "31194", "Sweden" ], [ "2243", "Bevis", "Acosta", "V4M 9Z2", "Jamaica" ], [ "2244", "Anastasia", "Mcknight", "24878", "Sao Tome and Principe" ], [ "2245", "Anika", "Rowland", "45287", "Chile" ], [ "2246", "Dexter", "Rollins", "00684", "Iran, Islamic Republic of" ], [ "2247", "Brielle", "Irwin", "V4U 7R2", "Belgium" ], [ "2248", "Ocean", "Fields", "08544", "Croatia" ], [ "2249", "Sonia", "Solis", "C4X 1L5", "Niue" ], [ "2250", "Joseph", "Haney", "29567", "Argentina" ], [ "2251", "Lamar", "Heath", "81699", "Italy" ], [ "2252", "Raya", "Jordan", "R6K 7B3", "Spain" ], [ "2253", "Brody", "Frost", "34564", "Dominican Republic" ], [ "2254", "Ann", "Hawkins", "S3A 5K7", "Yemen" ], [ "2255", "Phillip", "Lindsay", "80544", "Sierra Leone" ], [ "2256", "Willa", "Maynard", "A6A 4C5", "Mexico" ], [ "2257", "Carolyn", "Mercer", "V8Z 1X5", "Zimbabwe" ], [ "2258", "Justin", "Cole", "68764", "Saint Vincent and The Grenadines" ], [ "2259", "Emmanuel", "Parks", "99769", "Latvia" ], [ "2260", "Isaiah", "Salazar", "H1K 1X3", "Turks and Caicos Islands" ], [ "2261", "Vance", "Porter", "49607", "Costa Rica" ], [ "2262", "Igor", "Kim", "99489", "Turkmenistan" ], [ "2263", "Emi", "Graves", "F4M 5L8", "El Salvador" ], [ "2264", "Griffith", "Monroe", "11550", "Tanzania, United Republic of" ], [ "2265", "Iliana", "Coffey", "30220", "Albania" ], [ "2266", "Jemima", "Guthrie", "69283", "Saint Pierre and Miquelon" ], [ "2267", "Zenia", "Farrell", "91872", "Tanzania, United Republic of" ], [ "2268", "Lucas", "Chambers", "L5Z 1W0", "Bouvet Island" ], [ "2269", "Zenaida", "Valenzuela", "31700", "Guam" ], [ "2270", "Bradley", "Wynn", "21222", "Lithuania" ], [ "2271", "Maite", "Richard", "H4D 7X0", "Cameroon" ], [ "2272", "Moses", "House", "Y3Z 3K7", "Saint Vincent and The Grenadines" ], [ "2273", "Erich", "Petersen", "U4N 9R7", "Rwanda" ], [ "2274", "Stephanie", "Zimmerman", "70097", "Malawi" ], [ "2275", "Rylee", "Schneider", "15645", "Gibraltar" ], [ "2276", "Zia", "Craig", "H1K 1N9", "Norway" ], [ "2277", "Fiona", "Chaney", "Y4U 7K8", "San Marino" ], [ "2278", "Gil", "Sherman", "64720", "Wallis and Futuna" ], [ "2279", "Raja", "Sandoval", "11225", "Lithuania" ], [ "2280", "Illana", "Wyatt", "A2M 9O2", "Brazil" ], [ "2281", "Declan", "Howell", "E9V 8J5", "San Marino" ], [ "2282", "Warren", "Cooper", "47160", "Guyana" ], [ "2283", "Alyssa", "Juarez", "S7G 8F2", "Sweden" ], [ "2284", "Quynn", "Long", "P1P 5Y4", "Mexico" ], [ "2285", "Dalton", "Booker", "I5T 1R3", "Mauritius" ], [ "2286", "Lunea", "Mclaughlin", "I3F 6D4", "Togo" ], [ "2287", "Irene", "Brock", "04760", "Tajikistan" ], [ "2288", "Raven", "Floyd", "R2N 2Y5", "Philippines" ], [ "2289", "Nichole", "Farmer", "81213", "Seychelles" ], [ "2290", "Sophia", "Mcdonald", "86291", "Chile" ], [ "2291", "Nehru", "Matthews", "60732", "Central African Republic" ], [ "2292", "Marah", "Nelson", "44533", "Kenya" ], [ "2293", "Marvin", "Lyons", "M7Y 1Q6", "Somalia" ], [ "2294", "Ian", "Fernandez", "D9U 8B6", "Turkey" ], [ "2295", "Gretchen", "Dotson", "48294", "China" ], [ "2296", "Brady", "Weaver", "S4U 4I8", "Burundi" ], [ "2297", "Ella", "Salas", "73771", "Sao Tome and Principe" ], [ "2298", "Martha", "Irwin", "06554", "Timor-leste" ], [ "2299", "Penelope", "Pratt", "S1R 4L4", "Gabon" ], [ "2300", "Kenyon", "Dale", "64548", "Zimbabwe" ], [ "2301", "Henry", "Myers", "07614", "United Arab Emirates" ], [ "2302", "Chaney", "Dunlap", "18388", "French Southern Territories" ], [ "2303", "Palmer", "Le", "10807", "Colombia" ], [ "2304", "Kaseem", "Madden", "U4E 6L9", "Guyana" ], [ "2305", "Grant", "Anthony", "F3K 4D8", "Trinidad and Tobago" ], [ "2306", "Denton", "Moore", "I5O 4I5", "Belize" ], [ "2307", "Regan", "Pittman", "U8T 9M1", "Romania" ], [ "2308", "Valentine", "Hunt", "E9O 6H6", "Poland" ], [ "2309", "Abraham", "Love", "X1T 4K0", "Philippines" ], [ "2310", "Maggie", "Gaines", "W5Z 6L4", "Chad" ], [ "2311", "Kylynn", "Sears", "53419", "Ghana" ], [ "2312", "Abel", "Hudson", "O6C 6K5", "Malaysia" ], [ "2313", "Aladdin", "Brady", "16465", "Antarctica" ], [ "2314", "Laurel", "Bush", "42295", "Kyrgyzstan" ], [ "2315", "Cameron", "Shepherd", "Y8R 5L7", "Finland" ], [ "2316", "Colin", "Barker", "H8Q 5L0", "Aruba" ], [ "2317", "Nichole", "Stephens", "B8P 3D5", "Qatar" ], [ "2318", "Mary", "Dorsey", "J7D 1E5", "Iceland" ], [ "2319", "Yetta", "Dillon", "I7X 9D3", "Hong Kong" ], [ "2320", "Hope", "May", "L5W 1T9", "Taiwan, Province of China" ], [ "2321", "Daphne", "Barr", "W2B 9G2", "Korea, Republic of" ], [ "2322", "Melissa", "Hartman", "17607", "Reunion" ], [ "2323", "Acton", "Merritt", "U7M 3Q5", "Cape Verde" ], [ "2324", "Alika", "Weeks", "45475", "Singapore" ], [ "2325", "Fitzgerald", "Rowe", "Z3Z 2B6", "Israel" ], [ "2326", "Frances", "Valentine", "54329", "Kyrgyzstan" ], [ "2327", "Hollee", "Poole", "56101", "Saint Kitts and Nevis" ], [ "2328", "Melissa", "Stafford", "R5C 7V0", "Philippines" ], [ "2329", "Patience", "Jones", "61516", "Mauritius" ], [ "2330", "Uta", "Sloan", "K1B 9R2", "Timor-leste" ], [ "2331", "Brent", "West", "69310", "Burundi" ], [ "2332", "Otto", "Olsen", "88849", "Monaco" ], [ "2333", "Blossom", "Soto", "E2Q 6E6", "Ukraine" ], [ "2334", "Anastasia", "Stanton", "S8D 3U5", "Mexico" ], [ "2335", "Nyssa", "Massey", "A4G 8G7", "Ireland" ], [ "2336", "Brian", "Moreno", "T6O 4D7", "Myanmar" ], [ "2337", "Fiona", "Price", "03826", "Benin" ], [ "2338", "Wyoming", "Knowles", "I5M 7T3", "Chad" ], [ "2339", "Iola", "Noble", "95251", "Tunisia" ], [ "2340", "Cameran", "Montgomery", "35748", "Korea" ], [ "2341", "Wesley", "Sims", "J6O 7C0", "Hungary" ], [ "2342", "Mona", "Gates", "J6Y 3E2", "Tokelau" ], [ "2343", "Dominique", "Sellers", "G6U 7I2", "Sudan" ], [ "2344", "Destiny", "Frazier", "Y2P 5X6", "Madagascar" ], [ "2345", "Kelsie", "Stokes", "78561", "Yemen" ], [ "2346", "Julie", "Jordan", "U5H 4H0", "Myanmar" ], [ "2347", "Xaviera", "Hodge", "36452", "Turkey" ], [ "2348", "Cain", "Boyd", "74543", "Lebanon" ], [ "2349", "Devin", "Burch", "94879", "Cyprus" ], [ "2350", "Michelle", "Manning", "V7T 4A3", "New Zealand" ], [ "2351", "Quintessa", "Chapman", "95379", "Faroe Islands" ], [ "2352", "Danielle", "Wells", "27722", "Colombia" ], [ "2353", "Faith", "Decker", "04881", "Canada" ], [ "2354", "Gannon", "Chapman", "07687", "Israel" ], [ "2355", "Jayme", "Black", "A6L 9W1", "Jordan" ], [ "2356", "Zenia", "Cooley", "A6X 1B7", "Greenland" ], [ "2357", "Maris", "Burton", "J4G 1Y0", "Ecuador" ], [ "2358", "Rina", "Vazquez", "G3V 7G6", "Russian Federation" ], [ "2359", "Nina", "Stanton", "E7Z 1W0", "Dominica" ], [ "2360", "Alexandra", "Jenkins", "C6N 4R4", "Morocco" ], [ "2361", "Jerome", "Chen", "68955", "Israel" ], [ "2362", "Clementine", "Robbins", "X7I 7T3", "Croatia" ], [ "2363", "Nigel", "Guthrie", "A4N 6X8", "French Southern Territories" ], [ "2364", "Xaviera", "Griffith", "90489", "Cuba" ], [ "2365", "Marsden", "Best", "U4B 5R7", "Estonia" ], [ "2366", "Ebony", "Benson", "H7C 7F7", "Anguilla" ], [ "2367", "Kylie", "Hansen", "38932", "Eritrea" ], [ "2368", "Iola", "Copeland", "P4X 9M4", "Rwanda" ], [ "2369", "Jorden", "Green", "48018", "Namibia" ], [ "2370", "Hamish", "Porter", "L6F 8L1", "Taiwan, Province of China" ], [ "2371", "Ezra", "Taylor", "09148", "French Southern Territories" ], [ "2372", "Dara", "Pratt", "00558", "Saint Kitts and Nevis" ], [ "2373", "Oliver", "Holt", "C4N 5Z7", "Thailand" ], [ "2374", "Kato", "Mcgee", "17017", "Micronesia" ], [ "2375", "Fuller", "Rogers", "M8F 6Y7", "French Polynesia" ], [ "2376", "Carol", "Stuart", "55980", "Sudan" ], [ "2377", "Wayne", "Nichols", "37344", "Chile" ], [ "2378", "Lars", "Gilbert", "27076", "Micronesia" ], [ "2379", "Todd", "Rollins", "M4I 4X8", "Virgin Islands, U.S." ], [ "2380", "Colorado", "Justice", "68795", "Yemen" ], [ "2381", "Jordan", "Chang", "11149", "Mayotte" ], [ "2382", "Troy", "Haynes", "N2N 1N8", "Reunion" ], [ "2383", "Amity", "Snyder", "17785", "Argentina" ], [ "2384", "Kennan", "Turner", "30041", "Brazil" ], [ "2385", "Dorothy", "Gates", "B7Z 6V4", "Ghana" ], [ "2386", "Ariana", "Rojas", "70797", "Eritrea" ], [ "2387", "Desirae", "Joyner", "63493", "Maldives" ], [ "2388", "Marsden", "Barton", "36343", "Chile" ], [ "2389", "Graham", "Greer", "65152", "Cayman Islands" ], [ "2390", "Cameron", "Edwards", "89276", "Montserrat" ], [ "2391", "Bradley", "White", "80364", "United Kingdom" ], [ "2392", "Finn", "Cote", "G9P 1P0", "Ghana" ], [ "2393", "Geoffrey", "Becker", "O5G 4L4", "Wallis and Futuna" ], [ "2394", "Hayden", "Estes", "Q8G 7F9", "Togo" ], [ "2395", "Quinlan", "Garrett", "R2C 3E7", "Uganda" ], [ "2396", "Haviva", "Harrington", "64198", "Bahamas" ], [ "2397", "Brennan", "Hodge", "35327", "Paraguay" ], [ "2398", "Halee", "Sykes", "S6J 4S4", "Costa Rica" ], [ "2399", "Mikayla", "Ruiz", "21686", "Malaysia" ], [ "2400", "Macy", "Stanley", "F6D 6C4", "Luxembourg" ], [ "2401", "Petra", "Miles", "O7X 2D2", "Tokelau" ], [ "2402", "Oprah", "Mendez", "88994", "France" ], [ "2403", "Upton", "Silva", "17878", "French Southern Territories" ], [ "2404", "Wade", "Pennington", "S8J 3P2", "Malaysia" ], [ "2405", "Gannon", "Riddle", "I4A 2H9", "Somalia" ], [ "2406", "Jana", "Myers", "04982", "Philippines" ], [ "2407", "Brooke", "Hale", "98272", "Lithuania" ], [ "2408", "Hashim", "Mendez", "00144", "Saint Helena" ], [ "2409", "Blythe", "Hanson", "U5Z 6P4", "Saint Helena" ], [ "2410", "Michelle", "Madden", "B4R 1I9", "Ireland" ], [ "2411", "Deirdre", "Patton", "B4H 1N7", "Georgia" ], [ "2412", "Nathaniel", "Chandler", "W1V 8R4", "Sierra Leone" ], [ "2413", "Tamekah", "Murray", "I8M 1W8", "Guatemala" ], [ "2414", "Naida", "Boyle", "V4S 2N2", "United Arab Emirates" ], [ "2415", "Hiroko", "Winters", "K8G 3R9", "Barbados" ], [ "2416", "Palmer", "Guy", "A4H 5L1", "Saudi Arabia" ], [ "2417", "Hermione", "Nicholson", "76147", "Marshall Islands" ], [ "2418", "Russell", "Boyd", "66149", "Switzerland" ], [ "2419", "Gretchen", "Robles", "B9L 1J7", "Spain" ], [ "2420", "Leah", "Gibbs", "16682", "Vanuatu" ], [ "2421", "Amir", "Carlson", "A5C 6F2", "Myanmar" ], [ "2422", "Merrill", "Ratliff", "A6E 9B2", "Tonga" ], [ "2423", "Wyatt", "David", "P8G 2M1", "Kiribati" ], [ "2424", "Violet", "Boyle", "P5X 7B0", "Denmark" ], [ "2425", "Jared", "Myers", "22131", "Kyrgyzstan" ], [ "2426", "Lavinia", "Stephenson", "55537", "Turks and Caicos Islands" ], [ "2427", "Zachary", "Tyson", "C4O 7V4", "Macedonia" ], [ "2428", "Emma", "Clark", "A7Z 2Z1", "Guam" ], [ "2429", "Aaron", "Montoya", "Q3U 2X1", "Bahrain" ], [ "2430", "Dylan", "Roach", "81238", "French Guiana" ], [ "2431", "Baxter", "Rosario", "H7B 1R2", "Suriname" ], [ "2432", "Shad", "Bolton", "D1W 5X0", "Barbados" ], [ "2433", "Hasad", "Hines", "D9U 3H1", "Ukraine" ], [ "2434", "Maggy", "French", "M3E 5H8", "Nicaragua" ], [ "2435", "Evangeline", "Jenkins", "57732", "Nigeria" ], [ "2436", "Eaton", "Shannon", "56854", "Namibia" ], [ "2437", "Keaton", "Barber", "G5V 7T0", "Svalbard and Jan Mayen" ], [ "2438", "Lester", "Love", "J5Q 8H3", "United Kingdom" ], [ "2439", "Olivia", "Foley", "16284", "Mayotte" ], [ "2440", "Inez", "Craig", "98947", "Poland" ], [ "2441", "Desirae", "Jacobson", "25950", "French Polynesia" ], [ "2442", "Amethyst", "Robertson", "78840", "Timor-leste" ], [ "2443", "Rahim", "Day", "61420", "Maldives" ], [ "2444", "Kevyn", "Mccarty", "X7T 8Z3", "Guam" ], [ "2445", "Logan", "Malone", "B6F 8N0", "Madagascar" ], [ "2446", "Kathleen", "Cote", "L4R 6W9", "Congo" ], [ "2447", "Porter", "Mclean", "G1Z 1W9", "Mauritius" ], [ "2448", "Reagan", "Chapman", "86314", "Palestinian Territory, Occupied" ], [ "2449", "Veda", "Harrington", "R7W 1K4", "Congo" ], [ "2450", "Dominique", "Hewitt", "P5K 7L4", "San Marino" ], [ "2451", "Zelda", "Orr", "Z5B 6V1", "Greenland" ], [ "2452", "Natalie", "Kane", "10491", "Belgium" ], [ "2453", "Elizabeth", "Bright", "R3V 2R4", "Bangladesh" ], [ "2454", "Evan", "Knapp", "W3Z 3I5", "Mauritius" ], [ "2455", "Unity", "Armstrong", "82986", "Kiribati" ], [ "2456", "Arden", "Winters", "C7D 4M2", "Sweden" ], [ "2457", "Hayfa", "Henderson", "B8Z 3V3", "Latvia" ], [ "2458", "Ocean", "Delacruz", "Z3Z 2H8", "Tonga" ], [ "2459", "Carter", "Harding", "R1Z 8J4", "Ireland" ], [ "2460", "Harriet", "Simmons", "54757", "Indonesia" ], [ "2461", "Sopoline", "Hicks", "I5A 6O2", "Argentina" ], [ "2462", "Jenette", "Ramos", "I4V 3H6", "Portugal" ], [ "2463", "Abigail", "Berg", "E6P 6L0", "United States" ], [ "2464", "Sybill", "Fox", "02319", "Svalbard and Jan Mayen" ], [ "2465", "Wyoming", "Jarvis", "I1R 7V9", "Palestinian Territory, Occupied" ], [ "2466", "Cynthia", "English", "17983", "Israel" ], [ "2467", "Jerry", "Little", "33846", "Mauritius" ], [ "2468", "Quintessa", "Donaldson", "V4N 2K1", "China" ], [ "2469", "Anne", "Potter", "78596", "United States Minor Outlying Islands" ], [ "2470", "Madonna", "Hart", "A4A 4T8", "Bahrain" ], [ "2471", "Madeline", "Walls", "Y3D 4T3", "Comoros" ], [ "2472", "Fleur", "Blevins", "D1T 9P6", "Guinea-bissau" ], [ "2473", "Jaden", "Webb", "13917", "Lesotho" ], [ "2474", "Abdul", "Fleming", "A8A 3Y3", "Canada" ], [ "2475", "Blaze", "Carroll", "41059", "Marshall Islands" ], [ "2476", "David", "Hoover", "29132", "Algeria" ], [ "2477", "Renee", "Nieves", "35843", "Egypt" ], [ "2478", "Jaime", "Mcclure", "R5K 6B5", "Liechtenstein" ], [ "2479", "Deborah", "Fletcher", "70399", "Equatorial Guinea" ], [ "2480", "Otto", "Lopez", "72417", "Belarus" ], [ "2481", "Bo", "Walls", "F4M 8X8", "Latvia" ], [ "2482", "Jamal", "Adams", "N9X 3A2", "Spain" ], [ "2483", "Silas", "Gardner", "25259", "French Guiana" ], [ "2484", "Aladdin", "Morin", "45179", "Sweden" ], [ "2485", "Dawn", "Grant", "53613", "Grenada" ], [ "2486", "Forrest", "Gay", "53606", "Cayman Islands" ], [ "2487", "Lavinia", "Murphy", "S5L 6X9", "Turkey" ], [ "2488", "Sylvia", "Wolfe", "37280", "Indonesia" ], [ "2489", "Wynter", "Adkins", "37391", "Russian Federation" ], [ "2490", "Iola", "Frank", "I9H 1K7", "Nigeria" ], [ "2491", "Emmanuel", "Hester", "Z6E 3I4", "Guinea" ], [ "2492", "Karina", "Christian", "V8M 6F3", "Honduras" ], [ "2493", "Malcolm", "Holden", "I7J 6U7", "Austria" ], [ "2494", "Moana", "Holmes", "80402", "Israel" ], [ "2495", "Ramona", "Hewitt", "U6B 7A6", "Guadeloupe" ], [ "2496", "Nicholas", "Terry", "V8J 5D9", "Costa Rica" ], [ "2497", "Erica", "Dunlap", "91596", "Kazakhstan" ], [ "2498", "Logan", "Harper", "R7V 3T5", "Guinea-bissau" ], [ "2499", "Bert", "Ortega", "74557", "Paraguay" ], [ "2500", "Cameron", "Ortiz", "P9C 5B6", "Eritrea" ] ] }PK!Iī3datatables/extensions/Scroller/examples/simple.htmlnu[ Scroller example - Basic initialisation

    Scroller example Basic initialisation

    Scroller is a plug-in for DataTables which enhances DataTables' built-in scrolling features to allow large amounts of data to be rendered on page very quickly. This is done by Scroller through the use of a virtual rendering technique that will render only the part of the table that is actually required for the current view.

    Note that Scroller assumes that all rows are of the same height (in order to preform the required calculations. You can use td { white-space: nowrap; } in your CSS to ensure that text in rows does not wrap.

    This example shows how Scroller for DataTables can be initialised by simply including the character S in sDom (note that the S must come after the t in sDom). Deferred rendering an and Ajax data source are also used in this example.

    ID First name Last name ZIP / Post code Country
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { $('#example').DataTable( { ajax: "data/2500.txt", deferRender: true, dom: "frtiS", scrollY: 200, scrollCollapse: true } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!Cdatatables/extensions/Scroller/examples/server-side_processing.htmlnu[ Scroller example - Server-side processing (5,000,000 rows)

    Scroller example Server-side processing (5,000,000 rows)

    DataTables' server-side processing mode is a feature that naturally fits in with Scroller perfectly. Server-side processing can be used to show large data sets, with the server being used to do the data processing, and Scroller optimising the display of the data in a scrolling viewport.

    When using server-side processing, Scroller will wait a small amount of time to allow the scrolling to finish before requesting more data from the server (200mS by default). This prevents you from DoSing your own server!

    This example shows Scroller using server-side processing mode and 5 million rows. Important This particular example uses ajaxDT as a function to 'fake' the data to show Scroller's ability to show large data sets. It does not have a real database behind it! You would normally not use ajaxDT as a function to generate data, but rather as a url for where to fetch the real data!

    In this example we also enable the loadingIndicator option of Scroller to show the end user what is happening when they scroll passed the currently loaded data.

    ID First name Last name ZIP / Post code Country
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { $('#example').DataTable( { serverSide: true, ordering: false, searching: false, ajax: function ( data, callback, settings ) { var out = []; for ( var i=data.start, ien=data.start+data.length ; i<ien ; i++ ) { out.push( [ i+'-1', i+'-2', i+'-3', i+'-4', i+'-5' ] ); } setTimeout( function () { callback( { draw: data.draw, data: out, recordsTotal: 5000000, recordsFiltered: 5000000 } ); }, 50 ); }, dom: "rtiS", scrollY: 200, scroller: { loadingIndicator: true } } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!?i<datatables/extensions/Scroller/examples/large_js_source.htmlnu[ Scroller example - Client-side data source (50,000 rows)

    Scroller example Client-side data source (50,000 rows)

    This example is completely artificial in that the data generated is created on the client-side by just looping around a Javascript array and then passing that to DataTables. However, it does show quite nicely that DataTables and Scroller can cope with large amounts of data on the client-side quite nicely. Typically data such as this would be Ajax sourced and server-side processing should be considered.

    Please be aware that the performance of this page will depend on your browser as the array of data is generated - for example IE6 will crawl!

    ID First name Last name ZIP / Post code Country
    • Javascript
    • HTML
    • CSS
    • Ajax
    • Server-side script

    The Javascript shown below is used to initialise the table shown in this example:

    $(document).ready(function() { var data = []; for ( var i=0 ; i<50000 ; i++ ) { data.push( [ i, i, i, i, i ] ); } var oTable = $('#example').dataTable( { data: data, deferRender: true, dom: "frtiS", scrollY: 200, scrollCollapse: true } ); } );

    In addition to the above code, the following Javascript library files are loaded for use in this example:

    The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

    This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

    The following CSS library files are loaded for use in this example to provide the styling of the table:

    This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

    The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

    PK!q2datatables/extensions/Scroller/examples/index.htmlnu[ Scroller examples - Scroller examples

    Scroller example Scroller examples

    Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on screen every quickly. What the virtual rendering means is that only the visible portion of the table (and a bit to either side to make the scrolling smooth) is drawn, while the scrolling container gives the visual impression that the whole table is visible. This is done by making use of the pagination abilities of DataTables and moving the table around in the scrolling container DataTables adds to the page. The scrolling container is forced to the height it would be for the full table display using an extra element.

    Scroller is initialised by simply including the letter S in the domDT for the table you want to have this feature enabled on. Note that the S must come after the t parameter in domDT.

    Key features include:

    • Speed! The aim of Scroller for DataTables is to make rendering large data sets fast
    • Full compatibility with DataTables' deferred rendering for maximum speed
    • Integration with state saving in DataTables (scrolling position is saved)
    • Easy to use
    PK!6hh/datatables/extensions/Scroller/2suwm3/index.phpnu[PK!0wjj2datatables/extensions/Scroller/js/qh8zaj/index.phpnu[PK! ((<datatables/extensions/Scroller/js/dataTables.scroller.min.jsnu[/*! Scroller 1.2.2 ©2011-2014 SpryMedia Ltd - datatables.net/license */ (function(m,n,k){var l=function(e){var g=function(a,b){!this instanceof g?alert("Scroller warning: Scroller must be initialised with the 'new' keyword."):("undefined"==typeof b&&(b={}),this.s={dt:a,tableTop:0,tableBottom:0,redrawTop:0,redrawBottom:0,autoHeight:!0,viewportRows:0,stateTO:null,drawTO:null,heights:{jump:null,page:null,virtual:null,scroll:null,row:null,viewport:null},topRowFloat:0,scrollDrawDiff:null,loaderVisible:!1},this.s=e.extend(this.s,g.oDefaults,b),this.s.heights.row=this.s.rowHeight, this.dom={force:n.createElement("div"),scroller:null,table:null,loader:null},this.s.dt.oScroller=this,this._fnConstruct())};g.prototype={fnRowToPixels:function(a,b,c){a=c?this._domain("virtualToPhysical",a*this.s.heights.row):this.s.baseScrollTop+(a-this.s.baseRowTop)*this.s.heights.row;return b||b===k?parseInt(a,10):a},fnPixelsToRow:function(a,b,c){var d=a-this.s.baseScrollTop,a=c?this._domain("physicalToVirtual",a)/this.s.heights.row:d/this.s.heights.row+this.s.baseRowTop;return b||b===k?parseInt(a, 10):a},fnScrollToRow:function(a,b){var c=this,d=!1,f=this.fnRowToPixels(a),h=a-(this.s.displayBuffer-1)/2*this.s.viewportRows;0>h&&(h=0);if((f>this.s.redrawBottom||ftable",this.dom.scroller)[0];this.dom.table.style.position="absolute";this.dom.table.style.top="0px";this.dom.table.style.left="0px";e(this.s.dt.nTableWrapper).addClass("DTS");this.s.loadingIndicator&&(this.dom.loader=e('
    '+this.s.dt.oLanguage.sLoadingRecords+"
    ").css("display","none"),e(this.dom.scroller.parentNode).css("position","relative").append(this.dom.loader));this.s.heights.row&&"auto"!=this.s.heights.row&& (this.s.autoHeight=!1);this.fnMeasure(!1);this.s.ingnoreScroll=!0;this.s.stateSaveThrottle=this.s.dt.oApi._fnThrottle(function(){a.s.dt.oApi._fnSaveState(a.s.dt)},500);e(this.dom.scroller).on("scroll.DTS",function(){a._fnScroll.call(a)});e(this.dom.scroller).on("touchstart.DTS",function(){a._fnScroll.call(a)});this.s.dt.aoDrawCallback.push({fn:function(){a.s.dt.bInitialised&&a._fnDrawCallback.call(a)},sName:"Scroller"});e(m).on("resize.DTS",function(){a.fnMeasure(false);a._fnInfo()});var b=!0;this.s.dt.oApi._fnCallbackReg(this.s.dt, "aoStateSaveParams",function(c,d){if(b&&a.s.dt.oLoadedState){d.iScroller=a.s.dt.oLoadedState.iScroller;d.iScrollerTopRow=a.s.dt.oLoadedState.iScrollerTopRow;b=false}else{d.iScroller=a.dom.scroller.scrollTop;d.iScrollerTopRow=a.s.topRowFloat}},"Scroller_State");this.s.dt.oLoadedState&&(this.s.topRowFloat=this.s.dt.oLoadedState.iScrollerTopRow||0);this.s.dt.aoDestroyCallback.push({sName:"Scroller",fn:function(){e(m).off("resize.DTS");e(a.dom.scroller).off("touchstart.DTS scroll.DTS");e(a.s.dt.nTableWrapper).removeClass("DTS"); e("div.DTS_Loading",a.dom.scroller.parentNode).remove();a.dom.table.style.position="";a.dom.table.style.top="";a.dom.table.style.left=""}})}else this.s.dt.oApi._fnLog(this.s.dt,0,"Pagination must be enabled for Scroller")},_fnScroll:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d;if(!this.s.skip&&!this.s.ingnoreScroll)if(this.s.dt.bFiltered||this.s.dt.bSorted)this.s.lastScrollTop=0;else{this._fnInfo();clearTimeout(this.s.stateTO);this.s.stateTO=setTimeout(function(){a.s.dt.oApi._fnSaveState(a.s.dt)}, 250);if(cthis.s.redrawBottom){var f=Math.ceil((this.s.displayBuffer-1)/2*this.s.viewportRows);Math.abs(c-this.s.lastScrollTop)>b.viewport||this.s.ani?(d=parseInt(this._domain("physicalToVirtual",c)/b.row,10)-f,this.s.topRowFloat=this._domain("physicalToVirtual",c)/b.row):(d=this.fnPixelsToRow(c)-f,this.s.topRowFloat=this.fnPixelsToRow(c,!1));0>=d?d=0:d+this.s.dt._iDisplayLength>this.s.dt.fnRecordsDisplay()?(d=this.s.dt.fnRecordsDisplay()-this.s.dt._iDisplayLength,0>d&&(d=0)): 0!==d%2&&d++;if(d!=this.s.dt._iDisplayStart&&(this.s.tableTop=e(this.s.dt.nTable).offset().top,this.s.tableBottom=e(this.s.dt.nTable).height()+this.s.tableTop,b=function(){if(a.s.scrollDrawReq===null)a.s.scrollDrawReq=c;a.s.dt._iDisplayStart=d;a.s.dt.oApi._fnCalculateEnd&&a.s.dt.oApi._fnCalculateEnd(a.s.dt);a.s.dt.oApi._fnDraw(a.s.dt)},this.s.dt.oFeatures.bServerSide?(clearTimeout(this.s.drawTO),this.s.drawTO=setTimeout(b,this.s.serverWait)):b(),this.dom.loader&&!this.s.loaderVisible))this.dom.loader.css("display", "block"),this.s.loaderVisible=!0}this.s.lastScrollTop=c;this.s.stateSaveThrottle()}},_domain:function(a,b){var c=this.s.heights,d;if(c.virtual===c.scroll){d=(c.virtual-c.viewport)/(c.scroll-c.viewport);if("virtualToPhysical"===a)return b/d;if("physicalToVirtual"===a)return b*d}var e=(c.scroll-c.viewport)/2,h=(c.virtual-c.viewport)/2;d=h/(e*e);if("virtualToPhysical"===a){if(bb?c.scroll:2*e-Math.pow(b/d,0.5)}if("physicalToVirtual"===a){if(bb?c.virtual:2*h-b*b*d}},_fnDrawCallback:function(){var a=this,b=this.s.heights,c=this.dom.scroller.scrollTop,d=e(this.s.dt.nTable).height(),f=this.s.dt._iDisplayStart,h=this.s.dt._iDisplayLength,g=this.s.dt.fnRecordsDisplay();this.s.skip=!0;this._fnScrollForce();c=0===f?this.s.topRowFloat*b.row:f+h>=g?b.scroll-(g-this.s.topRowFloat)*b.row:this._domain("virtualToPhysical",this.s.topRowFloat*b.row);this.dom.scroller.scrollTop=c;this.s.baseScrollTop=c;this.s.baseRowTop=this.s.topRowFloat; var j=c-(this.s.topRowFloat-f)*b.row;0===f?j=0:f+h>=g&&(j=b.scroll-d);this.dom.table.style.top=j+"px";this.s.tableTop=j;this.s.tableBottom=d+this.s.tableTop;d=(c-this.s.tableTop)*this.s.boundaryScale;this.s.redrawTop=c-d;this.s.redrawBottom=c+d;this.s.skip=!1;this.s.dt.oFeatures.bStateSave&&null!==this.s.dt.oLoadedState&&"undefined"!=typeof this.s.dt.oLoadedState.iScroller?((c=(this.s.dt.sAjaxSource||a.s.dt.ajax)&&!this.s.dt.oFeatures.bServerSide?!0:!1)&&2==this.s.dt.iDraw||!c&&1==this.s.dt.iDraw)&& setTimeout(function(){e(a.dom.scroller).scrollTop(a.s.dt.oLoadedState.iScroller);a.s.redrawTop=a.s.dt.oLoadedState.iScroller-b.viewport/2;setTimeout(function(){a.s.ingnoreScroll=!1},0)},0):a.s.ingnoreScroll=!1;setTimeout(function(){a._fnInfo.call(a)},0);this.dom.loader&&this.s.loaderVisible&&(this.dom.loader.css("display","none"),this.s.loaderVisible=!1)},_fnScrollForce:function(){var a=this.s.heights;a.virtual=a.row*this.s.dt.fnRecordsDisplay();a.scroll=a.virtual;1E6").appendTo(c),f=e('
    ');for(e("tbody tr:lt(4)",b).clone().appendTo(d);3>e("tr",d).length;)d.append(" ");e("div."+a.oClasses.sScrollBody,f).append(c);a._bInitComplete?a=b.parentNode:(this.s.dt.nHolding||(this.s.dt.nHolding=e("
    ").insertBefore(this.s.dt.nTable)), a=this.s.dt.nHolding);f.appendTo(a);this.s.heights.row=e("tr",d).eq(1).outerHeight();f.remove()},_fnInfo:function(){if(this.s.dt.oFeatures.bInfo){var a=this.s.dt,b=a.oLanguage,c=this.dom.scroller.scrollTop,d=Math.floor(this.fnPixelsToRow(c,!1,this.s.ani)+1),f=a.fnRecordsTotal(),h=a.fnRecordsDisplay(),c=Math.ceil(this.fnPixelsToRow(c+this.s.heights.viewport,!1,this.s.ani)),c=h *
  • Speed! The aim of Scroller for DataTables is to make rendering large data sets fast
  • *
  • Full compatibility with deferred rendering in DataTables 1.9 for maximum speed
  • *
  • Display millions of rows
  • *
  • Integration with state saving in DataTables (scrolling position is saved)
  • *
  • Easy to use
  • *
* * @class * @constructor * @global * @param {object} oDT DataTables settings object * @param {object} [oOpts={}] Configuration object for FixedColumns. Options * are defined by {@link Scroller.defaults} * * @requires jQuery 1.7+ * @requires DataTables 1.9.0+ * * @example * $(document).ready(function() { * $('#example').dataTable( { * "sScrollY": "200px", * "sAjaxSource": "media/dataset/large.txt", * "sDom": "frtiS", * "bDeferRender": true * } ); * } ); */ var Scroller = function ( oDTSettings, oOpts ) { /* Sanity check - you just know it will happen */ if ( ! this instanceof Scroller ) { alert( "Scroller warning: Scroller must be initialised with the 'new' keyword." ); return; } if ( typeof oOpts == 'undefined' ) { oOpts = {}; } /** * Settings object which contains customisable information for the Scroller instance * @namespace * @private * @extends Scroller.defaults */ this.s = { /** * DataTables settings object * @type object * @default Passed in as first parameter to constructor */ "dt": oDTSettings, /** * Pixel location of the top of the drawn table in the viewport * @type int * @default 0 */ "tableTop": 0, /** * Pixel location of the bottom of the drawn table in the viewport * @type int * @default 0 */ "tableBottom": 0, /** * Pixel location of the boundary for when the next data set should be loaded and drawn * when scrolling up the way. * @type int * @default 0 * @private */ "redrawTop": 0, /** * Pixel location of the boundary for when the next data set should be loaded and drawn * when scrolling down the way. Note that this is actually calculated as the offset from * the top. * @type int * @default 0 * @private */ "redrawBottom": 0, /** * Auto row height or not indicator * @type bool * @default 0 */ "autoHeight": true, /** * Number of rows calculated as visible in the visible viewport * @type int * @default 0 */ "viewportRows": 0, /** * setTimeout reference for state saving, used when state saving is enabled in the DataTable * and when the user scrolls the viewport in order to stop the cookie set taking too much * CPU! * @type int * @default 0 */ "stateTO": null, /** * setTimeout reference for the redraw, used when server-side processing is enabled in the * DataTables in order to prevent DoSing the server * @type int * @default null */ "drawTO": null, heights: { jump: null, page: null, virtual: null, scroll: null, /** * Height of rows in the table * @type int * @default 0 */ row: null, /** * Pixel height of the viewport * @type int * @default 0 */ viewport: null }, topRowFloat: 0, scrollDrawDiff: null, loaderVisible: false }; // @todo The defaults should extend a `c` property and the internal settings // only held in the `s` property. At the moment they are mixed this.s = $.extend( this.s, Scroller.oDefaults, oOpts ); // Workaround for row height being read from height object (see above comment) this.s.heights.row = this.s.rowHeight; /** * DOM elements used by the class instance * @private * @namespace * */ this.dom = { "force": document.createElement('div'), "scroller": null, "table": null, "loader": null }; /* Attach the instance to the DataTables instance so it can be accessed */ this.s.dt.oScroller = this; /* Let's do it */ this._fnConstruct(); }; Scroller.prototype = /** @lends Scroller.prototype */{ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Public methods * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Calculate the pixel position from the top of the scrolling container for * a given row * @param {int} iRow Row number to calculate the position of * @returns {int} Pixels * @example * $(document).ready(function() { * $('#example').dataTable( { * "sScrollY": "200px", * "sAjaxSource": "media/dataset/large.txt", * "sDom": "frtiS", * "bDeferRender": true, * "fnInitComplete": function (o) { * // Find where row 25 is * alert( o.oScroller.fnRowToPixels( 25 ) ); * } * } ); * } ); */ "fnRowToPixels": function ( rowIdx, intParse, virtual ) { var pixels; if ( virtual ) { pixels = this._domain( 'virtualToPhysical', rowIdx * this.s.heights.row ); } else { var diff = rowIdx - this.s.baseRowTop; pixels = this.s.baseScrollTop + (diff * this.s.heights.row); } return intParse || intParse === undefined ? parseInt( pixels, 10 ) : pixels; }, /** * Calculate the row number that will be found at the given pixel position * (y-scroll). * * Please note that when the height of the full table exceeds 1 million * pixels, Scroller switches into a non-linear mode for the scrollbar to fit * all of the records into a finite area, but this function returns a linear * value (relative to the last non-linear positioning). * @param {int} iPixels Offset from top to calculate the row number of * @param {int} [intParse=true] If an integer value should be returned * @param {int} [virtual=false] Perform the calculations in the virtual domain * @returns {int} Row index * @example * $(document).ready(function() { * $('#example').dataTable( { * "sScrollY": "200px", * "sAjaxSource": "media/dataset/large.txt", * "sDom": "frtiS", * "bDeferRender": true, * "fnInitComplete": function (o) { * // Find what row number is at 500px * alert( o.oScroller.fnPixelsToRow( 500 ) ); * } * } ); * } ); */ "fnPixelsToRow": function ( pixels, intParse, virtual ) { var diff = pixels - this.s.baseScrollTop; var row = virtual ? this._domain( 'physicalToVirtual', pixels ) / this.s.heights.row : ( diff / this.s.heights.row ) + this.s.baseRowTop; return intParse || intParse === undefined ? parseInt( row, 10 ) : row; }, /** * Calculate the row number that will be found at the given pixel position (y-scroll) * @param {int} iRow Row index to scroll to * @param {bool} [bAnimate=true] Animate the transition or not * @returns {void} * @example * $(document).ready(function() { * $('#example').dataTable( { * "sScrollY": "200px", * "sAjaxSource": "media/dataset/large.txt", * "sDom": "frtiS", * "bDeferRender": true, * "fnInitComplete": function (o) { * // Immediately scroll to row 1000 * o.oScroller.fnScrollToRow( 1000 ); * } * } ); * * // Sometime later on use the following to scroll to row 500... * var oSettings = $('#example').dataTable().fnSettings(); * oSettings.oScroller.fnScrollToRow( 500 ); * } ); */ "fnScrollToRow": function ( iRow, bAnimate ) { var that = this; var ani = false; var px = this.fnRowToPixels( iRow ); // We need to know if the table will redraw or not before doing the // scroll. If it will not redraw, then we need to use the currently // displayed table, and scroll with the physical pixels. Otherwise, we // need to calculate the table's new position from the virtual // transform. var preRows = ((this.s.displayBuffer-1)/2) * this.s.viewportRows; var drawRow = iRow - preRows; if ( drawRow < 0 ) { drawRow = 0; } if ( (px > this.s.redrawBottom || px < this.s.redrawTop) && this.s.dt._iDisplayStart !== drawRow ) { ani = true; px = this.fnRowToPixels( iRow, false, true ); } if ( typeof bAnimate == 'undefined' || bAnimate ) { this.s.ani = ani; $(this.dom.scroller).animate( { "scrollTop": px }, function () { // This needs to happen after the animation has completed and // the final scroll event fired setTimeout( function () { that.s.ani = false; }, 25 ); } ); } else { $(this.dom.scroller).scrollTop( px ); } }, /** * Calculate and store information about how many rows are to be displayed * in the scrolling viewport, based on current dimensions in the browser's * rendering. This can be particularly useful if the table is initially * drawn in a hidden element - for example in a tab. * @param {bool} [bRedraw=true] Redraw the table automatically after the recalculation, with * the new dimensions forming the basis for the draw. * @returns {void} * @example * $(document).ready(function() { * // Make the example container hidden to throw off the browser's sizing * document.getElementById('container').style.display = "none"; * var oTable = $('#example').dataTable( { * "sScrollY": "200px", * "sAjaxSource": "media/dataset/large.txt", * "sDom": "frtiS", * "bDeferRender": true, * "fnInitComplete": function (o) { * // Immediately scroll to row 1000 * o.oScroller.fnScrollToRow( 1000 ); * } * } ); * * setTimeout( function () { * // Make the example container visible and recalculate the scroller sizes * document.getElementById('container').style.display = "block"; * oTable.fnSettings().oScroller.fnMeasure(); * }, 3000 ); */ "fnMeasure": function ( bRedraw ) { if ( this.s.autoHeight ) { this._fnCalcRowHeight(); } var heights = this.s.heights; heights.viewport = $(this.dom.scroller).height(); this.s.viewportRows = parseInt( heights.viewport / heights.row, 10 )+1; this.s.dt._iDisplayLength = this.s.viewportRows * this.s.displayBuffer; if ( bRedraw === undefined || bRedraw ) { this.s.dt.oInstance.fnDraw(); } }, /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Private methods (they are of course public in JS, but recommended as private) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Initialisation for Scroller * @returns {void} * @private */ "_fnConstruct": function () { var that = this; /* Sanity check */ if ( !this.s.dt.oFeatures.bPaginate ) { this.s.dt.oApi._fnLog( this.s.dt, 0, 'Pagination must be enabled for Scroller' ); return; } /* Insert a div element that we can use to force the DT scrolling container to * the height that would be required if the whole table was being displayed */ this.dom.force.style.position = "absolute"; this.dom.force.style.top = "0px"; this.dom.force.style.left = "0px"; this.dom.force.style.width = "1px"; this.dom.scroller = $('div.'+this.s.dt.oClasses.sScrollBody, this.s.dt.nTableWrapper)[0]; this.dom.scroller.appendChild( this.dom.force ); this.dom.scroller.style.position = "relative"; this.dom.table = $('>table', this.dom.scroller)[0]; this.dom.table.style.position = "absolute"; this.dom.table.style.top = "0px"; this.dom.table.style.left = "0px"; // Add class to 'announce' that we are a Scroller table $(this.s.dt.nTableWrapper).addClass('DTS'); // Add a 'loading' indicator if ( this.s.loadingIndicator ) { this.dom.loader = $('
'+this.s.dt.oLanguage.sLoadingRecords+'
') .css('display', 'none'); $(this.dom.scroller.parentNode) .css('position', 'relative') .append( this.dom.loader ); } /* Initial size calculations */ if ( this.s.heights.row && this.s.heights.row != 'auto' ) { this.s.autoHeight = false; } this.fnMeasure( false ); /* Scrolling callback to see if a page change is needed - use a throttled * function for the save save callback so we aren't hitting it on every * scroll */ this.s.ingnoreScroll = true; this.s.stateSaveThrottle = this.s.dt.oApi._fnThrottle( function () { that.s.dt.oApi._fnSaveState( that.s.dt ); }, 500 ); $(this.dom.scroller).on( 'scroll.DTS', function (e) { that._fnScroll.call( that ); } ); /* In iOS we catch the touchstart event in case the user tries to scroll * while the display is already scrolling */ $(this.dom.scroller).on('touchstart.DTS', function () { that._fnScroll.call( that ); } ); /* Update the scroller when the DataTable is redrawn */ this.s.dt.aoDrawCallback.push( { "fn": function () { if ( that.s.dt.bInitialised ) { that._fnDrawCallback.call( that ); } }, "sName": "Scroller" } ); /* On resize, update the information element, since the number of rows shown might change */ $(window).on( 'resize.DTS', function () { that.fnMeasure( false ); that._fnInfo(); } ); /* Add a state saving parameter to the DT state saving so we can restore the exact * position of the scrolling */ var initialStateSave = true; this.s.dt.oApi._fnCallbackReg( this.s.dt, 'aoStateSaveParams', function (oS, oData) { /* Set iScroller to saved scroll position on initialization. */ if(initialStateSave && that.s.dt.oLoadedState){ oData.iScroller = that.s.dt.oLoadedState.iScroller; oData.iScrollerTopRow = that.s.dt.oLoadedState.iScrollerTopRow; initialStateSave = false; } else { oData.iScroller = that.dom.scroller.scrollTop; oData.iScrollerTopRow = that.s.topRowFloat; } }, "Scroller_State" ); if ( this.s.dt.oLoadedState ) { this.s.topRowFloat = this.s.dt.oLoadedState.iScrollerTopRow || 0; } /* Destructor */ this.s.dt.aoDestroyCallback.push( { "sName": "Scroller", "fn": function () { $(window).off( 'resize.DTS' ); $(that.dom.scroller).off('touchstart.DTS scroll.DTS'); $(that.s.dt.nTableWrapper).removeClass('DTS'); $('div.DTS_Loading', that.dom.scroller.parentNode).remove(); that.dom.table.style.position = ""; that.dom.table.style.top = ""; that.dom.table.style.left = ""; } } ); }, /** * Scrolling function - fired whenever the scrolling position is changed. * This method needs to use the stored values to see if the table should be * redrawn as we are moving towards the end of the information that is * currently drawn or not. If needed, then it will redraw the table based on * the new position. * @returns {void} * @private */ "_fnScroll": function () { var that = this, heights = this.s.heights, iScrollTop = this.dom.scroller.scrollTop, iTopRow; if ( this.s.skip ) { return; } if ( this.s.ingnoreScroll ) { return; } /* If the table has been sorted or filtered, then we use the redraw that * DataTables as done, rather than performing our own */ if ( this.s.dt.bFiltered || this.s.dt.bSorted ) { this.s.lastScrollTop = 0; return; } /* Update the table's information display for what is now in the viewport */ this._fnInfo(); /* We don't want to state save on every scroll event - that's heavy * handed, so use a timeout to update the state saving only when the * scrolling has finished */ clearTimeout( this.s.stateTO ); this.s.stateTO = setTimeout( function () { that.s.dt.oApi._fnSaveState( that.s.dt ); }, 250 ); /* Check if the scroll point is outside the trigger boundary which would required * a DataTables redraw */ if ( iScrollTop < this.s.redrawTop || iScrollTop > this.s.redrawBottom ) { var preRows = Math.ceil( ((this.s.displayBuffer-1)/2) * this.s.viewportRows ); if ( Math.abs( iScrollTop - this.s.lastScrollTop ) > heights.viewport || this.s.ani ) { iTopRow = parseInt(this._domain( 'physicalToVirtual', iScrollTop ) / heights.row, 10) - preRows; this.s.topRowFloat = (this._domain( 'physicalToVirtual', iScrollTop ) / heights.row); } else { iTopRow = this.fnPixelsToRow( iScrollTop ) - preRows; this.s.topRowFloat = this.fnPixelsToRow( iScrollTop, false ); } if ( iTopRow <= 0 ) { /* At the start of the table */ iTopRow = 0; } else if ( iTopRow + this.s.dt._iDisplayLength > this.s.dt.fnRecordsDisplay() ) { /* At the end of the table */ iTopRow = this.s.dt.fnRecordsDisplay() - this.s.dt._iDisplayLength; if ( iTopRow < 0 ) { iTopRow = 0; } } else if ( iTopRow % 2 !== 0 ) { // For the row-striping classes (odd/even) we want only to start // on evens otherwise the stripes will change between draws and // look rubbish iTopRow++; } if ( iTopRow != this.s.dt._iDisplayStart ) { /* Cache the new table position for quick lookups */ this.s.tableTop = $(this.s.dt.nTable).offset().top; this.s.tableBottom = $(this.s.dt.nTable).height() + this.s.tableTop; var draw = function () { if ( that.s.scrollDrawReq === null ) { that.s.scrollDrawReq = iScrollTop; } that.s.dt._iDisplayStart = iTopRow; if ( that.s.dt.oApi._fnCalculateEnd ) { // Removed in 1.10 that.s.dt.oApi._fnCalculateEnd( that.s.dt ); } that.s.dt.oApi._fnDraw( that.s.dt ); }; /* Do the DataTables redraw based on the calculated start point - note that when * using server-side processing we introduce a small delay to not DoS the server... */ if ( this.s.dt.oFeatures.bServerSide ) { clearTimeout( this.s.drawTO ); this.s.drawTO = setTimeout( draw, this.s.serverWait ); } else { draw(); } if ( this.dom.loader && ! this.s.loaderVisible ) { this.dom.loader.css( 'display', 'block' ); this.s.loaderVisible = true; } } } this.s.lastScrollTop = iScrollTop; this.s.stateSaveThrottle(); }, /** * Convert from one domain to another. The physical domain is the actual * pixel count on the screen, while the virtual is if we had browsers which * had scrolling containers of infinite height (i.e. the absolute value) * * @param {string} dir Domain transform direction, `virtualToPhysical` or * `physicalToVirtual` * @returns {number} Calculated transform * @private */ _domain: function ( dir, val ) { var heights = this.s.heights; var coeff; // If the virtual and physical height match, then we use a linear // transform between the two, allowing the scrollbar to be linear if ( heights.virtual === heights.scroll ) { coeff = (heights.virtual-heights.viewport) / (heights.scroll-heights.viewport); if ( dir === 'virtualToPhysical' ) { return val / coeff; } else if ( dir === 'physicalToVirtual' ) { return val * coeff; } } // Otherwise, we want a non-linear scrollbar to take account of the // redrawing regions at the start and end of the table, otherwise these // can stutter badly - on large tables 30px (for example) scroll might // be hundreds of rows, so the table would be redrawing every few px at // the start and end. Use a simple quadratic to stop this. It does mean // the scrollbar is non-linear, but with such massive data sets, the // scrollbar is going to be a best guess anyway var xMax = (heights.scroll - heights.viewport) / 2; var yMax = (heights.virtual - heights.viewport) / 2; coeff = yMax / ( xMax * xMax ); if ( dir === 'virtualToPhysical' ) { if ( val < yMax ) { return Math.pow(val / coeff, 0.5); } else { val = (yMax*2) - val; return val < 0 ? heights.scroll : (xMax*2) - Math.pow(val / coeff, 0.5); } } else if ( dir === 'physicalToVirtual' ) { if ( val < xMax ) { return val * val * coeff; } else { val = (xMax*2) - val; return val < 0 ? heights.virtual : (yMax*2) - (val * val * coeff); } } }, /** * Draw callback function which is fired when the DataTable is redrawn. The main function of * this method is to position the drawn table correctly the scrolling container for the rows * that is displays as a result of the scrolling position. * @returns {void} * @private */ "_fnDrawCallback": function () { var that = this, heights = this.s.heights, iScrollTop = this.dom.scroller.scrollTop, iActualScrollTop = iScrollTop, iScrollBottom = iScrollTop + heights.viewport, iTableHeight = $(this.s.dt.nTable).height(), displayStart = this.s.dt._iDisplayStart, displayLen = this.s.dt._iDisplayLength, displayEnd = this.s.dt.fnRecordsDisplay(); // Disable the scroll event listener while we are updating the DOM this.s.skip = true; // Resize the scroll forcing element this._fnScrollForce(); // Reposition the scrolling for the updated virtual position if needed if ( displayStart === 0 ) { // Linear calculation at the top of the table iScrollTop = this.s.topRowFloat * heights.row; } else if ( displayStart + displayLen >= displayEnd ) { // Linear calculation that the bottom as well iScrollTop = heights.scroll - ((displayEnd - this.s.topRowFloat) * heights.row); } else { // Domain scaled in the middle iScrollTop = this._domain( 'virtualToPhysical', this.s.topRowFloat * heights.row ); } this.dom.scroller.scrollTop = iScrollTop; // Store positional information so positional calculations can be based // upon the current table draw position this.s.baseScrollTop = iScrollTop; this.s.baseRowTop = this.s.topRowFloat; // Position the table in the virtual scroller var tableTop = iScrollTop - ((this.s.topRowFloat - displayStart) * heights.row); if ( displayStart === 0 ) { tableTop = 0; } else if ( displayStart + displayLen >= displayEnd ) { tableTop = heights.scroll - iTableHeight; } this.dom.table.style.top = tableTop+'px'; /* Cache some information for the scroller */ this.s.tableTop = tableTop; this.s.tableBottom = iTableHeight + this.s.tableTop; // Calculate the boundaries for where a redraw will be triggered by the // scroll event listener var boundaryPx = (iScrollTop - this.s.tableTop) * this.s.boundaryScale; this.s.redrawTop = iScrollTop - boundaryPx; this.s.redrawBottom = iScrollTop + boundaryPx; this.s.skip = false; // Restore the scrolling position that was saved by DataTable's state // saving Note that this is done on the second draw when data is Ajax // sourced, and the first draw when DOM soured if ( this.s.dt.oFeatures.bStateSave && this.s.dt.oLoadedState !== null && typeof this.s.dt.oLoadedState.iScroller != 'undefined' ) { // A quirk of DataTables is that the draw callback will occur on an // empty set if Ajax sourced, but not if server-side processing. var ajaxSourced = (this.s.dt.sAjaxSource || that.s.dt.ajax) && ! this.s.dt.oFeatures.bServerSide ? true : false; if ( ( ajaxSourced && this.s.dt.iDraw == 2) || (!ajaxSourced && this.s.dt.iDraw == 1) ) { setTimeout( function () { $(that.dom.scroller).scrollTop( that.s.dt.oLoadedState.iScroller ); that.s.redrawTop = that.s.dt.oLoadedState.iScroller - (heights.viewport/2); // In order to prevent layout thrashing we need another // small delay setTimeout( function () { that.s.ingnoreScroll = false; }, 0 ); }, 0 ); } } else { that.s.ingnoreScroll = false; } // Because of the order of the DT callbacks, the info update will // take precedence over the one we want here. So a 'thread' break is // needed setTimeout( function () { that._fnInfo.call( that ); }, 0 ); // Hide the loading indicator if ( this.dom.loader && this.s.loaderVisible ) { this.dom.loader.css( 'display', 'none' ); this.s.loaderVisible = false; } }, /** * Force the scrolling container to have height beyond that of just the * table that has been drawn so the user can scroll the whole data set. * * Note that if the calculated required scrolling height exceeds a maximum * value (1 million pixels - hard-coded) the forcing element will be set * only to that maximum value and virtual / physical domain transforms will * be used to allow Scroller to display tables of any number of records. * @returns {void} * @private */ _fnScrollForce: function () { var heights = this.s.heights; var max = 1000000; heights.virtual = heights.row * this.s.dt.fnRecordsDisplay(); heights.scroll = heights.virtual; if ( heights.scroll > max ) { heights.scroll = max; } this.dom.force.style.height = heights.scroll+"px"; }, /** * Automatic calculation of table row height. This is just a little tricky here as using * initialisation DataTables has tale the table out of the document, so we need to create * a new table and insert it into the document, calculate the row height and then whip the * table out. * @returns {void} * @private */ "_fnCalcRowHeight": function () { var dt = this.s.dt; var origTable = dt.nTable; var nTable = origTable.cloneNode( false ); var tbody = $('').appendTo( nTable ); var container = $( '
'+ '
'+ '
'+ '
'+ '
' ); // Want 3 rows in the sizing table so :first-child and :last-child // CSS styles don't come into play - take the size of the middle row $('tbody tr:lt(4)', origTable).clone().appendTo( tbody ); while( $('tr', tbody).length < 3 ) { tbody.append( ' ' ); } $('div.'+dt.oClasses.sScrollBody, container).append( nTable ); var appendTo; if (dt._bInitComplete) { appendTo = origTable.parentNode; } else { if (!this.s.dt.nHolding) { this.s.dt.nHolding = $( '
' ).insertBefore( this.s.dt.nTable ); } appendTo = this.s.dt.nHolding; } container.appendTo( appendTo ); this.s.heights.row = $('tr', tbody).eq(1).outerHeight(); container.remove(); }, /** * Update any information elements that are controlled by the DataTable based on the scrolling * viewport and what rows are visible in it. This function basically acts in the same way as * _fnUpdateInfo in DataTables, and effectively replaces that function. * @returns {void} * @private */ "_fnInfo": function () { if ( !this.s.dt.oFeatures.bInfo ) { return; } var dt = this.s.dt, language = dt.oLanguage, iScrollTop = this.dom.scroller.scrollTop, iStart = Math.floor( this.fnPixelsToRow(iScrollTop, false, this.s.ani)+1 ), iMax = dt.fnRecordsTotal(), iTotal = dt.fnRecordsDisplay(), iPossibleEnd = Math.ceil( this.fnPixelsToRow(iScrollTop+this.s.heights.viewport, false, this.s.ani) ), iEnd = iTotal < iPossibleEnd ? iTotal : iPossibleEnd, sStart = dt.fnFormatNumber( iStart ), sEnd = dt.fnFormatNumber( iEnd ), sMax = dt.fnFormatNumber( iMax ), sTotal = dt.fnFormatNumber( iTotal ), sOut; if ( dt.fnRecordsDisplay() === 0 && dt.fnRecordsDisplay() == dt.fnRecordsTotal() ) { /* Empty record set */ sOut = language.sInfoEmpty+ language.sInfoPostFix; } else if ( dt.fnRecordsDisplay() === 0 ) { /* Empty record set after filtering */ sOut = language.sInfoEmpty +' '+ language.sInfoFiltered.replace('_MAX_', sMax)+ language.sInfoPostFix; } else if ( dt.fnRecordsDisplay() == dt.fnRecordsTotal() ) { /* Normal record set */ sOut = language.sInfo. replace('_START_', sStart). replace('_END_', sEnd). replace('_MAX_', sMax). replace('_TOTAL_', sTotal)+ language.sInfoPostFix; } else { /* Record set after filtering */ sOut = language.sInfo. replace('_START_', sStart). replace('_END_', sEnd). replace('_MAX_', sMax). replace('_TOTAL_', sTotal) +' '+ language.sInfoFiltered.replace( '_MAX_', dt.fnFormatNumber(dt.fnRecordsTotal()) )+ language.sInfoPostFix; } var callback = language.fnInfoCallback; if ( callback ) { sOut = callback.call( dt.oInstance, dt, iStart, iEnd, iMax, iTotal, sOut ); } var n = dt.aanFeatures.i; if ( typeof n != 'undefined' ) { for ( var i=0, iLen=n.length ; i t3iIDATxڌm 0UvΠv.XG46r/G7 v1S-A< *(}uNq #fmM!{+:PjIENDB`PK!m )datatables/extensions/Scroller/Readme.txtnu[# Scroller Scroller is a virtual rendering plug-in for DataTables which allows large datasets to be drawn on screen every quickly. What the virtual rendering means is that only the visible portion of the table (and a bit to either side to make the scrolling smooth) is drawn, while the scrolling container gives the visual impression that the whole table is visible. This is done by making use of the pagination abilities of DataTables and moving the table around in the scrolling container DataTables adds to the page. The scrolling container is forced to the height it would be for the full table display using an extra element. Key features include: * Speed! The aim of Scroller for DataTables is to make rendering large data sets fast * Full compatibility with DataTables' deferred rendering for maximum speed * Integration with state saving in DataTables (scrolling position is saved) * Support for scrolling with millions of rows * Easy to use # Installation To use Scroller, first download DataTables ( http://datatables.net/download ) and place the unzipped Scroller package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. # Basic usage Scroller is initialised by simply including the letter `dt-string S` in the `dt-init dom` for the table you want to have this feature enabled on. Note that the `dt-string S` must come after the `dt-string t` parameter in `dom`. For example: ```js $(document).ready( function () { $('#example').DataTable( { dom: 'lfrtipS' } ); } ); ``` Note that rows in the table must all be the same height. Information in a cell which expands on to multiple lines will cause some odd behaviour in the scrolling. Additionally, the table's `cellspacing` parameter must be set to 0, again to ensure the information display is correct. # Documentation / support * Documentation: http://datatables.net/extensions/scroller/ * DataTables support forums: http://datatables.net/forums # GitHub If you fancy getting involved with the development of Scroller and help make it better, please refer to its GitHub repo: https://github.com/DataTables/Scroller PK!D:datatables/extensions/Scroller/css/dataTables.scroller.cssnu[ /* * Namespace: DTS (DataTables Scroller) */ div.DTS tbody th, div.DTS tbody td { white-space: nowrap; } div.DTS tbody tr.even { background-color: white; } div.DTS div.DTS_Loading { position: absolute; top: 50%; left: 50%; width: 200px; height: 20px; margin-top: -20px; margin-left: -100px; z-index: 1; border: 1px solid #999; padding: 20px 0; text-align: center; background-color: white; background-color: rgba(255, 255, 255, 0.5); } div.DTS div.dataTables_scrollHead, div.DTS div.dataTables_scrollFoot { background-color: white; } div.DTS div.dataTables_scrollBody { z-index: 2; } div.DTS div.dataTables_scroll { background: url('../images/loading-background.png') repeat 0 0; } PK!<<>datatables/extensions/Scroller/css/dataTables.scroller.min.cssnu[div.DTS tbody th,div.DTS tbody td{white-space:nowrap}div.DTS tbody tr.even{background-color:white}div.DTS div.DTS_Loading{position:absolute;top:50%;left:50%;width:200px;height:20px;margin-top:-20px;margin-left:-100px;z-index:1;border:1px solid #999;padding:20px 0;text-align:center;background-color:white;background-color:rgba(255,255,255,0.5)}div.DTS div.dataTables_scrollHead,div.DTS div.dataTables_scrollFoot{background-color:white}div.DTS div.dataTables_scrollBody{z-index:2}div.DTS div.dataTables_scroll{background:url("../images/loading-background.png") repeat 0 0} PK!YkSwSwSCdatatables/extensions/FixedColumns/examples/left_right_columns.htmlnu[ FixedColumns example - Left and right fixed columns

FixedColumns example Left and right fixed columns

FixedColumns allows columns to be fixed from both the left and right hand sides of the table. Fixing right hand-side columns is done by using the rightColumns initialisation parameter, which works just the same as leftColumns does for the left side of the table. This example shows both the left and right columns being fixed in place.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table, { leftColumns: 1, rightColumns: 1 } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK![N̩VV9datatables/extensions/FixedColumns/examples/css_size.htmlnu[ FixedColumns example - CSS row sizing

FixedColumns example CSS row sizing

Because of the method FixedColumns uses to display the fixed columns, an important consideration is the alignment of the rows due to different heights in the individual rows of the table. There are two different algorithms in FixedColumns which can be used, or you can switch off automatic row sizing all together. This is controlled through the heightMatch parameter. If can take the following values:

  • none - no automatic row height matching is performed. CSS can be used in this case and is useful when speed is of primary importance.
  • semiauto (default) - the height calculation will be performed once, and the result cached to be used again (fnRecalculateHeight can be used to force recalculation)
  • auto - height matching is performed on every draw (slowest but must accurate)

This example shows row height matching switched off but there is a CSS statement of tr { height: 50px } to force all rows to the same height.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table, { heightMatch: 'none' } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; } tr { height: 50px; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!t}"U"U;datatables/extensions/FixedColumns/examples/size_fluid.htmlnu[ FixedColumns example - Fluid column width

FixedColumns example Fluid column width

The columns that are fixed in place by FixedColumns take their width from the parent DataTable. As such, the width of the column can be controlled using the columns.widthDT option.

This example shows the first column being set to width: 20% (note that this is not pixel perfect in a table, the browser will make some adjustments!), a width that is reflected in the fixed column. Resize the browser window horizontally and you will be able to see that the fixed column retains its proportional width (again with a small margin dictated by the browser) in the resizing table.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false, columnDefs: [ { width: '20%', targets: 0 } ] } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { margin: 0 auto; } div.container { width: 80%; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!%-WW;datatables/extensions/FixedColumns/examples/col_filter.htmlnu[ FixedColumns example - Individual column filtering

FixedColumns example Individual column filtering

This example shows FixedColumns being configured with individual column filtering abilities. Note that the event handler for the filtering is applied to the input elements before FixedColumns is initialised, so when FixedColumns clones nodes it also copies the event.

First name Last name Position Office Age Start date Salary Extn. E-mail
First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { // Setup - add a text input to each footer cell $('#example tfoot th').each( function () { var title = $('#example thead th').eq( $(this).index() ).text(); $(this).html( '<input type="text" placeholder="Search '+title+'" />' ); } ); // DataTable var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); // Apply the filter table.columns().indexes().each( function (idx) { $( 'input', table.column( idx ).footer() ).on( 'keyup change', function () { table .column( idx ) .search( this.value ) .draw(); } ); } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!E+uGuG8datatables/extensions/FixedColumns/examples/rowspan.htmlnu[ FixedColumns example - Complex headers

FixedColumns example Complex headers

If you are using multiple rows in the table header, it can be useful to have a rowspanning cell on the column(s) you have fixed in place - equally at other times it can be useful to not and make use of the two or more cells per column. FixedColumns builds on the complex header support in DataTables to make this trivial to use in FixedColumns. Just initialise your FixedColumns instance as you normally would!

Name HR Information Contact
Position Salary Office Extn. E-mail
Name Position Salary Office Extn. E-mail
Tiger Nixon System Architect $320,800 Edinburgh 5421 t.nixon@datatables.net
Garrett Winters Accountant $170,750 Tokyo 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author $86,000 San Francisco 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer $433,060 Edinburgh 6224 c.kelly@datatables.net
Airi Satou Accountant $162,700 Tokyo 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist $372,000 New York 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant $137,500 San Francisco 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist $327,900 Tokyo 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer $205,500 San Francisco 2360 c.hurst@datatables.net
Sonya Frost Software Engineer $103,600 Edinburgh 1667 s.frost@datatables.net
Jena Gaines Office Manager $90,560 London 3814 j.gaines@datatables.net
Quinn Flynn Support Lead $342,000 Edinburgh 9497 q.flynn@datatables.net
Charde Marshall Regional Director $470,600 San Francisco 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer $313,500 London 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director $385,750 London 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer $198,500 London 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) $725,000 New York 3059 p.byrd@datatables.net
Gloria Little Systems Administrator $237,500 New York 1721 g.little@datatables.net
Bradley Greer Software Engineer $132,000 London 2558 b.greer@datatables.net
Dai Rios Personnel Lead $217,500 Edinburgh 2290 d.rios@datatables.net
Jenette Caldwell Development Lead $345,000 New York 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) $675,000 New York 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support $106,450 New York 8330 c.vance@datatables.net
Doris Wilder Sales Assistant $85,600 Sidney 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) $1,200,000 London 5797 a.ramos@datatables.net
Gavin Joyce Developer $92,575 Edinburgh 8822 g.joyce@datatables.net
Jennifer Chang Regional Director $357,650 Singapore 9239 j.chang@datatables.net
Brenden Wagner Software Engineer $206,850 San Francisco 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) $850,000 San Francisco 2947 f.green@datatables.net
Shou Itou Regional Marketing $163,000 Tokyo 8899 s.itou@datatables.net
Michelle House Integration Specialist $95,400 Sidney 2769 m.house@datatables.net
Suki Burks Developer $114,500 London 6832 s.burks@datatables.net
Prescott Bartlett Technical Author $145,000 London 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader $235,500 San Francisco 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support $324,050 Edinburgh 8240 m.mccray@datatables.net
Unity Butler Marketing Designer $85,675 San Francisco 5384 u.butler@datatables.net
Howard Hatfield Office Manager $164,500 San Francisco 7031 h.hatfield@datatables.net
Hope Fuentes Secretary $109,850 San Francisco 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller $452,500 San Francisco 9422 v.harrell@datatables.net
Timothy Mooney Office Manager $136,200 London 7580 t.mooney@datatables.net
Jackson Bradshaw Director $645,750 New York 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer $234,500 Singapore 2120 o.liang@datatables.net
Bruno Nash Software Engineer $163,500 London 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer $139,575 Tokyo 9383 s.yamamoto@datatables.net
Thor Walton Developer $98,540 New York 8327 t.walton@datatables.net
Finn Camacho Support Engineer $87,500 San Francisco 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator $138,575 Singapore 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer $125,250 New York 7439 z.frank@datatables.net
Zorita Serrano Software Engineer $115,000 San Francisco 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer $75,650 Edinburgh 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant $145,600 New York 3990 c.stevens@datatables.net
Hermione Butler Regional Director $356,250 London 1016 h.butler@datatables.net
Lael Greer Systems Administrator $103,500 London 6733 l.greer@datatables.net
Jonas Alexander Developer $86,500 San Francisco 8196 j.alexander@datatables.net
Shad Decker Regional Director $183,000 Edinburgh 6373 s.decker@datatables.net
Michael Bruce Javascript Developer $183,000 Singapore 5384 m.bruce@datatables.net
Donna Snider Customer Support $112,000 New York 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; padding-left: 40px !important; padding-right: 40px !important; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!)ĬTT7datatables/extensions/FixedColumns/examples/simple.htmlnu[ FixedColumns example - Basic initialisation

FixedColumns example Basic initialisation

When displaying a table which scrolls along the x-axis, it can sometimes be useful to the end user for the left most column to be fixed in place, if it shows grouping, index or similar information. This is basically the same idea as 'freeze columns' in Excel. This can be achieved with the FixedColumns plug-in for DataTables, as shown below.

Note that FixedColumns is suitable only for use with the scrolling features in DataTables. If you want to achieve a similar effect without scrolling enabled, please checkout FixedHeader, also for DataTables.

FixedColumns is initialised using the constructor new $.fn.dataTable.FixedColumns(); - shown below.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!8Ω:Gdatatables/extensions/FixedColumns/examples/server-side-processing.htmlnu[ FixedColumns example - Server-side processing

FixedColumns example Server-side processing

This example shows how FixedColumns can be used with server-side processing in DataTables to cope with very large tables. No special considerations are required, just initialise FixedColumns as you normally would!

Note that the table width is constrained in this example to allow scrolling to occur as the server-side processing data set has a limited number of columns in this demo!

Name Position Office Extn. Start date Salary
Name Position Office Extn. Start date Salary
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, ajax: "../../../examples/server_side/scripts/server_processing.php", serverSide: true } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 600px; margin: 0 auto; } /* Lots of padding for the cells as SSP has limited data in the demo */ th, td { padding-left: 40px !important; padding-right: 40px !important; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!VV:datatables/extensions/FixedColumns/examples/bootstrap.htmlnu[ FixedColumns example - Bootstrap

FixedColumns example Bootstrap

When displaying a table which scrolls along the x-axis, it can sometimes be useful to the end user for the left most column to be fixed in place, if it shows grouping, index or similar information. This is basically the same idea as 'freeze columns' in Excel. This can be achieved with the FixedColumns plug-in for DataTables, as shown below.

Note that FixedColumns is suitable only for use with the scrolling features in DataTables. If you want to achieve a similar effect without scrolling enabled, please checkout FixedHeader, also for DataTables.

FixedColumns is initialised using the constructor new $.fn.dataTable.FixedColumns(); - shown below.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

body { font-size: 140%; } /* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!tDzWzW7datatables/extensions/FixedColumns/examples/colvis.htmlnu[ FixedColumns example - ColVis integration

FixedColumns example ColVis integration

FixedColumns operates with DataTables' built-in column visibility options (columns.visibleDT and column().visible()DT), which columns that are hidden not being shown in the fixed columns. This integration also means that FixedColumns works well with ColVis, with columns that are dynamically shown and hidden updated immediately in the fixed columns.

The example below shows ColVis and FixedColumns working together. Two columns have been fixed on the left hand side of the table to show FixedColumns ability to work effortlessly with column visibility.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { dom: "Cfrtip", scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table, { leftColumns: 2 } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; } div.ColVis { float: left; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!'q\\=datatables/extensions/FixedColumns/examples/index_column.htmlnu[ FixedColumns example - Index column

FixedColumns example Index column

A typical interaction to want to perform with a fixed column, is an index column. A method for how this can be achieved with FixedColumns is shown in this example, building on the index column example for DataTables. Also shown in this example is how the fixed column can be styled with CSS to show it more prominently.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false, columnDefs: [ { sortable: false, "class": "index", targets: 0 } ], order: [[ 1, 'asc' ]] } ); table.on( 'order.dt search.dt', function () { table.column(0, {search:'applied', order:'applied'}).nodes().each( function (cell, i) { cell.innerHTML = i+1; } ); } ).draw(); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; } /* Styling for the index columns */ th.index, td.index { background-color: white !important; border-top: 1px solid white !important; border-bottom: none !important; } div.DTFC_LeftHeadWrapper table { border-bottom: 1px solid white !important; } div.DTFC_LeftHeadWrapper th { border-bottom: 1px solid white !important; } div.DTFC_LeftBodyWrapper { border-right: 1px solid black; } div.DTFC_LeftFootWrapper th { border-top: 1px solid white !important; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!컁SS=datatables/extensions/FixedColumns/examples/right_column.htmlnu[ FixedColumns example - Right column only

FixedColumns example Right column only

FixedColumns has the ability to freeze columns on both the left and right hand sides of the table. By default it will fix the first column on the left, but using the initialisation parameters leftColumns and rightColumns you can alter this to fix the columns on the right as well. This example shows a single column fixed in place, in this case the right most column.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table, { leftColumns: 0, rightColumns: 1 } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!ڷD 6datatables/extensions/FixedColumns/examples/index.htmlnu[ FixedColumns examples - FixedColumns examples

FixedColumns example FixedColumns examples

When making use of DataTables' x-axis scrolling feature (scrollXDT), you may wish to fix the left or right most columns in place. This extension for DataTables provides exactly this option (for non-scrolling tables, please use the FixedHeader extension, which can fix headers, footers and columns). Key features include:

  • Freezes the left most column to the side of the table
  • Option to freeze two or more columns
  • Full integration with DataTables' scrolling options
PK!`)U)U;datatables/extensions/FixedColumns/examples/size_fixed.htmlnu[ FixedColumns example - Assigned column width

FixedColumns example Assigned column width

The columns that are fixed in place by FixedColumns take their width from the parent DataTable. As such, the width of the column can be controlled using the columns.widthDT option.

This example shows the first column being set to width: 200px (note that this is not pixel perfect in a table, the browser will make some adjustments!), a width that is reflected in the fixed column. Resize the browser window horizontally and you will be able to see that the fixed column retains its width while the scrolling viewport and the table resize.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').removeAttr('width').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false, columnDefs: [ { width: 200, targets: 0 } ] } ); new $.fn.dataTable.FixedColumns( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { margin: 0 auto; } div.container { width: 80%; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!0a kRkR<datatables/extensions/FixedColumns/examples/two_columns.htmlnu[ FixedColumns example - Multiple fixed columns

FixedColumns example Multiple fixed columns

FixedColumns allows more than one column to be frozen into place using the leftColumns parameter. The example below shows two columns fixed.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table, { leftColumns: 2 } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

/* Ensure that the demo table scrolls */ th, td { white-space: nowrap; } div.dataTables_wrapper { width: 800px; margin: 0 auto; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!EW@@.datatables/extensions/FixedColumns/License.txtnu[Copyright (c) 2010-2015 SpryMedia Limited http://datatables.net Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK!XYj,datatables/extensions/FixedColumns/Readme.mdnu[# FixedColumns When making use of DataTables' x-axis scrolling feature (`scrollX`), you may wish to fix the left or right most columns in place. This plug-in for DataTables provides exactly this option (for non-scrolling tables, please use the FixedHeader plug-in, which can fix headers, footers and columns). Key features include: * Freezes the left most column to the side of the table * Option to freeze two or more columns * Full integration with DataTables' scrolling options # Installation To use FixedColumns, first download DataTables ( http://datatables.net/download ) and place the unzipped FixedColumns package into a `extensions` directory in the DataTables package. This will allow the pages in the examples to operate correctly. To see the examples running, open the `examples` directory in your web-browser. # Basic usage FixedColumns is initialised using the `$.fn.dataTable.FixedColumns()` constructor. For example: ```js $(document).ready(function() { var table = $('#example').DataTable( { scrollY: "300px", scrollX: true, scrollCollapse: true, paging: false } ); new $.fn.dataTable.FixedColumns( table ); } ); ``` # Documentation / support * Documentation: http://datatables.net/extensions/FixedColumns/ * DataTables support forums: http://datatables.net/forums # GitHub If you fancy getting involved with the development of FixedColumns and help make it better, please refer to its GitHub repo: https://github.com/DataTables/FixedColumns PK!M@datatables/extensions/FixedColumns/js/dataTables.fixedColumns.jsnu[/*! FixedColumns 3.0.4 * ©2010-2014 SpryMedia Ltd - datatables.net/license */ /** * @summary FixedColumns * @description Freeze columns in place on a scrolling DataTable * @version 3.0.4 * @file dataTables.fixedColumns.js * @author SpryMedia Ltd (www.sprymedia.co.uk) * @contact www.sprymedia.co.uk/contact * @copyright Copyright 2010-2014 SpryMedia Ltd. * * This source file is free software, available under the following license: * MIT license - http://datatables.net/license/mit * * This source file is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. * * For details please refer to: http://www.datatables.net */ (function(window, document, undefined) { var factory = function( $, DataTable ) { "use strict"; /** * When making use of DataTables' x-axis scrolling feature, you may wish to * fix the left most column in place. This plug-in for DataTables provides * exactly this option (note for non-scrolling tables, please use the * FixedHeader plug-in, which can fix headers, footers and columns). Key * features include: * * * Freezes the left or right most columns to the side of the table * * Option to freeze two or more columns * * Full integration with DataTables' scrolling options * * Speed - FixedColumns is fast in its operation * * @class * @constructor * @global * @param {object} dt DataTables instance. With DataTables 1.10 this can also * be a jQuery collection, a jQuery selector, DataTables API instance or * settings object. * @param {object} [init={}] Configuration object for FixedColumns. Options are * defined by {@link FixedColumns.defaults} * * @requires jQuery 1.7+ * @requires DataTables 1.8.0+ * * @example * var table = $('#example').dataTable( { * "scrollX": "100%" * } ); * new $.fn.dataTable.fixedColumns( table ); */ var FixedColumns = function ( dt, init ) { var that = this; /* Sanity check - you just know it will happen */ if ( ! ( this instanceof FixedColumns ) ) { alert( "FixedColumns warning: FixedColumns must be initialised with the 'new' keyword." ); return; } if ( typeof init == 'undefined' ) { init = {}; } // Use the DataTables Hungarian notation mapping method, if it exists to // provide forwards compatibility for camel case variables var camelToHungarian = $.fn.dataTable.camelToHungarian; if ( camelToHungarian ) { camelToHungarian( FixedColumns.defaults, FixedColumns.defaults, true ); camelToHungarian( FixedColumns.defaults, init ); } // v1.10 allows the settings object to be got form a number of sources var dtSettings = $.fn.dataTable.Api ? new $.fn.dataTable.Api( dt ).settings()[0] : dt.fnSettings(); /** * Settings object which contains customisable information for FixedColumns instance * @namespace * @extends FixedColumns.defaults * @private */ this.s = { /** * DataTables settings objects * @type object * @default Obtained from DataTables instance */ "dt": dtSettings, /** * Number of columns in the DataTable - stored for quick access * @type int * @default Obtained from DataTables instance */ "iTableColumns": dtSettings.aoColumns.length, /** * Original outer widths of the columns as rendered by DataTables - used to calculate * the FixedColumns grid bounding box * @type array. * @default [] */ "aiOuterWidths": [], /** * Original inner widths of the columns as rendered by DataTables - used to apply widths * to the columns * @type array. * @default [] */ "aiInnerWidths": [] }; /** * DOM elements used by the class instance * @namespace * @private * */ this.dom = { /** * DataTables scrolling element * @type node * @default null */ "scroller": null, /** * DataTables header table * @type node * @default null */ "header": null, /** * DataTables body table * @type node * @default null */ "body": null, /** * DataTables footer table * @type node * @default null */ "footer": null, /** * Display grid elements * @namespace */ "grid": { /** * Grid wrapper. This is the container element for the 3x3 grid * @type node * @default null */ "wrapper": null, /** * DataTables scrolling element. This element is the DataTables * component in the display grid (making up the main table - i.e. * not the fixed columns). * @type node * @default null */ "dt": null, /** * Left fixed column grid components * @namespace */ "left": { "wrapper": null, "head": null, "body": null, "foot": null }, /** * Right fixed column grid components * @namespace */ "right": { "wrapper": null, "head": null, "body": null, "foot": null } }, /** * Cloned table nodes * @namespace */ "clone": { /** * Left column cloned table nodes * @namespace */ "left": { /** * Cloned header table * @type node * @default null */ "header": null, /** * Cloned body table * @type node * @default null */ "body": null, /** * Cloned footer table * @type node * @default null */ "footer": null }, /** * Right column cloned table nodes * @namespace */ "right": { /** * Cloned header table * @type node * @default null */ "header": null, /** * Cloned body table * @type node * @default null */ "body": null, /** * Cloned footer table * @type node * @default null */ "footer": null } } }; /* Attach the instance to the DataTables instance so it can be accessed easily */ dtSettings._oFixedColumns = this; /* Let's do it */ if ( ! dtSettings._bInitComplete ) { dtSettings.oApi._fnCallbackReg( dtSettings, 'aoInitComplete', function () { that._fnConstruct( init ); }, 'FixedColumns' ); } else { this._fnConstruct( init ); } }; FixedColumns.prototype = /** @lends FixedColumns.prototype */{ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Public methods * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Update the fixed columns - including headers and footers. Note that FixedColumns will * automatically update the display whenever the host DataTable redraws. * @returns {void} * @example * var table = $('#example').dataTable( { * "scrollX": "100%" * } ); * var fc = new $.fn.dataTable.fixedColumns( table ); * * // at some later point when the table has been manipulated.... * fc.fnUpdate(); */ "fnUpdate": function () { this._fnDraw( true ); }, /** * Recalculate the resizes of the 3x3 grid that FixedColumns uses for display of the table. * This is useful if you update the width of the table container. Note that FixedColumns will * perform this function automatically when the window.resize event is fired. * @returns {void} * @example * var table = $('#example').dataTable( { * "scrollX": "100%" * } ); * var fc = new $.fn.dataTable.fixedColumns( table ); * * // Resize the table container and then have FixedColumns adjust its layout.... * $('#content').width( 1200 ); * fc.fnRedrawLayout(); */ "fnRedrawLayout": function () { this._fnColCalc(); this._fnGridLayout(); this.fnUpdate(); }, /** * Mark a row such that it's height should be recalculated when using 'semiauto' row * height matching. This function will have no effect when 'none' or 'auto' row height * matching is used. * @param {Node} nTr TR element that should have it's height recalculated * @returns {void} * @example * var table = $('#example').dataTable( { * "scrollX": "100%" * } ); * var fc = new $.fn.dataTable.fixedColumns( table ); * * // manipulate the table - mark the row as needing an update then update the table * // this allows the redraw performed by DataTables fnUpdate to recalculate the row * // height * fc.fnRecalculateHeight(); * table.fnUpdate( $('#example tbody tr:eq(0)')[0], ["insert date", 1, 2, 3 ... ]); */ "fnRecalculateHeight": function ( nTr ) { delete nTr._DTTC_iHeight; nTr.style.height = 'auto'; }, /** * Set the height of a given row - provides cross browser compatibility * @param {Node} nTarget TR element that should have it's height recalculated * @param {int} iHeight Height in pixels to set * @returns {void} * @example * var table = $('#example').dataTable( { * "scrollX": "100%" * } ); * var fc = new $.fn.dataTable.fixedColumns( table ); * * // You may want to do this after manipulating a row in the fixed column * fc.fnSetRowHeight( $('#example tbody tr:eq(0)')[0], 50 ); */ "fnSetRowHeight": function ( nTarget, iHeight ) { nTarget.style.height = iHeight+"px"; }, /** * Get data index information about a row or cell in the table body. * This function is functionally identical to fnGetPosition in DataTables, * taking the same parameter (TH, TD or TR node) and returning exactly the * the same information (data index information). THe difference between * the two is that this method takes into account the fixed columns in the * table, so you can pass in nodes from the master table, or the cloned * tables and get the index position for the data in the main table. * @param {node} node TR, TH or TD element to get the information about * @returns {int} If nNode is given as a TR, then a single index is * returned, or if given as a cell, an array of [row index, column index * (visible), column index (all)] is given. */ "fnGetPosition": function ( node ) { var idx; var inst = this.s.dt.oInstance; if ( ! $(node).parents('.DTFC_Cloned').length ) { // Not in a cloned table return inst.fnGetPosition( node ); } else { // Its in the cloned table, so need to look up position if ( node.nodeName.toLowerCase() === 'tr' ) { idx = $(node).index(); return inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] ); } else { var colIdx = $(node).index(); idx = $(node.parentNode).index(); var row = inst.fnGetPosition( $('tr', this.s.dt.nTBody)[ idx ] ); return [ row, colIdx, inst.oApi._fnVisibleToColumnIndex( this.s.dt, colIdx ) ]; } } }, /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Private methods (they are of course public in JS, but recommended as private) * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Initialisation for FixedColumns * @param {Object} oInit User settings for initialisation * @returns {void} * @private */ "_fnConstruct": function ( oInit ) { var i, iLen, iWidth, that = this; /* Sanity checking */ if ( typeof this.s.dt.oInstance.fnVersionCheck != 'function' || this.s.dt.oInstance.fnVersionCheck( '1.8.0' ) !== true ) { alert( "FixedColumns "+FixedColumns.VERSION+" required DataTables 1.8.0 or later. "+ "Please upgrade your DataTables installation" ); return; } if ( this.s.dt.oScroll.sX === "" ) { this.s.dt.oInstance.oApi._fnLog( this.s.dt, 1, "FixedColumns is not needed (no "+ "x-scrolling in DataTables enabled), so no action will be taken. Use 'FixedHeader' for "+ "column fixing when scrolling is not enabled" ); return; } /* Apply the settings from the user / defaults */ this.s = $.extend( true, this.s, FixedColumns.defaults, oInit ); /* Set up the DOM as we need it and cache nodes */ var classes = this.s.dt.oClasses; this.dom.grid.dt = $(this.s.dt.nTable).parents('div.'+classes.sScrollWrapper)[0]; this.dom.scroller = $('div.'+classes.sScrollBody, this.dom.grid.dt )[0]; /* Set up the DOM that we want for the fixed column layout grid */ this._fnColCalc(); this._fnGridSetup(); /* Event handlers */ var mouseController; // When the body is scrolled - scroll the left and right columns $(this.dom.scroller) .on( 'mouseover.DTFC touchstart.DTFC', function () { mouseController = 'main'; } ) .on( 'scroll.DTFC', function () { if ( mouseController === 'main' ) { if ( that.s.iLeftColumns > 0 ) { that.dom.grid.left.liner.scrollTop = that.dom.scroller.scrollTop; } if ( that.s.iRightColumns > 0 ) { that.dom.grid.right.liner.scrollTop = that.dom.scroller.scrollTop; } } } ); var wheelType = 'onwheel' in document.createElement('div') ? 'wheel.DTFC' : 'mousewheel.DTFC'; if ( that.s.iLeftColumns > 0 ) { // When scrolling the left column, scroll the body and right column $(that.dom.grid.left.liner) .on( 'mouseover.DTFC touchstart.DTFC', function () { mouseController = 'left'; } ) .on( 'scroll.DTFC', function () { if ( mouseController === 'left' ) { that.dom.scroller.scrollTop = that.dom.grid.left.liner.scrollTop; if ( that.s.iRightColumns > 0 ) { that.dom.grid.right.liner.scrollTop = that.dom.grid.left.liner.scrollTop; } } } ) .on( wheelType, function(e) { // xxx update the destroy as well // Pass horizontal scrolling through var xDelta = e.type === 'wheel' ? -e.originalEvent.deltaX : e.originalEvent.wheelDeltaX; that.dom.scroller.scrollLeft -= xDelta; } ); } if ( that.s.iRightColumns > 0 ) { // When scrolling the right column, scroll the body and the left column $(that.dom.grid.right.liner) .on( 'mouseover.DTFC touchstart.DTFC', function () { mouseController = 'right'; } ) .on( 'scroll.DTFC', function () { if ( mouseController === 'right' ) { that.dom.scroller.scrollTop = that.dom.grid.right.liner.scrollTop; if ( that.s.iLeftColumns > 0 ) { that.dom.grid.left.liner.scrollTop = that.dom.grid.right.liner.scrollTop; } } } ) .on( wheelType, function(e) { // Pass horizontal scrolling through var xDelta = e.type === 'wheel' ? -e.originalEvent.deltaX : e.originalEvent.wheelDeltaX; that.dom.scroller.scrollLeft -= xDelta; } ); } $(window).on( 'resize.DTFC', function () { that._fnGridLayout.call( that ); } ); var bFirstDraw = true; var jqTable = $(this.s.dt.nTable); jqTable .on( 'draw.dt.DTFC', function () { that._fnDraw.call( that, bFirstDraw ); bFirstDraw = false; } ) .on( 'column-sizing.dt.DTFC', function () { that._fnColCalc(); that._fnGridLayout( that ); } ) .on( 'column-visibility.dt.DTFC', function () { that._fnColCalc(); that._fnGridLayout( that ); that._fnDraw( true ); } ) .on( 'destroy.dt.DTFC', function () { jqTable.off( 'column-sizing.dt.DTFC destroy.dt.DTFC draw.dt.DTFC' ); $(that.dom.scroller).off( 'scroll.DTFC mouseover.DTFC' ); $(window).off( 'resize.DTFC' ); $(that.dom.grid.left.liner).off( 'scroll.DTFC mouseover.DTFC '+wheelType ); $(that.dom.grid.left.wrapper).remove(); $(that.dom.grid.right.liner).off( 'scroll.DTFC mouseover.DTFC '+wheelType ); $(that.dom.grid.right.wrapper).remove(); } ); /* Get things right to start with - note that due to adjusting the columns, there must be * another redraw of the main table. It doesn't need to be a full redraw however. */ this._fnGridLayout(); this.s.dt.oInstance.fnDraw(false); }, /** * Calculate the column widths for the grid layout * @returns {void} * @private */ "_fnColCalc": function () { var that = this; var iLeftWidth = 0; var iRightWidth = 0; this.s.aiInnerWidths = []; this.s.aiOuterWidths = []; $.each( this.s.dt.aoColumns, function (i, col) { var th = $(col.nTh); var border; if ( ! th.filter(':visible').length ) { that.s.aiInnerWidths.push( 0 ); that.s.aiOuterWidths.push( 0 ); } else { // Inner width is used to assign widths to cells // Outer width is used to calculate the container var iWidth = th.outerWidth(); // When working with the left most-cell, need to add on the // table's border to the outerWidth, since we need to take // account of it, but it isn't in any cell if ( that.s.aiOuterWidths.length === 0 ) { border = $(that.s.dt.nTable).css('border-left-width'); iWidth += typeof border === 'string' ? 1 : parseInt( border, 10 ); } // Likewise with the final column on the right if ( that.s.aiOuterWidths.length === that.s.dt.aoColumns.length-1 ) { border = $(that.s.dt.nTable).css('border-right-width'); iWidth += typeof border === 'string' ? 1 : parseInt( border, 10 ); } that.s.aiOuterWidths.push( iWidth ); that.s.aiInnerWidths.push( th.width() ); if ( i < that.s.iLeftColumns ) { iLeftWidth += iWidth; } if ( that.s.iTableColumns-that.s.iRightColumns <= i ) { iRightWidth += iWidth; } } } ); this.s.iLeftWidth = iLeftWidth; this.s.iRightWidth = iRightWidth; }, /** * Set up the DOM for the fixed column. The way the layout works is to create a 1x3 grid * for the left column, the DataTable (for which we just reuse the scrolling element DataTable * puts into the DOM) and the right column. In each of he two fixed column elements there is a * grouping wrapper element and then a head, body and footer wrapper. In each of these we then * place the cloned header, body or footer tables. This effectively gives as 3x3 grid structure. * @returns {void} * @private */ "_fnGridSetup": function () { var that = this; var oOverflow = this._fnDTOverflow(); var block; this.dom.body = this.s.dt.nTable; this.dom.header = this.s.dt.nTHead.parentNode; this.dom.header.parentNode.parentNode.style.position = "relative"; var nSWrapper = $('
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
'+ '
')[0]; var nLeft = nSWrapper.childNodes[0]; var nRight = nSWrapper.childNodes[1]; this.dom.grid.dt.parentNode.insertBefore( nSWrapper, this.dom.grid.dt ); nSWrapper.appendChild( this.dom.grid.dt ); this.dom.grid.wrapper = nSWrapper; if ( this.s.iLeftColumns > 0 ) { this.dom.grid.left.wrapper = nLeft; this.dom.grid.left.head = nLeft.childNodes[0]; this.dom.grid.left.body = nLeft.childNodes[1]; this.dom.grid.left.liner = $('div.DTFC_LeftBodyLiner', nSWrapper)[0]; nSWrapper.appendChild( nLeft ); } if ( this.s.iRightColumns > 0 ) { this.dom.grid.right.wrapper = nRight; this.dom.grid.right.head = nRight.childNodes[0]; this.dom.grid.right.body = nRight.childNodes[1]; this.dom.grid.right.liner = $('div.DTFC_RightBodyLiner', nSWrapper)[0]; block = $('div.DTFC_RightHeadBlocker', nSWrapper)[0]; block.style.width = oOverflow.bar+"px"; block.style.right = -oOverflow.bar+"px"; this.dom.grid.right.headBlock = block; block = $('div.DTFC_RightFootBlocker', nSWrapper)[0]; block.style.width = oOverflow.bar+"px"; block.style.right = -oOverflow.bar+"px"; this.dom.grid.right.footBlock = block; nSWrapper.appendChild( nRight ); } if ( this.s.dt.nTFoot ) { this.dom.footer = this.s.dt.nTFoot.parentNode; if ( this.s.iLeftColumns > 0 ) { this.dom.grid.left.foot = nLeft.childNodes[2]; } if ( this.s.iRightColumns > 0 ) { this.dom.grid.right.foot = nRight.childNodes[2]; } } }, /** * Style and position the grid used for the FixedColumns layout * @returns {void} * @private */ "_fnGridLayout": function () { var oGrid = this.dom.grid; var iWidth = $(oGrid.wrapper).width(); var iBodyHeight = $(this.s.dt.nTable.parentNode).outerHeight(); var iFullHeight = $(this.s.dt.nTable.parentNode.parentNode).outerHeight(); var oOverflow = this._fnDTOverflow(); var iLeftWidth = this.s.iLeftWidth, iRightWidth = this.s.iRightWidth, iRight; var scrollbarAdjust = function ( node, width ) { if ( ! oOverflow.bar ) { // If there is no scrollbar (Macs) we need to hide the auto scrollbar node.style.width = (width+20)+"px"; node.style.paddingRight = "20px"; node.style.boxSizing = "border-box"; } else { // Otherwise just overflow by the scrollbar node.style.width = (width+oOverflow.bar)+"px"; } }; // When x scrolling - don't paint the fixed columns over the x scrollbar if ( oOverflow.x ) { iBodyHeight -= oOverflow.bar; } oGrid.wrapper.style.height = iFullHeight+"px"; if ( this.s.iLeftColumns > 0 ) { oGrid.left.wrapper.style.width = iLeftWidth+"px"; oGrid.left.wrapper.style.height = "1px"; oGrid.left.body.style.height = iBodyHeight+"px"; if ( oGrid.left.foot ) { oGrid.left.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; // shift footer for scrollbar } scrollbarAdjust( oGrid.left.liner, iLeftWidth ); oGrid.left.liner.style.height = iBodyHeight+"px"; } if ( this.s.iRightColumns > 0 ) { iRight = iWidth - iRightWidth; if ( oOverflow.y ) { iRight -= oOverflow.bar; } oGrid.right.wrapper.style.width = iRightWidth+"px"; oGrid.right.wrapper.style.left = iRight+"px"; oGrid.right.wrapper.style.height = "1px"; oGrid.right.body.style.height = iBodyHeight+"px"; if ( oGrid.right.foot ) { oGrid.right.foot.style.top = (oOverflow.x ? oOverflow.bar : 0)+"px"; } scrollbarAdjust( oGrid.right.liner, iRightWidth ); oGrid.right.liner.style.height = iBodyHeight+"px"; oGrid.right.headBlock.style.display = oOverflow.y ? 'block' : 'none'; oGrid.right.footBlock.style.display = oOverflow.y ? 'block' : 'none'; } }, /** * Get information about the DataTable's scrolling state - specifically if the table is scrolling * on either the x or y axis, and also the scrollbar width. * @returns {object} Information about the DataTables scrolling state with the properties: * 'x', 'y' and 'bar' * @private */ "_fnDTOverflow": function () { var nTable = this.s.dt.nTable; var nTableScrollBody = nTable.parentNode; var out = { "x": false, "y": false, "bar": this.s.dt.oScroll.iBarWidth }; if ( nTable.offsetWidth > nTableScrollBody.clientWidth ) { out.x = true; } if ( nTable.offsetHeight > nTableScrollBody.clientHeight ) { out.y = true; } return out; }, /** * Clone and position the fixed columns * @returns {void} * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) * @private */ "_fnDraw": function ( bAll ) { this._fnGridLayout(); this._fnCloneLeft( bAll ); this._fnCloneRight( bAll ); /* Draw callback function */ if ( this.s.fnDrawCallback !== null ) { this.s.fnDrawCallback.call( this, this.dom.clone.left, this.dom.clone.right ); } /* Event triggering */ $(this).trigger( 'draw.dtfc', { "leftClone": this.dom.clone.left, "rightClone": this.dom.clone.right } ); }, /** * Clone the right columns * @returns {void} * @param {Boolean} bAll Indicate if the header and footer should be updated as well (true) * @private */ "_fnCloneRight": function ( bAll ) { if ( this.s.iRightColumns <= 0 ) { return; } var that = this, i, jq, aiColumns = []; for ( i=this.s.iTableColumns-this.s.iRightColumns ; ithead', oClone.header); jqCloneThead.empty(); /* Add the created cloned TR elements to the table */ for ( i=0, iLen=aoCloneLayout.length ; ithead', oClone.header)[0] ); for ( i=0, iLen=aoCloneLayout.length ; itbody>tr', that.dom.body).css('height', 'auto'); } if ( oClone.body !== null ) { oClone.body.parentNode.removeChild( oClone.body ); oClone.body = null; } oClone.body = $(this.dom.body).clone(true)[0]; oClone.body.className += " DTFC_Cloned"; oClone.body.style.paddingBottom = dt.oScroll.iBarWidth+"px"; oClone.body.style.marginBottom = (dt.oScroll.iBarWidth*2)+"px"; /* For IE */ if ( oClone.body.getAttribute('id') !== null ) { oClone.body.removeAttribute('id'); } $('>thead>tr', oClone.body).empty(); $('>tfoot', oClone.body).remove(); var nBody = $('tbody', oClone.body)[0]; $(nBody).empty(); if ( dt.aiDisplay.length > 0 ) { /* Copy the DataTables' header elements to force the column width in exactly the * same way that DataTables does it - have the header element, apply the width and * colapse it down */ var nInnerThead = $('>thead>tr', oClone.body)[0]; for ( iIndex=0 ; iIndextbody>tr', that.dom.body).each( function (z) { var n = this.cloneNode(false); n.removeAttribute('id'); var i = that.s.dt.oFeatures.bServerSide===false ? that.s.dt.aiDisplay[ that.s.dt._iDisplayStart+z ] : z; var aTds = that.s.dt.aoData[ i ].anCells || $(this).children('td, th'); for ( iIndex=0 ; iIndex 0 ) { nClone = $( aTds[iColumn] ).clone(true, true)[0]; n.appendChild( nClone ); } } nBody.appendChild( n ); } ); } else { $('>tbody>tr', that.dom.body).each( function (z) { nClone = this.cloneNode(true); nClone.className += ' DTFC_NoData'; $('td', nClone).html(''); nBody.appendChild( nClone ); } ); } oClone.body.style.width = "100%"; oClone.body.style.margin = "0"; oClone.body.style.padding = "0"; // Interop with Scroller - need to use a height forcing element in the // scrolling area in the same way that Scroller does in the body scroll. if ( dt.oScroller !== undefined ) { var scrollerForcer = dt.oScroller.dom.force; if ( ! oGrid.forcer ) { oGrid.forcer = scrollerForcer.cloneNode( true ); oGrid.liner.appendChild( oGrid.forcer ); } else { oGrid.forcer.style.height = scrollerForcer.style.height; } } oGrid.liner.appendChild( oClone.body ); this._fnEqualiseHeights( 'tbody', that.dom.body, oClone.body ); /* * Footer */ if ( dt.nTFoot !== null ) { if ( bAll ) { if ( oClone.footer !== null ) { oClone.footer.parentNode.removeChild( oClone.footer ); } oClone.footer = $(this.dom.footer).clone(true, true)[0]; oClone.footer.className += " DTFC_Cloned"; oClone.footer.style.width = "100%"; oGrid.foot.appendChild( oClone.footer ); /* Copy the footer just like we do for the header */ aoCloneLayout = this._fnCopyLayout( dt.aoFooter, aiColumns ); var jqCloneTfoot = $('>tfoot', oClone.footer); jqCloneTfoot.empty(); for ( i=0, iLen=aoCloneLayout.length ; itfoot', oClone.footer)[0] ); for ( i=0, iLen=aoCloneLayout.length ; ithead', oClone.header)[0] ); $(anUnique).each( function (i) { iColumn = aiColumns[i]; this.style.width = that.s.aiInnerWidths[iColumn]+"px"; } ); if ( that.s.dt.nTFoot !== null ) { anUnique = dt.oApi._fnGetUniqueThs( dt, $('>tfoot', oClone.footer)[0] ); $(anUnique).each( function (i) { iColumn = aiColumns[i]; this.style.width = that.s.aiInnerWidths[iColumn]+"px"; } ); } }, /** * From a given table node (THEAD etc), get a list of TR direct child elements * @param {Node} nIn Table element to search for TR elements (THEAD, TBODY or TFOOT element) * @returns {Array} List of TR elements found * @private */ "_fnGetTrNodes": function ( nIn ) { var aOut = []; for ( var i=0, iLen=nIn.childNodes.length ; i'+nodeName+'>tr:eq(0)', original).children(':first'), iBoxHack = jqBoxHack.outerHeight() - jqBoxHack.height(), anOriginal = this._fnGetTrNodes( rootOriginal ), anClone = this._fnGetTrNodes( rootClone ), heights = []; for ( i=0, iLen=anClone.length ; i iHeightOriginal ? iHeightClone : iHeightOriginal; if ( this.s.sHeightMatch == 'semiauto' ) { anOriginal[i]._DTTC_iHeight = iHeight; } heights.push( iHeight ); } for ( i=0, iLen=anClone.length ; i
')[0], g=c.childNodes[0],f=c.childNodes[1];this.dom.grid.dt.parentNode.insertBefore(c,this.dom.grid.dt);c.appendChild(this.dom.grid.dt);this.dom.grid.wrapper=c;0b.clientWidth&&(c.x=!0);a.offsetHeight>b.clientHeight&&(c.y=!0);return c},_fnDraw:function(a){this._fnGridLayout();this._fnCloneLeft(a);this._fnCloneRight(a);null!==this.s.fnDrawCallback&&this.s.fnDrawCallback.call(this,this.dom.clone.left,this.dom.clone.right);d(this).trigger("draw.dtfc",{leftClone:this.dom.clone.left,rightClone:this.dom.clone.right})},_fnCloneRight:function(a){if(!(0>= this.s.iRightColumns)){var b,c=[];for(b=this.s.iTableColumns-this.s.iRightColumns;b=this.s.iLeftColumns)){var b,c=[];for(b=0;bthead",a.header);k.empty();e=0;for(h=n.length;ethead",a.header)[0]);e=0;for(h=n.length;etbody>tr",f.dom.body).css("height","auto");null!==a.body&&(a.body.parentNode.removeChild(a.body),a.body=null);a.body=d(this.dom.body).clone(!0)[0];a.body.className+=" DTFC_Cloned";a.body.style.paddingBottom=l.oScroll.iBarWidth+"px";a.body.style.marginBottom=2*l.oScroll.iBarWidth+"px";null!==a.body.getAttribute("id")&&a.body.removeAttribute("id");d(">thead>tr",a.body).empty();d(">tfoot", a.body).remove();var p=d("tbody",a.body)[0];d(p).empty();if(0thead>tr",a.body)[0];for(o=0;otbody>tr",f.dom.body).each(function(a){var b=this.cloneNode(false);b.removeAttribute("id");a=f.s.dt.aoData[f.s.dt.oFeatures.bServerSide===false?f.s.dt.aiDisplay[f.s.dt._iDisplayStart+ a]:a].anCells||d(this).children("td, th");for(o=0;o0){m=d(a[j]).clone(true,true)[0];b.appendChild(m)}}p.appendChild(b)})}else d(">tbody>tr",f.dom.body).each(function(){m=this.cloneNode(true);m.className=m.className+" DTFC_NoData";d("td",m).html("");p.appendChild(m)});a.body.style.width="100%";a.body.style.margin="0";a.body.style.padding="0";l.oScroller!==t&&(h=l.oScroller.dom.force,b.forcer?b.forcer.style.height=h.style.height:(b.forcer=h.cloneNode(!0),b.liner.appendChild(b.forcer))); b.liner.appendChild(a.body);this._fnEqualiseHeights("tbody",f.dom.body,a.body);if(null!==l.nTFoot){if(g){null!==a.footer&&a.footer.parentNode.removeChild(a.footer);a.footer=d(this.dom.footer).clone(!0,!0)[0];a.footer.className+=" DTFC_Cloned";a.footer.style.width="100%";b.foot.appendChild(a.footer);n=this._fnCopyLayout(l.aoFooter,c);b=d(">tfoot",a.footer);b.empty();e=0;for(h=n.length;etfoot",a.footer)[0]);e=0;for(h=n.length;ethead",a.header)[0]);d(b).each(function(a){j=c[a];this.style.width=f.s.aiInnerWidths[j]+"px"});null!==f.s.dt.nTFoot&&(b=l.oApi._fnGetUniqueThs(l,d(">tfoot",a.footer)[0]),d(b).each(function(a){j=c[a];this.style.width=f.s.aiInnerWidths[j]+"px"}))},_fnGetTrNodes:function(a){for(var b= [],c=0,d=a.childNodes.length;c"+a+">tr:eq(0)",b).children(":first");a.outerHeight();a.height();for(var e=this._fnGetTrNodes(e),b=this._fnGetTrNodes(c),h=[],c=0,a=b.length;cg?f:g,"semiauto"==this.s.sHeightMatch&& (e[c]._DTTC_iHeight=g),h.push(g);c=0;for(a=b.length;c Responsive example - Foundation styling

Responsive example Foundation styling

This example shows DataTables and the Responsive extension being used with the Foundation framework providing the styling. The DataTables / Foundation integration files prove seamless integration for DataTables to be used in a Foundation page.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable(); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

table.dataTable th, table.dataTable td { white-space: nowrap; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!Y)*Z*Z@datatables/extensions/Responsive/examples/styling/bootstrap.htmlnu[ Responsive example - Bootstrap styling

Responsive example Bootstrap styling

This example shows DataTables and the Responsive extension being used with the Bootstrap framework providing the styling. The DataTables / Bootstrap integration files prove seamless integration for DataTables to be used in a Bootstrap page.

Note that the dt-responsive class is used to indicate to the extension that it should be enabled on this page, as responsive has special meaning in Bootstrap. The responsiveR option could also be used if required.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable(); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

body { font-size: 140% } table.dataTable th, table.dataTable td { white-space: nowrap; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!>hMWMW@datatables/extensions/Responsive/examples/styling/scrolling.htmlnu[ Responsive example - Vertical scrolling

Responsive example Vertical scrolling

This example shows Responsive in use with the scrollYDT option to present a scrolling table (instead of using paging as the other Responsive examples do). Responsive will automatically work with the table in such a configuration.

Responsive can be used with scrollXDT, however it is relatively pointless as Responsive will remove columns to ensure that there is no horizontal scrolling!

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { scrollY: 300, paging: false } ); new $.fn.dataTable.Responsive( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

div.container { max-width: 1200px }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!51V1V>datatables/extensions/Responsive/examples/styling/compact.htmlnu[ Responsive example - Compact styling

Responsive example Compact styling

DataTables' default stylesheet has a number number of features available that can be enabled by including a class name on the DataTable. One of those options is compact which displays the DataTable with less whitespace padding that might other be used to increase the information density of the table. Responsive's own style has support for this compact styling as showing in this example.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable(); new $.fn.dataTable.Responsive( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

div.container { max-width: 1200px }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!yu u <datatables/extensions/Responsive/examples/styling/index.htmlnu[ Responsive examples - Styling

Responsive example Styling

Responsive requires very little styling information of its own, with styling needed only for the child row display when the table has been collapsed. As such, integrating Responsive with your application should be as simple as including the Javascript and base stylesheet! This section shows Responsive being styling using external CSS frameworks.

PK!nRRFdatatables/extensions/Responsive/examples/child-rows/right-column.htmlnu[ Responsive example - Column control - right

Responsive example Column control - right

When using the column child row control type, Responsive has the ability to use any column or element as the show / hide control for the row details. This is provided through the responsive.details.targetR option, which can be either a column index, or a jQuery selector.

This example shows the last column in the table being used as the control column.

First name Last name Position Office Age Start date Salary Extn.
First name Last name Position Office Age Start date Salary Extn.
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769
Suki Burks Developer London 53 2009/10/22 $114,500 6832
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383
Thor Walton Developer New York 61 2013/08/11 $98,540 8327
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { responsive: { details: { type: 'column', target: -1 } }, columnDefs: [ { className: 'control', orderable: false, targets: -1 } ] } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!fUfUHdatatables/extensions/Responsive/examples/child-rows/column-control.htmlnu[ Responsive example - Column controlled child rows

Responsive example Column controlled child rows

Responsive has two built in methods for displaying the controlling element of the child rows; inline which is the default option and shows the control in the first column, and column which set a control column as the control. The control column is shown only when there is some other column hidden, and is dedicated only to the show / hide control for the rows.

This example shows the responsive.details.typeR option set to column to activate the control column. Note that by default the first column is used as the control, so additionally in the initialisation the orderDT and columns.orderableDT options are used to disable sorting on this column.

First name Last name Position Office Age Start date Salary Extn.
First name Last name Position Office Age Start date Salary Extn.
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769
Suki Burks Developer London 53 2009/10/22 $114,500 6832
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383
Thor Walton Developer New York 61 2013/08/11 $98,540 8327
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { responsive: { details: { type: 'column' } }, columnDefs: [ { className: 'control', orderable: false, targets: 0 } ], order: [ 1, 'asc' ] } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!kʜr[r[Idatatables/extensions/Responsive/examples/child-rows/custom-renderer.htmlnu[ Responsive example - Custom child row renderer

Responsive example Custom child row renderer

The child row's for a collapsed table in Responsive, by default, show a ul/li list of the data from the hidden columns. The responsive.details.rendererR option provide the ability to create your own custom renderer. It is given two parameters: the DataTables API instance for the table and the row index to use.

This example shows the cells()DT method being used to select the hidden columns and constructing a table of the data. You could refine the selector to select only certain columns, or show all columns, etc.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { responsive: { details: { renderer: function ( api, rowIdx ) { // Select hidden columns for the given row var data = api.cells( rowIdx, ':hidden' ).eq(0).map( function ( cell ) { var header = $( api.column( cell.column ).header() ); return '<tr>'+ '<td>'+ header.text()+':'+ '</td> '+ '<td>'+ api.cell( cell ).data()+ '</td>'+ '</tr>'; } ).toArray().join(''); return data ? $('<table/>').append( data ) : false; } } } } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK![FUULdatatables/extensions/Responsive/examples/child-rows/disable-child-rows.htmlnu[ Responsive example - Disable child rows

Responsive example Disable child rows

By default, when Responsive collapses a table, it will show an option for the end user to expand the row, showing the details of the hidden columns in a child row. This can be disabled using the responsive.detailsR option and setting it to false, as shown in the example below. In this case the hidden data is not directly accessible to the end user.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { responsive: { details: false } } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!vRRKdatatables/extensions/Responsive/examples/child-rows/whole-row-control.htmlnu[ Responsive example - Whole row child row control

Responsive example Whole row child row control

When using the column details type in Responsive the responsive.details.targetR option provides the ability to control what element is used to show / hide the child rows when the table is collapsed.

This example uses the tr selector to have the whole row act as the control.

First name Last name Position Office Age Start date Salary Extn.
First name Last name Position Office Age Start date Salary Extn.
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769
Suki Burks Developer London 53 2009/10/22 $114,500 6832
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383
Thor Walton Developer New York 61 2013/08/11 $98,540 8327
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { responsive: { details: { type: 'column', target: 'tr' } }, columnDefs: [ { className: 'control', orderable: false, targets: 0 } ], order: [ 1, 'asc' ] } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!8 RR?datatables/extensions/Responsive/examples/child-rows/index.htmlnu[ Responsive examples - Child row control

Responsive example Child row control

When a column is removed from display by Responsive, the data is still available in the table and can be displayed in a DataTables child row (see row().child()DT). By default Responsive will show child row controls in the first column when the table has been collapsed, allowing the end user to show / hide the information from the hidden columns.

Responsive has a number of options for display of the child rows:

This section shows examples of these options being used.

PK!xUxUGdatatables/extensions/Responsive/examples/initialisation/className.htmlnu[ Responsive example - Class name

Responsive example Class name

The easiest way to initialise the Responsive extension for DataTables is simply to add the class responsive to the table's class name. When the DataTable is initialised the Responsive extension will automatically enable itself on these tables.

The may also use the class dt-responsive to perform the same action, since responsive may be used in your stylesheet, or may have some other meaning in a CSS framework being used (for example Bootstrap).

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable(); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!T)W)WAdatatables/extensions/Responsive/examples/initialisation/new.htmlnu[ Responsive example - `new` constructor

Responsive example `new` constructor

Responsive will automatically detect new DataTable instances being created on a page and initialise itself if it find the responsiveR option or responsive class name on the table, as shown in the other examples.

The third way of initialising Responsive is manually creating a new instance using the $.fn.dataTable.Responsive class, as shown in this example (the other two methods are provided using this constructor in a initDT event handler!).

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable(); new $.fn.dataTable.Responsive( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

div.container { max-width: 1200px }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!^0W0WEdatatables/extensions/Responsive/examples/initialisation/default.htmlnu[ Responsive example - Default initialisation

Responsive example Default initialisation

It can often be useful to be able to set a default value for DataTables' initialisation options, providing a common starting point for initialisation when working with multiple tables over many pages or even just on a single page. DataTables provides that ability through the $.fn.dataTable.defaults object which can have any of the initialisation options set.

Extending that ability, Responsive can also be set to initialise by default, as shown in this example thorugh the $.fn.dataTable.defaults.responsive property. Extending that, all of the Responsive options can also be set using this configuration option (i.e. use responsive as an object).

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$.extend( $.fn.dataTable.defaults, { responsive: true } ); $(document).ready(function() { $('#example').DataTable(); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!~% % Bdatatables/extensions/Responsive/examples/initialisation/ajax.htmlnu[ Responsive example - Ajax data

Responsive example Ajax data

This example shows the Responsive extension working with Ajax sourced data in the DataTable. Note that no special initialisation is required. Responsive is enabled by adding the responsive class to the table element.

Name Position Office Extn. Start date Salary
Name Position Office Extn. Start date Salary
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { "ajax": "../../../../examples/ajax/data/objects.txt", "columns": [ { "data": "name" }, { "data": "position" }, { "data": "office" }, { "data": "extn" }, { "data": "start_date" }, { "data": "salary" } ] } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

div.container { max-width: 1200px }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!` W WDdatatables/extensions/Responsive/examples/initialisation/option.htmlnu[ Responsive example - Configuration option

Responsive example Configuration option

The Responsive extension for DataTables can be applied to a DataTable in one of two ways; with a specific class name on the table, or using the DataTables initialisation options. This method shows the latter, with the responsiveR option being set to the boolean value true.

The responsiveR option can be given as a boolean value, or as an object with configuration options. If as a boolean, as in this case, the default options are used.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { responsive: true } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

div.container { max-width: 1200px }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK! / Cdatatables/extensions/Responsive/examples/initialisation/index.htmlnu[ Responsive examples - Initialisation

Responsive example Initialisation

Responsive can be run on a DataTable in a number of different ways:

  • By adding the class responsive or dt-responsive to the table
  • Using the responsiveR option in the DataTables initialisation
  • Use the $.fn.dataTable.Responsive constructor.

This set of examples demonstrates these initialisation options.

PK!=/((Fdatatables/extensions/Responsive/examples/display-control/classes.htmlnu[ Responsive example - Class control

Responsive example Class control

You can tell Responsive what columns to want to be visible on different devices through the use of class names on the columns. The breakpoints are horizontal screen resolutions and the defaults are set for common devices:

  • desktop x >= 1024px
  • tablet-l (landscape) 768 <= x < 1024
  • tablet-p (portrait) 480 <= x < 768
  • mobile-l (landscape) 320 <= x < 480
  • mobile-p (portrait) x < 320

You may leave the -[lp] option from the end if you wish to just target all tablet or mobile devices. Additionally to may add min-, max- or not- as a prefix to the class name to perform logic operations. For example not-mobile would cause a column to appear as visible on desktop and tablet devices, while min-tablet-l would require at least a horizontal width of 768 for the browser window to be shown, and be shown at all sizes larger.

Additionally, there are three special class names:

  • all - Always display
  • none - Don't display as a column, but show in the child row
  • never - Never display
  • control - Used for the column responsive.details.typeR option.

Please refer to the Responsive manual for further details of these options.

This example shows the salary column visible on a desktop only - office and age require a tablet, while the position column requires a phone in landscape or larger. The name column is always visible and the start date is never visible.

This can be useful if you wish to change the format of the data shown on different devices, for example using a combination of mobile and not-mobile on two different columns would allow information to be formatted suitable for each device type.

Name Position Office Age Start date Salary Extn.
Name Position Office Age Start date Salary Extn.
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { "ajax": "../../../../examples/ajax/data/objects.txt", "columns": [ { "data": "name" }, { "data": "position" }, { "data": "office" }, { "data": "age" }, { "data": "start_date" }, { "data": "salary" }, { "data": "extn" } ] } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!s""Kdatatables/extensions/Responsive/examples/display-control/init-classes.htmlnu[ Responsive example - Assigned class control

Responsive example Assigned class control

This example exactly matches the functionality of the class control example but in this case the classes are assigned using the columns.classNameDT option.

Name Position Office Age Start date Salary Extn.
Name Position Office Age Start date Salary Extn.
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable( { "ajax": "../../../../examples/ajax/data/objects.txt", "columns": [ { "data": "name", className: "all" }, { "data": "position", className: "min-phone-l" }, { "data": "office", className: "min-tablet" }, { "data": "age", className: "min-tablet" }, { "data": "start_date", className: "never" }, { "data": "salary", className: "desktop" }, { "data": "extn", className: "none" } ] } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!#CUUCdatatables/extensions/Responsive/examples/display-control/auto.htmlnu[ Responsive example - Automatic column hiding

Responsive example Automatic column hiding

Responsive will automatically detect which columns have breakpoint class names assigned to them for visibility control. If no breakpoint class is found for a column, Responsive will determine automatically if the column should be shown or not at any particular viewport width. This is done by removing columns which cause the table to overflow the viewport, with the columns being removed from the right.

This example shows that simple case. On a desktop browser resize the window horizontally to see columns added and removed on-the-fly. On a tablet or mobile browser, change the screen's orientation.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { $('#example').DataTable(); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!C̗[W[WJdatatables/extensions/Responsive/examples/display-control/fixedHeader.htmlnu[ Responsive example - With FixedHeader

Responsive example With FixedHeader

This example shows Responsive being used with the DataTables FixedHeader extension. FixedHeader will lock a table's header to the top of the table, ensuring that the user always knows what each column relates to.

First name Last name Position Office Age Start date Salary Extn. E-mail
Tiger Nixon System Architect Edinburgh 61 2011/04/25 $320,800 5421 t.nixon@datatables.net
Garrett Winters Accountant Tokyo 63 2011/07/25 $170,750 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author San Francisco 66 2009/01/12 $86,000 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer Edinburgh 22 2012/03/29 $433,060 6224 c.kelly@datatables.net
Airi Satou Accountant Tokyo 33 2008/11/28 $162,700 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist New York 61 2012/12/02 $372,000 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant San Francisco 59 2012/08/06 $137,500 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist Tokyo 55 2010/10/14 $327,900 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer San Francisco 39 2009/09/15 $205,500 2360 c.hurst@datatables.net
Sonya Frost Software Engineer Edinburgh 23 2008/12/13 $103,600 1667 s.frost@datatables.net
Jena Gaines Office Manager London 30 2008/12/19 $90,560 3814 j.gaines@datatables.net
Quinn Flynn Support Lead Edinburgh 22 2013/03/03 $342,000 9497 q.flynn@datatables.net
Charde Marshall Regional Director San Francisco 36 2008/10/16 $470,600 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer London 43 2012/12/18 $313,500 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director London 19 2010/03/17 $385,750 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer London 66 2012/11/27 $198,500 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) New York 64 2010/06/09 $725,000 3059 p.byrd@datatables.net
Gloria Little Systems Administrator New York 59 2009/04/10 $237,500 1721 g.little@datatables.net
Bradley Greer Software Engineer London 41 2012/10/13 $132,000 2558 b.greer@datatables.net
Dai Rios Personnel Lead Edinburgh 35 2012/09/26 $217,500 2290 d.rios@datatables.net
Jenette Caldwell Development Lead New York 30 2011/09/03 $345,000 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) New York 40 2009/06/25 $675,000 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support New York 21 2011/12/12 $106,450 8330 c.vance@datatables.net
Doris Wilder Sales Assistant Sidney 23 2010/09/20 $85,600 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) London 47 2009/10/09 $1,200,000 5797 a.ramos@datatables.net
Gavin Joyce Developer Edinburgh 42 2010/12/22 $92,575 8822 g.joyce@datatables.net
Jennifer Chang Regional Director Singapore 28 2010/11/14 $357,650 9239 j.chang@datatables.net
Brenden Wagner Software Engineer San Francisco 28 2011/06/07 $206,850 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) San Francisco 48 2010/03/11 $850,000 2947 f.green@datatables.net
Shou Itou Regional Marketing Tokyo 20 2011/08/14 $163,000 8899 s.itou@datatables.net
Michelle House Integration Specialist Sidney 37 2011/06/02 $95,400 2769 m.house@datatables.net
Suki Burks Developer London 53 2009/10/22 $114,500 6832 s.burks@datatables.net
Prescott Bartlett Technical Author London 27 2011/05/07 $145,000 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader San Francisco 22 2008/10/26 $235,500 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support Edinburgh 46 2011/03/09 $324,050 8240 m.mccray@datatables.net
Unity Butler Marketing Designer San Francisco 47 2009/12/09 $85,675 5384 u.butler@datatables.net
Howard Hatfield Office Manager San Francisco 51 2008/12/16 $164,500 7031 h.hatfield@datatables.net
Hope Fuentes Secretary San Francisco 41 2010/02/12 $109,850 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller San Francisco 62 2009/02/14 $452,500 9422 v.harrell@datatables.net
Timothy Mooney Office Manager London 37 2008/12/11 $136,200 7580 t.mooney@datatables.net
Jackson Bradshaw Director New York 65 2008/09/26 $645,750 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer Singapore 64 2011/02/03 $234,500 2120 o.liang@datatables.net
Bruno Nash Software Engineer London 38 2011/05/03 $163,500 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer Tokyo 37 2009/08/19 $139,575 9383 s.yamamoto@datatables.net
Thor Walton Developer New York 61 2013/08/11 $98,540 8327 t.walton@datatables.net
Finn Camacho Support Engineer San Francisco 47 2009/07/07 $87,500 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator Singapore 64 2012/04/09 $138,575 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer New York 63 2010/01/04 $125,250 7439 z.frank@datatables.net
Zorita Serrano Software Engineer San Francisco 56 2012/06/01 $115,000 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer Edinburgh 43 2013/02/01 $75,650 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant New York 46 2011/12/06 $145,600 3990 c.stevens@datatables.net
Hermione Butler Regional Director London 47 2011/03/21 $356,250 1016 h.butler@datatables.net
Lael Greer Systems Administrator London 21 2009/02/27 $103,500 6733 l.greer@datatables.net
Jonas Alexander Developer San Francisco 30 2010/07/14 $86,500 8196 j.alexander@datatables.net
Shad Decker Regional Director Edinburgh 51 2008/11/13 $183,000 6373 s.decker@datatables.net
Michael Bruce Javascript Developer Singapore 29 2011/06/27 $183,000 5384 m.bruce@datatables.net
Donna Snider Customer Support New York 27 2011/01/25 $112,000 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { var table = $('#example').DataTable( { responsive: true, paging: false } ); new $.fn.dataTable.FixedHeader( table ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

div.container { max-width: 1200px }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!CV3Q3QLdatatables/extensions/Responsive/examples/display-control/complexHeader.htmlnu[ Responsive example - Complex headers (rowspan / colspan)

Responsive example Complex headers (rowspan / colspan)

This example shows how Responsive can be used with complex headers (i.e. headers that contain colspan attributes for one or more cells). As Responsive will removed columns one at a time the cell with the colspan attribute can end up forcing the width of a column, disrupting the flow. Rather than removing all columns under the colspan cell, we want to reduce the amount of text that is visible in that cell. This example shows how that can be achieved thought a little bit of jQuery and CSS.

We use jQuery to find the header cells which have a colspan attribute and wrap their contents in a span tag. That span is then set to position: absolute; using text-overflow: ellipsis. The result is that the text of the colspan cell will reduce automatically to fit the available area based on the contents of the column cells below it.

This functionality is not currently built into Responsive. It likely will be for v1.1.

Name HR Information Contact
Position Salary Office Extn. E-mail
Name Position Salary Office Extn. E-mail
Tiger Nixon System Architect $320,800 Edinburgh 5421 t.nixon@datatables.net
Garrett Winters Accountant $170,750 Tokyo 8422 g.winters@datatables.net
Ashton Cox Junior Technical Author $86,000 San Francisco 1562 a.cox@datatables.net
Cedric Kelly Senior Javascript Developer $433,060 Edinburgh 6224 c.kelly@datatables.net
Airi Satou Accountant $162,700 Tokyo 5407 a.satou@datatables.net
Brielle Williamson Integration Specialist $372,000 New York 4804 b.williamson@datatables.net
Herrod Chandler Sales Assistant $137,500 San Francisco 9608 h.chandler@datatables.net
Rhona Davidson Integration Specialist $327,900 Tokyo 6200 r.davidson@datatables.net
Colleen Hurst Javascript Developer $205,500 San Francisco 2360 c.hurst@datatables.net
Sonya Frost Software Engineer $103,600 Edinburgh 1667 s.frost@datatables.net
Jena Gaines Office Manager $90,560 London 3814 j.gaines@datatables.net
Quinn Flynn Support Lead $342,000 Edinburgh 9497 q.flynn@datatables.net
Charde Marshall Regional Director $470,600 San Francisco 6741 c.marshall@datatables.net
Haley Kennedy Senior Marketing Designer $313,500 London 3597 h.kennedy@datatables.net
Tatyana Fitzpatrick Regional Director $385,750 London 1965 t.fitzpatrick@datatables.net
Michael Silva Marketing Designer $198,500 London 1581 m.silva@datatables.net
Paul Byrd Chief Financial Officer (CFO) $725,000 New York 3059 p.byrd@datatables.net
Gloria Little Systems Administrator $237,500 New York 1721 g.little@datatables.net
Bradley Greer Software Engineer $132,000 London 2558 b.greer@datatables.net
Dai Rios Personnel Lead $217,500 Edinburgh 2290 d.rios@datatables.net
Jenette Caldwell Development Lead $345,000 New York 1937 j.caldwell@datatables.net
Yuri Berry Chief Marketing Officer (CMO) $675,000 New York 6154 y.berry@datatables.net
Caesar Vance Pre-Sales Support $106,450 New York 8330 c.vance@datatables.net
Doris Wilder Sales Assistant $85,600 Sidney 3023 d.wilder@datatables.net
Angelica Ramos Chief Executive Officer (CEO) $1,200,000 London 5797 a.ramos@datatables.net
Gavin Joyce Developer $92,575 Edinburgh 8822 g.joyce@datatables.net
Jennifer Chang Regional Director $357,650 Singapore 9239 j.chang@datatables.net
Brenden Wagner Software Engineer $206,850 San Francisco 1314 b.wagner@datatables.net
Fiona Green Chief Operating Officer (COO) $850,000 San Francisco 2947 f.green@datatables.net
Shou Itou Regional Marketing $163,000 Tokyo 8899 s.itou@datatables.net
Michelle House Integration Specialist $95,400 Sidney 2769 m.house@datatables.net
Suki Burks Developer $114,500 London 6832 s.burks@datatables.net
Prescott Bartlett Technical Author $145,000 London 3606 p.bartlett@datatables.net
Gavin Cortez Team Leader $235,500 San Francisco 2860 g.cortez@datatables.net
Martena Mccray Post-Sales support $324,050 Edinburgh 8240 m.mccray@datatables.net
Unity Butler Marketing Designer $85,675 San Francisco 5384 u.butler@datatables.net
Howard Hatfield Office Manager $164,500 San Francisco 7031 h.hatfield@datatables.net
Hope Fuentes Secretary $109,850 San Francisco 6318 h.fuentes@datatables.net
Vivian Harrell Financial Controller $452,500 San Francisco 9422 v.harrell@datatables.net
Timothy Mooney Office Manager $136,200 London 7580 t.mooney@datatables.net
Jackson Bradshaw Director $645,750 New York 1042 j.bradshaw@datatables.net
Olivia Liang Support Engineer $234,500 Singapore 2120 o.liang@datatables.net
Bruno Nash Software Engineer $163,500 London 6222 b.nash@datatables.net
Sakura Yamamoto Support Engineer $139,575 Tokyo 9383 s.yamamoto@datatables.net
Thor Walton Developer $98,540 New York 8327 t.walton@datatables.net
Finn Camacho Support Engineer $87,500 San Francisco 2927 f.camacho@datatables.net
Serge Baldwin Data Coordinator $138,575 Singapore 8352 s.baldwin@datatables.net
Zenaida Frank Software Engineer $125,250 New York 7439 z.frank@datatables.net
Zorita Serrano Software Engineer $115,000 San Francisco 4389 z.serrano@datatables.net
Jennifer Acosta Junior Javascript Developer $75,650 Edinburgh 3431 j.acosta@datatables.net
Cara Stevens Sales Assistant $145,600 New York 3990 c.stevens@datatables.net
Hermione Butler Regional Director $356,250 London 1016 h.butler@datatables.net
Lael Greer Systems Administrator $103,500 London 6733 l.greer@datatables.net
Jonas Alexander Developer $86,500 San Francisco 8196 j.alexander@datatables.net
Shad Decker Regional Director $183,000 Edinburgh 6373 s.decker@datatables.net
Michael Bruce Javascript Developer $183,000 Singapore 5384 m.bruce@datatables.net
Donna Snider Customer Support $112,000 New York 4226 d.snider@datatables.net
  • Javascript
  • HTML
  • CSS
  • Ajax
  • Server-side script

The Javascript shown below is used to initialise the table shown in this example:

$(document).ready(function() { // jQuery update a column title from the demo table to contain a long description // You would not need to do this in your own code. $('#example thead tr:eq(0) th:eq(2)').html("This is a really long column title!"); // Wrap the colspan'ing header cells with a span so they can be positioned // absolutely - filling the available space, and no more. $('#example thead th[colspan]').wrapInner( '<span/>' ).append( '&nbsp;' ); // Standard initialisation $('#example').DataTable( { responsive: true, paging: false } ); } );

In addition to the above code, the following Javascript library files are loaded for use in this example:

The HTML shown below is the raw HTML table element, before it has been enhanced by DataTables:

This example uses a little bit of additional CSS beyond what is loaded from the library files (below), in order to correctly display the table. The additional CSS used is shown below:

th { position: relative; min-height: 41px; } span { display: block; position: absolute; left: 0; right: 0; white-space: nowrap; text-overflow: ellipsis; overflow: hidden; }

The following CSS library files are loaded for use in this example to provide the styling of the table:

This table loads data by Ajax. The latest data that has been loaded is shown below. This data will update automatically as any additional data is loaded.

The script used to perform the server-side processing for this table is shown below. Please note that this is just an example script using PHP. Server-side processing scripts can be written in any language, using the protocol described in the DataTables documentation.

PK!n$z Ddatatables/extensions/Responsive/examples/display-control/index.htmlnu[ Responsive examples - Display control

Responsive example Display control

Responsive has two basic modes of operation for controlling the visibility of columns at different display sizes. These two modes can be using either separately or together:

  • Manually assigned class names for breakpoints - Assign a column a class name to tell Responsive which breakpoint(s) to show it in.
  • Automatically - for columns without a breakpoint class name, it will be automatically removed if there is no room available on screen to show it. Columns are removed from the right, moving left.

This section explores these two options.

PK!V&4datatables/extensions/Responsive/examples/index.htmlnu[ Responsive examples - Responsive DataTables

Responsive example Responsive DataTables

PK!b[@@,datatables/extensions/Responsive/License.txtnu[Copyright (c) 2014-2015 SpryMedia Limited http://datatables.net Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK!*datatables/extensions/Responsive/Readme.mdnu[PK!c: b b<datatables/extensions/Responsive/js/dataTables.responsive.jsnu[/*! Responsive 1.0.6 * 2014-2015 SpryMedia Ltd - datatables.net/license */ /** * @summary Responsive * @description Responsive tables plug-in for DataTables * @version 1.0.6 * @file dataTables.responsive.js * @author SpryMedia Ltd (www.sprymedia.co.uk) * @contact www.sprymedia.co.uk/contact * @copyright Copyright 2014-2015 SpryMedia Ltd. * * This source file is free software, available under the following license: * MIT license - http://datatables.net/license/mit * * This source file is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details. * * For details please refer to: http://www.datatables.net */ (function(window, document, undefined) { var factory = function( $, DataTable ) { "use strict"; /** * Responsive is a plug-in for the DataTables library that makes use of * DataTables' ability to change the visibility of columns, changing the * visibility of columns so the displayed columns fit into the table container. * The end result is that complex tables will be dynamically adjusted to fit * into the viewport, be it on a desktop, tablet or mobile browser. * * Responsive for DataTables has two modes of operation, which can used * individually or combined: * * * Class name based control - columns assigned class names that match the * breakpoint logic can be shown / hidden as required for each breakpoint. * * Automatic control - columns are automatically hidden when there is no * room left to display them. Columns removed from the right. * * In additional to column visibility control, Responsive also has built into * options to use DataTables' child row display to show / hide the information * from the table that has been hidden. There are also two modes of operation * for this child row display: * * * Inline - when the control element that the user can use to show / hide * child rows is displayed inside the first column of the table. * * Column - where a whole column is dedicated to be the show / hide control. * * Initialisation of Responsive is performed by: * * * Adding the class `responsive` or `dt-responsive` to the table. In this case * Responsive will automatically be initialised with the default configuration * options when the DataTable is created. * * Using the `responsive` option in the DataTables configuration options. This * can also be used to specify the configuration options, or simply set to * `true` to use the defaults. * * @class * @param {object} settings DataTables settings object for the host table * @param {object} [opts] Configuration options * @requires jQuery 1.7+ * @requires DataTables 1.10.1+ * * @example * $('#example').DataTable( { * responsive: true * } ); * } ); */ var Responsive = function ( settings, opts ) { // Sanity check that we are using DataTables 1.10 or newer if ( ! DataTable.versionCheck || ! DataTable.versionCheck( '1.10.1' ) ) { throw 'DataTables Responsive requires DataTables 1.10.1 or newer'; } this.s = { dt: new DataTable.Api( settings ), columns: [] }; // Check if responsive has already been initialised on this table if ( this.s.dt.settings()[0].responsive ) { return; } // details is an object, but for simplicity the user can give it as a string if ( opts && typeof opts.details === 'string' ) { opts.details = { type: opts.details }; } this.c = $.extend( true, {}, Responsive.defaults, DataTable.defaults.responsive, opts ); settings.responsive = this; this._constructor(); }; Responsive.prototype = { /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Constructor */ /** * Initialise the Responsive instance * * @private */ _constructor: function () { var that = this; var dt = this.s.dt; dt.settings()[0]._responsive = this; // Use DataTables' private throttle function to avoid processor thrashing $(window).on( 'resize.dtr orientationchange.dtr', dt.settings()[0].oApi._fnThrottle( function () { that._resize(); } ) ); // Destroy event handler dt.on( 'destroy.dtr', function () { $(window).off( 'resize.dtr orientationchange.dtr draw.dtr' ); } ); // Reorder the breakpoints array here in case they have been added out // of order this.c.breakpoints.sort( function (a, b) { return a.width < b.width ? 1 : a.width > b.width ? -1 : 0; } ); // Determine which columns are already hidden, and should therefore // remain hidden. todo - should this be done? See thread 22677 // // this.s.alwaysHidden = dt.columns(':hidden').indexes(); this._classLogic(); this._resizeAuto(); // Details handler var details = this.c.details; if ( details.type ) { that._detailsInit(); this._detailsVis(); dt.on( 'column-visibility.dtr', function () { that._detailsVis(); } ); // Redraw the details box on each draw. This is used until // DataTables implements a native `updated` event for rows dt.on( 'draw.dtr', function () { dt.rows( {page: 'current'} ).iterator( 'row', function ( settings, idx ) { var row = dt.row( idx ); if ( row.child.isShown() ) { var info = that.c.details.renderer( dt, idx ); row.child( info, 'child' ).show(); } } ); } ); $(dt.table().node()).addClass( 'dtr-'+details.type ); } // First pass - draw the table for the current viewport size this._resize(); }, /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Private methods */ /** * Calculate the visibility for the columns in a table for a given * breakpoint. The result is pre-determined based on the class logic if * class names are used to control all columns, but the width of the table * is also used if there are columns which are to be automatically shown * and hidden. * * @param {string} breakpoint Breakpoint name to use for the calculation * @return {array} Array of boolean values initiating the visibility of each * column. * @private */ _columnsVisiblity: function ( breakpoint ) { var dt = this.s.dt; var columns = this.s.columns; var i, ien; // Class logic - determine which columns are in this breakpoint based // on the classes. If no class control (i.e. `auto`) then `-` is used // to indicate this to the rest of the function var display = $.map( columns, function ( col ) { return col.auto && col.minWidth === null ? false : col.auto === true ? '-' : $.inArray( breakpoint, col.includeIn ) !== -1; } ); // Auto column control - first pass: how much width is taken by the // ones that must be included from the non-auto columns var requiredWidth = 0; for ( i=0, ien=display.length ; i