AC_4897, AC_4898, AC_4899: Multifile uploader fixes.
[acontent.git] / docs / include / jscripts / infusion / components / pager / js / Pager.js
1 var fluid_1_4=fluid_1_4||{};(function($,fluid){function updateStyles(pageListThat,newModel,oldModel){if(!pageListThat.pageLinks){return }if(oldModel.pageIndex!==undefined){var oldLink=pageListThat.pageLinks.eq(oldModel.pageIndex);oldLink.removeClass(pageListThat.options.styles.currentPage)}var pageLink=pageListThat.pageLinks.eq(newModel.pageIndex);pageLink.addClass(pageListThat.options.styles.currentPage)}function bindLinkClick(link,events,eventArg){link.unbind("click.fluid.pager");link.bind("click.fluid.pager",function(){events.initiatePageChange.fire(eventArg)})}function computePageCount(model){model.pageCount=Math.max(1,Math.floor((model.totalRange-1)/model.pageSize)+1)}fluid.pager=function(){return fluid.pagerImpl.apply(null,arguments)};fluid.pager.computePageLimit=function(model){return Math.min(model.totalRange,(model.pageIndex+1)*model.pageSize)};fluid.pager.directPageList=function(container,events,options){var that=fluid.initView("fluid.pager.directPageList",container,options);that.pageLinks=that.locate("pageLinks");for(var i=0;i<that.pageLinks.length;++i){var pageLink=that.pageLinks.eq(i);bindLinkClick(pageLink,events,{pageIndex:i})}events.onModelChange.addListener(function(newModel,oldModel){updateStyles(that,newModel,oldModel)});that.defaultModel={pageIndex:undefined,pageSize:1,totalRange:that.pageLinks.length};return that};fluid.iota=function(count,first){first=first||0;var togo=[];for(var i=0;i<count;++i){togo[togo.length]=first++}return togo};fluid.pager.everyPageStrategy=fluid.iota;fluid.pager.gappedPageStrategy=function(locality,midLocality){if(!locality){locality=3}if(!midLocality){midLocality=locality}return function(count,first,mid){var togo=[];var j=0;var lastSkip=false;for(var i=0;i<count;++i){if(i<locality||(count-i-1)<locality||(i>=mid-midLocality&&i<=mid+midLocality)){togo[j++]=i;lastSkip=false}else{if(!lastSkip){togo[j++]=-1;lastSkip=true}}}return togo}};fluid.pager.consistentGappedPageStrategy=function(endLinkCount,midLinkCount){if(!endLinkCount){endLinkCount=1}if(!midLinkCount){midLinkCount=endLinkCount}var endWidth=endLinkCount+2+midLinkCount;return function(count,first,mid){var pages=[];var anchoredLeft=mid<endWidth;var anchoredRight=mid>=count-endWidth;var anchoredEndWidth=endWidth+midLinkCount;var midStart=mid-midLinkCount;var midEnd=mid+midLinkCount;var lastSkip=false;for(var page=0;page<count;page++){if(page<endLinkCount||count-page<=endLinkCount||(anchoredLeft&&page<anchoredEndWidth)||(anchoredRight&&page>=count-anchoredEndWidth)||(page>=midStart&&page<=midEnd)){pages.push(page);lastSkip=false}else{if(!lastSkip){pages.push(-1);lastSkip=true}}}return pages}};fluid.pager.renderedPageList=function(container,events,pagerBarOptions,options,strings){options=$.extend(true,pagerBarOptions,options);var that=fluid.initView("fluid.pager.renderedPageList",container,options);options=that.options;var idMap={};var renderOptions={cutpoints:[{id:"page-link:link",selector:pagerBarOptions.selectors.pageLinks},{id:"page-link:skip",selector:pagerBarOptions.selectors.pageLinkSkip}],idMap:idMap};if(options.linkBody){renderOptions.cutpoints[renderOptions.cutpoints.length]={id:"payload-component",selector:options.linkBody}}var assembleComponent=function(page,isCurrent){var obj={ID:"page-link:link",localID:page+1,value:page+1,pageIndex:page,decorators:[{type:"jQuery",func:"click",args:function(event){events.initiatePageChange.fire({pageIndex:page});event.preventDefault()}}]};if(isCurrent){obj.current=true;obj.decorators=obj.decorators.concat([{type:"addClass",classes:that.options.styles.currentPage},{type:"jQuery",func:"attr",args:["aria-label",that.options.strings.currentPageIndexMsg]}])}return obj};function pageToComponent(current){return function(page){return page===-1?{ID:"page-link:skip"}:assembleComponent(page,page===current)}}var root=that.locate("root");fluid.expectFilledSelector(root,"Error finding root template for fluid.pager.renderedPageList");var template=fluid.selfRender(root,{},renderOptions);events.onModelChange.addListener(function(newModel,oldModel){var pages=that.options.pageStrategy(newModel.pageCount,0,newModel.pageIndex);var pageTree=fluid.transform(pages,pageToComponent(newModel.pageIndex));if(pageTree.length>1){pageTree[pageTree.length-1].value=pageTree[pageTree.length-1].value+strings.last}events.onRenderPageLinks.fire(pageTree,newModel);$.each(idMap,function(key,id){var pageLink=fluid.jById(id);if(pageLink.tooltip){pageLink.tooltip("destroy")}});fluid.reRender(template,root,pageTree,renderOptions);updateStyles(that,newModel,oldModel)});return that};fluid.defaults("fluid.pager.renderedPageList",{selectors:{root:".flc-pager-links"},linkBody:"a",pageStrategy:fluid.pager.everyPageStrategy});var updatePreviousNext=function(that,options,newModel){if(newModel.pageIndex===0){that.previous.addClass(options.styles.disabled)}else{that.previous.removeClass(options.styles.disabled)}if(newModel.pageIndex===newModel.pageCount-1){that.next.addClass(options.styles.disabled)}else{that.next.removeClass(options.styles.disabled)}};fluid.pager.previousNext=function(container,events,options){var that=fluid.initView("fluid.pager.previousNext",container,options);that.previous=that.locate("previous");bindLinkClick(that.previous,events,{relativePage:-1});that.next=that.locate("next");bindLinkClick(that.next,events,{relativePage:+1});events.onModelChange.addListener(function(newModel,oldModel,overallThat){updatePreviousNext(that,options,newModel)});return that};fluid.pager.pagerBar=function(events,container,options,strings){var that=fluid.initView("fluid.pager.pagerBar",container,options);that.pageList=fluid.initSubcomponent(that,"pageList",[container,events,that.options,fluid.COMPONENT_OPTIONS,strings]);that.previousNext=fluid.initSubcomponent(that,"previousNext",[container,events,that.options,fluid.COMPONENT_OPTIONS,strings]);return that};fluid.defaults("fluid.pager.pagerBar",{previousNext:{type:"fluid.pager.previousNext"},pageList:{type:"fluid.pager.renderedPageList",options:{pageStrategy:fluid.pager.gappedPageStrategy(3,1)}},selectors:{pageLinks:".flc-pager-pageLink",pageLinkSkip:".flc-pager-pageLink-skip",previous:".flc-pager-previous",next:".flc-pager-next"},styles:{currentPage:"fl-pager-currentPage",disabled:"fl-pager-disabled"},strings:{currentPageIndexMsg:"Current page"}});function getColumnDefs(that){return that.options.columnDefs}fluid.pager.findColumnDef=function(columnDefs,key){var columnDef=$.grep(columnDefs,function(def){return def.key===key})[0];return columnDef};function getRoots(target,overallThat,index){var cellRoot=(overallThat.options.dataOffset?overallThat.options.dataOffset+".":"");target.shortRoot=index;target.longRoot=cellRoot+target.shortRoot}function expandPath(EL,shortRoot,longRoot){if(EL.charAt(0)==="*"){return longRoot+EL.substring(1)}else{return EL.replace("*",shortRoot)}}fluid.pager.fetchValue=function(that,dataModel,index,valuebinding,roots){getRoots(roots,that,index);var path=expandPath(valuebinding,roots.shortRoot,roots.longRoot);return fluid.get(dataModel,path)};fluid.pager.basicSorter=function(overallThat,model){var dataModel=overallThat.options.dataModel;var roots={};var columnDefs=getColumnDefs(overallThat);var columnDef=fluid.pager.findColumnDef(columnDefs,model.sortKey);var sortrecs=[];for(var i=0;i<model.totalRange;++i){sortrecs[i]={index:i,value:fluid.pager.fetchValue(overallThat,dataModel,i,columnDef.valuebinding,roots)}}function sortfunc(arec,brec){var a=arec.value;var b=brec.value;return a===b?0:(a>b?model.sortDir:-model.sortDir)}sortrecs.sort(sortfunc);return fluid.transform(sortrecs,function(row){return row.index})};fluid.pager.directModelFilter=function(model,pagerModel,perm){var togo=[];var limit=fluid.pager.computePageLimit(pagerModel);for(var i=pagerModel.pageIndex*pagerModel.pageSize;i<limit;++i){var index=perm?perm[i]:i;togo[togo.length]={index:index,row:model[index]}}return togo};function expandVariables(value,opts){var togo="";var index=0;while(true){var nextindex=value.indexOf("${",index);if(nextindex===-1){togo+=value.substring(index);break}else{togo+=value.substring(index,nextindex);var endi=value.indexOf("}",nextindex+2);var EL=value.substring(nextindex+2,endi);if(EL==="VALUE"){EL=opts.EL}else{EL=expandPath(EL,opts.shortRoot,opts.longRoot)}var val=fluid.get(opts.dataModel,EL);togo+=val;index=endi+1}}return togo}function expandPaths(target,tree,opts){for(var i in tree){var val=tree[i];if(val===fluid.VALUE){if(i==="valuebinding"){target[i]=opts.EL}else{target[i]={valuebinding:opts.EL}}}else{if(i==="valuebinding"){target[i]=expandPath(tree[i],opts)}else{if(typeof (val)==="object"){target[i]=val.length!==undefined?[]:{};expandPaths(target[i],val,opts)}else{if(typeof (val)==="string"){target[i]=expandVariables(val,opts)}else{target[i]=tree[i]}}}}}return target}function iDforColumn(columnDef,opts){var options=opts.options;var EL=columnDef.valuebinding;var key=columnDef.key;if(!EL){fluid.fail("Error in definition for column with key "+key+": valuebinding is not set")}opts.EL=expandPath(EL,opts.shortRoot,opts.longRoot);if(!key){var segs=fluid.model.parseEL(EL);key=segs[segs.length-1]}var ID=(options.keyPrefix?options.keyPrefix:"")+key;return ID}function expandColumnDefs(filteredRow,opts){var tree=fluid.transform(opts.columnDefs,function(columnDef){var ID=iDforColumn(columnDef,opts);var togo;if(!columnDef.components){return{ID:ID,valuebinding:opts.EL}}else{if(typeof columnDef.components==="function"){togo=columnDef.components(filteredRow.row,filteredRow.index)}else{togo=columnDef.components}}togo=expandPaths({},togo,opts);togo.ID=ID;return togo});return tree}function fetchModel(overallThat){return fluid.get(overallThat.options.dataModel,overallThat.options.dataOffset)}function bigHeaderForKey(key,opts){var id=opts.options.renderOptions.idMap["header:"+key];var smallHeader=fluid.jById(id);if(smallHeader.length===0){return null}var headerSortStylisticOffset=opts.overallOptions.selectors.headerSortStylisticOffset;var bigHeader=fluid.findAncestor(smallHeader,function(element){return $(element).is(headerSortStylisticOffset)});return bigHeader}function setSortHeaderClass(styles,element,sort){element=$(element);element.removeClass(styles.ascendingHeader);element.removeClass(styles.descendingHeader);if(sort!==0){element.addClass(sort===1?styles.ascendingHeader:styles.descendingHeader);element.attr("aria-sort",sort===1?"ascending":"descending")}}function isCurrentColumnSortable(columnDefs,model){var columnDef=model.sortKey?fluid.pager.findColumnDef(columnDefs,model.sortKey):null;return columnDef?columnDef.sortable:false}function setModelSortHeaderClass(newModel,opts){var styles=opts.overallOptions.styles;var sort=isCurrentColumnSortable(opts.columnDefs,newModel)?newModel.sortDir:0;setSortHeaderClass(styles,bigHeaderForKey(newModel.sortKey,opts),sort)}function fireModelChange(that,newModel,forceUpdate){computePageCount(newModel);if(newModel.pageIndex>=newModel.pageCount){newModel.pageIndex=newModel.pageCount-1}if(forceUpdate||newModel.pageIndex!==that.model.pageIndex||newModel.pageSize!==that.model.pageSize||newModel.sortKey!==that.model.sortKey||newModel.sortDir!==that.model.sortDir){var sorted=isCurrentColumnSortable(getColumnDefs(that),newModel)?that.options.sorter(that,newModel):null;that.permutation=sorted;that.events.onModelChange.fire(newModel,that.model,that);fluid.model.copyModel(that.model,newModel)}}function generateColumnClick(overallThat,columnDef,opts){return function(){if(columnDef.sortable===true){var model=overallThat.model;var newModel=fluid.copy(model);var styles=overallThat.options.styles;var oldKey=model.sortKey;if(columnDef.key!==model.sortKey){newModel.sortKey=columnDef.key;newModel.sortDir=1;var oldBig=bigHeaderForKey(oldKey,opts);if(oldBig){setSortHeaderClass(styles,oldBig,0)}}else{if(newModel.sortKey===columnDef.key){newModel.sortDir=-1*newModel.sortDir}else{return false}}newModel.pageIndex=0;fireModelChange(overallThat,newModel,true);setModelSortHeaderClass(newModel,opts)}return false}}function fetchHeaderDecorators(decorators,columnDef){return decorators[columnDef.sortable?"sortableHeader":"unsortableHeader"]}function generateHeader(overallThat,newModel,columnDefs,opts){var sortableColumnTxt=opts.options.strings.sortableColumnText;if(newModel.sortDir===1){sortableColumnTxt=opts.options.strings.sortableColumnTextAsc}else{if(newModel.sortDir===-1){sortableColumnTxt=opts.options.strings.sortableColumnTextDesc}}return{children:fluid.transform(columnDefs,function(columnDef){return{ID:iDforColumn(columnDef,opts),value:columnDef.label,decorators:[{jQuery:["click",generateColumnClick(overallThat,columnDef,opts)]},{identify:"header:"+columnDef.key},{type:"attrs",attributes:{title:(columnDef.key===newModel.sortKey)?sortableColumnTxt:opts.options.strings.sortableColumnText}}].concat(fetchHeaderDecorators(opts.overallOptions.decorators,columnDef))}})}}fluid.pager.selfRender=function(overallThat,inOptions){var that=fluid.initView("fluid.pager.selfRender",overallThat.container,inOptions);var options=that.options;options.renderOptions.idMap=options.renderOptions.idMap||{};var idMap=options.renderOptions.idMap;var root=that.locate("root");var template=fluid.selfRender(root,{},options.renderOptions);root.addClass(options.styles.root);var columnDefs=getColumnDefs(overallThat);var expOpts={options:options,columnDefs:columnDefs,overallOptions:overallThat.options,dataModel:overallThat.options.dataModel,idMap:idMap};var directModel=fetchModel(overallThat);return{returnedOptions:{listeners:{onModelChange:function(newModel,oldModel){var filtered=overallThat.options.modelFilter(directModel,newModel,overallThat.permutation);var tree=fluid.transform(filtered,function(filteredRow){getRoots(expOpts,overallThat,filteredRow.index);if(columnDefs==="explode"){return fluid.explode(filteredRow.row,expOpts.longRoot)}else{if(columnDefs.length){return expandColumnDefs(filteredRow,expOpts)}}});var fullTree={};fullTree[options.row]=tree;if(typeof (columnDefs)==="object"){fullTree[options.header]=generateHeader(overallThat,newModel,columnDefs,expOpts)}options.renderOptions=options.renderOptions||{};options.renderOptions.model=expOpts.dataModel;fluid.reRender(template,root,fullTree,options.renderOptions);overallThat.events.afterRender.fire(overallThat);setModelSortHeaderClass(newModel,expOpts)}}}}};fluid.defaults("fluid.pager.selfRender",{selectors:{root:".flc-pager-body-template"},styles:{root:"fl-pager"},keyStrategy:"id",keyPrefix:"",row:"row:",header:"header:",strings:{sortableColumnText:"Select to sort",sortableColumnTextDesc:"Select to sort in ascending, currently in descending order.",sortableColumnTextAsc:"Select to sort in descending, currently in ascending order."},renderOptions:{}});fluid.pager.summaryAria=function(element){element.attr({"aria-relevant":"all","aria-atomic":"false","aria-live":"assertive",role:"status"})};fluid.pager.summary=function(dom,options){var node=dom.locate("summary");fluid.pager.summaryAria(node);return{returnedOptions:{listeners:{onModelChange:function(newModel,oldModel){var text=fluid.stringTemplate(options.message,{first:newModel.pageIndex*newModel.pageSize+1,last:fluid.pager.computePageLimit(newModel),total:newModel.totalRange,currentPage:newModel.pageIndex+1});if(node.length>0){node.text(text)}}}}}};fluid.pager.directPageSize=function(that){var node=that.locate("pageSize");if(node.length>0){that.events.onModelChange.addListener(function(newModel,oldModel){if(node.val()!==newModel.pageSize){node.val(newModel.pageSize)}});node.change(function(){that.events.initiatePageSizeChange.fire(node.val())})}};fluid.pager.rangeAnnotator=function(that,options){var roots={};that.events.onRenderPageLinks.addListener(function(tree,newModel){var column=that.options.annotateColumnRange;var dataModel=that.options.dataModel;var columnDefs=getColumnDefs(that);if(!column||!dataModel||!columnDefs){return }var columnDef=fluid.pager.findColumnDef(columnDefs,column);function fetchValue(index){index=that.permutation?that.permutation[index]:index;return fluid.pager.fetchValue(that,dataModel,index,columnDef.valuebinding,roots)}var tModel={};fluid.model.copyModel(tModel,newModel);fluid.transform(tree,function(cell){if(cell.ID==="page-link:link"){var page=cell.pageIndex;var start=page*tModel.pageSize;tModel.pageIndex=page;var limit=fluid.pager.computePageLimit(tModel);var iValue=fetchValue(start);var lValue=fetchValue(limit-1);var tooltipOpts=fluid.copy(that.options.tooltip.options)||{};if(!tooltipOpts.content){tooltipOpts.content=function(){return fluid.stringTemplate(that.options.markup.rangeAnnotation,{first:iValue,last:lValue})}}if(!cell.current){var decorators=[{type:"fluid",func:that.options.tooltip.type,options:tooltipOpts},{identify:page}];cell.decorators=cell.decorators.concat(decorators)}}})})};fluid.pagerImpl=function(container,options){var that=fluid.initView("fluid.pager",container,options);that.container.attr("role","application");that.events.initiatePageChange.addListener(function(arg){var newModel=fluid.copy(that.model);if(arg.relativePage!==undefined){newModel.pageIndex=that.model.pageIndex+arg.relativePage}else{newModel.pageIndex=arg.pageIndex}if(newModel.pageIndex===undefined||newModel.pageIndex<0){newModel.pageIndex=0}fireModelChange(that,newModel,arg.forceUpdate)});that.events.initiatePageSizeChange.addListener(function(arg){var newModel=fluid.copy(that.model);newModel.pageSize=arg;fireModelChange(that,newModel)});var pagerBarElement=that.locate("pagerBar");if(pagerBarElement.length>0){that.pagerBar=fluid.initSubcomponent(that,"pagerBar",[that.events,pagerBarElement,fluid.COMPONENT_OPTIONS,that.options.strings])}var pagerBarSecondaryElement=that.locate("pagerBarSecondary");if(pagerBarSecondaryElement.length>0){that.pagerBarSecondary=fluid.initSubcomponent(that,"pagerBar",[that.events,pagerBarSecondaryElement,fluid.COMPONENT_OPTIONS,that.options.strings])}that.bodyRenderer=fluid.initSubcomponent(that,"bodyRenderer",[that,fluid.COMPONENT_OPTIONS]);that.summary=fluid.initSubcomponent(that,"summary",[that.dom,fluid.COMPONENT_OPTIONS]);that.pageSize=fluid.initSubcomponent(that,"pageSize",[that]);that.rangeAnnotator=fluid.initSubcomponent(that,"rangeAnnotator",[that,fluid.COMPONENT_OPTIONS]);that.model=fluid.copy(that.options.model);var dataModel=fetchModel(that);if(dataModel){that.model.totalRange=dataModel.length}if(that.model.totalRange===undefined){if(!that.pagerBar){fluid.fail("Error in Pager configuration - cannot determine total range,  since not configured in model.totalRange and no PagerBar is configured")}that.model=that.pagerBar.pageList.defaultModel}that.applier=fluid.makeChangeApplier(that.model);that.events.initiatePageChange.fire({pageIndex:that.model.pageIndex?that.model.pageIndex:0,forceUpdate:true});return that};fluid.defaults("fluid.pager",{mergePolicy:{dataModel:"preserve",model:"preserve"},pagerBar:{type:"fluid.pager.pagerBar"},summary:{type:"fluid.pager.summary",options:{message:"Viewing page %currentPage. Showing records %first - %last of %total items."}},pageSize:{type:"fluid.pager.directPageSize"},modelFilter:fluid.pager.directModelFilter,sorter:fluid.pager.basicSorter,bodyRenderer:{type:"fluid.pager.selfRender"},model:{pageIndex:undefined,pageSize:10,totalRange:undefined},dataModel:undefined,dataOffset:"",columnDefs:[],annotateColumnRange:undefined,tooltip:{type:"fluid.tooltip"},rangeAnnotator:{type:"fluid.pager.rangeAnnotator"},selectors:{pagerBar:".flc-pager-top",pagerBarSecondary:".flc-pager-bottom",summary:".flc-pager-summary",pageSize:".flc-pager-page-size",headerSortStylisticOffset:".flc-pager-sort-header"},styles:{ascendingHeader:"fl-pager-asc",descendingHeader:"fl-pager-desc"},decorators:{sortableHeader:[],unsortableHeader:[]},strings:{last:" (last)"},events:{initiatePageChange:null,initiatePageSizeChange:null,onModelChange:null,onRenderPageLinks:null,afterRender:null},markup:{rangeAnnotation:"<b> %first </b><br/>&mdash;<br/><b> %last </b>"}})})(jQuery,fluid_1_4);