(function($){$.widget("ui.draggable",$.extend({},$.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"
}(this.options.addClasses&&this.element.addClass("ui-draggable"));
(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));
this._mouseInit()
},destroy:function(){if(!this.element.data("draggable")){return
}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");
this._mouseDestroy()
},_mouseCapture:function(event){var o=this.options;
if(this.helper||o.disabled||$(event.target).is(".ui-resizable-handle")){return false
}this.handle=this._getHandle(event);
if(!this.handle){return false
}return true
},_mouseStart:function(event){var o=this.options;
this.helper=this._createHelper(event);
this._cacheHelperProportions();
if($.ui.ddmanager){$.ui.ddmanager.current=this
}this._cacheMargins();
this.cssPosition=this.helper.css("position");
this.scrollParent=this.helper.scrollParent();
this.offset=this.element.offset();
this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};
$.extend(this.offset,{click:{left:event.pageX-this.offset.left,top:event.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});
this.originalPosition=this._generatePosition(event);
this.originalPageX=event.pageX;
this.originalPageY=event.pageY;
if(o.cursorAt){this._adjustOffsetFromHelper(o.cursorAt)
}if(o.containment){this._setContainment()
}this._trigger("start",event);
this._cacheHelperProportions();
if($.ui.ddmanager&&!o.dropBehaviour){$.ui.ddmanager.prepareOffsets(this,event)
}this.helper.addClass("ui-draggable-dragging");
this._mouseDrag(event,true);
return true
},_mouseDrag:function(event,noPropagation){this.position=this._generatePosition(event);
this.positionAbs=this._convertPositionTo("absolute");
if(!noPropagation){var ui=this._uiHash();
this._trigger("drag",event,ui);
this.position=ui.position
}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"
}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"
}if($.ui.ddmanager){$.ui.ddmanager.drag(this,event)
}return false
},_mouseStop:function(event){var dropped=false;
if($.ui.ddmanager&&!this.options.dropBehaviour){dropped=$.ui.ddmanager.drop(this,event)
}if(this.dropped){dropped=this.dropped;
this.dropped=false
}if((this.options.revert=="invalid"&&!dropped)||(this.options.revert=="valid"&&dropped)||this.options.revert===true||($.isFunction(this.options.revert)&&this.options.revert.call(this.element,dropped))){var self=this;
$(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){self._trigger("stop",event);
self._clear()
})
}else{this._trigger("stop",event);
this._clear()
}return false
},_getHandle:function(event){var handle=!this.options.handle||!$(this.options.handle,this.element).length?true:false;
$(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==event.target){handle=true
}});
return handle
},_createHelper:function(event){var o=this.options;
var helper=$.isFunction(o.helper)?$(o.helper.apply(this.element[0],[event])):(o.helper=="clone"?this.element.clone():this.element);
if(!helper.parents("body").length){helper.appendTo((o.appendTo=="parent"?this.element[0].parentNode:o.appendTo))
}if(helper[0]!=this.element[0]&&!(/(fixed|absolute)/).test(helper.css("position"))){helper.css("position","absolute")
}return helper
},_adjustOffsetFromHelper:function(obj){if(obj.left!=undefined){this.offset.click.left=obj.left+this.margins.left
}if(obj.right!=undefined){this.offset.click.left=this.helperProportions.width-obj.right+this.margins.left
}if(obj.top!=undefined){this.offset.click.top=obj.top+this.margins.top
}if(obj.bottom!=undefined){this.offset.click.top=this.helperProportions.height-obj.bottom+this.margins.top
}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();
var po=this.offsetParent.offset();
if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&$.ui.contains(this.scrollParent[0],this.offsetParent[0])){po.left+=this.scrollParent.scrollLeft();
po.top+=this.scrollParent.scrollTop()
}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&$.browser.msie)){po={top:0,left:0}
}return{top:po.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:po.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}
},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var p=this.element.position();
return{top:p.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:p.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}
}else{return{top:0,left:0}
}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}
},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}
},_setContainment:function(){var o=this.options;
if(o.containment=="parent"){o.containment=this.helper[0].parentNode
}if(o.containment=="document"||o.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,$(o.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,($(o.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]
}if(!(/^(document|window|parent)$/).test(o.containment)&&o.containment.constructor!=Array){var ce=$(o.containment)[0];
if(!ce){return
}var co=$(o.containment).offset();
var over=($(ce).css("overflow")!="hidden");
this.containment=[co.left+(parseInt($(ce).css("borderLeftWidth"),10)||0)+(parseInt($(ce).css("paddingLeft"),10)||0)-this.margins.left,co.top+(parseInt($(ce).css("borderTopWidth"),10)||0)+(parseInt($(ce).css("paddingTop"),10)||0)-this.margins.top,co.left+(over?Math.max(ce.scrollWidth,ce.offsetWidth):ce.offsetWidth)-(parseInt($(ce).css("borderLeftWidth"),10)||0)-(parseInt($(ce).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,co.top+(over?Math.max(ce.scrollHeight,ce.offsetHeight):ce.offsetHeight)-(parseInt($(ce).css("borderTopWidth"),10)||0)-(parseInt($(ce).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]
}else{if(o.containment.constructor==Array){this.containment=o.containment
}}},_convertPositionTo:function(d,pos){if(!pos){pos=this.position
}var mod=d=="absolute"?1:-1;
var o=this.options,scroll=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&$.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,scrollIsRootNode=(/(html|body)/i).test(scroll[0].tagName);
return{top:(pos.top+this.offset.relative.top*mod+this.offset.parent.top*mod-($.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(scrollIsRootNode?0:scroll.scrollTop()))*mod)),left:(pos.left+this.offset.relative.left*mod+this.offset.parent.left*mod-($.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():scrollIsRootNode?0:scroll.scrollLeft())*mod))}
},_generatePosition:function(event){var o=this.options,scroll=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&$.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,scrollIsRootNode=(/(html|body)/i).test(scroll[0].tagName);
if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()
}var pageX=event.pageX;
var pageY=event.pageY;
if(this.originalPosition){if(this.containment){if(event.pageX-this.offset.click.left<this.containment[0]){pageX=this.containment[0]+this.offset.click.left
}if(event.pageY-this.offset.click.top<this.containment[1]){pageY=this.containment[1]+this.offset.click.top
}if(event.pageX-this.offset.click.left>this.containment[2]){pageX=this.containment[2]+this.offset.click.left
}if(event.pageY-this.offset.click.top>this.containment[3]){pageY=this.containment[3]+this.offset.click.top
}}if(o.grid){var top=this.originalPageY+Math.round((pageY-this.originalPageY)/o.grid[1])*o.grid[1];
pageY=this.containment?(!(top-this.offset.click.top<this.containment[1]||top-this.offset.click.top>this.containment[3])?top:(!(top-this.offset.click.top<this.containment[1])?top-o.grid[1]:top+o.grid[1])):top;
var left=this.originalPageX+Math.round((pageX-this.originalPageX)/o.grid[0])*o.grid[0];
pageX=this.containment?(!(left-this.offset.click.left<this.containment[0]||left-this.offset.click.left>this.containment[2])?left:(!(left-this.offset.click.left<this.containment[0])?left-o.grid[0]:left+o.grid[0])):left
}}return{top:(pageY-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+($.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(scrollIsRootNode?0:scroll.scrollTop())))),left:(pageX-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+($.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():scrollIsRootNode?0:scroll.scrollLeft())))}
},_clear:function(){this.helper.removeClass("ui-draggable-dragging");
if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()
}this.helper=null;
this.cancelHelperRemoval=false
},_trigger:function(type,event,ui){ui=ui||this._uiHash();
$.ui.plugin.call(this,type,[event,ui]);
if(type=="drag"){this.positionAbs=this._convertPositionTo("absolute")
}return $.widget.prototype._trigger.call(this,type,event,ui)
},plugins:{},_uiHash:function(event){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,offset:this.positionAbs}
}}));
$.extend($.ui.draggable,{version:"1.7.1",eventPrefix:"drag",defaults:{addClasses:true,appendTo:"parent",axis:false,cancel:":input,option",connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false}});
$.ui.plugin.add("draggable","connectToSortable",{start:function(event,ui){var inst=$(this).data("draggable"),o=inst.options,uiSortable=$.extend({},ui,{item:inst.element});
inst.sortables=[];
$(o.connectToSortable).each(function(){var sortable=$.data(this,"sortable");
if(sortable&&!sortable.options.disabled){inst.sortables.push({instance:sortable,shouldRevert:sortable.options.revert});
sortable._refreshItems();
sortable._trigger("activate",event,uiSortable)
}})
},stop:function(event,ui){var inst=$(this).data("draggable"),uiSortable=$.extend({},ui,{item:inst.element});
$.each(inst.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;
inst.cancelHelperRemoval=true;
this.instance.cancelHelperRemoval=false;
if(this.shouldRevert){this.instance.options.revert=true
}this.instance._mouseStop(event);
this.instance.options.helper=this.instance.options._helper;
if(inst.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})
}}else{this.instance.cancelHelperRemoval=false;
this.instance._trigger("deactivate",event,uiSortable)
}})
},drag:function(event,ui){var inst=$(this).data("draggable"),self=this;
var checkPos=function(o){var dyClick=this.offset.click.top,dxClick=this.offset.click.left;
var helperTop=this.positionAbs.top,helperLeft=this.positionAbs.left;
var itemHeight=o.height,itemWidth=o.width;
var itemTop=o.top,itemLeft=o.left;
return $.ui.isOver(helperTop+dyClick,helperLeft+dxClick,itemTop,itemLeft,itemHeight,itemWidth)
};
$.each(inst.sortables,function(i){this.instance.positionAbs=inst.positionAbs;
this.instance.helperProportions=inst.helperProportions;
this.instance.offset.click=inst.offset.click;
if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;
this.instance.currentItem=$(self).clone().appendTo(this.instance.element).data("sortable-item",true);
this.instance.options._helper=this.instance.options.helper;
this.instance.options.helper=function(){return ui.helper[0]
};
event.target=this.instance.currentItem[0];
this.instance._mouseCapture(event,true);
this.instance._mouseStart(event,true,true);
this.instance.offset.click.top=inst.offset.click.top;
this.instance.offset.click.left=inst.offset.click.left;
this.instance.offset.parent.left-=inst.offset.parent.left-this.instance.offset.parent.left;
this.instance.offset.parent.top-=inst.offset.parent.top-this.instance.offset.parent.top;
inst._trigger("toSortable",event);
inst.dropped=this.instance.element;
inst.currentItem=inst.element;
this.instance.fromOutside=inst
}if(this.instance.currentItem){this.instance._mouseDrag(event)
}}else{if(this.instance.isOver){this.instance.isOver=0;
this.instance.cancelHelperRemoval=true;
this.instance.options.revert=false;
this.instance._trigger("out",event,this.instance._uiHash(this.instance));
this.instance._mouseStop(event,true);
this.instance.options.helper=this.instance.options._helper;
this.instance.currentItem.remove();
if(this.instance.placeholder){this.instance.placeholder.remove()
}inst._trigger("fromSortable",event);
inst.dropped=false
}}})
}});
$.ui.plugin.add("draggable","cursor",{start:function(event,ui){var t=$("body"),o=$(this).data("draggable").options;
if(t.css("cursor")){o._cursor=t.css("cursor")
}t.css("cursor",o.cursor)
},stop:function(event,ui){var o=$(this).data("draggable").options;
if(o._cursor){$("body").css("cursor",o._cursor)
}}});
$.ui.plugin.add("draggable","iframeFix",{start:function(event,ui){var o=$(this).data("draggable").options;
$(o.iframeFix===true?"iframe":o.iframeFix).each(function(){$('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css($(this).offset()).appendTo("body")
})
},stop:function(event,ui){$("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)
})
}});
$.ui.plugin.add("draggable","opacity",{start:function(event,ui){var t=$(ui.helper),o=$(this).data("draggable").options;
if(t.css("opacity")){o._opacity=t.css("opacity")
}t.css("opacity",o.opacity)
},stop:function(event,ui){var o=$(this).data("draggable").options;
if(o._opacity){$(ui.helper).css("opacity",o._opacity)
}}});
$.ui.plugin.add("draggable","scroll",{start:function(event,ui){var i=$(this).data("draggable");
if(i.scrollParent[0]!=document&&i.scrollParent[0].tagName!="HTML"){i.overflowOffset=i.scrollParent.offset()
}},drag:function(event,ui){var i=$(this).data("draggable"),o=i.options,scrolled=false;
if(i.scrollParent[0]!=document&&i.scrollParent[0].tagName!="HTML"){if(!o.axis||o.axis!="x"){if((i.overflowOffset.top+i.scrollParent[0].offsetHeight)-event.pageY<o.scrollSensitivity){i.scrollParent[0].scrollTop=scrolled=i.scrollParent[0].scrollTop+o.scrollSpeed
}else{if(event.pageY-i.overflowOffset.top<o.scrollSensitivity){i.scrollParent[0].scrollTop=scrolled=i.scrollParent[0].scrollTop-o.scrollSpeed
}}}if(!o.axis||o.axis!="y"){if((i.overflowOffset.left+i.scrollParent[0].offsetWidth)-event.pageX<o.scrollSensitivity){i.scrollParent[0].scrollLeft=scrolled=i.scrollParent[0].scrollLeft+o.scrollSpeed
}else{if(event.pageX-i.overflowOffset.left<o.scrollSensitivity){i.scrollParent[0].scrollLeft=scrolled=i.scrollParent[0].scrollLeft-o.scrollSpeed
}}}}else{if(!o.axis||o.axis!="x"){if(event.pageY-$(document).scrollTop()<o.scrollSensitivity){scrolled=$(document).scrollTop($(document).scrollTop()-o.scrollSpeed)
}else{if($(window).height()-(event.pageY-$(document).scrollTop())<o.scrollSensitivity){scrolled=$(document).scrollTop($(document).scrollTop()+o.scrollSpeed)
}}}if(!o.axis||o.axis!="y"){if(event.pageX-$(document).scrollLeft()<o.scrollSensitivity){scrolled=$(document).scrollLeft($(document).scrollLeft()-o.scrollSpeed)
}else{if($(window).width()-(event.pageX-$(document).scrollLeft())<o.scrollSensitivity){scrolled=$(document).scrollLeft($(document).scrollLeft()+o.scrollSpeed)
}}}}if(scrolled!==false&&$.ui.ddmanager&&!o.dropBehaviour){$.ui.ddmanager.prepareOffsets(i,event)
}}});
$.ui.plugin.add("draggable","snap",{start:function(event,ui){var i=$(this).data("draggable"),o=i.options;
i.snapElements=[];
$(o.snap.constructor!=String?(o.snap.items||":data(draggable)"):o.snap).each(function(){var $t=$(this);
var $o=$t.offset();
if(this!=i.element[0]){i.snapElements.push({item:this,width:$t.outerWidth(),height:$t.outerHeight(),top:$o.top,left:$o.left})
}})
},drag:function(event,ui){var inst=$(this).data("draggable"),o=inst.options;
var d=o.snapTolerance;
var x1=ui.offset.left,x2=x1+inst.helperProportions.width,y1=ui.offset.top,y2=y1+inst.helperProportions.height;
for(var i=inst.snapElements.length-1;
i>=0;
i--){var l=inst.snapElements[i].left,r=l+inst.snapElements[i].width,t=inst.snapElements[i].top,b=t+inst.snapElements[i].height;
if(!((l-d<x1&&x1<r+d&&t-d<y1&&y1<b+d)||(l-d<x1&&x1<r+d&&t-d<y2&&y2<b+d)||(l-d<x2&&x2<r+d&&t-d<y1&&y1<b+d)||(l-d<x2&&x2<r+d&&t-d<y2&&y2<b+d))){if(inst.snapElements[i].snapping){(inst.options.snap.release&&inst.options.snap.release.call(inst.element,event,$.extend(inst._uiHash(),{snapItem:inst.snapElements[i].item})))
}inst.snapElements[i].snapping=false;
continue
}if(o.snapMode!="inner"){var ts=Math.abs(t-y2)<=d;
var bs=Math.abs(b-y1)<=d;
var ls=Math.abs(l-x2)<=d;
var rs=Math.abs(r-x1)<=d;
if(ts){ui.position.top=inst._convertPositionTo("relative",{top:t-inst.helperProportions.height,left:0}).top-inst.margins.top
}if(bs){ui.position.top=inst._convertPositionTo("relative",{top:b,left:0}).top-inst.margins.top
}if(ls){ui.position.left=inst._convertPositionTo("relative",{top:0,left:l-inst.helperProportions.width}).left-inst.margins.left
}if(rs){ui.position.left=inst._convertPositionTo("relative",{top:0,left:r}).left-inst.margins.left
}}var first=(ts||bs||ls||rs);
if(o.snapMode!="outer"){var ts=Math.abs(t-y1)<=d;
var bs=Math.abs(b-y2)<=d;
var ls=Math.abs(l-x1)<=d;
var rs=Math.abs(r-x2)<=d;
if(ts){ui.position.top=inst._convertPositionTo("relative",{top:t,left:0}).top-inst.margins.top
}if(bs){ui.position.top=inst._convertPositionTo("relative",{top:b-inst.helperProportions.height,left:0}).top-inst.margins.top
}if(ls){ui.position.left=inst._convertPositionTo("relative",{top:0,left:l}).left-inst.margins.left
}if(rs){ui.position.left=inst._convertPositionTo("relative",{top:0,left:r-inst.helperProportions.width}).left-inst.margins.left
}}if(!inst.snapElements[i].snapping&&(ts||bs||ls||rs||first)){(inst.options.snap.snap&&inst.options.snap.snap.call(inst.element,event,$.extend(inst._uiHash(),{snapItem:inst.snapElements[i].item})))
}inst.snapElements[i].snapping=(ts||bs||ls||rs||first)
}}});
$.ui.plugin.add("draggable","stack",{start:function(event,ui){var o=$(this).data("draggable").options;
var group=$.makeArray($(o.stack.group)).sort(function(a,b){return(parseInt($(a).css("zIndex"),10)||o.stack.min)-(parseInt($(b).css("zIndex"),10)||o.stack.min)
});
$(group).each(function(i){this.style.zIndex=o.stack.min+i
});
this[0].style.zIndex=o.stack.min+group.length
}});
$.ui.plugin.add("draggable","zIndex",{start:function(event,ui){var t=$(ui.helper),o=$(this).data("draggable").options;
if(t.css("zIndex")){o._zIndex=t.css("zIndex")
}t.css("zIndex",o.zIndex)
},stop:function(event,ui){var o=$(this).data("draggable").options;
if(o._zIndex){$(ui.helper).css("zIndex",o._zIndex)
}}})
})(jQuery);
var blistUtilNS=blist.namespace.fetch("blist.util");
blistUtilNS.toHumaneNumber=function(val,precision){var symbol=["K","M","B","T"];
var step=1000;
var divider=Math.pow(step,symbol.length);
var absVal=Math.abs(val);
var result;
val=parseFloat(val);
for(var i=symbol.length-1;
i>=0;
i--){if(absVal>=divider){result=(absVal/divider).toFixed(precision);
if(val<0){result=-result
}return result+symbol[i]
}divider=divider/step
}return val.toFixed(precision)
};
blistUtilNS.parseHumaneNumber=function(val){var symbol=["K","M","B","T"];
var step=1000;
var adjVal;
if($.isBlank(val)){return val
}var lastChar=val.charAt(val.length-1);
lastChar=lastChar.valueOf().toUpperCase();
for(i=symbol.length-1;
i>=0;
i--){if(lastChar===symbol[i]){adjVal=val.slice(0,val.length-1);
return parseFloat(adjVal)?adjVal*Math.pow(step,i+1):val
}}return val
};
blist.namespace.fetch("blist.data");
(function($){blist.data.Model=function(meta){var self=this;
var curOptions={blankRow:false,filterMinChars:3,initialResponse:null,masterView:null,pageSize:50,progressiveLoading:false};
var totalRows=0;
var activeCount=0;
var rowsLoaded=0;
var rows={};
var active=rows;
var lookup={};
var activeLookup={};
var columnLookup=[];
var columnIDLookup={};
var listeners=[];
var sortConfigured;
var orderFn;
var orderPrepro;
var orderCol;
var filterFn;
var filterText="";
var filterTimer;
var groupFn;
var translateFn=null;
var autoBaseURL=true;
var baseURL=null;
var supplementalAjaxOptions=null;
var undoBuffer=[];
var redoBuffer=[];
var findColumnIndex=function(id){var index;
$.each(meta.columns[0],function(i,col){if(col.id==id){index=i;
return false
}});
return index
};
var columnType=function(index){if(meta.columns){var column=meta.columns[0][index];
if(column){var type=blist.data.types[column.type];
if(type){return type
}}}return blist.data.types.text
};
var installIDs=function(activeOnly){if(!activeOnly||rows==active){lookup={};
rowsLoaded=0;
_.each(rows,function(row,i){var id=row.id||(row.id=row[0]);
rowsLoaded++;
lookup[id]=i;
if(rows==active){activeLookup[id]=i
}})
}if(rows!=active){activeLookup={};
_.each(active,function(row,i){var id=row.id||(row.id=row[0]);
activeLookup[id]=i
})
}};
var setRowMetadata=function(newRows,metaCols,dataMungeCols){_.each(newRows,function(r,i){if(metaCols){for(var j=0;
j<metaCols.length;
j++){var c=metaCols[j];
if(c.name=="meta"){var md=r[c.index];
if(md!==null&&md!==undefined){r[c.name]=JSON.parse(md)
}}else{if(r[c.index]!==undefined){r[c.name]=r[c.index]
}}}}if(dataMungeCols){for(var j=0;
j<dataMungeCols.length;
j++){var c=dataMungeCols[j];
if(c.type=="nullifyArrays"&&r[c.index]&&r[c.index] instanceof Array){var isEmpty=true;
$.each(r[c.index],function(k,v){if(v!==null&&v!==undefined&&typeof v!="boolean"){isEmpty=false;
return false
}});
if(isEmpty){r[c.index]=null
}}if(c.type=="arrayToObject"&&r[c.index]&&r[c.index] instanceof Array){var o={};
$.each(r[c.index],function(k,v){o[c.types[k]]=v===""?null:v
});
r[c.index]=o
}if(c.type=="arrayToFirstValue"&&r[c.index]&&r[c.index] instanceof Array){r[c.index]=r[c.index][0]
}if(c.type=="falseToNull"&&r[c.index]===false){r[c.index]=null
}if(c.type=="zeroToNull"&&r[c.index]===0){r[c.index]=null
}}}})
};
var dataChange=function(){self.unselectAllRows(true);
$(listeners).trigger("load",[self])
};
this.options=function(newOpt){if(newOpt){$.extend(curOptions,newOpt)
}return this
};
this.isProgressiveLoading=function(){if(!curOptions.progressiveLoading){return false
}if(rowsLoaded<totalRows||meta.view.searchString!==null){return true
}var isProg=false;
if(meta.columnFilters!=null){$.each(meta.columnFilters,function(i,v){if(v!=null){isProg=true;
return false
}})
}if(meta.view!==undefined&&meta.view.query!==undefined&&meta.view.query.orderBys!==undefined&&meta.view.query.orderBys.length>1){isProg=true
}return isProg
};
this.title=function(){return meta.title||(meta.view&&meta.view.name)||""
};
this.isGrouped=function(){return meta.view!==undefined&&meta.view.query!==undefined&&meta.view.query.groupBys!==undefined&&meta.view.query.groupBys.length>0
};
this.shouldSendColumns=function(){return this.willSendColumns
};
this.forceSendColumns=function(value){this.willSendColumns=value
};
this.canRead=function(){return meta.view&&meta.view.rights&&$.inArray("read",meta.view.rights)>=0
};
this.canWrite=function(){return meta.view&&!this.isGrouped()&&meta.view.rights&&$.inArray("write",meta.view.rights)>=0
};
this.canAdd=function(){return meta.view&&!this.isGrouped()&&meta.view.rights&&$.inArray("add",meta.view.rights)>=0
};
this.canDelete=function(){return meta.view&&!this.isGrouped()&&meta.view.rights&&$.inArray("delete",meta.view.rights)>=0
};
this.useBlankRows=function(){return curOptions.blankRow&&self.canAdd()&&self.canWrite()
};
this.addListener=function(listener){var pos=$.inArray(listener,listeners);
if(pos==-1){listeners.push(listener)
}};
this.removeListener=function(listener){var pos=$.inArray(listener,listeners);
if(pos==-1){listeners=listeners.splice(pos,1)
}};
this.load=function(config){var newRows=config.rows||(config.data!==undefined?config.data.data:null)||config.data;
if(config.meta){this.meta(config.meta);
updateColumns();
self.reloadAggregates();
if(config.meta.totalRows!==undefined){totalRows=config.meta.view.totalRows=config.meta.totalRows;
if(!$.isBlank(curOptions.masterView)){$.syncObjects(curOptions.masterView,self.getViewCopy())
}}filterFn=null;
filterText="";
orderCol=null;
orderFn=null;
sortConfigured=false
}if(newRows){this.rows(newRows)
}$(listeners).trigger("full_load")
};
this.translate=function(newTranslateFn){translateFn=newTranslateFn
};
this.ajax=function(ajaxOptions){if(typeof ajaxOptions=="string"){ajaxOptions={url:ajaxOptions}
}supplementalAjaxOptions=$.extend({},ajaxOptions);
if(curOptions.progressiveLoading){ajaxOptions.data=$.extend({},ajaxOptions.data,{method:"getByIds",meta:true,start:0,length:curOptions.pageSize})
}doLoad(this,this.load,ajaxOptions)
};
var doLoad=function(model,onLoad,ajaxOptions){if(!ajaxOptions.success){if(!ajaxOptions.dataType){ajaxOptions.dataType="json"
}ajaxOptions.success=function(config){if(config.id!==undefined){config={meta:{view:config}}
}if(translateFn){config=translateFn.apply(this,[config])
}onLoad.apply(model,[config])
};
ajaxOptions.complete=function(){$(listeners).trigger("after_load")
}
}if(!$(listeners).trigger("before_load",[ajaxOptions])){return
}if(autoBaseURL){var url=ajaxOptions.url;
var endOfProt=url.indexOf("://");
if(endOfProt!=-1){endOfProt+=3;
var endOfHost=url.indexOf("/",endOfProt);
if(endOfHost==-1){baseURL=url
}else{baseURL=url.substring(0,endOfHost)
}}else{baseURL=""
}}if(curOptions.initialResponse!==null){setTimeout(function(){ajaxOptions.success(curOptions.initialResponse);
ajaxOptions.complete();
curOptions.initialResponse=null
},0)
}else{$.ajax(ajaxOptions)
}};
var batchRequests=[];
var addBatchRequest=function(req){batchRequests.push(req)
};
var runBatch=function(){if(batchRequests.length<1){return
}if(batchRequests.length==1){$.ajax($.extend(batchRequests.shift(),{dataType:"json",contentType:"application/json"}));
return
}var serverReqs=[];
var br=batchRequests;
batchRequests=[];
$.each(br,function(i,r){serverReqs.push({url:r.url,requestType:r.type,body:r.data})
});
$.ajax({url:"/batches",dataType:"json",contentType:"application/json",type:"POST",data:JSON.stringify({requests:serverReqs}),success:function(resp){$.each(resp,function(i,r){if(r.error){if(typeof br[i].error=="function"){br[i].error(r.errorMessage)
}}else{if(typeof br[i].success=="function"){br[i].success(JSON.parse(r.response))
}}})
},complete:function(){$.each(br,function(i,r){if(typeof r.complete=="function"){r.complete()
}})
},error:function(xhr){var errBody=JSON.parse(xhr.responseText);
$.each(br,function(i,r){if(typeof r.error=="function"){r.error(errBody.message)
}})
}})
};
this.loadRows=function(rowsToLoad){if(!supplementalAjaxOptions){return
}var min=this.length()+1;
var max=-1;
_.each(rowsToLoad,function(n){min=Math.min(n,min);
max=Math.max(n,max)
});
max-=countSpecialTo(max);
min-=countSpecialTo(min);
var len=Math.min(max-min+1,curOptions.pageSize);
var tempView=blist.dataset.cleanViewForPost(this.getViewCopy(),this.isGrouped()||this.shouldSendColumns());
var ajaxOptions=$.extend({},supplementalAjaxOptions,{url:"/views/INLINE/rows.json?"+$.param($.extend({},supplementalAjaxOptions.data,{method:"getByIds",start:min,length:len})),type:"POST",contentType:"application/json",data:JSON.stringify(tempView)});
doLoad(this,function(d){onSupplementalLoad(d,min)
},ajaxOptions)
};
var onSupplementalLoad=function(response,start){var supplement=response.data;
setRowMetadata(supplement,meta.metaColumns,meta.dataMungeColumns);
for(var i=0;
i<supplement.length;
i++,start++){var adjStart=start+countSpecialTo(start);
var row=supplement[i];
if(active==rows&&active[adjStart]===undefined){rowsLoaded++
}active[adjStart]=row;
var id=row.id||(row.id=row[0]);
activeLookup[id]=adjStart;
if(rows==active){lookup[id]=adjStart
}}self.change(supplement)
};
this.reloadView=function(){var ajaxOptions=$.extend({},supplementalAjaxOptions);
if(curOptions.progressiveLoading){ajaxOptions.data=$.extend({},ajaxOptions.data,{method:"getByIds",start:0,length:1,meta:true})
}doLoad(self,viewReloaded,ajaxOptions)
};
var viewReloaded=function(config){if(config.meta){self.meta(config.meta);
updateColumns();
self.reloadAggregates();
var newRows=config.rows||(config.data!==undefined?config.data.data:null)||config.data;
if(newRows){if(config.meta.totalRows!==undefined){totalRows=config.meta.view.totalRows=config.meta.totalRows;
if(!$.isBlank(curOptions.masterView)){$.syncObjects(curOptions.masterView,self.getViewCopy())
}}this.rows(newRows,true)
}else{configureActive(null,true)
}$(listeners).trigger("columns_updated",[self]);
$(listeners).trigger("full_load")
}};
var translatePicklistFromView=function(col){var values=col.dropDown&&col.dropDown.values;
if(values){var options=col.options={};
for(var j=0;
j<values.length;
j++){var value=values[j];
options[value.id]={text:value.description||"",icon:value.icon,deleted:value.deleted||false}
}}return options
};
var getColumnLevel=function(columns,id){var level=columns[id];
if(!level){level=columns[id]=[];
level.id=id
}return level
};
this.reloadAggregates=function(tempView){if(!_.isUndefined(meta.view.message)){return
}tempView=blist.dataset.cleanViewForPost(tempView||this.getViewCopy(),this.isGrouped()||this.shouldSendColumns());
$.ajax({url:"/views/INLINE/rows.json?"+$.param({method:"getAggregates"}),type:"POST",contentType:"application/json",data:JSON.stringify(tempView),success:function(resp){updateAggregateHash(resp);
self.footerChange()
}})
};
var updateColumns=function(callback){if(!self.isGrouped()){if(_.isFunction(callback)){callback()
}return
}$.ajax({url:"/views/"+meta.view.id+"/columns.json",type:"GET",dataType:"json",success:function(cols){_.each(cols,function(c){if($.isBlank(self.getColumnByID(c.id))){meta.view.columns.push(c);
if(!$.isBlank(curOptions.masterView)){curOptions.masterView.columns.push(c)
}}});
if(_.isFunction(callback)){callback()
}}})
};
var updateAggregateHash=function(newAggs){meta.aggregates=newAggs;
if(!meta.aggregateHash){meta.aggregateHash={}
}if(newAggs){_.each(newAggs,function(a){if(meta.aggregateHash[a.columnId]===undefined){meta.aggregateHash[a.columnId]={}
}meta.aggregateHash[a.columnId].type=a.name;
meta.aggregateHash[a.columnId].value=a.value
})
}_.each(meta.allColumns,function(c){c.aggregate=meta.aggregateHash[c.id]
})
};
var translateMetaColumns=function(viewCols,metaCols,dataMungeCols){if(!viewCols){return
}for(var i=0;
i<viewCols.length;
i++){var v=viewCols[i];
if(v.dataTypeName=="meta_data"||v.dataTypeName=="tag"){var adjName=v.name;
if(v.dataTypeName=="tag"){adjName="tags"
}else{if(v.name=="sid"){adjName="id"
}else{if(v.name=="id"){adjName="uuid"
}}}metaCols.push({name:adjName,index:i})
}var type=blist.data.types[v.renderTypeName];
if(type&&type.isObject){dataMungeCols.push({index:i,type:"nullifyArrays"});
dataMungeCols.push({index:i,type:"arrayToObject",types:v.subColumnTypes})
}if(v.renderTypeName=="checkbox"){dataMungeCols.push({index:i,type:"falseToNull"})
}if(v.renderTypeName=="stars"){dataMungeCols.push({index:i,type:"zeroToNull"})
}}};
var translateViewColumns=function(view,viewCols,columns,allColumns,nestDepth,nestedIn){if(!viewCols){return
}viewCols=viewCols.slice();
for(var i=0;
i<viewCols.length;
i++){viewCols[i].dataIndex=i
}viewCols.sort(function(col1,col2){return col1.position-col2.position
});
var levelCols=getColumnLevel(columns,nestDepth);
var filledTo=0;
var addNestFiller=function(){if(filledTo<levelCols.length){var fillFor=[];
for(var i=filledTo;
i<levelCols.length;
i++){fillFor.push(levelCols[i])
}filledTo=levelCols.length+1;
getColumnLevel(columns,nestDepth+1).push({type:"fill",fillFor:fillFor})
}else{filledTo++
}};
for(i=0;
i<viewCols.length;
i++){var vcol=viewCols[i];
if(vcol.dataTypeName=="meta_data"){continue
}var col={name:vcol.name,description:vcol.description,width:Math.max(50,vcol.width||100),minWidth:50,type:vcol.renderTypeName||"text",originalType:vcol.dataTypeName,id:vcol.id,tableColumnId:vcol.tableColumnId,aggregate:meta.aggregateHash!==undefined?meta.aggregateHash[vcol.id]:undefined,subTypes:vcol.subColumnTypes};
col.dataIndex=vcol.dataIndex;
if(nestedIn){col.nestedIn=nestedIn;
col.dataLookupExpr=nestedIn.header.dataLookupExpr+"["+col.dataIndex+"]"
}else{col.dataLookupExpr="["+col.dataIndex+"]"
}switch(col.type){case"picklist":case"drop_down_list":case"dataset_link":col.options=translatePicklistFromView(vcol);
break;
case"photo_obsolete":case"document_obsolete":col.base=baseURL+"/views/"+view.id+"/obsolete_files/";
break;
case"photo":case"document":col.base=baseURL+"/views/"+view.id+"/files/";
break;
case"nested_table":var children=[];
col.body={type:"nested",children:children,header:col};
col.metaChildren=[];
col.dataMungeChildren=[];
translateMetaColumns(vcol.childColumns,col.metaChildren,col.dataMungeChildren);
translateViewColumns(view,vcol.childColumns,columns,allColumns,nestDepth+1,col.body);
if(!vcol.flags||$.inArray("hidden",vcol.flags)<0){addNestFiller();
if(columns[nestDepth+1]){columns[nestDepth+1].push(col.body)
}}break
}var format=vcol.format;
if(format){if(col.type=="stars"&&format.view=="stars_number"){col.type="number"
}if(col.originalType=="stars"&&format.view=="stars_number"){col.originalType="number"
}else{if(format.view){col.format=vcol.format.view
}}if(format.range){col.range=format.range
}if(format.precision){col.decimalPlaces=format.precision
}if(format.precisionStyle){col.precisionStyle=format.precisionStyle
}if(format.currency){col.currency=format.currency
}if(format.humane){col.humane=format.humane
}if(format.align){col.alignment=format.align
}if(format.grouping_aggregate){col.grouping_aggregate=format.grouping_aggregate
}if(format.drill_down&&!format.grouping_aggregate&&vcol.renderTypeName!="url"){col.drillDown=(format.drill_down==="true"||format.drill_down===true)
}}if(!vcol.flags||$.inArray("hidden",vcol.flags)<0){if(nestedIn){nestedIn.children.push(col)
}else{levelCols.push(col)
}}allColumns[col.id]=col
}if(columns[nestDepth+1]){addNestFiller()
}};
this.meta=function(newMeta){if(newMeta){resetUndo();
meta=newMeta;
if(!$.isBlank(curOptions.masterView)){$.syncObjects(curOptions.masterView,this.getViewCopy())
}meta.sort={};
columnLookup=[];
var nextID=0;
var assignIDs=function(cols,level){for(var i=0;
i<cols.length;
i++){var col=cols[i];
col.uid=nextID++;
col.level=level;
col.indexInLevel=i;
columnLookup[col.uid]=col;
if(col.children){assignIDs(col.children,level)
}}};
if(!meta.columns){meta.columns=[[]];
meta.allColumns={};
meta.metaColumns=[];
meta.dataMungeColumns=[];
columnIDLookup={};
if(meta.view){if(meta.view.columns){translateMetaColumns(meta.view.columns,meta.metaColumns,meta.dataMungeColumns);
translateViewColumns(meta.view,meta.view.columns,meta.columns,meta.allColumns,0);
$.each(meta.view.columns,function(i,col){if(col.id!=-1){columnIDLookup[col.id]=col
}if(col.childColumns){$.each(col.childColumns,function(j,cc){if(cc.id!=-1){columnIDLookup[cc.id]=cc
}})
}})
}}for(var i=0;
i<meta.columns.length;
i++){assignIDs(meta.columns[i],meta.columns[i])
}_.each(rows,function(r,i){try{resetChildRows(r)
}catch(e){}})
}else{for(var i=0;
i<meta.columns.length;
i++){assignIDs(meta.columns[i],meta.columns[i])
}}var rootColumns=meta.columns[0];
var sorts={};
if(meta.view!==undefined&&meta.view.query!==undefined&&meta.view.query.orderBys!==undefined&&meta.view.query.orderBys.length>0){$.each(meta.view.query.orderBys,function(i,order){sorts[order.expression.columnId]=order
});
$.each(meta.view.columns,function(i,c){if(sorts[c.id]!=undefined){meta.sort[c.id]={ascending:sorts[c.id].ascending,column:c}
}})
}for(i=0;
i<rootColumns.length;
i++){var col=rootColumns[i];
var dataIndex=col.dataIndex;
if(!dataIndex==undefined){dataIndex=col.dataIndex=i
}if(!col.dataLookupExpr){if(typeof dataIndex=="string"){col.dataLookupExpr="['"+dataIndex+"']"
}else{col.dataLookupExpr="["+dataIndex+"]"
}}}this.metaChange()
}return meta
};
this.rows=function(newRows,loadedTempView){if(newRows!==null&&newRows!==undefined){if(totalRows===0){totalRows=_.size(newRows)
}rows={};
_.each(newRows,function(r,i){rows[i]=r
});
active=rows;
activeCount=totalRows;
setRowMetadata(rows,meta.metaColumns,meta.dataMungeColumns);
installIDs();
if(sortConfigured&&!this.isProgressiveLoading()){doSort()
}configureActive(active,loadedTempView)
}return active
};
this.index=function(rowOrRowID){if(typeof rowOrRowID=="object"){return parseInt(activeLookup[rowOrRowID.id])
}return parseInt(activeLookup[rowOrRowID])
};
var addItemsToObject=function(obj,values,index){var numInserts=values.length;
var adjustIndexes=[];
_.each(obj,function(r,i){if(i>=index){adjustIndexes.push(parseInt(i))
}});
adjustIndexes.sort(function(a,b){return b-a
});
_.each(adjustIndexes,function(i){obj[i+numInserts]=obj[i];
delete obj[i]
});
_.each(values,function(v,i){obj[index+parseInt(i)]=v
})
};
var removeItemsFromObject=function(obj,index,numItems){for(var i=0;
i<numItems;
i++){delete obj[index+i]
}var adjustIndexes=[];
_.each(obj,function(r,i){if(i>index){adjustIndexes.push(parseInt(i))
}});
adjustIndexes.sort(function(a,b){return a-b
});
_.each(adjustIndexes,function(i){obj[i-numItems]=obj[i];
delete obj[i]
})
};
this.remove=function(delRows,serverDelete,skipUndo){if(!(delRows instanceof Array)||delRows.id){delRows=[delRows]
}if(!skipUndo&&serverDelete){this.addUndoItem({type:"delete",rows:delRows})
}for(var i=0;
i<delRows.length;
i++){var row=delRows[i];
if(row.expanded){this.expand(row,false)
}var id=row.id;
var index=parseInt(lookup[id]);
row.origPosition=index;
if(index!==undefined){delete lookup[id];
removeItemsFromObject(rows,index,1);
rowsLoaded--;
totalRows--
}if(rows!=active){index=parseInt(activeLookup[id]);
row.origActivePosition=index;
if(index!==undefined){delete activeLookup[id];
removeItemsFromObject(active,index,1);
activeCount--
}}else{activeCount=totalRows
}this.unselectRow(row);
if(serverDelete){startRowChange();
if(pendingRowEdits[id]){pendingRowDeletes[id]=true
}else{serverDeleteRow(id)
}}installIDs()
}$(listeners).trigger("row_remove",[delRows])
};
var serverDeleteRow=function(rowId,parColId,parRowId){var url="/views/"+meta.view.id+"/rows/";
if(parRowId){url+=parRowId+"/columns/"+parColId+"/subrows/"
}url+=rowId+".json";
$.ajax({url:url,contentType:"application/json",type:"DELETE",complete:function(){finishRowChange()
}})
};
this.removeChildRows=function(fakeRows,parCol,serverDelete,skipUndo){if(!(fakeRows instanceof Array)||fakeRows.id){fakeRows=[fakeRows]
}var removedRows=[];
$.each(fakeRows,function(i,fr){var parRow=fr.parent;
var subRow=self.getRowValue(fr,parCol);
var subRowSet=self.getRowValue(parRow,parCol);
for(var j=0;
j<subRowSet.length;
j++){if(subRow.id==subRowSet[j].id){subRowSet.splice(j,1);
subRow.origPosition=j;
removedRows.push({row:subRow,parentRow:parRow});
break
}}resetChildRows(parRow);
if(serverDelete){startRowChange();
if(pendingRowEdits[fr.id]){pendingRowDeletes[fr.id]={subRow:subRow,parRow:parRow,parCol:parCol}
}else{serverDeleteRow(subRow.uuid,parCol.id,parRow.uuid)
}}});
if(!skipUndo&&serverDelete){this.addUndoItem({type:"childDelete",rows:removedRows,parentColumn:parCol})
}};
this.getRowValue=function(row,column){if(row===undefined){return undefined
}var value;
eval("value = row"+(column.dataLookupExpr||("["+column.dataIndex+"]"))+";");
return value
};
this.getInvalidValue=function(row,column){var parCol=column.nestedIn?column.nestedIn.header:column;
var childLookup=column.nestedIn?parCol.dataLookupExpr:"";
var realRow;
eval("realRow = row"+childLookup+";");
return realRow.meta&&realRow.meta.invalidCells&&realRow.meta.invalidCells[column.tableColumnId]||null
};
this.setRowValue=function(value,row,column){eval("row"+column.dataLookupExpr+" = value;")
};
this.setInvalidValue=function(value,row,column){var parCol=column.nestedIn?column.nestedIn.header:column;
var childLookup=column.nestedIn?parCol.dataLookupExpr:"";
var realRow;
eval("realRow = row"+childLookup+";");
if(!realRow.meta){realRow.meta={invalidCells:{}}
}if(!realRow.meta.invalidCells){realRow.meta.invalidCells={}
}realRow.meta.invalidCells[column.tableColumnId]=value;
var metaCols=column.nestedIn?parCol.metaChildren:meta.metaColumns;
$.each(metaCols,function(i,c){if(c.name=="meta"){realRow[c.index]=JSON.stringify(realRow.meta);
return false
}})
};
this.isCellError=function(row,column){if(!row.error){return false
}if(column){column=meta.allColumns[column.id]
}var v;
eval("v = row.error"+column.dataLookupExpr+";");
return v
};
var resetChildRows=function(row){if(row.expanded){self.expand(row,false,true);
delete row.childRows;
self.expand(row,true,true);
installIDs();
configureActive()
}else{delete row.childRows
}};
var saveUID=0;
var isRowCreate=false;
var pendingRowCreates=[];
var pendingRowEdits={};
var pendingRowDeletes={};
var rowChangesPending=0;
var startRowChange=function(){rowChangesPending++
};
var finishRowChange=function(){rowChangesPending--;
if(rowChangesPending==0){$(listeners).trigger("server_row_change")
}};
this.saveRowValue=function(value,row,column,isValid,skipUndo){var validValue=isValid?value:null;
var invalidValue=isValid?null:value;
if(column){column=meta.allColumns[column.id]
}var isCreate=false;
if(row.type=="blank"){row=$.extend(row,{id:"saving"+saveUID++,isNew:true,type:null});
var lastRow=rows[totalRows-1];
if(totalRows<1||lastRow===undefined||!lastRow.isNew){rows[totalRows]=row;
totalRows++;
if(active==rows){activeCount=totalRows
}}installIDs();
configureActive(null,true);
isCreate=true;
if(!skipUndo){this.addUndoItem({type:"create",rows:[row]})
}}var prevValue;
var prevValueInvalid=false;
if(column){prevValue=this.getRowValue(row,column);
if(prevValue===null||prevValue===undefined){prevValue=this.getInvalidValue(row,column);
prevValueInvalid=prevValue!==null
}this.setRowValue(validValue,row,column);
this.setInvalidValue(invalidValue,row,column)
}if(!row.saving){row.saving=[]
}var data={};
if(column){if(column.type=="tag"){data._tags=validValue
}else{data[column.id]=validValue
}}if(row.meta){data.meta=JSON.stringify(row.meta)
}if(column&&column.nestedIn){var parCol=column.nestedIn.header;
var childRow=self.getRowValue(row,parCol);
isCreate=childRow.type=="blank";
if(isCreate){delete childRow.type;
var parRow=row.parent;
var curRowI=this.index(row);
if(parRow.type=="blank"){this.saveRowValue(null,parRow,null,true);
skipUndo=true
}if(!parRow[parCol.dataIndex]){parRow[parCol.dataIndex]=[]
}parRow[parCol.dataIndex].push(childRow);
resetChildRows(parRow);
row=this.get(curRowI);
if(!row.saving){row.saving=[]
}if(!skipUndo){this.addUndoItem({type:"childCreate",rows:[row],parentColumn:parCol})
}}setRowMetadata([row],parCol.metaChildren,parCol.dataMungeChildren);
if(!row.saving[parCol.dataIndex]){row.saving[parCol.dataIndex]=[]
}row.saving[parCol.dataIndex][column.dataIndex]=true;
if(row.error&&row.error[parCol.dataIndex]){delete row.error[parCol.dataIndex][column.dataIndex]
}}else{if(column){setRowMetadata([row],meta.metaColumns,meta.dataMungeColumns);
row.saving[column.dataIndex]=true;
if(row.error){delete row.error[column.dataIndex]
}}}if(!skipUndo&&!isCreate){this.addUndoItem({type:"edit",column:column,row:row,value:prevValue,invalid:prevValueInvalid})
}this.change([row]);
registerRowSave(row,column,data,isCreate)
};
var registerRowSave=function(row,column,data,isCreate,childRow,parentRow,parentColumn){startRowChange();
if(!isCreate&&row&&pendingRowEdits[row.id]){pendingRowEdits[row.id].push({column:column,parentColumn:parentColumn,data:data});
return
}else{if(isCreate&&parentRow&&pendingRowEdits[parentRow.id]){pendingRowEdits[parentRow.id].push({row:row,column:column,childRow:childRow,parentRow:parentRow,parentColumn:parentColumn,data:data,isCreate:true});
return
}}if(row&&!pendingRowEdits[row.id]){pendingRowEdits[row.id]=[]
}if(isCreate){if(isRowCreate){pendingRowCreates.push({row:row,column:column,childRow:childRow,parentRow:parentRow,parentColumn:parentColumn,data:data});
return
}isRowCreate=true
}serverSaveRow(row,column,data,isCreate,childRow,parentRow,parentColumn)
};
var getSaveURL=function(row,column,isCreate,childRow,parentRow,parentColumn){if(parentColumn||column&&column.nestedIn){parentColumn=parentColumn||column.nestedIn.header;
return getChildSaveURL(childRow||self.getRowValue(row,parentColumn),parentRow||row.parent,parentColumn,isCreate)
}var url="/views/"+self.meta().view.id+"/rows";
if(isCreate){url+=".json"
}else{url+="/"+row.uuid+".json"
}return url
};
var getChildSaveURL=function(childRow,parentRow,parentColumn,isCreate){var url="/views/"+self.meta().view.id+"/rows/"+parentRow.uuid+"/columns/"+parentColumn.id+"/subrows";
if(!isCreate){url+="/"+childRow.uuid
}url+=".json";
return url
};
var serverSaveRow=function(row,column,data,isCreate,childRow,parentRow,parentColumn,skipBatchRequest){var url=getSaveURL(row,column,isCreate,childRow,parentRow,parentColumn);
var newRow=isCreate?row:null;
if(parentColumn||column&&column.nestedIn){parentColumn=parentColumn||column.nestedIn.header;
if(childRow===undefined||childRow===null){childRow=self.getRowValue(row,parentColumn)
}newRow=isCreate?childRow:null
}var model=self;
addBatchRequest({url:url,type:isCreate?"POST":"PUT",data:JSON.stringify(data),complete:function(){if(row===null||row===undefined){finishRowChange();
return
}if(row.saving!==undefined){if(parentColumn&&column=="all"){row.saving[parentColumn.dataIndex]=[]
}else{if(parentColumn){delete row.saving[parentColumn.dataIndex][column.dataIndex]
}else{if(column=="all"){delete row.saving
}else{if(column&&row.saving){delete row.saving[column.dataIndex]
}}}}}if(pendingRowEdits[row.id]&&pendingRowEdits[row.id].length>0){while(pendingRowEdits[row.id].length>0){var u=pendingRowEdits[row.id].shift();
serverSaveRow(row,u.column,u.data,u.isCreate,u.childRow,u.parentRow,u.parentColumn,true)
}runBatch()
}else{delete pendingRowEdits[row.id];
if(pendingRowDeletes[row.id]){var pd=pendingRowDeletes[row.id];
if(pd===true){serverDeleteRow(row.id)
}else{serverDeleteRow(pd.subRow.uuid,pd.parCol.id,pd.parRow.uuid)
}delete pendingRowDeletes[row.id]
}}finishRowChange();
model.change([row])
},error:function(){if(!row.error){row.error=[]
}if(column=="all"){var errorArray=parentColumn===undefined?row.error:row.error[parentColumn.dataIndex];
var columns=parentColumn===undefined?meta.view.columns:parentColumn.body.children;
$.each(columns,function(i,c){if((c.dataTypeName=="tag")||c.id>-1){errorArray[c.dataIndex]=true
}})
}else{if(parentColumn){row.error[parentColumn.dataIndex][column.dataIndex]=true
}else{if(column){row.error[column.dataIndex]=true
}}}model.change([row])
},success:function(resp){if(newRow){var oldID=newRow.id;
var metaCols=parentColumn?parentColumn.metaChildren:meta.metaColumns;
$.each(metaCols,function(i,c){var n="_"+c.name;
if(resp[n]!==undefined){newRow[c.name]=newRow[c.index]=resp[n]
}});
installIDs();
delete newRow.isNew;
delete newRow.type;
setRowMetadata([newRow],metaCols,parentColumn?parentColumn.dataMungeChildren:meta.dataMungeColumns);
pendingRowEdits[newRow.id]=pendingRowEdits[oldID];
delete pendingRowEdits[oldID];
if(pendingRowDeletes[oldID]){pendingRowDeletes[newRow.id]=pendingRowDeletes[oldID];
delete pendingRowDeletes[oldID]
}if(pendingRowCreates.length>0){var c=pendingRowCreates.shift();
serverSaveRow(c.row,c.column,c.data,true,c.childRow,c.parentRow,c.parentColumn)
}else{isRowCreate=false
}model.change([newRow])
}}});
if(!skipBatchRequest){runBatch()
}};
var undeleteRow=function(row,parentRow,parentColumn,childCascade){var data={};
data.position=row.position;
var columns=parentColumn===undefined?meta.view.columns:parentColumn.body===undefined?parentColumn.childColumns:parentColumn.body.children;
var fakeRow;
var savingArray;
if(parentRow!==undefined&&parentRow.childRows!==undefined){fakeRow=parentRow.childRows[row.origPosition];
if(fakeRow){if(!fakeRow.saving){fakeRow.saving=[]
}fakeRow.saving[parentColumn.dataIndex]=[];
savingArray=fakeRow.saving[parentColumn.dataIndex]
}}else{savingArray=row.saving=[]
}var undeleteChildren=[];
$.each(columns,function(i,c){if(c.dataTypeName=="tag"){data._tags=row[c.dataIndex];
savingArray[c.dataIndex]=true
}else{if(c.dataTypeName=="nested_table"){if(row[c.dataIndex] instanceof Array){$.each(row[c.dataIndex],function(j,cr){cr.origPosition=j;
undeleteChildren.push({parentRow:row,row:cr,parentColumn:meta.allColumns[c.id]})
})
}}else{if(c.id>-1){data[c.id]=row[c.dataIndex];
savingArray[c.dataIndex]=true
}}}});
if(row.meta){data.meta=JSON.stringify(row.meta)
}row.isNew=true;
var oldID=row.id;
row.id="saving"+saveUID++;
delete row.uuid;
pendingRowEdits[row.id]=pendingRowEdits[oldID];
delete pendingRowEdits[oldID];
pendingRowDeletes[row.id]=pendingRowDeletes[oldID];
delete pendingRowDeletes[oldID];
if(parentRow!==undefined){if(!childCascade){var subRowSet=self.getRowValue(parentRow,parentColumn);
subRowSet.splice(row.origPosition,0,row)
}resetChildRows(parentRow);
if(parentRow.childRows!==undefined){fakeRow=parentRow.childRows[row.origPosition];
fakeRow.saving[parentColumn.dataIndex]=savingArray;
self.change([fakeRow])
}registerRowSave(fakeRow,"all",data,true,row,parentRow,parentColumn)
}else{addItemsToObject(rows,[row],row.origPosition);
totalRows++;
activeCount++;
if(active!=rows){addItemsToObject(active,[row],row.origActivePosition)
}installIDs();
configureActive();
$(listeners).trigger("row_add",[[row]]);
registerRowSave(row,"all",data,true);
$.each(undeleteChildren,function(i,cr){undeleteRow(cr.row,cr.parentRow,cr.parentColumn,true)
})
}};
var doUndoRedo=function(buffer){if(buffer.length<1){return null
}var item=buffer.pop();
var oppItem=null;
switch(item.type){case"edit":var curValue=self.getRowValue(item.row,item.column);
var isInvalid=false;
if(curValue===null||curValue===undefined){curValue=self.getInvalidValue(item.row,item.column);
isInvalid=curValue!==null
}oppItem={type:"edit",value:curValue,invalid:isInvalid,row:item.row,column:item.column};
self.saveRowValue(item.value,item.row,item.column,!item.invalid,true);
break;
case"create":oppItem={type:"delete",rows:item.rows};
self.remove(item.rows,true,true);
break;
case"childCreate":oppItem={type:"childDelete",rows:$.map(item.rows,function(r,i){return{parentRow:r.parent,row:fakeRowToChild(r,item.parentColumn)}
}),parentColumn:item.parentColumn};
self.removeChildRows(item.rows,item.parentColumn,true,true);
break;
case"delete":oppItem={type:"create",rows:item.rows.slice()};
item.rows.reverse();
$.each(item.rows,function(i,r){undeleteRow(r)
});
break;
case"childDelete":var reversedRows=item.rows.slice();
reversedRows.reverse();
$.each(reversedRows,function(i,r){undeleteRow(r.row,r.parentRow,item.parentColumn)
});
oppItem={type:"childCreate",rows:$.map(item.rows,function(r,i){return[childRowToFake(r.parentRow,r.row.origPosition)]
}),parentColumn:item.parentColumn};
break
}return oppItem
};
this.addUndoItem=function(itemHash){redoBuffer.length=0;
undoBuffer.push(itemHash);
this.undoRedoChange()
};
this.undo=function(){var oppItem=doUndoRedo(undoBuffer);
if(oppItem!==null){redoBuffer.push(oppItem);
this.undoRedoChange()
}};
this.redo=function(){var oppItem=doUndoRedo(redoBuffer);
if(oppItem!==null){undoBuffer.push(oppItem);
this.undoRedoChange()
}};
this.canUndo=function(){return undoBuffer.length>0
};
this.canRedo=function(){return redoBuffer.length>0
};
var resetUndo=function(){redoBuffer.length=0;
undoBuffer.length=0;
self.undoRedoChange()
};
var childRowToFake=function(parentRow,childRowPos){if(parentRow.childRows===undefined||parentRow.childRows===null){getChildRows(parentRow)
}return parentRow.childRows[childRowPos]
};
var fakeRowToChild=function(fakeRow,parentColumn){return fakeRow[parentColumn.dataIndex]
};
this.invalidateRows=function(){removeSpecialRows();
active=rows={};
activeCount=totalRows;
rowsLoaded=0;
lookup={};
activeLookup={}
};
this.updateColumn=function(column){var isColumnPresent=false;
$.each(meta.view.columns,function(i,c){if(c.id==column.id){column.childColumns=meta.view.columns[i].childColumns;
meta.view.columns[i]=column;
isColumnPresent=true;
return false
}else{if(c.childColumns instanceof Array){var found=false;
$.each(c.childColumns,function(j,cc){if(cc.id==column.id){c.childColumns[j]=column;
isColumnPresent=true;
found=true;
return false
}});
if(found){return false
}}}});
if(meta.aggregates===null||meta.aggregates===undefined){meta.aggregates=[]
}if(column.updatedAggregate!==null&&column.updatedAggregate!==undefined){var found=false;
$.each(meta.aggregates,function(i,a){if(a.columnId==column.id){meta.aggregates[i]=column.updatedAggregate;
found=true
}});
if(!found){meta.aggregates.push(column.updatedAggregate)
}}else{for(var i=0;
i<meta.aggregates.length;
i++){if(meta.aggregates[i].columnId==column.id){meta.aggregates.splice(i,1);
meta.aggregateHash={};
break
}}}if(!isColumnPresent){this.reloadView()
}else{meta.columns=null;
this.meta(meta);
updateAggregateHash(meta.aggregates);
self.footerChange();
$(listeners).trigger("columns_updated",[this])
}};
this.convertColumn=function(oldId,newViewColumn){this.invalidateRows();
if(meta.view!=null){$.each(meta.view.columns,function(i,c){if(c.id==oldId){meta.view.columns[i]=newViewColumn;
return false
}else{if(c.childColumns instanceof Array){var found=false;
$.each(c.childColumns,function(j,cc){if(cc.id==oldId){c.childColumns[j]=newViewColumn;
found=true;
return false
}});
if(found){return false
}}}})
}var isSorted=meta.sort[oldId]!==undefined;
if(newViewColumn.format&&newViewColumn.format.aggregate){$.each(meta.aggregates,function(i,a){if(a.columnId==oldId){a.columnId=newViewColumn.id;
return false
}})
}meta.columns=null;
this.meta(meta);
if(isSorted){$.each(meta.view.query.orderBys,function(i,o){if(o.expression.columnId==oldId){o.expression.columnId=newViewColumn.id
}});
this.multiSort(meta.view.query.orderBys)
}configureActive();
$(listeners).trigger("columns_updated",[this])
};
this.deleteColumns=function(cols){if(meta.view!=null){var removedData=[];
var subRemovedData={};
$.each(cols,function(j,cId){$.each(meta.view.columns,function(i,c){if(c.id==cId){removedData.push(meta.view.columns[i].dataIndex);
meta.view.columns.splice(i,1);
return false
}else{if(c.childColumns instanceof Array){var found=false;
$.each(c.childColumns,function(j,cc){if(cc.id==cId){if(subRemovedData[c.dataIndex]===undefined){subRemovedData[c.dataIndex]=[]
}subRemovedData[c.dataIndex].push(cc.dataIndex);
c.childColumns.splice(j,1);
found=true;
return false
}});
if(found){return false
}}}});
if(meta.aggregates!==null&&meta.aggregates!==undefined){$.each(meta.aggregates,function(i,a){if(a.columnId==cId){meta.aggregates.splice(i,1);
meta.aggregateHash={};
return false
}})
}});
removedData.sort(function(a,b){return b-a
});
_.each(rows,function(r){_.each(removedData,function(dataI){r.splice(dataI,1)
})
});
_.each(subRemovedData,function(subIndexes,index){subIndexes.sort(function(a,b){return b-a
});
_.each(rows,function(r){if(r[index] instanceof Object){_.each(r[index],function(subRow){_.each(subIndexes,function(dataI){subRow.splice(dataI,1)
})
})
}})
})
}meta.columns=null;
this.meta(meta);
$(listeners).trigger("columns_updated",[this])
};
this.moveColumn=function(oldPosOrCol,newPos){$.each(meta.columns,function(i,colList){$.each(colList,function(j,c){if(c.dataIndex){meta.view.columns[c.dataIndex].width=c.width
}})
});
var column=null;
var oldPos=-1;
if(typeof oldPosOrCol=="object"){column=oldPosOrCol;
if(column.flags!==undefined&&_.include(column.flags,"hidden")){column.flags=_.without(column.flags,"hidden")
}}else{oldPos=oldPosOrCol
}var viewCols=$.grep(meta.view.columns,function(c){return c.dataTypeName!="meta_data"&&(!c.flags||$.inArray("hidden",c.flags)<0)
});
viewCols.sort(function(col1,col2){return col1.position-col2.position
});
if(column!==null){oldPos=_.indexOf(viewCols,column)
}viewCols.splice(newPos,0,viewCols[oldPos]);
viewCols.splice((newPos<oldPos?oldPos+1:oldPos),1);
$.each(viewCols,function(i,c){c.position=i+1
});
meta.columns=null;
this.meta(meta);
$(listeners).trigger("columns_rearranged",[this])
};
this.updateVisibleColumns=function(visCols){$.each(meta.columns,function(i,colList){$.each(colList,function(j,c){if(c.dataIndex){meta.view.columns[c.dataIndex].width=c.width
}})
});
var visHash={};
$.each(visCols,function(i,cId){visHash[cId]=i
});
$.each(meta.view.columns,function(i,c){if(!c.flags){c.flags=[]
}if(visHash[c.id]!==undefined){c.position=visHash[c.id];
var ind=$.inArray("hidden",c.flags);
if(ind>-1){c.flags.splice(ind,1)
}}else{c.flags.push("hidden")
}});
meta.columns=null;
this.meta(meta);
$(listeners).trigger("columns_rearranged",[this])
};
this.change=function(rows){$(listeners).trigger("row_change",[rows])
};
this.metaChange=function(){$(listeners).trigger("meta_change",[this])
};
this.footerChange=function(){$(listeners).trigger("footer_change",[this])
};
this.selectionChange=function(rows){$(listeners).trigger("selection_change",[rows])
};
this.colWidthChange=function(col,isFinished){$(listeners).trigger("col_width_change",[col,isFinished])
};
this.columnSortChange=function(skipReq){$(listeners).trigger("sort_change",[skipReq])
};
this.columnFilterChange=function(col,setFilter){$(listeners).trigger("column_filter_change",[col,setFilter])
};
this.undoRedoChange=function(){$(listeners).trigger("undo_redo_change")
};
this.get=function(index){return active[index]
};
this.getByID=function(id){var row=undefined;
if(lookup[id]!=undefined){row=rows[lookup[id]]
}else{if(activeLookup[id]!=undefined){row=active[activeLookup[id]]
}}return row
};
this.column=function(uid){return columnLookup[uid]
};
this.columns=function(){return columnLookup
};
this.getColumnByID=function(id){return columnIDLookup[id]
};
this.columnIdToTableId=function(id){return this.getColumnByID(parseInt(id)).tableColumnId
};
this.length=function(){return activeCount
};
this.level=function(id){return meta.columns[id]
};
this.dataLength=function(){var total=activeCount;
_.each(active,function(row,i){if(row.level!==0&&row.level!==undefined||row.type=="blank"){total--
}if(row.childRows!==undefined){total+=row.childRows.length
}});
return total
};
this.nextInLevel=function(from,backward){var pos=from;
var level=0;
if(active[pos]!==undefined){level=active[pos].level||0
}if(backward){while(--pos>=0){if((active[pos]!==undefined?(active[pos].level||0):0)==level){return pos
}}}else{var end=activeCount;
while(++pos<end){if(active[pos]===undefined||(active[pos].level||0)==level){return pos
}}}return null
};
this.selectedRows={};
this.hasSelectedRows=function(){for(var i in this.selectedRows){return true
}};
this.toggleSelectRow=function(row){if(this.selectedRows[row.id]===undefined||this.selectedRows[row.id]===null){return this.selectRow(row)
}else{return this.unselectRow(row)
}};
this.selectRow=function(row,suppressChange){if(row.level<0||row.type=="blank"){return
}var rowId=row.id;
this.selectedRows[rowId]=activeLookup[rowId];
if(!suppressChange){this.selectionChange([row])
}return[row]
};
this.unselectRow=function(row){delete this.selectedRows[row.id];
this.selectionChange([row]);
return[row]
};
this.unselectAllRows=function(suppressChange){var unselectedRows=[];
$.each(this.selectedRows,function(id,v){unselectedRows.push(self.getByID(id))
});
this.selectedRows={};
if(!suppressChange){this.selectionChange(unselectedRows)
}return unselectedRows
};
this.selectSingleRow=function(row){var changedRows=this.unselectAllRows(true).concat(this.selectRow(row,true));
this.selectionChange(changedRows);
return changedRows
};
this.selectRowsTo=function(row){var minIndex;
$.each(this.selectedRows,function(id,index){if(minIndex==null||minIndex>index){minIndex=index
}});
if(minIndex==null){return this.selectRow(row)
}var curIndex=activeLookup[row.id];
var maxIndex=curIndex;
if(curIndex<minIndex){maxIndex=minIndex;
minIndex=curIndex
}var changedRows=this.unselectAllRows(true);
for(var i=minIndex;
i<=maxIndex;
i++){var curRow=active[i];
if(curRow!==undefined&&(curRow.level>=0||curRow.level===undefined)&&curRow.type!="blank"){this.selectedRows[curRow.id]=i;
changedRows.push(curRow)
}}this.selectionChange(changedRows);
return changedRows
};
this.multiSort=function(orderBys,skipRequest){if($.isBlank(orderBys)||orderBys.length===0){this.clearSort(null,skipRequest);
return
}else{if(orderBys.length==1){var sort=orderBys[0];
var colIndex=findColumnIndex(parseInt(sort.expression.columnId,10));
this.sort(colIndex,!sort.ascending,skipRequest);
return
}}meta.view.query.orderBys=orderBys;
if(!$.isBlank(curOptions.masterView)){curOptions.masterView.query.orderBys=orderBys
}meta.sort={};
$.each(meta.view.query.orderBys,function(i,sort){var col=self.getColumnByID(sort.expression.columnId);
meta.sort[sort.expression.columnId]={ascending:sort.ascending,column:col}
});
sortConfigured=true;
this.columnSortChange(skipRequest);
if(skipRequest){return
}doSort();
configureActive(active)
};
this.sort=function(order,descending,skipRequest){if(typeof order=="function"){orderFn=order
}else{if(typeof order=="object"){orderCol=order
}else{orderCol=meta.columns[0][order]
}meta.sort={};
meta.sort[orderCol.id]={column:orderCol,ascending:!descending};
if(meta.view.query!==undefined){meta.view.query.orderBys=[{expression:{columnId:orderCol.id,type:"column"},ascending:!descending}];
if(!$.isBlank(curOptions.masterView)){curOptions.masterView.query.orderBys=meta.view.query.orderBys
}}var r1="a"+orderCol.dataLookupExpr;
var r2="b"+orderCol.dataLookupExpr;
if(descending){var temp=r1;
r1=r2;
r2=temp
}var sortGen=columnType(order).sortGen;
if(sortGen){orderFn=sortGen(r1,r2)
}else{orderFn=null
}orderPrepro=columnType(order).sortPreprocessor;
if(orderPrepro&&!orderFn){if(descending){orderFn=function(a,b){return a[0]>b[0]?-1:a[0]<b[0]?1:0
}
}else{orderFn=function(a,b){return a[0]<b[0]?-1:a[0]>b[0]?1:0
}
}}if(orderCol.group===true){groupFn=columnType(order).group
}else{groupFn=orderCol.group
}sortConfigured=true
}this.columnSortChange(skipRequest);
if(skipRequest){return
}doSort();
configureActive(active)
};
this.clearSort=function(order,skipRequest){if(typeof order=="function"){order=null
}if(order&&typeof order!="object"){order=meta.columns[0][order]
}if($.isPlainObject(order)){delete meta.sort[order.id];
if(meta.view.query.orderBys!==undefined){for(var i=0;
i<meta.view.query.orderBys.length;
i++){if(meta.view.query.orderBys[i].expression.columnId==order.id){meta.view.query.orderBys.splice(i,1);
break
}}if(!$.isBlank(curOptions.masterView)){curOptions.masterView.query.orderBys=meta.view.query.orderBys
}if(meta.view.query.orderBys.length==1){var newSort=meta.view.query.orderBys[0];
var colIndex=findColumnIndex(newSort.expression.columnId);
if(colIndex!==undefined){this.sort(colIndex,!newSort.ascending,skipRequest);
return
}}}}else{meta.sort={};
delete meta.view.query.orderBys;
if(!$.isBlank(curOptions.masterView)){delete curOptions.masterView.query.orderBys
}}sortConfigured=true;
orderCol=null;
orderFn=null;
orderPrepro=null;
this.columnSortChange(skipRequest);
if(skipRequest){return
}var hasSort=false;
$.each(meta.sort,function(){hasSort=true;
return false
});
if(hasSort){doSort()
}else{this.getTempView()
}configureActive()
};
var getChildRows=function(row){if(row.childRows){return row.childRows
}var cols=meta.columns[row.level||0];
var childRows=row.childRows=[];
var childLevel=(row.level||0)+1;
for(var i=0;
i<cols.length;
i++){var col=cols[i];
if(!col.body){continue
}var cell=row[col.dataIndex];
if(!cell&&!self.useBlankRows()){continue
}if(!cell){cell=[]
}var numCells=(cell.length||0)+(self.useBlankRows()?1:0);
for(var j=0;
j<numCells;
j++){var childRow=childRows[j];
if(!childRow){childRow=childRows[j]=[];
childRow.id="t"+nextTempID++;
childRow.level=childLevel;
childRow.parent=row
}if(!childRow.saving){childRow.saving=[]
}childRow.saving[col.dataIndex]=[];
if(!childRow.error){childRow.error=[]
}childRow.error[col.dataIndex]=[];
childRow[col.dataIndex]=cell[j];
if(!childRow[col.dataIndex]){childRow[col.dataIndex]=[];
childRow[col.dataIndex].type="blank"
}setRowMetadata([childRow[col.dataIndex]],col.metaChildren,col.dataMungeChildren)
}}if(childRows.length){childRows[childRows.length-1].groupLast=true
}return childRows
};
var nextTempID=0;
this.expand=function(row,open,skipEvent){if(row===undefined){return
}if(open===undefined){open=!row.expanded
}if(open===row.expanded){return
}if(open){var childRows=getChildRows(row);
if(active==rows){active=_.clone(rows)
}var i=parseInt(activeLookup[row.id]);
addItemsToObject(active,childRows,i+1);
activeCount+=childRows.length
}else{if(row.childRows&&row.childRows.length){var i=parseInt(activeLookup[row.id]);
removeItemsFromObject(active,i+1,row.childRows.length);
activeCount-=row.childRows.length;
if(active==rows){totalRows=activeCount
}}}row.expanded=open;
installIDs(true);
if(!skipEvent){this.change([row])
}};
this.baseURL=function(newBaseURL){if(newBaseURL){baseURL=newBaseURL;
autoBaseURL=!baseURL
}return baseURL
};
var doSort=function(){if(!sortConfigured){return
}removeSpecialRows();
if(self.isProgressiveLoading()){self.getTempView();
return
}var toSort=new Array(activeCount);
_.each(active,function(rec,i){toSort[i]=orderPrepro!==undefined?[orderPrepro(rec[orderCol.dataIndex],orderCol),rec]:rec
});
if(orderFn){toSort.sort(orderFn)
}else{toSort.sort()
}var activeIsRows=active==rows;
active={};
if(activeIsRows){rows=active
}for(i=0;
i<toSort.length;
i++){active[i]=orderPrepro!==undefined?toSort[i][1]:toSort[i]
}installIDs(true)
};
this.getViewCopy=function(){var view=meta.view;
$.each((meta.columns||[])[0]||[],function(i,c){self.getColumnByID(c.id).width=c.width;
if(c.body&&c.body.children){$.each(c.body.children,function(j,cc){self.getColumnByID(cc.id).width=cc.width
})
}});
view=$.extend(true,{},view);
delete view.sortBys;
delete view.viewFilters;
view.columns=$.grep(view.columns,function(c,i){return c.id!=-1
});
view.columns.sort(function(a,b){return a.position-b.position
});
var cleanColumn=function(col){delete col.dataIndex
};
$.each(view.columns,function(i,c){cleanColumn(c);
if(c.childColumns){c.childColumns=$.grep(c.childColumns,function(cc,j){return cc.id!=-1
});
$.each(c.childColumns,function(j,cc){cleanColumn(cc)
})
}});
view.originalViewId=view.id;
return view
};
this.getTempView=function(tempView,includeColumns,callback){tempView=blist.dataset.cleanViewForPost(tempView||this.getViewCopy(),includeColumns||this.isGrouped());
var ajaxOptions=$.extend({},supplementalAjaxOptions,{url:"/views/INLINE/rows.json?"+$.param($.extend({},supplementalAjaxOptions.data,{method:"getByIds",start:0,length:curOptions.pageSize,meta:true})),type:"POST",contentType:"application/json",data:JSON.stringify(tempView)});
doLoad(self,function(config){loadTempView(config,callback)
},ajaxOptions)
};
var loadTempView=function(config,callback){var newRows=config.rows||(config.data!==undefined?config.data.data:null)||config.data;
if(config.meta){meta.columns=null;
config.meta.columnFilters=meta.columnFilters;
config.meta.view.id=meta.view.id;
config.meta.view.owner=meta.view.owner;
config.meta.view.flags=meta.view.flags;
self.meta(config.meta);
if(config.meta.totalRows!==undefined){activeCount=config.meta.view.totalRows=config.meta.totalRows;
if(!$.isBlank(curOptions.masterView)){$.syncObjects(curOptions.masterView,self.getViewCopy())
}}updateColumns(callback);
self.reloadAggregates()
}active={};
_.each(newRows,function(r,i){active[i]=r
});
setRowMetadata(active,meta.metaColumns,meta.dataMungeColumns);
_.each(active,function(curRow,i){var rowPos=lookup[curRow.id];
if(rowPos!==undefined){rows[rowPos]=curRow
}});
installIDs(true);
configureActive(null,true)
};
this.group=function(grouping){meta.view.query.groupBys=grouping;
if(!$.isBlank(curOptions.masterView)){curOptions.masterView.query.groupBys=grouping
}};
this.filter=function(filter,timeout){if(filterTimer){clearTimeout(filterTimer)
}var toFilter=configureFilter(filter);
if(!toFilter||!filterFn){return
}if(timeout){filterTimer=setTimeout(function(){window.clearTimeout(filterTimer);
configureActive(toFilter||active)
},250)
}else{configureActive(toFilter)
}};
var configureFilter=function(filter){var toFilter;
if(typeof filter=="function"){filterFn=filter;
filterText=null
}else{if(filter===null){filter=""
}if(filter===filterText){return null
}if(filter.length<curOptions.filterMinChars||filter.length==0){filterFn=null;
filterText="";
meta.view.searchString=null;
if(self.isProgressiveLoading()){self.getTempView()
}else{if(active!=rows){active=rows;
activeCount=totalRows;
$(listeners).trigger("client_filter");
configureActive()
}}return null
}var regexp=createRegExp(filter);
var filterParts=["(function(r) { return false"];
var rootColumns=meta.columns[0];
for(var i=0;
i<rootColumns.length;
i++){var type=rootColumns[i].type||"text";
if(blist.data.types[type].filterText){filterParts.push(" || ",type=="html"?"$.htmlStrip":"","(r",rootColumns[i].dataLookupExpr,' + "").match(regexp)')
}else{if(type=="picklist"||type=="drop_down_list"){var options=rootColumns[i].options;
if(options){var matches=[];
for(var key in options){if(options[key].text.match(regexp)){matches.push(key)
}}for(var j=0;
j<matches.length;
j++){filterParts.push(" || (r"+rootColumns[i].dataLookupExpr+' == "'+matches[j]+'")')
}}}}}filterParts.push("; });");
filterFn=new Function("regexp","return "+filterParts.join(""))(regexp);
if(filterText!==null&&filter.substring(0,filterText.length)==filterText){toFilter=active
}filterText=filter;
meta.view.searchString=filterText
}return toFilter||rows
};
var createRegExp=function(text){text=$.trim(text).replace(/\s+/," ");
if(text.match(/[A-Z]/)){var modifiers=""
}else{modifiers="i"
}return new RegExp(text.replace(/(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\})/g,"\\$1"),modifiers)
};
var clearColumnFilterData=function(filterCol){if(typeof filterCol!="object"){filterCol=meta.columns[0][filterCol]
}if(meta.columnFilters!=null){var cf=meta.columnFilters[filterCol.id];
if(meta.view.query.filterCondition==cf.viewFilter){meta.view.query.filterCondition=null
}else{meta.view.query.filterCondition.children.splice($.inArray(cf.viewFilter,meta.view.query.filterCondition.children),1);
if(meta.view.query.filterCondition.children.length<1){meta.view.query.filterCondition=null
}}meta.columnFilters[filterCol.id]=null
}};
this.filterColumn=function(filterCol,filterVal,subColumnType){if(typeof filterCol!="object"){filterCol=meta.columns[0][filterCol]
}if(meta.columnFilters==null){meta.columnFilters={}
}if(meta.columnFilters[filterCol.id]){clearColumnFilterData(filterCol)
}var filterItem={type:"operator",value:"EQUALS",children:[{type:"column",columnId:filterCol.id,value:subColumnType},{type:"literal",value:filterVal}]};
if(meta.view.query.filterCondition==null){meta.view.query.filterCondition=filterItem
}else{if(meta.view.query.filterCondition.type=="operator"&&meta.view.query.filterCondition.value=="AND"){if(!meta.view.query.filterCondition.children){meta.view.query.filterCondition.children=[]
}meta.view.query.filterCondition.children.push(filterItem)
}else{var topF={type:"operator",value:"AND",children:[meta.view.query.filterCondition,filterItem]};
meta.view.query.filterCondition=topF
}}meta.columnFilters[filterCol.id]={column:filterCol,value:filterVal,viewFilter:filterItem};
this.columnFilterChange(filterCol,true);
this.getTempView()
};
this.clearColumnFilter=function(filterCol){if(typeof filterCol!="object"){filterCol=meta.columns[0][filterCol]
}if(meta.columnFilters==null){meta.columnFilters={}
}if(meta.columnFilters[filterCol.id]){clearColumnFilterData(filterCol)
}this.columnFilterChange(filterCol,false);
this.getTempView()
};
this.findConfiguredColumn=function(idOrName,autoNames){var col;
if(idOrName!=undefined){col=this.getColumnByID(idOrName);
if(col!=undefined){return col
}idOrName=(""+idOrName).toLowerCase().replace(/[\s\-]/g,"_");
var columns=this.columns();
for(var i=0;
i<columns.length;
i++){var column=columns[i];
if(column.name.toLowerCase().replace(/\s\-/g,"_")==idOrName){return column
}}}if(autoNames){columns=this.columns()
}for(i=0;
i<columns.length;
i++){column=columns[i];
var name=column.name.toLowerCase().replace(/\s\-/g,"_");
if($.inArray(name,autoNames)!=-1){return column
}}return undefined
};
var configureActive=function(filterSource,loadedTempView){var idChange=removeSpecialRows();
if(!loadedTempView&&filterFn){doFilter(filterSource);
idChange=true
}if(groupFn){doGroup();
idChange=true
}if(doExpansion()){idChange=true
}if(self.useBlankRows()){var blankRow=[];
blankRow.level=0;
blankRow.type="blank";
blankRow.id="blank";
active[activeCount]=blankRow;
activeCount++;
if(active==rows){totalRows=activeCount
}idChange=true
}if(idChange){installIDs()
}dataChange()
};
var countSpecialTo=function(max){var count=0;
if(max===undefined){max=activeCount
}_.each(active,function(r,i){if(parseInt(i)<max&&(r.level!==0&&r.level!==undefined||r.type=="blank")){count++
}});
return count
};
var removeSpecialRows=function(){var removed=false;
var toRemove=[];
_.each(active,function(r,i){if(r.level!==0&&r.level!==undefined||r.type=="blank"){toRemove.push(parseInt(i));
removed=true
}});
toRemove.sort(function(a,b){return b-a
});
_.each(toRemove,function(i){removeItemsFromObject(active,i,1);
activeCount--
});
if(rows!=active){toRemove=[];
_.each(rows,function(r,i){if(r.level!==0&&r.level!==undefined||r.type=="blank"){toRemove.push(parseInt(i));
removed=true
}});
toRemove.sort(function(a,b){return b-a
});
_.each(toRemove,function(i){removeItemsFromObject(rows,i,1);
totalRows--
})
}else{totalRows=activeCount
}return removed
};
var doFilter=function(toFilter){if(filterTimer){window.clearTimeout(filterTimer);
filterTimer=null
}if(self.isProgressiveLoading()){self.getTempView();
return
}var filteredArray=_.sortBy($.objSelect(toFilter||rows,filterFn),function(v,k){return k
});
activeCount=filteredArray.length;
active={};
_.each(filteredArray,function(r,i){active[i]=r
});
$(listeners).trigger("client_filter")
};
var doGroup=function(){if(!groupFn||!orderCol){return
}var i=0;
var currentGroup;
var groupOn=orderCol.dataIndex;
while(i<activeCount){var group=groupFn(active[i][groupOn]);
if(group!=currentGroup){addItemsToObject(active,[{level:-1,type:"group",title:group,id:"special-"+i}],i);
activeCount++;
i++;
currentGroup=group
}i++
}if(rows==active){totalRows=activeCount
}installIDs(true)
};
var doExpansion=function(){var toExpand=[];
_.each(active,function(r,i){if(r.expanded){toExpand.push(parseInt(i))
}});
toExpand.sort(function(a,b){return b-a
});
_.each(toExpand,function(i){var childRows=getChildRows(active[i]);
addItemsToObject(active,childRows,i+1);
activeCount+=childRows.length
});
if(active==rows){totalRows=activeCount
}return toExpand.length>0
};
if(meta){this.meta(meta)
}else{this.meta({})
}};
$.fn.extend({blistModel:function(model){if(model){this.each(function(){var currentModel=$(this).data("blistModel");
if(currentModel){currentModel.removeListener(this)
}});
this.data("blistModel",model);
this.each(function(){model.addListener(this)
});
this.trigger("meta_change",[model]);
this.trigger("load",[model]);
return model
}var currentModel=this.data("blistModel");
if(currentModel){return currentModel
}return this.blistModel(new blist.data.Model())
}})
})(jQuery);
(function($){var EXPAND_DELAY=100;
var EXPAND_DURATION=100;
var MISSING_ROW_LOAD_DELAY=100;
var MINIMUM_HEADER_SIZE=10;
var nextTableID=1;
var htmlEscape=function(text){return text.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")
};
var trace=false;
trace=trace&&window.console&&window.console.time&&window.console.timeEnd;
var begin=trace?function(what){console.time(what)
}:function(){};
var end=trace?function(what){console.timeEnd(what)
}:function(){};
var makeTable=function(options){var model;
var id=this.id;
if(!id){id=nextTableID++;
id="blist-t"+id;
this.id=id
}var $this=$(this);
var calculateHandleDigits=function(model){return Math.ceil(Math.log(model.length()||1)*Math.LOG10E)
};
var sort=function(index){begin("sort.configure");
var columnSort=model.meta().sort[columns[index].id];
var sortDescending=false;
if(columnSort!=undefined){sortDescending=columnSort.ascending
}end("sort.configure");
begin("sort.sort");
model.sort(index,sortDescending);
end("sort.sort")
};
var configureSortHeader=function(){$(".sort.active",$header).removeClass("sort-asc").addClass("sort-desc").attr("title","Sort ascending").removeClass("active").closest(".blist-th").removeClass("sorted");
for(var i=0;
i<columns.length;
i++){var columnSort=model.meta().sort[columns[i].id];
if(columns[i].dom&&columnSort!=undefined){var sortDescending=!columnSort.ascending;
var col=columns[i];
var oldClass="sort-"+(sortDescending?"asc":"desc");
var newClass="sort-"+(sortDescending?"desc":"asc");
var newTitle="Sort "+(sortDescending?"ascending":"descending");
$(".sort",col.dom).removeClass(oldClass).addClass(newClass).attr("title",newTitle).addClass("active").closest(".blist-th").addClass("sorted")
}}};
var configureFilterHeaders=function(){$(".filter.active",$header).removeClass("active").closest(".blist-th").removeClass("filtered");
var colFilters=model.meta().columnFilters;
if(colFilters!=null){$.each(columns,function(i,c){if(colFilters[c.id]!=null){$(".filter",c.dom).addClass("active").closest(".blist-th").addClass("filtered")
}})
}};
var applyFilter=function(){setTimeout(function(){var searchText=$filterBox[0].value;
model.filter(searchText,250);
if(!searchText||searchText==""){$filterClear.hide()
}else{$filterClear.show()
}},10)
};
var clearFilter=function(e){e.preventDefault();
$filterBox.val("").blur();
$filterClear.hide();
model.filter("")
};
var getColumnForHeader=function(e){return model.column(e.getAttribute("uid"))
};
var getRow=function(cell){var rowDOM=cell.parentNode;
if(!rowDOM){return null
}var rowID=rowDOM.id.substring(id.length+2);
return model.getByID(rowID)
};
var getColumn=function(cell){var classIndex=cell.className.indexOf(id+"-c");
if(classIndex==-1){return null
}var endOfUID=cell.className.indexOf(" ",classIndex);
if(endOfUID==-1){endOfUID=cell.className.length
}var colUID=cell.className.slice(classIndex+id.length+2,endOfUID);
if(colUID=="rowHandleCol"){return rowHandleColumn
}else{if(colUID=="rowNumberCol"){return rowNumberColumn
}}return model.column(colUID)
};
var getColumnWidthPx=function(col){if(col.type=="opener"){return openerWidth+paddingX
}else{if(col.mcol){col=col.mcol
}}return(col.width||parseFloat(getColumnStyle(col).width))+paddingX
};
var selectColumn=function(column,state){if(!cellNav){return
}cellNav.setColumnSelection(column,state);
if(state){model.unselectAllRows()
}updateColumnSelection();
updateCellNavCues()
};
var selectColumnTo=function(column){if(!cellNav){return
}if(cellNav.lastSelectedColumn===null){selectColumn(column,true);
return
}var inSelect=false;
var lastCol=cellNav.lastSelectedColumn.id;
$.each(columns,function(i,c){if(c.id==column.id||c.id==lastCol){inSelect=!inSelect;
if(!inSelect){return false
}}if(inSelect){cellNav.setColumnSelection(c,true)
}});
selectColumn(column,true)
};
var selectOnlyColumn=function(column){if(!cellNav){return
}cellNav.clearColumnSelection();
selectColumn(column,true)
};
var updateColumnSelection=function(){if(!cellNav){return
}for(var i=0;
i<columns.length;
i++){var mcol=columns[i];
var col=$header.find("."+id+"-c"+mcol.index);
var colClass=getColumnClass(mcol);
if(cellNav.isColumnSelected(mcol)){if(!col.is(".blist-select-col")){var colLeft=col.addClass("blist-select-col").offset().left;
inside.append('<div class="col-select-holder blist-table-util '+colClass+'"/>').find(".col-select-holder."+colClass).css("left",colLeft-$header.offset().left+lockedWidth).removeClass("blist-table-util")
}}else{if(col.is(".blist-select-col")){col.removeClass("blist-select-col");
inside.find(".col-select-holder."+colClass).remove()
}}}};
var cellNav;
var $activeCells;
var getRenderedRowsWithPosition=function(){var rows=[];
for(var id in renderedRows){var row=renderedRows[id];
row.index=rowIndices[id];
rows.push(row)
}return rows.sort(function(a,b){return a.index-b.index
})
};
var clearRowSelection=function(row){if(row.row!==undefined){for(var cell=row.row.firstChild;
cell;
cell=cell.nextSibling){if(cell._sel){$(cell).removeClass("blist-cell-selected");
cell._sel=false
}}}delete row.selected
};
var setRowSelection=function(row,selmap){row.selected=true;
for(var pos=0,node=row.row.firstChild;
node;
node=node.nextSibling,pos++){if(selmap[pos]){if(!node.selected){$(node).addClass("blist-cell-selected");
node._sel=true
}}else{if(node._sel){$(node).removeClass("blist-cell-selected");
node._sel=false
}}}};
var focus=function(obtain){$navigator[0].focus()
};
var updateCellNavCues=function(){if(!cellNav){return
}if(cellNav.isActive()){var row=model.get(cellNav.getActiveY());
if(row!==undefined){var physActive=renderedRows[row.id];
if(physActive){var $newActive=$(physActive.row).children().slice(cellNav.getActiveX(),cellNav.getActiveXEnd())
}}if($newActive){$activeCells=$newActive
}else{$activeCells=null
}}var rows=getRenderedRowsWithPosition();
cellNav.processSelection(rows,setRowSelection,clearRowSelection);
cellNav.initCopy()
};
var $activeContainer;
var hideActiveCell=function(activeOnly){if($activeContainer){$activeContainer.css("top",-10000);
$activeContainer.css("left",-10000)
}if(!activeOnly){endEdit(true,SELECT_EDIT_MODE)
}};
var expandActiveCell=function(){if(isEdit[DEFAULT_EDIT_MODE]||!cellNav.isActive()){hideActiveCell();
return
}if(isEdit[SELECT_EDIT_MODE]){hideActiveCell(true);
return
}if($activeCells&&$activeCells.length>0){var column=getColumn($activeCells[0]);
var type=column?blist.data.types[column.type]:null;
if(type&&type.isInlineEdit){if(editCell($activeCells[0],SELECT_EDIT_MODE)){return
}}}if(!$activeContainer){$activeContainer=$('<div class="blist-table-active-container blist-table-util"></div>');
$render.append($activeContainer)
}else{if($activeContainer[0].parentNode==null||$activeContainer[0].parentNode.nodeType==11){$render.append($activeContainer)
}}var row=model.get(cellNav.getActiveY());
if(row!==undefined&&row.expanded){$activeContainer.addClass("blist-tr-open")
}else{$activeContainer.removeClass("blist-tr-open")
}if(!$activeCells){$activeContainer.empty();
$activeContainer.height(rowOffset-($activeContainer.outerHeight()-$activeContainer.height()));
var width=0;
for(var j=cellNav.getActiveX(),stop=cellNav.getActiveXEnd();
j<stop;
j++){width+=getColumnWidthPx(layout[0][j])
}$activeContainer.width(width-($activeContainer.outerWidth()-$activeContainer.width()));
var rowIndex=cellNav.getActiveY();
$activeContainer.css("top",rowIndex*renderScaling-$render.position().top);
var left=lockedWidth;
for(var i=0;
i<cellNav.getActiveX();
i++){left+=getColumnWidthPx(layout[0][i])
}$activeContainer.css("left",left);
return
}var $activeExpand=$activeCells.clone();
$activeExpand.width("auto").height("auto");
$activeContainer.width("auto").height("auto");
$activeContainer.empty();
$activeContainer.append($activeExpand);
sizeCellOverlay($activeContainer,$activeExpand,$activeCells);
positionCellOverlay($activeContainer,$activeCells);
$activeContainer.removeClass("blist-table-util")
};
var clearCellNav=function(){if(cellNav&&cellNav.clearAll()){$activeCells=null;
updateColumnSelection();
updateCellNavCues();
expandActiveCell();
inside.find(".col-select-holder").remove()
}};
var cellXY=function(cell){var row=getRow(cell);
if(!row){return null
}var levelID=row.level||0;
if(levelID<0){return null
}var rowLayout=layout[levelID];
var x;
var node;
var lcol;
for(x=0,node=cell.parentNode.firstChild;
node;
node=node.nextSibling){lcol=rowLayout[x];
if(!lcol){break
}if(node==cell){break
}if(lcol.skippable&&$(node).hasClass("blist-skip")){x+=lcol.skipCount
}x++
}if(lcol===undefined){return null
}return{x:x,y:model.index(row)}
};
var cellFromXY=function(x,y){var row=model.get(y);
if(row!==undefined){var physActive=renderedRows[row.id];
if(physActive){return $(physActive.row).children().eq(x)
}}return null
};
var cellNavTo=function(cell,event,selecting){var cellLoc=cellXY(cell);
if(!cellLoc){clearCellNav();
return false
}if(event){var $target=$(event.target);
if($target.closest(".blist-table-locked").length>0||(!selecting&&$target.closest(".blist-tdh")>0)||$target.is(".blist-table-expander")){return false
}}model.unselectAllRows();
if($target&&$target.is("a")&&!selecting){clearCellNav();
return true
}return cellNavToXY(cellLoc,event,selecting)
};
var cellNavToXY=function(xy,event,selecting,wrap){if(!cellNav.goTo(xy.x,xy.y,event,selecting,wrap)){return false
}xy.x=cellNav.getActiveX();
xy.y=cellNav.getActiveY();
if(event){var scrollTop=$scrolls[0].scrollTop;
var firstRow=scrollTop/renderScaling;
var lastRow=firstRow+pageSize-2;
var origScrollTop=scrollTop;
if(xy.y>lastRow){scrollTop=Math.ceil((xy.y-(pageSize-2))*renderScaling)
}if(xy.y<firstRow){scrollTop=Math.floor(xy.y*renderScaling)
}if(scrollTop!=origScrollTop){$scrolls.scrollTop(scrollTop)
}var scrollLeft=$scrolls.scrollLeft();
var scrollWidth=$scrolls.width();
if($scrolls[0].scrollHeight>$scrolls[0].clientHeight){scrollWidth-=scrollbarWidth
}var scrollRight=scrollLeft+scrollWidth;
var row=model.get(xy.y);
var layoutLevel=layout[row!==undefined?(row.level||0):0];
var cellLeft=lockedWidth;
for(var i=0;
i<xy.x;
i++){cellLeft+=getColumnWidthPx(layoutLevel[i])
}var cellRight=cellLeft;
for(var j=0;
j<cellNav.getActiveWidth();
j++){cellRight+=getColumnWidthPx(layoutLevel[xy.x+j])
}if(cellRight>scrollRight){$scrolls.scrollLeft(cellRight-scrollWidth)
}if(cellLeft-lockedWidth<scrollLeft){$scrolls.scrollLeft(cellLeft-lockedWidth)
}}killHotExpander();
updateCellNavCues();
return true
};
var $editContainers={};
var isEdit={};
var DEFAULT_EDIT_MODE="edit";
var EXPAND_EDIT_MODE="expand";
var SELECT_EDIT_MODE="select";
var canEdit=function(){return options.editEnabled&&model.canWrite()
};
var editCell=function(cell,mode,newValue){if(!mode){mode=DEFAULT_EDIT_MODE
}if(isEdit[mode]||!canEdit()){return false
}var row=getRow(cell);
var col=getColumn(cell);
if(!col||col.dataIndex=="rowHandle"||col.dataIndex=="rowNumber"||!row){return false
}var value=model.getRowValue(row,col);
if(!value){value=model.getInvalidValue(row,col)
}var $curEditContainer=$('<div class="blist-table-edit-container mode-'+mode+' blist-table-util"></div>');
$scrolls.append($curEditContainer);
var blistEditor=$curEditContainer.blistEditor({row:row,column:model.getColumnByID(col.id),value:value,newValue:newValue});
if(!blistEditor){return
}configureEditor(cell,$curEditContainer,mode);
if(mode==EXPAND_EDIT_MODE){$curEditContainer.bind("editor-change",function(){reconfigureEditor(cell,$curEditContainer,mode,SELECT_EDIT_MODE)
})
}return true
};
var reconfigureEditor=function(cell,$curEditContainer,oldMode,newMode){$curEditContainer.unbind();
$curEditContainer.removeClass("mode-"+oldMode);
isEdit[oldMode]=false;
delete $editContainers[oldMode];
clearCellNav();
if(isEdit[SELECT_EDIT_MODE]){endEdit(true,SELECT_EDIT_MODE)
}if(isEdit[DEFAULT_EDIT_MODE]){endEdit(true,DEFAULT_EDIT_MODE)
}cellNavTo(cell);
hideHotExpander();
$curEditContainer.addClass("mode-"+newMode);
configureEditor(cell,$curEditContainer,newMode)
};
var configureEditor=function(cell,$curEditContainer,mode){var blistEditor=$curEditContainer.blistEditor();
$curEditContainer.bind("edit_end",function(e,isSave,oe){handleEditEnd(e,isSave,oe,mode)
});
if(mode==SELECT_EDIT_MODE){$curEditContainer.keydown(navKeyDown).keypress(navKeyPress)
}var $editor=blistEditor.$editor();
isEdit[mode]=true;
$editContainers[mode]=$curEditContainer;
if(mode==DEFAULT_EDIT_MODE){hideActiveCell()
}var cellLoc=cellXY(cell);
var resizeEditor=function(){if(cellLoc){var $cell=cellFromXY(cellLoc.x,cellLoc.y);
if($cell){blistEditor.adjustSize($cell[0].offsetWidth+1,$cell[0].offsetHeight+1,$scrolls.width()*0.8,$scrolls.height()*0.8);
positionCellOverlay($curEditContainer,$cell)
}}};
var displayCallback=function(){resizeEditor();
$curEditContainer.bind("resize",function(){resizeEditor()
});
$editor.closest(".blist-table-edit-container").removeClass("blist-table-util").addClass("shown");
if(mode!=EXPAND_EDIT_MODE){blistEditor.focus()
}};
blistEditor.initComplete(displayCallback)
};
var endEdit=function(isSave,mode){if(!mode){mode=DEFAULT_EDIT_MODE
}if(!isEdit[mode]){return
}if(mode==DEFAULT_EDIT_MODE){focus()
}delete isEdit[mode];
var $curEditContainer=$editContainers[mode];
if(!$curEditContainer){return
}var editor=$curEditContainer.blistEditor();
editor.finishEdit();
var origValue=editor.originalValue;
var value=editor.currentValue();
var row=editor.row;
var col=editor.column;
var isValid=editor.isValid();
$curEditContainer.remove();
delete $editContainers[mode];
if(isSave&&(!$.compareValues(origValue,value)||model.isCellError(row,col))){model.saveRowValue(value,row,col,isValid)
}};
var handleEditEnd=function(event,isSave,origEvent,mode){endEdit(isSave,mode);
if(origEvent.type=="keydown"){if(mode==DEFAULT_EDIT_MODE&&(origEvent.keyCode==27||origEvent.keyCode==113)){didNavKeyDown=true;
expandActiveCell()
}else{navKeyDown(origEvent)
}}if(!isEdit[DEFAULT_EDIT_MODE]&&(origEvent.type!="mousedown"||isElementInScrolls(origEvent.target))){focus()
}else{cellNav.deactivate()
}};
var hotExpander;
var hotExpanderVisible;
var hideHotExpander=function(){if(hotExpander){hotExpander.style.top="-10000px";
hotExpander.style.left="-10000px";
hotExpanderVisible=false
}};
var killHotExpander=function(){if(hotCellTimer){clearTimeout(hotCellTimer);
hotCellTimer=null
}endEdit(true,EXPAND_EDIT_MODE);
hideHotExpander()
};
var setHotCell=function(newCell,event){if(hotCell){onCellOut(event)
}hotCell=newCell;
if(newCell){$(newCell).addClass("blist-hot");
if(options.cellExpandEnabled){hotCellTimer=setTimeout(expandHotCell,EXPAND_DELAY)
}}};
var expandHotCell=function(){if(options.noExpand){return
}if(!hotCellTimer){return
}hotCellTimer=null;
var column=getColumn(hotCell);
var type=column?blist.data.types[column.type]:null;
if(type&&type.isInlineEdit){if(editCell(hotCell,EXPAND_EDIT_MODE)){return
}}if(!hotExpander){hotExpander=document.createElement("div");
var $hotExpander=$(hotExpander);
$hotExpander.addClass("blist-table-expander");
$hotExpander.addClass("blist-table-util")
}else{hideHotExpander();
$hotExpander=$(hotExpander)
}if(hotExpander.parentNode==null||hotExpander.parentNode.nodeType==11){$render.append($hotExpander)
}var $hotCell=$(hotCell);
var $wrap=$hotCell.clone();
$wrap.width("auto").height("auto");
$hotExpander.width("auto").height("auto");
$hotExpander.empty();
$hotExpander.append($wrap);
var hotWidth=$hotCell.outerWidth();
var hotHeight=$hotCell.outerHeight();
if($wrap.outerWidth()<=hotWidth+2&&$wrap.outerHeight()<=hotHeight+2){hideHotExpander();
return
}var rc=sizeCellOverlay($hotExpander,$wrap,$hotCell,true);
rc=$.extend(rc,positionCellOverlay($hotExpander,$hotCell,true,rc));
$hotExpander.removeClass("blist-table-util");
hotExpanderVisible=true;
$hotExpander.animate(rc,EXPAND_DURATION,null,function(){if(!hotExpanderVisible){hideHotExpander()
}})
};
var positionCellOverlay=function($container,$refCell,animate,curSize){var $parent=$container.parent();
var left=$refCell.offset().left-$parent.offset().left+$parent.scrollLeft();
var top=$refCell.offset().top-$parent.offset().top-1+$parent.scrollTop();
var origOffset={top:top,left:left};
var contWidth=curSize?curSize.width:$container.outerWidth();
var viewportWidth=$scrolls.width();
if($scrolls[0].scrollHeight>$scrolls[0].clientHeight){viewportWidth-=scrollbarWidth
}var scrollLeft=$scrolls.scrollLeft();
if(left+contWidth>scrollLeft+viewportWidth){left=scrollLeft+viewportWidth-contWidth
}if(left<scrollLeft){left=scrollLeft
}var contHeight=curSize?curSize.height:$container.outerHeight();
var viewportHeight=$scrolls.height();
if($scrolls[0].scrollWidth>$scrolls[0].clientWidth){viewportHeight-=scrollbarWidth
}var scrollTop=$parent.scrollTop()+($scrolls.offset().top-$parent.offset().top);
if(top+contHeight>scrollTop+viewportHeight){top=scrollTop+viewportHeight-contHeight
}if(top<scrollTop-1){top=scrollTop-1
}if(!animate){origOffset={top:top,left:left}
}$container.css("top",origOffset.top+"px");
$container.css("left",origOffset.left+"px");
return({left:left,top:top})
};
var sizeCellOverlay=function($container,$expandCells,$refCells,animate){$expandCells.eq(0).addClass("blist-first");
$expandCells.eq($expandCells.length-1).addClass("blist-last");
var rc={width:$container.outerWidth(),height:$container.outerHeight()};
var refWidth=0;
var refHeight=0;
var minWidths=[];
$refCells.each(function(){var $t=$(this);
var w=$t.outerWidth();
refWidth+=w;
minWidths.push(w);
refHeight=Math.max(refHeight,$t.outerHeight())
});
refWidth+=1;
refHeight+=1;
if(rc.width<refWidth){rc.width=refWidth
}if(rc.height<refHeight){rc.height=refHeight
}var maxWidth=$scrolls.width();
if($scrolls[0].scrollHeight>$scrolls[0].clientHeight){maxWidth-=scrollbarWidth
}maxWidth=Math.floor(maxWidth*0.8);
if(rc.width>maxWidth){$container.width(maxWidth);
rc.width=maxWidth;
rc.height=$container.outerHeight()
}var maxHeight=$scrolls.height();
if($scrolls[0].scrollWidth>$scrolls[0].clientWidth){maxHeight-=scrollbarWidth
}maxHeight=Math.floor(maxHeight*0.9);
if(rc.height>maxHeight){rc.height=maxHeight
}var outerPadx=$container.outerWidth()-$container.width();
var outerPady=$container.outerHeight()-$container.height();
rc.width-=outerPadx;
rc.height-=outerPady;
var availW=rc.width;
var countedScroll=false;
var extraPadding=0;
$expandCells.each(function(i){var minW=minWidths.shift();
var $t=$(this);
var w=$t.outerWidth();
var innerPadx=w-$t.width();
if(i==0&&$expandCells.length>1){innerPadx+=outerPadx/2
}if(!countedScroll&&$t.outerHeight()>rc.height){availW-=scrollbarWidth;
countedScroll=true
}if(w>minW){innerPadx--;
extraPadding++
}$t.width(Math.min(Math.max(minW,w),availW)-innerPadx);
availW-=$t.outerWidth();
if(rc.height>$t.outerHeight()){var innerPady=$t.outerHeight()-$t.height();
$t.height(rc.height-innerPady)
}});
rc.width+=extraPadding;
if(!animate){refWidth=rc.width;
refHeight=rc.height
}$container.width(refWidth);
$container.height(refHeight);
return rc
};
var hotCell;
var hotRowID;
var hotCellTimer;
var hotHeader;
var hotHeaderMode;
var hotHeaderDrag=false;
var skipHeaderClick;
var mouseDownAt;
var dragHeaderLeft;
var clickTarget;
var clickCell;
var selectFrom;
var findContainer=function(event,selector){var $container;
try{$container=$(event.type=="mouseout"?event.relatedTarget:event.target)
}catch(ignore){$container=$(event.target)
}if(!$container){return null
}if(!$container.is(selector)){$container=$container.closest(selector);
if(!$container.length){return null
}}return $container[0]
};
var findCell=function(event){var cell=findContainer(event,".blist-td, .blist-table-expander, .blist-table-active-container, .blist-table-edit-container");
if(!cell){return null
}var $cell=$(cell);
if($cell.is(".blist-tdfill, .blist-opener-space")){return null
}if($activeCells&&(($activeContainer&&($cell[0]==$activeContainer[0]||$cell.parent()[0]==$activeContainer[0]))||$cell.closest(".blist-table-edit-container.mode-"+DEFAULT_EDIT_MODE).length>0||$cell.closest(".blist-table-edit-container.mode-"+SELECT_EDIT_MODE).length>0)){return $activeCells[0]
}if($cell.hasClass("blist-tdh")){while(!$cell.hasClass("blist-opener")){$cell=$(cell=cell.previousSibling)
}return cell
}if(cell==hotExpander||cell.parentNode==hotExpander||$cell.closest(".blist-table-edit-container.mode-"+EXPAND_EDIT_MODE).length>0){return hotCell
}return cell
};
var handleHeaderHover=function(event){if(hotHeaderMode==4&&hotHeaderDrag||isDisabled){return false
}var container=findContainer(event,".blist-tr, .blist-table-header");
if(!container){return false
}var x=event.clientX;
var hh,hhm;
var foundRealHeader=false;
var $headers=$(".blist-th:not(.blist-table-ghost), .blist-tdh",container);
$headers.each(function(i){var header=$(this);
var left=header.offset().left;
if(left>x){return false
}var width=header.outerWidth();
var right=left+width;
var isCtl=header.is(".blist-opener, .blist-table-row-handle, .blist-table-ghost");
var isSizable=!isCtl&&!header.is(".nested_table")&&!(options.disableLastColumnResize&&(i==($headers.length-1)));
if(isSizable&&x>=right-options.resizeHandleAdjust&&x<right+options.resizeHandleAdjust){hh=header[0];
hhm=2;
dragHeaderLeft=left;
foundRealHeader=header.is(".blist-th, .blist-tr-open .blist-tdh");
return false
}if(x>=left&&x<right){hh=header[0];
var $dragHandle=header.find(".dragHandle");
if($dragHandle.length<1){return false
}var dragLeft=$dragHandle.offset().left;
var dragRight=dragLeft+$dragHandle.outerWidth();
if(x>=dragLeft&&x<dragRight){hhm=4
}else{hhm=isCtl?3:1
}foundRealHeader=header.is(".blist-th, .blist-tr-open .blist-tdh");
return false
}});
if(hh){if(hh!=hotHeader||hhm!=hotHeaderMode){hotHeader=hh;
hotHeaderMode=hhm;
if(hotHeaderMode==2){$outside.css("cursor","col-resize")
}else{$outside.css("cursor","default")
}}return foundRealHeader
}return false
};
var handleColumnResize=function(event,isFinished){var width=event.clientX-dragHeaderLeft-paddingX;
if(width<MINIMUM_HEADER_SIZE){width=MINIMUM_HEADER_SIZE
}var col=getColumnForHeader(hotHeader);
if(col.hasOwnProperty("minWidth")&&width<col.minWidth){width=col.minWidth
}if(col.hasOwnProperty("percentWidth")){varDenom[0]-=col.percentWidth;
delete col.percentWidth;
variableColumns[0]=$.grep(variableColumns[0],function(c,i){return c.dataIndex==col.dataIndex
},true);
if(col.minWidth){varMinWidth[0]-=col.minWidth
}}col.width=width;
adjustHeaderStyling($(columns[col.indexInLevel].dom),true);
model.colWidthChange(col,isFinished);
updateColumnSelection()
};
var unHotRow=function(rowID){$("#"+id+"-r"+rowID).removeClass("blist-hot-row");
$("#"+id+"-l"+rowID).removeClass("blist-hot-row");
if(rowID==hotRowID){hotRowID=null
}};
var onMouseMove=function(event){if(hotHeaderDrag){if(hotHeaderMode==2){handleColumnResize(event);
return
}else{if(hotHeaderMode==4){return
}}}if(mouseDownAt){if(clickTarget&&Math.abs(event.clientX-mouseDownAt.x)>3||Math.abs(event.clientY-mouseDownAt.y>3)){clickTarget=null;
clickCell=null
}if(selectFrom&&!clickTarget){if(!cellNav.selectionInit(cellXY(selectFrom))){cellNavTo(selectFrom,event)
}var over=findCell(event);
if(over&&$(over).closest(".blist-table-edit-container").length<=0){cellNavTo(over,event,true)
}}return
}if(handleHeaderHover(event)){if(hotCell){onCellOut(event)
}}else{if(hotHeader){hotHeader=null;
$outside.css("cursor","auto")
}}over=findCell(event);
if(over==hotCell||($activeCells&&$activeCells.index(over)>=0)||$(over).closest(".blist-table-edit-container").length>0){return
}var $nhr=$(over).closest(".blist-tr");
var newHotID=$nhr.length>0?$nhr.attr("id").substring(id.length+2):null;
if(!isDisabled&&newHotID!=hotRowID){if(hotRowID){unHotRow(hotRowID)
}if(newHotID){$("#"+id+"-r"+newHotID).addClass("blist-hot-row");
$("#"+id+"-l"+newHotID).addClass("blist-hot-row")
}hotRowID=newHotID
}setHotCell(over,event)
};
var onCellOut=function(event){if(hotCell){var to=findCell(event);
if(to==hotCell){return
}if(hotRowID){var $nhr=$(to).closest(".blist-tr");
var newHotID=$nhr.length>0?$nhr.attr("id").substring(id.length+2):null;
if(newHotID!=hotRowID){unHotRow(hotRowID)
}}$(hotCell).removeClass("blist-hot");
hotCell=null;
killHotExpander()
}};
var onCellClick=function(event,origEvent){var cell=findCell(event);
if(cell){var row=getRow(cell);
if(!row){return
}var column=getColumn(cell);
var cellEvent=$.Event("cellclick");
$this.trigger(cellEvent,[row,column,origEvent]);
if(cellEvent.isDefaultPrevented()){return
}var skipSelect=false;
if($(cell).hasClass("blist-opener")&&!$(cell).hasClass("blist-opener-inactive")){clearCellNav();
endEdit(DEFAULT_EDIT_MODE);
model.expand(row);
skipSelect=true
}if(!isDisabled&&!skipSelect&&(!cellNav||!cellNav.isActive())&&options.selectionEnabled&&!(row.level<0)){if(origEvent.metaKey){model.toggleSelectRow(row)
}else{if(origEvent.shiftKey){model.selectRowsTo(row)
}else{model.selectSingleRow(row)
}}unHotRow(row.id)
}}};
var touchLastY,touchLastX;
var onTouchStart=function(event){var e=event.originalEvent;
e.preventDefault();
touchLastY=e.targetTouches[0].clientY;
touchLastX=e.targetTouches[0].clientX
};
var onTouchMove=function(event){var e=event.originalEvent;
if(_.isUndefined(e.targetTouches)||(e.targetTouches.length!==1)){return false
}var $scrolls=$outside.find(".blist-table-scrolls");
var deltaY=touchLastY-e.targetTouches[0].clientY;
$scrolls[0].scrollTop=$scrolls[0].scrollTop+deltaY;
var deltaX=touchLastX-e.targetTouches[0].clientX;
$scrolls[0].scrollLeft=$scrolls[0].scrollLeft+deltaX
};
var $prevActiveCells;
var onMouseDown=function(event){clickTarget=event.target;
if(isDisabled){return
}clickCell=findCell(event);
var $clickTarget=$(clickTarget);
if($clickTarget.is(".blist-table-scrolls, .blist-table-expander")){return
}if(isEdit[DEFAULT_EDIT_MODE]&&$clickTarget.parents().andSelf().index($editContainers[DEFAULT_EDIT_MODE])>=0){return
}mouseDownAt={x:event.clientX,y:event.clientY};
if(hotHeader&&hotHeaderMode!=3){if($clickTarget.closest(".action-item").length<1&&($clickTarget.closest(".blist-tdh").length<1||hotHeaderMode==2)){clickTarget=null;
clickCell=null;
hotHeaderDrag=true;
event.stopPropagation();
event.preventDefault()
}if(isEdit[DEFAULT_EDIT_MODE]){endEdit(true)
}if(cellNav){cellNav.deactivate();
hideActiveCell()
}if($clickTarget.closest(".action-item").length<1){event.preventDefault()
}return
}selectFrom=null;
clickedInGrid=isElementInScrolls(clickTarget);
if(cellNav){var cell=findCell(event);
if($(cell).is(".blist-opener, .blist-tdh, .blist-table-row-handle, .blist-column-adder")){return
}if(cell&&$activeCells&&$activeCells.index(cell)>=0){$prevActiveCells=$activeCells
}else{$prevActiveCells=null;
if(!event.shiftKey&&!event.metaKey){clearCellNav()
}}if(cell&&cellNavTo(cell,event)){if(isEdit[DEFAULT_EDIT_MODE]){endEdit(true)
}selectFrom=cell
}}};
var onMouseUp=function(event){mouseDownAt=null;
if(isEdit[DEFAULT_EDIT_MODE]){return
}if(!isDisabled&&hotHeaderDrag){$curHeaderSelect=null;
origColSelects=null;
curColSelects={};
hotHeaderDrag=false;
if(hotHeaderMode==2){handleColumnResize(event,true)
}if(hotHeaderMode>1){skipHeaderClick=true
}onMouseMove(event);
event.stopPropagation();
event.preventDefault();
return true
}var $target=$(event.target);
if($target.closest(".action-item").length>0){return
}if($target.parents().index($outside)<0){return
}var cell=findCell(event);
var editMode=false;
if(!isDisabled&&cellNav&&cell!==null&&cell==clickCell){var curActiveCell=(cellNav.isActive()&&$activeCells)?$activeCells[0]:null;
if(curActiveCell&&$prevActiveCells&&$prevActiveCells.index(curActiveCell)>=0){editMode=editCell(curActiveCell)
}else{if(curActiveCell){$prevActiveCells=$activeCells
}}if(!editMode){focus()
}}if(clickTarget&&clickTarget==event.target&&!$(clickTarget).is("a")){$(clickTarget).trigger("table_click",event)
}if(!isDisabled&&cellNav&&!editMode){expandActiveCell()
}};
var onDoubleClick=function(event){if(isDisabled){return
}if(isEdit[DEFAULT_EDIT_MODE]&&$(event.target).parents().andSelf().index($editContainers[DEFAULT_EDIT_MODE])>=0){return
}clickTarget=event.target;
if(cellNav){var cell=findCell(event);
if(cell){editCell(cell)
}}};
var pageSize=1;
var navFocused=false;
var navigateX=function(deltaX,event,wrap){var to=cellNav.navigateX(deltaX,event,wrap);
if(to){cellNavToXY(to,event,false,wrap)
}};
var navigateY=function(deltaY,event,wrap){var to=cellNav.navigateY(Math.floor(deltaY),event,wrap);
if(to){cellNavToXY(to,event,false,wrap)
}};
var onCopy=function(event){if(cellNav){$navigator.text(cellNav.getSelectionDoc());
$navigator[0].select()
}};
var didNavKeyDown=false;
var navKeyDown=function(event){didNavKeyDown=true;
doKeyNav(event)
};
var navFocus=function(){navFocused=true
};
var navBlur=function(){navFocused=false
};
var navHasSelection=function(){if(!navFocused){return false
}if(document.selection){return document.selection.createRange().text.length>0
}return Math.abs($navigator.selectionEnd-$navigator.selectStart)>0
};
var checkForEditorInput=function(){if(navHasSelection()){return
}var newValue=$navigator.val();
if(!newValue){return
}editCurrentCell(newValue)
};
var editCurrentCell=function(newValue){var curActiveCell=(cellNav.isActive()&&$activeCells)?$activeCells[0]:null;
if(!curActiveCell){return
}editCell(curActiveCell,null,newValue)
};
var navKeyPress=function(event){if(cellNav&&cellNav.isActive()){if(!navHasSelection()){$navigator.val("")
}setTimeout(checkForEditorInput,1)
}if(didNavKeyDown){didNavKeyDown=false;
return
}doKeyNav(event)
};
var doKeyNav=function(event){if(!cellNav){return
}switch(event.keyCode){case 90:if(event.metaKey){if(model.canUndo()){model.undo()
}}else{return
}break;
case 89:if(event.metaKey){if(model.canRedo()){model.redo()
}}else{return
}break;
case 33:navigateY(-pageSize,event);
break;
case 34:navigateY(pageSize,event);
break;
case 37:navigateX(-1,event);
break;
case 38:navigateY(-1,event);
break;
case 39:navigateX(1,event);
break;
case 40:navigateY(1,event);
break;
case 8:editCurrentCell("");
break;
case 9:var direction=event.shiftKey?-1:1;
event.shiftKey=false;
navigateX(direction,event,true);
break;
case 13:if(!event.shiftKey&&$activeCells&&$activeCells.hasClass("blist-opener")&&!$activeCells.hasClass("blist-opener-inactive")){model.expand(getRow($activeCells[0]))
}else{direction=event.shiftKey?-1:1;
event.shiftKey=false;
navigateY(direction,event,true)
}break;
case 27:clearCellNav();
break;
case 113:var curActiveCell=$activeCells?$activeCells[0]:null;
if(curActiveCell){if(editCell(curActiveCell)){event.preventDefault();
return
}}break;
default:return
}hideActiveCell();
focus();
setTimeout(expandActiveCell,0);
try{event.preventDefault()
}catch(err){}};
var isElementInScrolls=function(element){return $(element).closest(".blist-table-scrolls")[0]==$scrolls[0]
};
if(options.simpleCellExpand){$(".blist-td:not(.blist-td-popout)").live("mouseover",function(event){var $this=$(this);
var innerContentWidth=0;
$this.children().each(function(){innerContentWidth+=$(this).outerWidth(true)
});
if(innerContentWidth<=$this.innerWidth()){return
}var offsetPos=$this.offset();
offsetPos.top+=$this.offsetParent().scrollTop();
var $copy=$this.clone();
var outTimer;
var clearCopy=function(){$copy.stop().fadeOut("fast",function(){$copy.remove()
})
};
$copy.addClass("blist-td-popout").css("left",offsetPos.left).css("top",offsetPos.top).mouseover(function(){clearTimeout(outTimer)
}).mouseleave(clearCopy).fadeIn();
$this.mouseleave(function(){outTimer=setTimeout(clearCopy,0)
});
$(document.body).append($copy)
})
}var headerStr='<textarea class="blist-table-navigator hiddenTextField"></textarea><div class="blist-table-locked-scrolls">   <div class="blist-table-locked-header">&nbsp;</div>   <div class="blist-table-locked">     <div class="blist-table-render">&nbsp;</div>   </div>   <div class="blist-table-locked-footer">&nbsp;</div></div><div class="blist-table-top">';
if(options.showTitle){headerStr+='<div class="blist-table-title-tl"> <div class="blist-table-title-tr">   <div class="blist-table-title">     <div class="blist-table-filter-l">       <div class="blist-table-filter-r">         <input class="blist-table-filter"/>         <a class="blist-table-clear-filter" title="Clear Search" href="#clear_filter">Clear Search</a>     </div></div>';
if(options.showName){headerStr+='<div class="blist-table-name">&nbsp;</div>'
}headerStr+="</div></div></div>"
}headerStr+='  <div class="blist-table-header-scrolls">    <div class="blist-table-header">&nbsp;</div>    <div class="indicator-container"></div></div></div><div class="blist-table-scrolls">  <div class="blist-table-inside">    <div class="blist-table-render">&nbsp;</div>  </div></div><div class="blist-table-footer-scrolls">    <div class="blist-table-footer">&nbsp;</div></div><div class="blist-table-util"></div>';
$(document).mouseup(onMouseUp);
var $outside=$this.addClass("blist-table").mousedown(onMouseDown).mousemove(onMouseMove).dblclick(onDoubleClick).html(headerStr);
if(options.columnDrag){$outside.append($('<div class="dropIndicator"/>'));
$dropIndicator=$(".dropIndicator",$outside).css("left",-10000).hide()
}var $lockedScrolls=$outside.find(".blist-table-locked-scrolls");
var $lockedHeader=$lockedScrolls.find(".blist-table-locked-header");
var $locked=$lockedScrolls.find(".blist-table-locked").bind("table_click",onCellClick);
var $lockedRender=$locked.find(".blist-table-render");
var $lockedFooter=$lockedScrolls.find(".blist-table-locked-footer");
var $top=$outside.find(".blist-table-top");
var $title;
var $nameLabel;
var $filterBox;
var $filterClear;
if(options.showTitle){$title=$top.find(".blist-table-title");
$nameLabel=$title.find(".blist-table-name");
$filterBox=$title.find(".blist-table-filter").keydown(applyFilter).change(applyFilter).example("Find");
$filterClear=$title.find(".blist-table-clear-filter").bind("click",clearFilter).hide()
}var $headerScrolls=$top.find(".blist-table-header-scrolls");
var $header=$headerScrolls.find(".blist-table-header");
var $scrolls=$outside.find(".blist-table-scrolls").scroll(function(){onScroll();
renderRows()
}).bind("touchstart",onTouchStart).bind("touchmove",onTouchMove);
var inside=$scrolls.find(".blist-table-inside").mouseout(onCellOut).bind("table_click",onCellClick);
var $render=inside.find(".blist-table-render");
var renderDOM=$render[0];
var scalingFactor=1;
var renderScaling=1;
var $footerScrolls=$outside.find(".blist-table-footer-scrolls");
var $footer=$footerScrolls.find(".blist-table-footer");
var appendUtil=$(document.createElement("div"));
var appendUtilDOM=appendUtil[0];
var measureUtil=$outside.find(".blist-table-util");
var measureUtilDOM=measureUtil[0];
var $navigator=$outside.find(".blist-table-navigator").keydown(navKeyDown).keypress(navKeyPress).bind("copy",onCopy).bind("blur",navBlur);
$locked.css("top",$header.outerHeight());
var clickedInGrid=false;
if(cellNav){var onDocumentMouseDown=function(e){if(cellNav.isActive()&&!clickedInGrid&&!isElementInScrolls(e.target)){cellNav.deactivate();
hideActiveCell()
}clickedInGrid=false
};
$(document).mousedown(onDocumentMouseDown)
}var scrollbarWidth=(function scrollbarWidth(){var div=$('<div style="width:50px;height:50px;overflow:hidden;position:absolute;top:-200px;left:-200px;"><div style="height:100px;"></div></div>');
$("body").append(div);
var w1=div[0].clientWidth;
div.css("overflow","scroll");
var w2=div[0].clientWidth;
$(div).remove();
return w1-w2
})();
var updateLayout=function(){begin("updateLayout.size");
$headerScrolls.height($header.outerHeight());
$scrolls.height($outside.height()-$top.outerHeight()-($scrolls.outerHeight()-$scrolls.height())-1);
$scrolls.width($outside.width()-($scrolls.outerWidth()-$scrolls.width()));
var scrollHeight=$scrolls[0].clientHeight;
pageSize=(scrollHeight/rowOffset)||1;
var rowCount=model!==undefined?model.length():0;
var insideHeight=rowOffset*rowCount;
var footerHeight=0;
if($footerScrolls.is(":visible")){footerHeight+=$footerScrolls.outerHeight()-1
}if(insideHeight+footerHeight<scrollHeight){footerHeight+=scrollHeight-footerHeight-insideHeight
}var origHeight=insideHeight;
insideHeight/=scalingFactor;
inside.height(insideHeight+footerHeight);
while(inside.height()<insideHeight+footerHeight-2){scalingFactor++;
insideHeight=origHeight/scalingFactor;
inside.height(insideHeight+footerHeight)
}var lastPageHeight=scrollHeight-footerHeight;
var lastPageSize=(lastPageHeight/rowOffset)||1;
renderScaling=((insideHeight-lastPageHeight)/(rowCount-lastPageSize))||1;
$locked.height(insideHeight+footerHeight);
if($render.position().top+$render.height()>insideHeight+footerHeight){var adjTop=insideHeight+footerHeight-$render.height();
$render.css("top",adjTop);
$lockedRender.css("top",adjTop)
}$scrolls.scroll();
end("updateLayout.size");
begin("updateLayout.render");
renderRows();
configureWidths();
end("updateLayout.render");
begin("updateLayout.footer");
var lockedBottom=parseFloat($scrolls.css("border-bottom-width"))+1;
var footerBottom=parseFloat($scrolls.css("border-bottom-width"))+$footerScrolls.outerHeight();
if($scrolls[0].scrollWidth>$scrolls[0].clientWidth){lockedBottom+=scrollbarWidth;
footerBottom+=scrollbarWidth
}$lockedScrolls.height($outside.height()-lockedBottom);
$footerScrolls.css("bottom",footerBottom);
var marginR=$scrolls.outerHeight()-$scrolls.height();
if($scrolls[0].scrollHeight>$scrolls[0].clientHeight){marginR+=scrollbarWidth
}$footerScrolls.css("margin-right",marginR);
end("updateLayout.footer")
};
if(options.manualResize){$this.bind("resize",updateLayout)
}else{$(window).resize(updateLayout)
}var headerScrolledTo=0;
var rowsScrolledTo=0;
var onScroll=function(){var scrollHoriz=$scrolls[0].scrollLeft;
var horizontalChange=false;
if(scrollHoriz!=headerScrolledTo){$header[0].style.left=-scrollHoriz+"px";
$footer[0].style.left=-scrollHoriz+"px";
headerScrolledTo=scrollHoriz;
horizontalChange=true
}var doVertScroll=function(){var scrollVert=$scrolls[0].scrollTop;
if(scrollVert!=rowsScrolledTo){var scrollDiff=scrollVert-rowsScrolledTo;
var absDiff=Math.abs(scrollDiff);
if(absDiff<75&&absDiff/renderScaling>pageSize*0.8){var adjDiff=Math.ceil(pageSize*0.5*renderScaling)*(scrollDiff<0?-1:1);
scrollVert=rowsScrolledTo+adjDiff;
$scrolls[0].scrollTop=scrollVert
}$locked.css("top",$header.outerHeight()-scrollVert);
rowsScrolledTo=scrollVert
}};
if(horizontalChange){setTimeout(doVertScroll,50)
}else{doVertScroll()
}};
var css;
var rowStyle;
var unlockedRowStyle;
var ghostStyle;
var openerStyle;
var cellStyle;
var groupHeaderStyle;
var ghostClass;
var openerClass;
var cssSheetID=0;
var createCssRules=function(config){var cssID=id+"-styles-"+(++cssSheetID);
var cssText=['<style type="text/css" id="',cssID,'">\n'];
for(var i=0;
i<config.length;
i++){var rule=config[i];
if(!$.isArray(rule)){rule=[rule]
}cssText.push(rule[0]);
cssText.push(" {}\n")
}cssText.push("</style>");
$("head").append(cssText.join(""));
var cssElement=$("#"+cssID)[0];
for(var i=0;
i<document.styleSheets.length;
i++){var css=document.styleSheets[i];
if((css.ownerNode||css.owningElement)==cssElement){break
}css=null
}if(!css){throw"Unable to locate stylesheet"
}var result=[];
var rules=css.cssRules||css.rules;
for(var i=0;
i<rules.length;
i++){rule=rules[i].style;
result.push(rule);
if(config[i][1]){eval(config[i][1]+" = rule")
}}return result
};
var getColumnClass=function(column){return id+"-c"+column.uid
};
var colStyles=[];
var getColumnStyle=function(column){var result=colStyles[column.uid];
if(!result){throw"Uninitialized column style access for "+column.uid
}return result
};
(function(){var ruleConfig=[];
ghostClass=id+"-ghost";
openerClass=id+"-opener";
ruleConfig.push(["."+ghostClass,"ghostStyle"]);
ruleConfig.push(["div."+openerClass,"openerStyle"]);
ruleConfig.push(["#"+id+" .blist-tr","rowStyle"]);
ruleConfig.push(["#"+id+" .blist-table-inside .blist-tr","unlockedRowStyle"]);
ruleConfig.push(["#"+id+" .blist-cell","cellStyle"]);
ruleConfig.push(["#"+id+" .blist-td-header","groupHeaderStyle"]);
ruleConfig.push(["."+id+"-crowNumberCol","colStyles.rowNumberCol"]);
ruleConfig.push(["."+id+"-crowHandleCol","colStyles.rowHandleCol"]);
createCssRules(ruleConfig)
})();
var columns=[];
var lockedColumns=[];
var variableColumns=[];
var layout=[];
var rowRenderFn;
var rowLockedRenderFn;
var rowHeight;
var rowOffset;
var handleDigits;
var paddingX;
var lockedWidth;
var openerWidth;
var handleWidth=0;
var adderWidth=0;
var varMinWidth=[];
var varDenom=[];
var insideWidth;
var rowNumberColumn;
var rowHandleColumn;
var createColumnRendering=function(mcols,lcols,contextVariables,prefix,suffix){var colParts=[];
var generatedCode="";
if(prefix){colParts.push(prefix)
}var completeStatement=function(){if(colParts.length){generatedCode+="html.push("+colParts.join(",")+");";
colParts=[]
}};
for(var j=0;
j<mcols.length;
j++){var mcol=mcols[j];
if(mcol.body){completeStatement();
generatedCode+="if (row"+mcol.dataLookupExpr+" && row"+mcol.dataLookupExpr+".length || "+model.useBlankRows()+")";
colParts.push("\"<div class='"+getColumnClass(mcol)+" blist-td blist-tdh blist-opener "+openerClass+"'></div>\"");
var children=mcol.body.children;
lcols.push({type:"opener",skippable:true,skipCount:children.length,mcol:mcol,logical:mcol.uid});
if(options.showRowHandle){colParts.push("\"<div class='"+getColumnClass(rowHandleColumn)+" blist-td blist-tdh blist-table-row-handle'></div>\"");
lcols.push({type:"handle",canFocus:false,mcol:mcol,logical:mcol.uid})
}for(var k=0;
k<children.length;
k++){var child=children[k];
colParts.push("\"<div class='blist-td blist-tdh "+getColumnClass(child)+" "+child.type+"' uid='"+child.uid+"'>"+(canEdit()||child.type=="tag"?"<div class='blist-th-icon'></div>":"")+"<span class='blist-th-name'>"+htmlEscape(child.name)+'</span></div>"');
lcols.push({type:"header",canFocus:false,mcol:child,logical:mcol.uid})
}if(options.showAddColumns){lcols.push({type:"adder",canFocus:false,mcol:mcol,logical:mcol.uid});
colParts.push("\"<div class='"+getColumnClass(mcol)+" blist-td blist-tdh blist-column-adder'><div class='blist-column-adder-icon' title='Add a new column...'></div></div>\"")
}completeStatement();
generatedCode+="else ";
colParts.push("\"<div class='"+getColumnClass(mcol)+" blist-td blist-tdh blist-opener blist-opener-inactive "+openerClass+"'></div>\"");
if(options.showRowHandle){colParts.push("\"<div class='"+getColumnClass(rowHandleColumn)+" blist-td blist-tdh blist-table-row-handle handle-inactive'></div>\"")
}for(k=0;
k<children.length;
k++){child=children[k];
colParts.push("\"<div class='blist-td blist-tdh "+getColumnClass(child)+"' uid='"+child.uid+"'></div>\"")
}if(options.showAddColumns){colParts.push("\"<div class='"+getColumnClass(mcol)+" blist-td blist-tdh blist-column-adder'><div class='blist-column-adder-icon' title='Add a new column...'></div></div>\"")
}completeStatement()
}else{if(mcol.children){completeStatement();
children=mcol.children;
lcols.push({type:"nest-header",canFocus:false,skippable:true,skipCount:mcol.children.length,mcol:mcol,logical:mcol.uid});
if(options.showRowHandle){lcols.push({type:"nest-header",canFocus:false,skippable:true,mcol:mcol,logical:mcol.uid})
}generatedCode+="if (row"+mcol.header.dataLookupExpr+") "+createColumnRendering(children,lcols,contextVariables,"'<div class=\"blist-td blist-opener-space "+openerClass+'"></div>'+(options.showRowHandle?'<div class="blist-td '+getColumnClass(rowHandleColumn)+" blist-table-row-handle\">' + "+options.rowHandleRenderer(mcol)+" + '</div>'":"'"),options.showAddColumns?"'<div class=\"blist-td blist-column-adder-space blist-column-adder\"></div>'":undefined)+"else ";
if(options.showAddColumns){lcols.push({type:"nest-header",canFocus:false,skippable:true,mcol:mcol,logical:mcol.uid})
}colParts.push("'<div class=\"blist-td blist-opener-space blist-tdfill "+openerClass+"\"></div>'");
if(options.showRowHandle){colParts.push("'<div class=\"blist-td blist-tdfill "+getColumnClass(rowHandleColumn)+" blist-table-row-handle\"></div>'")
}for(var i=0;
i<children.length;
i++){colParts.push("\"<div class='blist-td blist-tdfill blist-td-colfill "+getColumnClass(children[i])+"'></div>\"")
}if(options.showAddColumns){colParts.push("'<div class=\"blist-td blist-column-adder-space blist-column-adder blist-tdfill\"></div>'")
}completeStatement()
}else{if(mcol.type&&mcol.type=="fill"){colParts.push("\"<div class='blist-td blist-tdfill "+getColumnClass(mcol)+(j==0?" initial-tdfill":"")+"'>&nbsp;</div>\"");
lcols.push({type:"fill",canFocus:false,mcol:mcol})
}else{var type=blist.data.types[mcol.type]||blist.data.types.text;
var renderer=mcol.renderer||type.renderGen;
var invalidRenderer=blist.data.types.invalid.renderGen;
var cls=mcol.cls||type.cls;
cls=cls?" blist-td-"+cls:"";
var align=mcol.alignment?" align-"+mcol.alignment:"";
var parCol=mcol.nestedIn?mcol.nestedIn.header:mcol;
var childLookup=mcol.nestedIn?parCol.dataLookupExpr:"";
var invalid="(!row"+mcol.dataLookupExpr+" && row"+childLookup+".meta && row"+childLookup+".meta.invalidCells && row"+childLookup+".meta.invalidCells["+mcol.tableColumnId+"] ? ' invalid' : '')";
var drillDown=mcol.drillDown?("<a class='drillDown' cellvalue='\" + $.escapeQuotes($.htmlStrip('' + row"+mcol.dataLookupExpr+")) + \"' datatype='"+mcol.type+"' column='\" + "+mcol.id+" + \"' href='#drillDown'></a>"):"";
var cellDrillStyle=mcol.drillDown?" drill-td":"";
renderer="(row"+mcol.dataLookupExpr+" !== null ? "+renderer("row"+mcol.dataLookupExpr,false,mcol,contextVariables)+" : (row"+childLookup+".meta && row"+childLookup+".meta.invalidCells ? "+invalidRenderer("row"+childLookup+".meta.invalidCells["+mcol.tableColumnId+"]")+" : ''))";
colParts.push("\"<div class='blist-td "+getColumnClass(mcol)+cls+cellDrillStyle+align+'" + '+invalid+" + (row.saving && row.saving"+mcol.dataLookupExpr+' ? " saving" : "") + (row.error && row.error'+mcol.dataLookupExpr+' ? " error" : "") + "\'>'+drillDown+'", '+renderer+', "</div>"');
lcols.push({mcol:mcol,logical:mcol.uid})
}}}if(options.generateHeights){getColumnStyle(mcol).height=rowHeight+"px"
}}if(suffix){colParts.push(suffix)
}completeStatement();
return generatedCode
};
var initMeta=function(newModel){begin("initMeta");
model=newModel;
clearCellNav();
endEdit(DEFAULT_EDIT_MODE);
columns=[];
variableColumns=[];
varMinWidth=[];
varDenom=[];
var cssColumnConfig=[];
for(var j=0;
j<model.meta().columns.length;
j++){variableColumns[j]=[];
varMinWidth[j]=0;
varDenom[j]=0;
var mcols=model.meta().columns[j];
for(var i=0;
i<mcols.length;
i++){var mcol=mcols[i];
var col=$.extend(false,{index:i},mcol);
if(col.hasOwnProperty("percentWidth")){varDenom[j]+=col.percentWidth;
if(col.minWidth){varMinWidth[j]+=col.minWidth
}col.width=0;
variableColumns[j].push(col)
}else{if(!col.hasOwnProperty("width")){col.width=100
}}if(j==0){columns.push(col)
}if(!colStyles[col.uid]){cssColumnConfig.push(["."+getColumnClass(col),"colStyles["+col.uid+"]"])
}if(col.body!==undefined&&col.body.children!==undefined){_.each(col.body.children,function(c){if(!colStyles[c.uid]){cssColumnConfig.push(["."+getColumnClass(c),"colStyles["+c.uid+"]"])
}})
}}}if(cssColumnConfig.length){createCssRules(cssColumnConfig)
}if(variableColumns[0].length<1&&options.showGhostColumn){variableColumns[0].push({percentWidth:100,minWidth:options.ghostMinWidth,ghostColumn:true});
varMinWidth[0]+=options.ghostMinWidth;
varDenom[0]+=100
}else{options.showGhostColumn=false
}lockedColumns=[];
if(options.showRowNumbers){lockedColumns.push(rowNumberColumn={uid:"rowNumberCol",dataIndex:"rowNumber",cls:"blist-table-row-numbers",measureText:Math.max(model.length(),100),renderer:'(row.type == "blank" ? "new" : renderIndex + 1)',footerText:"Totals"})
}if(options.showRowHandle){lockedColumns.push(rowHandleColumn={uid:"rowHandleCol",dataIndex:"rowHandle",cls:"blist-table-row-handle",width:options.rowHandleWidth,renderer:options.rowHandleRenderer()})
}handleDigits=calculateHandleDigits(model);
measureUtilDOM.innerHTML='<div class="blist-td">x</div>';
var $measureDiv=$(measureUtilDOM.firstChild);
var measuredInnerDims={width:$measureDiv.width(),height:$measureDiv.height()};
var measuredOuterDims={width:$measureDiv.outerWidth(),height:$measureDiv.outerHeight()};
paddingX=measuredOuterDims.width-measuredInnerDims.width;
rowHeight=measuredInnerDims.height;
rowOffset=measuredOuterDims.height;
rowStyle.height=rowOffset+"px";
scalingFactor=1;
if(options.generateHeights&&options.showGhostColumn){ghostStyle.height=rowHeight+"px"
}if(options.generateHeights){cellStyle.height=rowHeight+"px"
}lockedWidth=0;
$.each(lockedColumns,function(i,c){measureUtilDOM.innerHTML='<div class="blist-tr"><div class="'+(c.width?getColumnClass(c):"")+" "+(c.cls||"")+' blist-td">'+(c.measureText||"")+"</div></div>";
var $measureCol=$(measureUtilDOM).find(".blist-td");
var colStyle=getColumnStyle(c);
if(c.width){colStyle.width=c.width+"px"
}else{colStyle.width=$measureCol.width()+"px"
}lockedWidth+=$measureCol.outerWidth();
if(options.generateHeights){colStyle.height=rowHeight+"px"
}});
openerWidth=measuredInnerDims.width*1.5;
if(options.showAddColumns){measureUtilDOM.innerHTML='<div class="blist-td blist-column-adder">x</div>';
$measureDiv=$(measureUtilDOM.firstChild);
adderWidth=$measureDiv.width()+paddingX
}if(options.showRowHandle){handleWidth=parseFloat(getColumnStyle(rowHandleColumn).width)+paddingX
}openerStyle.width=openerWidth+"px";
if(options.generateHeights){openerStyle.height=rowHeight+"px"
}var contextVariables={renderSpecial:function(specialRow){return"<div class='blist-td blist-td-header'>"+specialRow.title+"</div>"
},permissions:{canRead:model.canRead(),canWrite:model.canWrite(),canAdd:model.canAdd(),canDelete:model.canDelete(),canEdit:canEdit()}};
var levelRender=[];
for(i=0;
i<model.meta().columns.length;
i++){mcols=model.meta().columns[i];
var lcols=layout[i]=[];
levelRender[i]=createColumnRendering(mcols,lcols,contextVariables)
}if(cellNav){cellNav.updateModel(model);
cellNav.updateLayout(layout)
}else{cellNav=options.cellNav?new blist.data.TableNavigation(model,layout,$navigator):null
}var rowDivContents='class=\'blist-tr", (renderIndex % 2 ? " blist-tr-even" : ""), (row.level !== undefined ? " blist-tr-level" + row.level : ""), (row.level > 0 ? " blist-tr-sub" : ""), (row.type ? " blist-tr-" + row.type : ""), (row.expanded ? " blist-tr-open" : ""), (row.groupLast ? " last" : ""), "\' style=\'top: ", (index * '+rowOffset+"), \"px'";
var renderFnSource="(function(html, index, renderIndex, row) {   html.push(       \"<div id='"+id+'-r",        (row.id || row[0]),        "\' '+rowDivContents+'>"       );   switch (row.level || 0) {     case -1:       if (row.type == "group")       { html.push(renderSpecial(row)); }       break;';
for(i=0;
i<levelRender.length;
i++){renderFnSource+="case "+i+":"+levelRender[i]+"break;"
}renderFnSource+="}";
if(options.showGhostColumn){renderFnSource+="html.push(\"<div class='blist-td "+ghostClass+" blist-table-ghost'></div>\");"
}renderFnSource+='html.push("</div>");})';
rowRenderFn=blist.data.types.compile(renderFnSource,contextVariables);
var renderLockedFnSource="(function(html, index, renderIndex, row) {";
renderLockedFnSource+="html.push(\"<div id='"+id+'-l", (row.id || row[0]), "\' '+rowDivContents+'>");';
$.each(lockedColumns,function(i,c){renderLockedFnSource+="html.push(\"<div class='"+(c.cls||"")+" blist-td "+getColumnClass(c)+"'>\", "+c.renderer+', "</div>");'
});
renderLockedFnSource+='html.push("</div>");';
renderLockedFnSource+="})";
rowLockedRenderFn=blist.data.types.compile(renderLockedFnSource,contextVariables);
groupHeaderStyle.left=lockedWidth+"px";
unlockedRowStyle.left=lockedWidth+"px";
$headerScrolls.css("margin-left",lockedWidth);
$footerScrolls.css("margin-left",lockedWidth);
if($nameLabel){$nameLabel.html(model.title())
}end("initMeta");
configureWidths()
};
var configureWidths=function(){begin("configureWidths");
begin("configureWidths.levels");
insideWidth=0;
var mcols=model.meta().columns;
for(var i=0;
i<mcols.length;
i++){configureLevelWidths(mcols[i],i)
}end("configureWidths.levels");
groupHeaderStyle.width=Math.max(0,(insideWidth-lockedWidth-paddingX))+"px";
var scrollWidth=$scrolls.width();
if($scrolls[0].scrollHeight>$scrolls[0].clientHeight){scrollWidth-=scrollbarWidth
}var totalWidth=Math.max(insideWidth,scrollWidth);
$header.width(totalWidth);
$footer.width(totalWidth);
inside.width(totalWidth);
$lockedScrolls.width(lockedWidth);
$locked.width(lockedWidth);
end("configureWidths")
};
var configureLevelWidths=function(mcols,level){var hpos=lockedWidth;
if(level==0&&options.showGhostColumn){hpos+=paddingX
}for(var j=0;
j<mcols.length;
j++){var mcol=mcols[j];
var colWidth;
if(mcol.body){colWidth=openerWidth+paddingX;
colWidth+=handleWidth;
colWidth+=adderWidth;
var children=mcol.body.children;
for(var k=0;
k<children.length;
k++){colWidth+=children[k].width+paddingX
}}else{if(mcol.children){colWidth=null;
configureLevelWidths(mcol.children,level)
}else{if(mcol.fillFor){colWidth=0;
for(k=0;
k<mcol.fillFor.length;
k++){var fillFor=mcol.fillFor[k];
colWidth+=(fillFor.width||parseFloat(getColumnStyle(fillFor).width))+paddingX
}}else{colWidth=(mcol.width||0)+paddingX
}}}if(colWidth){hpos+=colWidth;
var style=getColumnStyle(mcol);
var widthStyle=(colWidth-paddingX)+"px";
if(style.width!=widthStyle){style.width=widthStyle
}}}hpos+=varMinWidth[level];
configureVariableWidths(level,hpos);
if(hpos>insideWidth){insideWidth=hpos
}};
var configureVariableWidths=function(level,levelWidth){if(variableColumns[level] instanceof Array&&variableColumns[level].length>0){var pos=levelWidth;
var varSize=$scrolls.width()-pos;
if($scrolls[0].scrollHeight>$scrolls[0].clientHeight){varSize-=scrollbarWidth
}varSize=Math.max(varSize,0);
for(i=0;
i<variableColumns[level].length;
i++){var c=variableColumns[level][i];
if(c.ghostColumn){ghostStyle.width=(c.minWidth+varSize)+"px"
}else{getColumnStyle(c).width=((c.minWidth||0)+((c.percentWidth/varDenom[level])*varSize))+"px"
}}if(level==0&&!options.showGhostColumn){pos=lockedWidth;
for(var i=0;
i<columns.length;
i++){var col=columns[i];
col.left=pos;
pos+=paddingX;
pos+=col.width||parseFloat(getColumnStyle(col).width)
}}}};
var columnHeaderClick=function(event,$target){if(isDisabled){return
}var col=$target.closest(".blist-th").data("column");
if(col===undefined||col===null){return
}$(event.currentTarget).removeClass("hover").data("column-clicked",false);
if($target.closest(".filter").length>0){clearCellNav();
model.clearColumnFilter(col.index);
return
}if(($target.closest(".sort").length>0||(!event.metaKey&&!event.shiftKey))&&((blist.data.types[col.type]!==undefined&&blist.data.types[col.type].sortable)||col.sortable)){clearCellNav();
sort(col.index);
return
}if(event.metaKey){selectColumn(col,!cellNav.isColumnSelected(col))
}else{if(event.shiftKey){selectColumnTo(col)
}else{clearCellNav()
}}};
var renderHeader=function(){begin("renderHeader-assemble");
var html=[];
for(var i=0;
i<columns.length;
i++){var col=columns[i];
var cls=col.cls?" blist-th-"+col.cls:"";
var colName=col.name==null?"":htmlEscape(col.name);
html.push('<div class="blist-th ',!i?"blist-th-first ":"",(col.originalType||col.type)," ",getColumnClass(col),cls,'" uid="',col.uid,'">');
if(col.type=="nested_table"){html.push('<div class="blist-tdh blist-opener ',openerClass,'"></div>')
}if(options.columnDrag){html.push('<div class="dragHandle"',options.generateHeights?' style="height: '+rowOffset+'px"':"","></div>")
}html.push('<div class="info-container',(canEdit()||col.type=="tag")?" icon-display":"",'">');
if(canEdit()||col.type=="tag"){html.push('<span class="blist-th-icon"></span>')
}html.push('<div class="name-wrapper"><span class="blist-th-name">',colName,"</span></div>","</div>",'<div class="indicator-container">','<div class="filter" title="Remove filter"',options.generateHeights?' style="height: '+rowOffset+'px"':"","></div>",'<div class="sort sort-desc" title="Sort ascending"',options.generateHeights?' style="height: '+rowOffset+'px"':"","></div>","</div>","</div>")
}if(options.showGhostColumn){html.push('<div class="blist-th blist-table-ghost ',columns.length<1?"blist-th-first ":"",ghostClass,'">'+(options.showAddColumns?'<div class="blist-column-adder add-column" title="Add a new column..."></div>':"")+'<div class="indicator-container"></div></div>')
}html=html.join("");
end("renderHeader-assemble");
begin("renderHeader-render");
$header[0].innerHTML=html;
end("renderHeader-render");
begin("renderHeader-augment");
$(".blist-th",$header).each(function(index){if(index>=columns.length){return
}columns[index].dom=this;
var $col=$(this);
var interactionsInitialized=false;
var initializeInteractions=function(){interactionsInitialized=true;
$col.mouseleave(function(){$(this).removeClass("hover")
}).bind("click",function(event){if(isDisabled){return
}if(skipHeaderClick){skipHeaderClick=false;
return
}var $target=$(event.target);
if($target.closest(".action-item").length>0){return
}if($target.closest(".blist-th .indicator-container, .blist-th .dragHandle, .blist-th .action-item").length<1){if($col.data("column-clicked")){}else{$col.data("column-clicked",true);
setTimeout(function(){if($col.data("column-clicked")){columnHeaderClick(event,$target)
}},500)
}}else{columnHeaderClick(event,$target)
}}).bind("dblclick",function(event){if($(event.target).closest(".blist-th .indicator-container, .blist-th .dragHandle, .blist-th .action-item").length<1){$col.data("column-clicked",false);
$this.trigger("column_name_dblclick",[event])
}});
if(options.columnDrag){$col.draggable({appendTo:".blist-table",axis:"x",drag:function(event,ui){var dragPos=findHeaderDragPosition(event);
if(curDropPos!=dragPos){curDropPos=dragPos;
drawHeaderDragPosition(curDropPos)
}},handle:".dragHandle",helper:function(event){var $drag=$('<div class="blist-th-drag"/>');
$drag.append($(this).clone());
return $drag
},opacity:0.85,start:function(event,ui){hotHeaderDrag=true;
hotHeaderMode=4
},stop:function(event,ui){hotHeaderMode=null;
$dropIndicator.css("left",-10000).hide();
if(curDropPos==null){return
}var col=$(this).data("column");
model.moveColumn(col.index,curDropPos);
curDropPos=null
}})
}if(options.headerMods!=null){options.headerMods(columns[index])
}};
$col.data("column",columns[index]).mouseenter(function(){if(!interactionsInitialized){initializeInteractions()
}if(isDisabled){return
}if(!hotHeaderDrag||hotHeaderMode!=4){$(this).addClass("hover")
}});
adjustHeaderStyling($col)
});
var lockedHtml="";
$.each(lockedColumns,function(i,c){lockedHtml+='<div class="blist-th '+(c.cls||"")+" "+getColumnClass(c)+'"><div class="indicator-container"></div></div>'
});
$lockedHeader.html(lockedHtml);
adjustHeaderIndicators();
end("renderHeader-augment")
};
var adjustHeaderIndicators=function(){configureSortHeader();
configureFilterHeaders();
$outside.toggleClass("indicators-inactive",$.keys(model.meta().sort).length<=0&&$.keys(model.meta().columnFilters).length<=0);
$locked.css("top",$header.outerHeight()-$scrolls[0].scrollTop)
};
var adjustHeaderStyling=function($colHeader,tertiary){var $orig=$colHeader;
if(tertiary){$colHeader=$orig.clone();
measureUtil.append($colHeader);
$colHeader.removeClass("narrow narrower")
}var $infoC=$colHeader.find(".info-container");
var infoW=$infoC.outerWidth(true);
var innerW=$colHeader.width();
if(infoW+20>innerW){infoW+=parseInt($infoC.css("left"));
if(infoW>innerW){var iconW=$colHeader.find(".blist-th-icon").outerWidth(true)||0;
$orig.toggleClass("narrower",infoW-iconW>innerW);
$orig.addClass("narrow")
}else{if(tertiary){$orig.removeClass("narrow narrower")
}}}else{if(tertiary){$orig.removeClass("narrow narrower")
}}if(tertiary){$colHeader.remove()
}};
var curDropPos=null;
var $dropIndicator;
var findHeaderDragPosition=function(event){var x=event.pageX;
var $headers=$(".blist-th:not(.ui-draggable-dragging, .blist-table-ghost)",$header);
if(x<$headers.eq(0).offset().left){return 0
}var $lastHeader=$headers.eq($headers.length-1);
if(x>$lastHeader.offset().left+$lastHeader.outerWidth()){return $headers.length
}var dropPos;
$headers.each(function(i){var $col=$(this);
var left=$col.offset().left;
if(x<left){return true
}var width=$col.outerWidth();
var right=left+width;
if(x>right){return true
}dropPos=(x-left)<(width/2)?i:i+1;
return false
});
return dropPos
};
var drawHeaderDragPosition=function(pos){var $headers=$(".blist-th:not(.ui-draggable-dragging, .blist-table-ghost)",$header);
var x;
if(pos>=$headers.length){var $lh=$headers.eq($headers.length-1);
x=$lh.offset().left+$lh.outerWidth()
}else{x=$headers.eq(pos).offset().left
}x+=lockedWidth-$headerScrolls.offset().left-$dropIndicator.width()/2;
$dropIndicator.css("left",x).show()
};
var updateHeader=function(model){begin("updateHeader");
adjustHeaderIndicators();
end("updateHeader")
};
var updateFooter=function(){var updateColAgg=function(col){var modelCol=_.detect(model.meta().allColumns,function(c){return c.id==col.id
});
col.aggregate=modelCol.aggregate;
if(col.body!==undefined){_.each(col.body.children,function(c){updateColAgg(c)
})
}};
_.each(columns,function(c){updateColAgg(c)
});
renderFooter();
updateLayout()
};
var renderFooter=function(){var html=[];
var showAgg=false;
var renderColFooter=function(col){var cls=col.cls?" blist-tf-"+col.cls:"";
showAgg=showAgg||col.aggregate!==undefined;
var val=col.aggregate?parseFloat(parseFloat(col.aggregate.value||0).toFixed(col.decimalPlaces||3)):"";
if(col.aggregate){switch(col.type){case"money":case"percent":switch(col.aggregate.type){case"sum":case"average":case"maximum":case"minimum":val=blist.data.types[col.type].filterRender(val,col);
break
}break
}}html.push('<div class="blist-tf ',!i?"blist-tf-first ":"",getColumnClass(col),cls,'" title="',col.aggregate?$.capitalize(col.aggregate.type):"",'" uid="',col.uid,'">','<span class="blist-tf-value">',val,"</span></div>")
};
for(var i=0;
i<columns.length;
i++){var col=columns[i];
if(col.body){html.push('<div class="blist-tf blist-opener ',id,'-opener"></div>');
if(options.showRowHandle){html.push('<div class="'+getColumnClass(rowHandleColumn)+' blist-tf blist-table-row-handle"></div>')
}$.each(col.body.children,function(i,cc){renderColFooter(cc)
});
if(options.showAddColumns){html.push('<div class="blist-tf blist-column-adder"></div>')
}}else{renderColFooter(col)
}}if(options.showGhostColumn){html.push('<div class="blist-tf blist-table-ghost ',columns.length<1?"blist-tf-first ":"",ghostClass,'"></div>')
}if(showAgg){$footer.html(html.join(""));
$footerScrolls.show();
$lockedFooter.show()
}else{$footerScrolls.hide();
$lockedFooter.hide()
}var lockedHtml="";
$.each(lockedColumns,function(i,c){lockedHtml+='<div class="blist-tf '+(c.cls||"")+" "+getColumnClass(c)+'"><span class="blist-tf-value">'+(c.footerText||"")+"</span></div>"
});
$lockedFooter.html(lockedHtml)
};
var renderedRows={};
var dirtyRows={};
var rowIndices={};
var rowLoadTimer=null;
var rowLoadRows=null;
var appendRows=function(html){var appendRows_render=function(){appendUtilDOM.innerHTML=html
};
var appendRows_append=function(){while(appendUtilDOM.firstChild){var row=appendUtilDOM.firstChild;
var rowID=row.id.substring(id.length+2);
if(!renderedRows[rowID]){renderedRows[rowID]={}
}renderedRows[rowID].row=row;
if(dirtyRows[rowID]){renderDOM.replaceChild(row,dirtyRows[rowID].row);
delete dirtyRows[rowID]
}else{renderDOM.appendChild(row)
}}};
begin("appendRows.render");
appendRows_render();
end("appendRows.render");
begin("appendRows.append");
appendRows_append();
end("appendRows.append")
};
var appendLockedRows=function(html){var appendRows_render=function(){appendUtilDOM.innerHTML=html
};
var appendRows_append=function(){while(appendUtilDOM.firstChild){var row=appendUtilDOM.firstChild;
var rowID=row.id.substring(id.length+2);
if(renderedRows[rowID]===undefined){renderedRows[rowID]={}
}renderedRows[rowID].locked=row;
if(dirtyRows[rowID]!==undefined){$lockedRender[0].replaceChild(row,dirtyRows[rowID].locked)
}else{$lockedRender[0].appendChild(row)
}}};
appendRows_render();
appendRows_append()
};
var renderRows=function(){if(!model){return
}begin("renderRows.setup");
var start=Math.floor($scrolls.scrollTop()/renderScaling);
var stop=Math.ceil(start+pageSize*1.5);
var rows=model.rows();
if(start<0){start=0
}if(stop>model.length()){stop=model.length()
}var renderHeight=(stop-start)*rowOffset;
var renderTop=start*renderScaling;
var insideHeight=inside.height();
if($footerScrolls.is(":visible")){insideHeight-=$footerScrolls.outerHeight()-1
}if(renderTop+renderHeight>insideHeight){renderTop=insideHeight-renderHeight
}$render.css("top",renderTop);
$render.height(renderHeight);
$lockedRender.css("top",renderTop);
$lockedRender.height(renderHeight);
end("renderRows.setup");
begin("renderRows.render");
var unusedRows=$.extend({},renderedRows);
var html=[];
var lockedHtml=[];
var rowsToLoad=[];
for(var i=start;
i<stop;
i++){var row=rows[i];
if(typeof row=="object"){var rowID=row.id||row[0];
if(unusedRows[rowID]&&rowIndices[rowID]==i){delete unusedRows[rowID];
$(renderedRows[rowID].row).css("top",(i-start)*rowOffset);
var locked=renderedRows[rowID].locked;
if(locked!==undefined){$(locked).css("top",(i-start)*rowOffset)
}}else{rowRenderFn(html,i-start,i,row);
if(rowLockedRenderFn!=null){rowLockedRenderFn(lockedHtml,i-start,i,row)
}rowIndices[rowID]=i
}}else{rowsToLoad.push(i)
}}end("renderRows.render");
begin("renderRows.destroy");
for(var unusedID in unusedRows){row=unusedRows[unusedID].row;
if(row!==undefined){row.parentNode.removeChild(row)
}row=unusedRows[unusedID].locked;
if(row!==undefined){row.parentNode.removeChild(row)
}delete renderedRows[unusedID]
}end("renderRows.destroy");
begin("renderRows.appendLocked");
appendLockedRows(lockedHtml.join(""));
end("renderRows.appendLocked");
begin("renderRows.append");
appendRows(html.join(""));
end("renderRows.append");
begin("renderRows.rowMods");
if(options.rowMods!==null){options.rowMods(renderedRows)
}end("renderRows.rowMods");
begin("renderRows.finalize");
if(rowsToLoad.length){if(rowLoadTimer){clearTimeout(rowLoadTimer)
}rowLoadTimer=setTimeout(loadMissingRows,MISSING_ROW_LOAD_DELAY);
rowLoadRows=rowsToLoad
}if(cellNav){updateCellNavCues();
expandActiveCell()
}updateRowSelection();
end("renderRows.finalize")
};
var updateRowSelection=function(){inside.find(".blist-select-row").removeClass("blist-select-row");
$locked.find(".blist-select-row").removeClass("blist-select-row");
$.each(model.selectedRows,function(k,v){$("#"+id+"-r"+k).addClass("blist-select-row");
$("#"+id+"-l"+k).addClass("blist-select-row")
});
updateCellNavCues()
};
var loadMissingRows=function(){if(!rowLoadTimer){return
}rowLoadTimer=null;
if(!rowLoadRows){return
}model.loadRows(rowLoadRows);
rowLoadRows=null
};
var initRows=function(model){begin("initRows.handle");
if(handleDigits!=calculateHandleDigits(model)){initMeta(model);
renderHeader();
renderFooter()
}end("initRows.handle");
begin("initRows.layout");
$lockedRender.empty();
$render.empty();
renderedRows={};
updateLayout();
end("initRows.layout")
};
var updateRows=function(rows){for(var i=0;
i<rows.length;
i++){var row=rows[i];
var rowID=row.id||row[0];
var rendered=renderedRows[rowID];
if(rendered){delete renderedRows[rowID];
dirtyRows[rowID]=rendered
}}updateLayout()
};
var setUpColumnChoose=function(types,callback){$outside.css("cursor","crosshair");
$lockedScrolls.append('<div class="disabled-overlay"></div>');
var rightPos=0;
_.each(columns,function(c){var $c=$(c.dom);
var left=$c.position().left;
var divClass="disabled-overlay";
if(_.include(types,c.type)){divClass="select-overlay"
}var $h=$('<div class="'+divClass+" col-"+c.id+'"></div>').width($c.outerWidth()).css("left",left).hover(function(){$h.add($f).add($m).addClass("overlay-hover")
},function(){$h.add($f).add($m).removeClass("overlay-hover")
});
if(_.include(types,c.type)){$h.click(function(){if(_.isFunction(callback)){callback(c)
}})
}var $f=$h.clone(true);
var $m=$h.clone(true).css("left",left+lockedWidth);
$header.append($h);
$footer.append($f);
inside.append($m);
rightPos=$c.outerWidth()+$c.position().left
});
var $or=$('<div class="disabled-overlay"></div>').width($header.width()-rightPos).css("left",rightPos);
$header.append($or);
$footer.append($or.clone());
inside.append($or.clone().css("left",rightPos+lockedWidth).width($or.width()-lockedWidth))
};
var finishColumnChoose=function(){$outside.css("cursor","auto");
$outside.find(".disabled-overlay, .select-overlay").remove()
};
$this.bind("meta_change",function(event,model){initMeta(model);
renderHeader();
renderFooter();
initRows(model)
});
$this.bind("footer_change",function(event){updateFooter()
});
$this.bind("header_change",function(event,model){updateHeader(model)
});
$this.bind("before_load",function(){$outside.addClass("blist-loading")
});
$this.bind("load",function(event,model){begin("load");
initRows(model);
end("load")
});
$this.bind("after_load",function(){$outside.removeClass("blist-loading")
});
$this.bind("row_change",function(event,rows){updateRows(rows)
});
$this.bind("selection_change",function(event,rows){begin("selectionChange");
updateRowSelection(rows);
end("selectionChange")
});
$this.bind("row_add",updateLayout);
$this.bind("row_remove",updateLayout);
$this.bind("col_width_change",configureWidths);
$this.bind("sort_change",updateHeader);
$this.blistModel(options.model);
updateLayout();
var table=this;
var isDisabled=false;
var blistTableObj=function(){this.getSelectedColumns=function(){return cellNav?cellNav.getSelectedColumns():{}
};
this.disable=function(){isDisabled=true;
$this.addClass("disabled");
clearCellNav()
};
this.enable=function(){isDisabled=false;
$this.removeClass("disabled");
finishColumnChoose()
};
this.enterColumnChoose=function(types,callback){if(!_.isArray(types)){types=[types]
}setUpColumnChoose(types,callback)
};
this.exitColumnChoose=function(){finishColumnChoose()
}
};
$this.data("blistTableObj",new blistTableObj())
};
var blistTableDefaults={cellExpandEnabled:true,cellNav:false,columnDrag:false,disableLastColumnResize:false,editEnabled:false,generateHeights:true,ghostMinWidth:20,headerMods:function(col){},manualResize:false,resizeHandleAdjust:3,rowHandleRenderer:function(col){return'""'
},rowHandleWidth:1,rowMods:function(renderedRows){},selectionEnabled:true,showGhostColumn:false,showName:true,showRowNumbers:true,showRowHandle:false,showTitle:true,showAddColumns:false};
$.fn.extend({blistTable:function(options){return this.each(function(){if(!$(this).is(".blist-table")){makeTable.apply(this,[$.extend({},blistTableDefaults,options)])
}})
},blistTableAccessor:function(){return this.data("blistTableObj")
}})
})(jQuery);
blist.namespace.fetch("blist.data");
blist.data.TableNavigation=function(_model,_layout,_$textarea){var model=_model;
this.updateModel=function(_newModel){model=_newModel
};
var layout=_layout;
this.updateLayout=function(_newLayout){layout=_newLayout
};
var $textarea=_$textarea;
var activeCellOn=false;
var activeCellXStart;
var activeCellXCount;
var activeCellY;
var selectionLevel=-1;
var selectionBoxes=[];
var selectedColumns={};
this.lastSelectedColumn=null;
var hasSelection=function(){if(selectionBoxes.length){return true
}for(var col in selectedColumns){return true
}if(model.hasSelectedRows()){return true
}return false
};
var convertCellSelection=function(){var converted=[];
for(var i=0;
i<selectionBoxes.length;
i++){var sel=selectionBoxes[i];
var sel2=sel.slice(0);
if(sel2[1]>sel2[3]){var tmp=sel2[3];
sel2[3]=sel2[1];
sel2[1]=tmp
}if(sel2[0]>sel2[2]){tmp=sel2[2];
sel2[2]=sel2[0];
sel2[0]=tmp
}converted.push(sel2)
}converted.sort(function(a,b){var diff=a[1]-b[1];
if(diff){return diff
}return a[3]-b[3]
});
return converted
};
var createSelectionMap=function(selectionComponents,selectionComponentCount,template){var selectionMap=template.slice(0,template.length);
for(var selectionComponentID=0;
selectionComponentID<selectionComponentCount;
selectionComponentID++){var selectionComponent=selectionComponents[selectionComponentID];
for(var columnID=selectionComponent[0];
columnID<=selectionComponent[2];
columnID++){selectionMap[columnID]=true
}var layoutLevel=layout[selectionLevel];
columnID=selectionComponent[2];
var uid=layoutLevel[columnID].logical;
for(columnID++;
columnID<layoutLevel.length&&layoutLevel[columnID].logical==uid;
columnID++){selectionMap[columnID]=true
}}return selectionMap
};
this.goTo=function(x,y,event,selecting,wrap){if(!event){event={}
}var selectionMode;
if(selecting||event.shiftKey){if(selectionBoxes.length){selectionMode="continue"
}else{selectionMode="start"
}}else{if(event.metaKey){selectionMode="start-new"
}else{if(hasSelection()){selectionBoxes=[];
selectedColumns={};
this.lastSelectedColumn=null
}}}var row=model.get(y);
var rowLevel=row!==undefined?(row.level||0):0;
if(hasSelection()&&selectionLevel!=rowLevel){return false
}var layoutLevel=layout[rowLevel];
var xNum=1;
var col=layoutLevel[x];
var uid=col.logical;
if(wrap&&row!==undefined&&!row.expanded&&(col.type=="opener"||col.type=="header")){var subT=model.getRowValue(row,col.mcol);
if(model.useBlankRows()||subT&&subT.length>0){model.expand(row)
}}if((row===undefined||!row.expanded||!wrap)&&(col.type=="opener"||col.type=="header")){for(var i=x+1;
i<layoutLevel.length&&layoutLevel[i].logical==uid;
i++){xNum++
}}if(row!==undefined&&row.expanded&&wrap&&(col.type=="opener"||col.type=="header")){var newXY=getAdjustedY(1,event,x,y,wrap);
if(newXY){x=newXY.x;
y=newXY.y;
row=model.get(y);
rowLevel=row.level||0;
layoutLevel=layout[rowLevel];
col=layoutLevel[x];
uid=col.logical
}}var selection;
if(selectionMode=="start"||selectionMode=="start-new"){if(!selectionBoxes.length){var curRow=model.get(y);
selectionLevel=curRow!==undefined?(curRow.level||0):0
}var startX=selectionMode=="start"&&activeCellOn?activeCellXStart:x;
var startY=selectionMode=="start"&&activeCellOn?activeCellY:y;
selectionBoxes.push(selection=[startX,startY])
}else{if(selectionMode=="continue"){selection=selectionBoxes[selectionBoxes.length-1]
}}if(selection){selection[2]=x<selection[0]?x:x+xNum-1;
selection[3]=y
}activeCellOn=true;
activeCellXStart=x;
activeCellXCount=xNum;
activeCellY=y;
return true
};
this.selectionInit=function(selectFrom){var needInit=true;
if(selectionBoxes.length){var box=selectionBoxes[selectionBoxes.length-1];
if(box[0]==selectFrom.x&&box[1]==selectFrom.y){needInit=false
}}if(needInit){this.deactivate();
return false
}return true
};
this.initCopy=function(){if(hasSelection()){$textarea.text("x");
$textarea[0].select()
}else{$textarea.text("")
}};
this.processSelection=function(rows,setRowSelectionFn,clearRowSelectionFn){var selection=convertCellSelection();
var selmap;
var selmapSelectionCount;
var selmapTemplate=[];
var hasColumnSelection;
if(selectionLevel==0){var layoutLevel=layout[selectionLevel];
for(var i=0;
i<layoutLevel.length;
i++){var selected=selmapTemplate[i]=selectedColumns[layoutLevel[i].mcol.id];
if(selected){hasColumnSelection=true
}}}var len=rows.length;
for(i=0;
i<len;
i++){var row=rows[i];
var index=row.index;
var modelRow;
if(index===undefined){index=i;
modelRow=row
}else{modelRow=model.get(index)
}if(modelRow===undefined||modelRow.id=="blank"){continue
}if(model.selectedRows[modelRow.id]!==undefined){selmap=[];
$.each(layout[modelRow.level||0],function(i,c){selmap[i]=true
})
}else{if(!modelRow||(modelRow.level||0)!=selectionLevel){clearRowSelectionFn(row);
continue
}while(selection.length&&selection[0][3]<index){selection.shift();
selmap=undefined
}for(var selCount=0;
selCount<selection.length;
selCount++){if(selection[selCount][1]>index){break
}}if(selCount==0&&!hasColumnSelection){clearRowSelectionFn(row);
continue
}if(!selmap||selmapSelectionCount!=selCount){selmapSelectionCount=selCount;
selmap=createSelectionMap(selection,selCount,selmapTemplate)
}}setRowSelectionFn(row,selmap)
}};
this.isActive=function(){return activeCellOn
};
this.getActiveX=function(){return activeCellXStart
};
this.getActiveXEnd=function(){return activeCellXStart+activeCellXCount
};
this.getActiveWidth=function(){return activeCellXCount
};
this.getActiveY=function(){return activeCellY
};
this.deactivate=function(){activeCellOn=false
};
this.clearAll=function(){var needRefresh=false;
if(activeCellOn){activeCellOn=false;
needRefresh=true
}if(hasSelection()){selectionBoxes=[];
selectedColumns={};
this.lastSelectedColumn=null;
needRefresh=true
}$textarea.text("");
return needRefresh
};
var getColumnInLevel=function(newMCol,row){var newL=row!==undefined?(row.level||0):0;
var newLevelLayout=layout[newL];
var x=null;
for(var i=0;
i<newLevelLayout.length;
i++){if(newLevelLayout[i].mcol==newMCol){x=i;
break
}}if(x==newLevelLayout.length){return null
}return x
};
var getAdjustedY=function(deltaY,event,baseX,baseY,wrap){var y=baseY;
if(y===undefined){return null
}y+=deltaY;
var x=baseX;
var oldRow=model.get(baseY);
var oldLevel=oldRow!==undefined?(oldRow.level||0):0;
var oldCol=layout[oldLevel][baseX];
if(wrap&&(y<0||y>=model.length())){if(oldCol.type!="header"&&oldCol.type!="opener"&&oldCol.mcol&&oldCol.mcol.nestedIn&&((oldCol.mcol.indexInLevel>0&&deltaY<0)||(oldCol.mcol.indexInLevel<oldCol.mcol.nestedIn.children.length-1&&deltaY>0))){y+=(deltaY<0?1:-1)*oldRow.parent.childRows.length;
x+=deltaY<0?-1:1
}else{if(oldCol.type=="header"){for(var h=0;
h<layout[oldLevel].length;
h++){if(layout[oldLevel][h].mcol==oldCol.mcol.nestedIn.header){x=h;
break
}}}var newY=y<0?model.length()-1:0;
if(oldCol.mcol&&oldCol.mcol.nestedIn){x=getColumnInLevel(oldCol.mcol.nestedIn.header,model.get(newY));
if(x===null){return null
}}else{var curRow=model.get(newY);
if((curRow!==undefined?(curRow.level||0):0)>oldLevel){var adjHeader=layout[oldLevel][x+(deltaY<0?-1:1)];
if(adjHeader&&adjHeader.type=="header"&&adjHeader.mcol&&adjHeader.mcol.nestedIn){x=getColumnInLevel(adjHeader.mcol,model.get(newY));
if(x===null){return null
}x=x+(deltaY<0?1:-1)
}else{newY=model.nextInLevel(newY+(deltaY<0?1:-1),deltaY<0)
}}}var adjX=getAdjustedX(y<0?-1:1,event,x,newY);
if(adjX&&(adjX.x!=x||adjX.y!=y)){x=adjX.x;
y=adjX.y
}}}if(y<0){y=0
}if(y>=model.length()){y=model.length()-1
}if(y==baseY&&x==baseX){return null
}var newRow=model.get(y);
var newLevel=newRow!==undefined?(newRow.level||0):0;
var newCol=layout[newLevel][x];
if(wrap&&baseX==x&&oldCol.mcol&&oldCol.mcol.nestedIn&&oldRow!==undefined&&oldRow.parent&&(newRow===undefined||!newRow.parent||newRow.parent!=oldRow.parent)){if((oldCol.mcol.indexInLevel==0&&deltaY<0)||(oldCol.mcol.indexInLevel==oldCol.mcol.nestedIn.children.length-1&&deltaY>0)){x=getColumnInLevel(oldCol.mcol.nestedIn.header,newRow);
if(x===null){return null
}newCol=layout[newLevel][x]
}else{var childRows=oldRow.parent.childRows;
var ntY=model.index(deltaY<0?childRows[childRows.length-1]:childRows[0]);
var adjXNT=getAdjustedX(deltaY<0?-1:1,event,x,ntY);
if(adjXNT){x=adjXNT.x;
y=adjXNT.y;
newRow=model.get(y);
newLevel=newRow!==undefined?(newRow.level||0):0;
newCol=layout[newLevel][x]
}}}if(newCol&&(newCol.type=="opener"||newCol.type=="header")){if(newRow!==undefined&&newRow.expanded&&wrap){return getAdjustedY(deltaY<0?-1:1,event,x,y,wrap)
}else{var targetCol=newCol.mcol.type=="nested_table"?newCol.mcol:newCol.mcol.nestedIn.header;
for(var j=0;
j<layout[newLevel].length;
j++){if(layout[newLevel][j].mcol==targetCol){x=j;
return{x:x,y:y}
}}}}if(newLevel!=oldLevel&&baseX==x){if(event.shiftKey||event.metaKey){var needScan=true
}else{if(newLevel>oldLevel){if(oldCol.mcol&&oldCol.mcol.body){var newMCol=oldCol.mcol.body.children[0]
}else{if(oldCol.mcol&&oldCol.mcol.nestedIn){newMCol=oldCol.mcol
}else{needScan=true
}}}else{if(newLevel<oldLevel&&oldCol.mcol&&oldCol.mcol.nestedIn){newMCol=oldCol.mcol.nestedIn.header
}else{needScan=true
}}}if(needScan){y=model.nextInLevel(baseY,deltaY<0);
if(y==null){if(!wrap){return null
}var wrapY=deltaY<0?model.length()-1:0;
var wrapXY=getAdjustedX(deltaY<0?-1:1,event,x,wrapY);
if(wrapXY&&wrapXY.x!=x){return wrapXY
}return null
}}else{if(newMCol){x=getColumnInLevel(newMCol,newRow);
if(x===null){return null
}newCol=layout[newLevel][x]
}else{return null
}}}if(newCol&&newCol.mcol&&(newCol.mcol.nestedIn||newCol.type=="nest-header")){var subRow=model.getRowValue(newRow,(newCol.type=="nest-header"?newCol.mcol.header:newCol.mcol.nestedIn.header));
if(!subRow){var adjDelta=deltaY<0?-1:1;
if(!wrap&&y+adjDelta>=model.length()){return null
}return getAdjustedY(adjDelta,event,x,y,wrap)
}}return{x:x,y:y}
};
var getAdjustedX=function(deltaX,event,baseX,baseY,wrap){var y=baseY;
var origRow=model.get(y);
var origLevel=origRow!==undefined?(origRow.level||0):0;
var layoutLevel=layout[origLevel];
var x=baseX;
var origCol=layoutLevel[x];
var prevCol=origCol;
var cellsToMove=Math.abs(deltaX);
var delta=deltaX/cellsToMove;
for(var i=0;
i<cellsToMove;
i++){for(var newX=x+delta;
newX>=0&&newX<layoutLevel.length;
newX+=delta){var curCol=layoutLevel[newX];
if(wrap&&prevCol&&prevCol.mcol&&prevCol.mcol.nestedIn&&(!curCol.mcol||curCol.mcol.nestedIn!=prevCol.mcol.nestedIn)){var dY=delta<0?-1:1;
var adjX=newX+(delta<0?1:-1)*prevCol.mcol.nestedIn.children.length;
var adjP=getAdjustedY(dY,event,adjX,y);
if(adjP){var adjRow=model.get(adjP.y);
var curRow=model.get(y);
if(origLevel==(adjRow!==undefined?(adjRow.level||0):0)&&(curRow!==undefined?curRow.parent:undefined)==(adjRow!==undefined?adjRow.parent:undefined)){y=adjP.y;
newX=adjP.x;
curRow=model.get(y);
layoutLevel=layout[curRow!==undefined?(curRow.level||0):0];
break
}}}if(curCol.type=="nest-header"||curCol.type=="header"){continue
}if(curCol.mcol&&curCol.mcol.type=="nested_table"){var curRow=model.get(y);
if(curRow!==undefined&&curRow.expanded){var subTable=model.getRowValue(curRow,curCol.mcol);
if(!model.useBlankRows()&&(!subTable||subTable.length<1)){continue
}}}if(curCol.type=="fill"||(prevCol&&prevCol.mcol&&prevCol.mcol.nestedIn&&curCol.mcol&&curCol.mcol.nestedIn&&curCol.mcol.nestedIn!=prevCol.mcol.nestedIn)){var curRow=model.get(y);
if(curRow===undefined){return null
}var newRow=curRow.parent;
if(curCol.mcol&&curCol.mcol.nestedIn&&newRow!==undefined&&newRow.expanded){var subT=model.getRowValue(newRow,curCol.mcol.nestedIn.header);
if(!model.useBlankRows()&&(!subT||subT.length<1)){continue
}}y=model.index(newRow);
x=getColumnInLevel(prevCol.mcol.nestedIn.header,newRow);
if(x===null){return null
}layoutLevel=layout[newRow!==undefined?(newRow.level||0):0];
curCol=layoutLevel[x];
return getAdjustedX(deltaX,event,x,y,wrap)
}else{if(curCol.canFocus!==false){break
}}}if(newX<0||newX>=layoutLevel.length){if(!wrap){break
}if(prevCol&&prevCol.mcol&&prevCol.mcol.nestedIn){dY=delta<0?-1:1;
adjX=newX+(delta<0?1:-1)*prevCol.mcol.nestedIn.children.length;
adjP=getAdjustedY(dY,event,adjX,y);
if(adjP!==null){var adjRow=model.get(adjP.y);
var curRow=model.get(y);
if(origLevel==(adjRow!==undefined?(adjRow.level||0):0)&&(curRow!==undefined?curRow.parent:undefined)==(adjRow!==undefined?adjRow.parent:undefined)){y=adjP.y;
x=adjP.x;
curRow=model.get(y);
layoutLevel=layout[curRow!==undefined?(curRow.level||0):0];
prevCol=layoutLevel[newX];
continue
}}}curRow=model.get(y);
if(curRow!==undefined&&curRow.parent){curRow=curRow.parent
}y=model.nextInLevel(model.index(curRow),delta<0);
if(y==null){return null
}newX=newX<0?layoutLevel.length:-1;
curRow=model.get(y);
layoutLevel=layout[curRow!==undefined?(curRow.level||0):0];
i--
}x=newX;
prevCol=layoutLevel[x]
}return{x:x,y:y}
};
var preNav=function(){if(!activeCellOn&&model.length()&&model.column(0)){return{x:0,y:0}
}return null
};
this.navigateY=function(deltaY,event,wrap){var xy=preNav();
if(!xy){xy=getAdjustedY(deltaY,event,activeCellXStart,activeCellY,wrap)
}return xy
};
this.navigateX=function(deltaX,event,wrap){var xy=preNav();
if(!xy){xy=getAdjustedX(deltaX,event,activeCellXStart,activeCellY,wrap)
}if(!xy||xy.x==activeCellXStart&&xy.y==activeCellY){xy=null
}return xy
};
this.setColumnSelection=function(column,value){if(hasSelection()){if(selectionLevel!=0){return
}}else{selectionLevel=0
}selectedColumns[column.id]=value;
if(value){this.lastSelectedColumn=column
}};
this.isColumnSelected=function(column){return selectedColumns[column.id]
};
this.getSelectedColumns=function(){var rv={};
$.each(selectedColumns,function(colId,val){if(val){rv[colId]=val
}});
return rv
};
this.clearColumnSelection=function(){selectedColumns={};
this.lastSelectedColumn=null
};
this.getSelectionDoc=function(){var rawDoc=[];
var renderContextVars={rawDoc:rawDoc};
if(!hasSelection()){if(activeCellOn){var row=model.get(activeCellY);
var col=model.column(activeCellXStart);
if(row!==undefined&&col!==undefined&&col.dataLookupExpr){var type=blist.data.types[col.type]||blist.data.types.text;
renderContextVars.row=row;
var fn=type.renderGen("row"+model.column(activeCellXStart).dataLookupExpr,true,col);
var value=blist.data.types.compile(fn,renderContextVars);
if(value!=undefined){return value
}}}return""
}var usedCols;
var layoutLevel=layout[selectionLevel];
if(model.hasSelectedRows()){usedCols=[];
for(var i=0;
i<layoutLevel.length;
i++){usedCols[i]=layoutLevel[i].mcol
}}else{usedCols=[];
var selectedCols=this.getSelectedColumns();
for(i=0;
i<layoutLevel.length;
i++){var mcol=layoutLevel[i].mcol;
if(selectedCols[mcol.id]){usedCols[i]=mcol
}}var selBoxes=convertCellSelection();
for(i=0;
i<selBoxes.length;
i++){var box=selBoxes[i];
for(id=box[0];
id<=box[2];
id++){usedCols[id]=layoutLevel[id].mcol
}}}var mapFnSrc="(function(row, selmap) {";
var didOne=false;
for(i=0;
i<usedCols.length;
i++){if(usedCols[i]){col=usedCols[i];
if(col.type=="nested_table"||col.type=="fill"||(col.level.id||0)!=selectionLevel){continue
}if(!col.dataLookupExpr){continue
}if(didOne){mapFnSrc+='rawDoc.push("\\t");'
}else{didOne=true
}type=blist.data.types[col.type]||blist.data.types.text;
mapFnSrc+="if (selmap["+i+"]) rawDoc.push("+type.renderGen("row"+col.dataLookupExpr,true,col,renderContextVars)+");"
}}mapFnSrc+='rawDoc.push("\\r\\n");})';
var mapFn=blist.data.types.compile(mapFnSrc,renderContextVars);
this.processSelection(model.rows(),mapFn,function(){});
rawDoc.pop();
if(rawDoc.length==1){return rawDoc[0]
}return rawDoc.join("")
};
return this
};
(function($){$.fn.scrollable=function(options){var opts=$.extend({},$.fn.scrollable.defaults,options);
return this.each(function(){var $this=$(this);
var config=$.meta?$.extend({},opts,$this.data()):opts;
$this.data("config-scrollable",config);
if($this.children(config.selector).length<=config.numVisible){$this.find(config.prevSelector).parent().hide();
$this.find(config.nextSelector).parent().hide();
return
}$this.children(config.selector+":gt("+(config.numVisible-1)+")").addClass(config.hiddenClass);
updateButtons($this);
var timerPtr;
var repeatScroll=function(tickCallback,iterations){if(!tickCallback()){$(document).unbind("mouseup.scrollable.repeatScroll");
return
}timerPtr=setTimeout(function(){repeatScroll(tickCallback,iterations++)
},Math.max(100-iterations*2,5))
};
$this.find(config.prevSelector).mousedown(function(event){if(!stepPrev($this)){return
}timerPtr=setTimeout(function(){repeatScroll(function(){return stepPrev($this)
},0)
},800);
$(document).bind("mouseup.scrollable.repeatScroll",function(event){clearTimeout(timerPtr);
$(document).unbind("mouseup.scrollable.repeatScroll")
})
});
$this.find(config.prevSelector).click(function(event){event.stopPropagation();
event.preventDefault()
});
$this.find(config.nextSelector).mousedown(function(event){if(!stepNext($this)){return
}timerPtr=setTimeout(function(){repeatScroll(function(){return stepNext($this)
},0)
},500);
$(document).bind("mouseup.scrollable.repeatScroll",function(event){clearTimeout(timerPtr);
$(document).unbind("mouseup.scrollable.repeatScroll")
})
});
$this.find(config.nextSelector).click(function(event){event.stopPropagation();
event.preventDefault()
});
var $activeItem=$this.find(config.activeSelector+":first");
while($activeItem.length>0&&$activeItem.hasClass(config.hiddenClass)){stepNext($this)
}})
};
function stepPrev($this){var config=$this.data("config-scrollable");
var $prevItem=prevHiddenItem($this);
if($prevItem.length>0){$prevItem.removeClass(config.hiddenClass);
lastShownItem($this).addClass(config.hiddenClass);
updateButtons($this);
return true
}return false
}function stepNext($this){var config=$this.data("config-scrollable");
var $nextItem=nextHiddenItem($this);
if($nextItem.length>0){$nextItem.removeClass(config.hiddenClass);
firstShownItem($this).addClass(config.hiddenClass);
updateButtons($this);
return true
}return false
}function prevHiddenItem($this){var config=$this.data("config-scrollable");
return firstShownItem($this).prev(config.selector)
}function firstShownItem($this){var config=$this.data("config-scrollable");
return $this.children(config.selector+":not(."+config.hiddenClass+"):first")
}function lastShownItem($this){var config=$this.data("config-scrollable");
return $this.children(config.selector+":not(."+config.hiddenClass+"):last")
}function nextHiddenItem($this){var config=$this.data("config-scrollable");
return lastShownItem($this).next(config.selector)
}function updateButtons($this){var config=$this.data("config-scrollable");
if(prevHiddenItem($this).length>0){$this.find(config.prevSelector).parent().removeClass(config.disabledClass)
}else{$this.find(config.prevSelector).parent().addClass(config.disabledClass)
}if(nextHiddenItem($this).length>0){$this.find(config.nextSelector).parent().removeClass(config.disabledClass)
}else{$this.find(config.nextSelector).parent().addClass(config.disabledClass)
}}$.fn.scrollable.defaults={activeSelector:".active",selector:".scrollable",hiddenClass:"hidden",prevSelector:".prev a",nextSelector:".next a",disabledClass:"disabled",numVisible:6}
})(jQuery);
(function($){$.fn.isDatasetGrid=function(){return !_.isUndefined($(this[0]).data("datasetGrid"))
};
$.fn.datasetGrid=function(options){var datasetGrid=$(this[0]).data("datasetGrid");
if(!datasetGrid){datasetGrid=new $.datasetGridObject(options,this[0])
}return datasetGrid
};
$.datasetGridObject=function(options,grid){this.settings=$.extend({},$.datasetGridObject.defaults,options);
this.currentGrid=grid;
this.init()
};
$.extend($.datasetGridObject,{defaults:{accessType:"DEFAULT",addColumnCallback:function(parentId){},autoHideClearFilterItem:true,clearFilterItem:null,clearTempViewCallback:function(){},columnDeleteEnabled:false,columnNameEdit:false,columnPropertiesEnabled:false,editColumnCallback:function(columnId,parentId){},editEnabled:true,filterForm:null,initialResponse:null,isInvalid:false,manualResize:false,setTempViewCallback:function(){},updateTempViewCallback:function(){},showRowHandle:false,showRowNumbers:true,showAddColumns:false,validViewCallback:function(view){},viewId:null},prototype:{init:function(){var datasetObj=this;
var $datasetGrid=datasetObj.$dom();
$datasetGrid.data("datasetGrid",datasetObj);
datasetObj.settings._filterCount=0;
$datasetGrid.bind("col_width_change",function(event,c,f){columnResized(datasetObj,c,f)
}).bind("sort_change",function(event,skipReq){sortChanged(datasetObj,skipReq)
}).bind("columns_rearranged",function(event){columnsRearranged(datasetObj)
}).bind("column_filter_change",function(event,c,s){columnFilterChanged(datasetObj,c,s)
}).bind("server_row_change",function(event){serverRowChange(datasetObj)
}).bind("columns_updated",function(event){columnsUpdated(datasetObj)
}).bind("full_load",function(event){viewLoaded(datasetObj)
}).bind("column_name_dblclick",function(event,origEvent){columnNameEdit(datasetObj,event,origEvent)
}).blistTable({cellNav:true,selectionEnabled:false,generateHeights:false,columnDrag:true,editEnabled:datasetObj.settings.editEnabled,headerMods:function(col){headerMods(datasetObj,col)
},rowMods:function(rows){rowMods(datasetObj,rows)
},manualResize:datasetObj.settings.manualResize,showGhostColumn:true,showTitle:false,showRowHandle:datasetObj.settings.showRowHandle,rowHandleWidth:15,showAddColumns:datasetObj.settings.showAddColumns,rowHandleRenderer:(datasetObj.settings.editEnabled?datasetObj.rowHandleRenderer:function(){return'""'
}),showRowNumbers:datasetObj.settings.showRowNumbers}).bind("cellclick",function(e,r,c,o){cellClick(datasetObj,e,r,c,o)
}).blistModel().options({blankRow:datasetObj.settings.editEnabled,filterMinChars:0,masterView:blist.display.view,progressiveLoading:!datasetObj.settings.isInvalid,initialResponse:datasetObj.settings.initialResponse}).ajax({url:"/views/"+datasetObj.settings.viewId+(datasetObj.settings.isInvalid?".json":"/rows.json"),cache:false,data:{accessType:datasetObj.settings.accessType},dataType:"json"});
$.live("#"+$datasetGrid.attr("id")+" .blist-table-row-handle","mouseover",function(e){hookUpRowMenu(datasetObj,this,e)
});
$.live("#"+$datasetGrid.attr("id")+" .add-column","click",function(){datasetObj.settings.addColumnCallback()
});
$.live("#"+$datasetGrid.attr("id")+" .drillDown","click",function(e){e.preventDefault();
datasetObj.drillDown(this)
});
datasetObj.settings._model=$datasetGrid.blistModel();
if(datasetObj.settings.filterForm){datasetObj.settings.filterForm=$(datasetObj.settings.filterForm);
datasetObj.settings.filterForm.submit(function(e){filterFormSubmit(datasetObj,e)
})
}if(datasetObj.settings.clearFilterItem){datasetObj.settings.clearFilterItem=$(datasetObj.settings.clearFilterItem);
datasetObj.settings.clearFilterItem.click(function(e){datasetObj.clearFilterInput(e)
});
if(datasetObj.settings.autoHideClearFilterItem){datasetObj.settings.clearFilterItem.hide()
}}},$dom:function(){if(!this._$dom){this._$dom=$(this.currentGrid)
}return this._$dom
},updateFilter:function(filter,saveExisting,skipRequest){var datasetObj=this;
var model=datasetObj.settings._model;
model.meta().columnFilters=null;
model.meta().view.query.filterCondition=filter;
blist.display.view.query.filterCondition=filter;
if(skipRequest){return
}var view=datasetObj.settings._model.meta().view;
if(saveExisting&&!_.include(view.flags||[],"default")&&_.include(view.rights,"update_view")){$.ajax({url:"/views/"+view.id+".json",data:JSON.stringify({query:view.query}),type:"PUT",contentType:"application/json",success:function(newView){if(datasetObj.settings.isInvalid){datasetObj.updateValidity(newView)
}else{model.getTempView(null,true)
}}})
}else{model.getTempView(null,true);
this.setTempView()
}},updateView:function(newView){var datasetObj=this;
datasetObj.settings._filterIds={};
datasetObj.settings._filterCount=0;
blist.display.isTempView=datasetObj.isTempView=false;
if(datasetObj.settings.filterForm){datasetObj.settings.filterForm.find(":input").val("").blur()
}if(datasetObj.settings.autoHideClearFilterItem){datasetObj.settings.clearFilterItem.hide()
}datasetObj.summaryStale=true;
if(typeof newView=="string"){newView={id:newView}
}if(!newView.meta&&newView.id){datasetObj.settings.viewId=newView.id;
datasetObj.settings._model.ajax({url:"/views/"+datasetObj.settings.viewId+"/rows.json",cache:false,data:{accessType:datasetObj.settings.accessType},dataType:"json"})
}else{if(newView.meta&&newView.data){datasetObj.settings.viewId=o.meta.view.id;
datasetObj.settings._model.meta(o.meta);
datasetObj.settings._model.rows(o.data)
}}},setColumnAggregate:function(columnId,aggregate){var datasetObj=this;
var view=datasetObj.settings._model.meta().view;
var col=datasetObj.settings._model.getColumnByID(columnId);
if(col){$.ajax({url:"/views/"+view.id+"/columns/"+columnId+".json",dataType:"json",type:"PUT",contentType:"application/json",data:JSON.stringify({format:$.extend({},col.format,{aggregate:aggregate})}),success:function(retCol){datasetObj.settings._model.updateColumn(retCol);
$(document).trigger(blist.events.COLUMNS_CHANGED)
}})
}},showHideColumns:function(columns,hide,skipRequest,successCallback){if(!(columns instanceof Array)){columns=[columns]
}var datasetObj=this;
var view=datasetObj.settings._model.meta().view;
var successCount=0;
$.each(columns,function(i,colId){var col=datasetObj.settings._model.getColumnByID(colId);
if(col){if(!col.flags){col.flags=[]
}if(hide){col.flags.push("hidden")
}else{var ind=$.inArray("hidden",col.flags);
if(ind>-1){col.flags.splice(ind,1)
}}datasetObj.settings._model.updateColumn(col);
var $li=$('.columnsShow a[href*="_'+colId+'"]').closest("li");
if(hide){$li.removeClass("checked")
}else{$li.addClass("checked")
}if(!skipRequest){if(_.include(view.rights,"update_view")){$.ajax({url:"/views/"+view.id+"/columns/"+col.id+".json",data:JSON.stringify({hidden:hide}),type:"PUT",dataType:"json",contentType:"application/json",success:function(retCol){if(retCol.updatedAggregate!==null&&retCol.updatedAggregate!==undefined){datasetObj.settings._model.updateColumn(retCol)
}successCount++;
if(successCount==columns.length){$(document).trigger(blist.events.COLUMNS_CHANGED);
if(typeof successCallback=="function"){successCallback()
}}}})
}else{datasetObj.setTempView("columnShowHide-"+colId)
}}}})
},showHideTags:function(hide){var datasetObj=this;
var model=datasetObj.settings._model;
var column=$.grep(model.meta().view.columns,function(c,i){return c.dataTypeName=="tag"
})[0];
datasetObj.showHideColumns(column.id,hide,false,function(){if(!hide&&column.position>1){model.moveColumn(column,0)
}})
},deleteColumns:function(columns){if(!(columns instanceof Array)){columns=[columns]
}var datasetObj=this;
var model=datasetObj.settings._model;
var view=model.meta().view;
var successCount=0;
var multiCols=columns.length>1;
if(confirm("Do you want to delete the "+(multiCols?columns.length+" selected columns":"selected column")+"? All data in "+(multiCols?"these columns":"this column")+" will be removed!")){$.each(columns,function(i,colId){$.ajax({url:"/views/"+view.id+"/columns/"+colId+".json",type:"DELETE",contentType:"application/json",complete:function(){successCount++;
if(successCount==columns.length){model.deleteColumns(columns);
$(document).trigger(blist.events.COLUMNS_CHANGED)
}}})
});
datasetObj.showHideColumns(columns,true,true)
}},updateVisibleColumns:function(columns,callback){var datasetObj=this;
var view=datasetObj.settings._model.meta().view;
if(_.include(view.rights,"update_view")){var serverCols=[];
$.each(columns,function(i,colId){var col=datasetObj.settings._model.getColumnByID(colId);
if(col){$.socrataServer.addRequest({url:"/views/"+view.id+"/columns/"+col.id+".json",type:"PUT",data:JSON.stringify({hidden:false})});
serverCols.push({id:col.id,name:col.name})
}});
$.socrataServer.addRequest({url:"/views/"+view.id+".json",type:"PUT",data:JSON.stringify({columns:serverCols})});
$.socrataServer.runRequests({complete:function(){datasetObj.settings._model.reloadView();
if(_.isFunction(callback)){callback()
}}})
}},groupAggregate:function(grouped,aggregates,doSave,newName,drillDown,successCallback,errorCallback,skipRequest){var datasetObj=this;
var model=datasetObj.settings._model;
var view=blist.display.view;
var isNew=newName!==null&&newName!==undefined;
var isUpdate=doSave&&!isNew&&_.include(view.rights,"update_view");
var isGrouping=grouped instanceof Array&&grouped.length>0;
var wasGrouped=model.isGrouped();
var newCols=[];
var usedCols={};
if(isGrouping){model.group(grouped);
$.each(grouped,function(i,c){var col=_.detect(view.columns,function(vc){return vc.id==c.columnId
});
var alreadyGrouped=_.include(view.query.groupBys||[],function(gb){return gb.columnId==col.id
});
var newWidth=col.width+(drillDown&&!(col.format||{}).drill_down?30:0);
var newFormat=$.extend({},col.format,{drill_down:drillDown});
newCols.push($.extend({},col,{hidden:alreadyGrouped&&_.include(col.flags||[],"hidden"),position:newCols.length+1,format:newFormat,width:newWidth}));
usedCols[col.id]=newFormat
});
view.query.groupBys=grouped
}else{delete view.query.groupBys
}if((isGrouping||wasGrouped)&&_.isArray(aggregates)&&aggregates.length>0){_.each(aggregates,function(a){var col=_.detect(view.columns,function(vc){return vc.id==a.id
});
var existingFormat=usedCols[col.id]||col.format||{};
var format=$.extend({},existingFormat,{grouping_aggregate:(a.format||{}).grouping_aggregate||null});
if($.isBlank(format.grouping_aggregate)){delete format.grouping_aggregate
}if(_.isUndefined(usedCols[col.id])){newCols.push($.extend({},col,{hidden:$.isBlank(format.grouping_aggregate)||!$.isBlank(existingFormat.grouping_aggregate)&&_.include(col.flags||[],"hidden"),position:newCols.length+1}))
}_.detect(newCols,function(nc){return nc.id==col.id
}).format=format
})
}if(isGrouping||wasGrouped){view.columns=newCols
}if(isNew){view.name=newName
}if(skipRequest){if(_.isFunction(successCallback)){successCallback()
}return
}if(!doSave){if(typeof successCallback=="function"){successCallback()
}model.getTempView($.extend(true,{},view),isGrouping||wasGrouped);
datasetObj.setTempView("grouping")
}else{if(isNew){view=blist.dataset.cleanViewForPost($.extend(true,{},view),isGrouping||wasGrouped);
var saveNewView=function(){$.ajax({url:"/views.json",type:"POST",contentType:"application/json",dataType:"json",data:JSON.stringify(view),error:function(xhr){if(typeof errorCallback=="function"){errorCallback(JSON.parse(xhr.responseText).message)
}},success:function(resp){if(typeof successCallback=="function"){successCallback()
}blist.util.navigation.redirectToView(resp.id)
}})
};
if(blist.util&&blist.util.inlineLogin){var loginMessage="You must be logged in to create a new view";
blist.util.inlineLogin.verifyUser(function(isSuccess){if(isSuccess){saveNewView()
}else{if(typeof errorCallback=="function"){errorCallback(loginMessage)
}}},loginMessage)
}else{saveNewView()
}}else{view=blist.dataset.cleanViewForPost($.extend(true,{},view),isGrouping||wasGrouped);
$.socrataServer.addRequest({url:"/views/"+view.id+".json",type:"PUT",data:JSON.stringify(view),error:errorCallback,success:function(newView){if(datasetObj.settings.isInvalid){datasetObj.updateValidity(newView)
}else{model.reloadView()
}}});
_.each(newCols,function(c){$.socrataServer.addRequest({url:"/views/"+view.id+"/columns/"+c.id+".json",type:"PUT",data:JSON.stringify({hidden:c.hidden,format:c.format}),error:errorCallback})
});
$.socrataServer.runRequests({success:function(){if(typeof successCallback=="function"){successCallback()
}$(document).trigger(blist.events.COLUMNS_CHANGED)
}})
}}},drillDown:function(drillLink){var datasetObj=this;
var model=datasetObj.settings._model;
var filterValue=$(drillLink).attr("cellvalue");
var filterColumn=$(drillLink).attr("column");
var filterColumnId=parseInt(filterColumn,10);
var dataTypeName=$(drillLink).attr("datatype");
var isBlank=false;
if(filterColumn==""||filterValue==""){return false
}var view=blist.dataset.cleanViewForPost(model.getViewCopy(),true);
var filter;
var columnJson={columnId:filterColumn,type:"column",value:dataTypeName};
if(filterValue=="null"){filter={type:"operator",value:"IS_BLANK",children:[columnJson]}
}else{filter={type:"operator",value:"EQUALS",children:[columnJson,{type:"literal",value:$.unescapeQuotes(filterValue)}]}
}if(view.query.filterCondition!=null&&view.query.filterCondition.type=="operator"){if(view.query.filterCondition.value=="AND"){if($.isBlank(view.query.filterCondition.children)){view.query.filterCondition.children=[]
}view.query.filterCondition.children.push(filter)
}else{var existingQuery=view.query.filterCondition;
view.query.filterCondition={type:"operator",value:"AND",children:[existingQuery,filter]}
}}else{view.query.filterCondition=filter
}var drillDownCallBack=function(newView){model.getTempView(newView,true);
datasetObj.setTempView("drilldown");
model.forceSendColumns(true)
};
var otherGroupBys=_.select(view.query.groupBys||[],function(g){return g.columnId!=filterColumnId
});
if(otherGroupBys.length>0){_.each(view.columns,function(c){if(c.id==filterColumnId){if(!c.flags){c.flags=[]
}c.flags.push("hidden");
delete c.format.grouping_aggregate;
delete c.format.drill_down
}});
view.query.groupBys=otherGroupBys;
drillDownCallBack(view)
}else{var currentColumns,parentColumns;
var getMatchingColumn=function(parentCol,childPool){var matchingColumn=_.detect(childPool,function(col){return col.tableColumnId==parentCol.tableColumnId
});
if(matchingColumn){return matchingColumn.id
}return null
};
var revealDrillDownCallBack=function(){var translatedColumns=[];
_.each(parentColumns,function(oCol){var newColumnMatch=getMatchingColumn(oCol,currentColumns);
if(newColumnMatch!==null){var newCol=$.extend(oCol,{id:newColumnMatch});
if(newCol.childColumns){var newChildColumns=[];
_.each(oCol.childColumns,function(oChildCol){newChildColumns.push($.extend(oChildCol,{id:getMatchingColumn(oCol,newCol.childColumns)}))
});
newCol.childColumns=newChildColumns
}if(newCol.format){delete newCol.format.grouping_aggregate;
delete newCol.format.drill_down
}delete newCol.options;
translatedColumns.push(newCol)
}});
view.columns=translatedColumns;
drillDownCallBack(view)
};
view.query.groupBys=null;
$.get("/views/"+view.id+"/columns.json",function(cols){currentColumns=cols;
if(!$.isBlank(blist.parentViewId)&&view.id==blist.parentViewId){parentColumns=cols
}if(!_.isUndefined(parentColumns)){revealDrillDownCallBack()
}},"json");
if(!$.isBlank(blist.parentViewId)&&view.id!==blist.parentViewId){$.get("/views/"+blist.parentViewId+"/columns.json",function(pcols){parentColumns=pcols;
if(!_.isUndefined(currentColumns)){revealDrillDownCallBack()
}},"json")
}}},clearTempView:function(countId,forceAll){var datasetObj=this;
if(datasetObj.settings._filterCount<1){return
}if(!datasetObj.settings._filterIds){datasetObj.settings._filterIds={}
}if(countId!=null){if(datasetObj.settings._filterIds[countId]){datasetObj.settings._filterCount--
}delete datasetObj.settings._filterIds[countId]
}else{datasetObj.settings._filterCount--
}if(forceAll){datasetObj.settings._filterCount=0;
datasetObj.settings._filterIds={}
}else{if(datasetObj.settings._filterCount>0){return
}}blist.display.isTempView=datasetObj.isTempView=false;
if(datasetObj.settings.clearTempViewCallback!=null){datasetObj.settings.clearTempViewCallback()
}$(datasetObj.currentGrid).trigger("clear_temp_view");
if(datasetObj.settings.filterForm){datasetObj.settings.filterForm.find(":input").val("").blur()
}if(datasetObj.settings.autoHideClearFilterItem){datasetObj.settings.clearFilterItem.hide()
}datasetObj.summaryStale=true;
datasetObj.settings._model.reloadView()
},setTempView:function(countId){var datasetObj=this;
if(!datasetObj.settings._filterIds){datasetObj.settings._filterIds={}
}if(countId==null||datasetObj.settings._filterIds[countId]==null){datasetObj.settings._filterCount++;
if(countId!=null){datasetObj.settings._filterIds[countId]=true
}}if(datasetObj.isTempView){if(datasetObj.settings.updateTempViewCallback!=null){datasetObj.settings.updateTempViewCallback()
}return
}blist.display.isTempView=datasetObj.isTempView=true;
if(datasetObj.settings.setTempViewCallback!=null){datasetObj.settings.setTempViewCallback()
}},clearFilterInput:function(e){var datasetObj=this;
if($(datasetObj.currentGrid).closest("body").length<1){return
}e.preventDefault();
if(datasetObj.settings.filterForm){datasetObj.settings.filterForm.find(":input").val("").blur()
}datasetObj.summaryStale=true;
datasetObj.settings._model.filter("");
datasetObj.clearTempView("searchString");
if(datasetObj.settings.autoHideClearFilterItem){$(e.currentTarget).hide()
}},updateValidity:function(view){var datasetObj=this;
if(!datasetObj.settings.isInvalid){return true
}if(view.message===undefined||view.message===""){datasetObj.settings.isInvalid=false;
datasetObj.settings.validViewCallback(view);
datasetObj.settings._model.options({progressiveLoading:true}).ajax({url:"/views/"+datasetObj.settings.viewId+"/rows.json",cache:false,data:{accessType:datasetObj.settings.accessType},dataType:"json"});
$(window).resize();
return true
}else{datasetObj.settings._model.options({progressiveLoading:false});
datasetObj.settings.isInvalid=true;
return false
}},disable:function(){var datasetObj=this;
if(datasetObj._disabled){return
}datasetObj._disabled=true;
datasetObj.$dom().blistTableAccessor().disable()
},enable:function(){var datasetObj=this;
if(!datasetObj._disabled){return
}datasetObj.$dom().blistTableAccessor().enable();
delete datasetObj._disabled
},summaryStale:true,isTempView:false,rowHandleRenderer:function(col){var colAdjust="";
var subRowLookup="";
if(col&&col.header){colAdjust="_"+col.header.indexInLevel;
subRowLookup=col.header.dataLookupExpr
}return"((permissions.canDelete || permissions.canEdit && !(row.level > 0)) && row"+subRowLookup+'.type != "blank" ? "<a class=\'menuLink\' href=\'#row-menu_" + row.id + "'+colAdjust+"'></a><ul class='menu rowMenu' id='row-menu_\" + row.id + \""+colAdjust+"'>\" + (permissions.canEdit && !(row.level > 0) ? \"<li class='tags'><a href='#row-tag_\" + row.id + \""+colAdjust+"' class='noClose'>Tag Row</a><form class='editContainer'><input /><a class='tagSubmit' href='#saveTags' title='Save'>Save Tags</a><a class='tagCancel' href='#cancelTags' title='Cancel'>Cancel</a></form></li>\" : \"\") + (permissions.canDelete ? \"<li class='delete'><a href='#row-delete_\" + row.id + \""+colAdjust+"'>Delete Row</a></li>\" : \"\") + \"<li class='footer'><div class='outerWrapper'><div class='innerWrapper'><span class='colorWrapper'></span></div></div></li></ul>\" : \"\")"
}}});
var hookUpRowMenu=function(datasetObj,curCell,e){var $cell=$(curCell);
if(!$cell.data("row-menu-applied")){var $menu=$cell.find("ul.menu");
$menu.dropdownMenu({menuContainerSelector:".blist-table-row-handle",triggerButtonSelector:"a.menuLink",openCallback:function($menu){rowMenuOpenCallback(datasetObj,$menu)
},linkCallback:function(e){rowMenuHandler(datasetObj,e)
},pullToTop:true});
$menu.find("li.tags .editContainer a").click(function(e){e.preventDefault();
var $link=$(e.currentTarget);
var href=$link.attr("href");
switch(href.slice(href.indexOf("#")+1)){case"saveTags":submitRowTagsMenu(datasetObj,$menu);
break;
case"cancelTags":hideRowTagsMenu($menu);
break
}});
$menu.find("li.tags .editContainer input").keypress(function(e){if(e.keyCode==27){hideRowTagsMenu($menu);
$menu.focus()
}});
$menu.find("li.tags form.editContainer").submit(function(e){e.preventDefault();
submitRowTagsMenu(datasetObj,$menu)
});
$cell.data("row-menu-applied",true)
}};
var submitRowTagsMenu=function(datasetObj,$menu){$menu.trigger("close");
var model=datasetObj.settings._model;
var newVal=$.map($menu.find("li.tags .editContainer input").val().split(","),function(t,i){return $.trim(t)
});
var row=model.getByID($menu.attr("id").split("_")[1]);
if($.compareValues(row.tags,newVal)){return
}var column=$.grep(model.meta().view.columns,function(c,i){return c.dataTypeName=="tag"
})[0];
model.saveRowValue(newVal,row,model.meta().allColumns[column.id],true);
if(column.flags!==undefined&&_.include(column.flags,"hidden")){datasetObj.showHideTags(false)
}};
var hideRowTagsMenu=function($menu){$menu.removeClass("tagsShown")
};
var rowMenuOpenCallback=function(datasetObj,$menu){$menu.find("li.tags").toggle(!datasetObj.settings._model.hasSelectedRows());
hideRowTagsMenu($menu)
};
var rowMenuHandler=function(datasetObj,event){event.preventDefault();
var $link=$(event.currentTarget);
var href=$link.attr("href");
var s=href.slice(href.indexOf("#")+1).split("_");
if(s.length<2){return
}var $menu=$link.closest(".rowMenu");
var action=s[0];
var rowId=s[1];
var model=datasetObj.settings._model;
var view=model.meta().view;
switch(action){case"row-delete":if(s[2]!==undefined){model.removeChildRows(model.getByID(rowId),model.column(s[2]),true)
}else{model.selectRow(model.getByID(rowId));
var rows=[];
$.each(model.selectedRows,function(id,index){rows.push(model.getByID(id))
});
model.remove(rows,true)
}datasetObj.summaryStale=true;
break;
case"row-tag":var row=model.getByID($menu.attr("id").split("_")[1]);
$menu.find("li.tags .editContainer input").val(row.tags?row.tags.join(", "):"");
$link.closest(".rowMenu").toggleClass("tagsShown");
$menu.find("li.tags .editContainer input").focus().select();
break
}};
var columnsUpdated=function(datasetObj){datasetObj.summaryStale=true;
$(document).trigger(blist.events.COLUMNS_CHANGED)
};
var serverRowChange=function(datasetObj){datasetObj.summaryStale=true;
datasetObj.settings._model.reloadAggregates()
};
var cellClick=function(datasetObj,event,row,column,origEvent){var model=datasetObj.settings._model;
if(!column||row.level>0){return
}if(column.dataIndex=="rowNumber"){if(origEvent.shiftKey){model.selectRowsTo(row)
}else{model.toggleSelectRow(row)
}}else{if($(origEvent.target).closest(".blist-column-adder-icon").length>0){event.preventDefault();
datasetObj.settings.addColumnCallback(column.id)
}}};
var filterFormSubmit=function(datasetObj,e){e.preventDefault();
if($(datasetObj.currentGrid).closest("body").length<1){return
}var searchText=$(e.currentTarget).find(":input").val();
datasetObj.summaryStale=true;
var model=datasetObj.settings._model;
model.filter(searchText);
if(!searchText||searchText===""){datasetObj.clearTempView("searchString");
if(datasetObj.settings.autoHideClearFilterItem){datasetObj.settings.clearFilterItem.hide()
}}else{datasetObj.setTempView("searchString");
if(datasetObj.settings.autoHideClearFilterItem){datasetObj.settings.clearFilterItem.show()
}}};
var rowMods=function(datasetObj,renderedRows){$.each(renderedRows,function(i,r){var $row=$(r.row);
if(!$row.is(".blist-tr-open")){return true
}$row.find(".blist-tdh[uid]").each(function(i,tdh){var $tdh=$(tdh);
if($tdh.find("a.menuLink").length>0){return true
}var uid=$tdh.attr("uid");
var col=datasetObj.settings._model.column(uid);
if(col){setupHeader(datasetObj,col,$tdh,false)
}})
})
};
var setupHeader=function(datasetObj,col,$col,tipsRef){createHeaderMenu(datasetObj,col,$col);
if(tipsRef){if(tipsRef[col.id]&&tipsRef[col.id].isSocrataTip()){tipsRef[col.id].socrataTip().hide();
tipsRef[col.id].socrataTip().disable()
}tipsRef[col.id]=$col;
var typeName=blist.data.types[col.type].title||col.type.displayable();
var tooltipContent='<div class="blist-th-tooltip '+col.type+'"><p class="name">'+$.htmlEscape(col.name).replace(/ /,"&nbsp;")+"</p>"+(col.description!==undefined?'<p class="description">'+$.htmlEscape(col.description)+"</p>":"")+'<p class="columnType"><span class="blist-th-icon"></span>'+typeName+(col.grouping_aggregate!==undefined?" ("+$.capitalize(col.grouping_aggregate)+" on "+col.originalType.displayable()+")":"")+"</p></div>";
var contentIsMain=true;
var showTimer=null;
var clearShowTimer=function(){clearTimeout(showTimer);
showTimer=null
};
var showTip=function(){showTimer=setTimeout(function(){showTimer=null;
$col.socrataTip().show()
},300)
};
$col.mouseover(function(e){if(!$(e.target).is(".menuLink")){clearShowTimer();
showTip()
}else{clearShowTimer();
$col.socrataTip().hide()
}}).mouseleave(function(e){clearShowTimer();
$col.socrataTip().hide()
});
$col.socrataTip({content:tooltipContent,trigger:"none",parent:"body"});
showTip();
$col.find(".menuLink").socrataTip({message:"Click for Menu",parent:"body"})
}};
var headerMods=function(datasetObj,col){if(!datasetObj.settings._colTips){datasetObj.settings._colTips={}
}setupHeader(datasetObj,col,$(col.dom),datasetObj.settings._colTips)
};
var createHeaderMenu=function(datasetObj,col,$colDom){var view=datasetObj.settings._model.meta().view;
var isNested=col.nestedIn!==undefined;
var features={};
if(!isNested&&blist.data.types[col.type].sortable){features.sort=true
}if(!isNested&&blist.data.types[col.type].filterable&&!datasetObj.settings._model.isGrouped()){features.filter=true
}if(datasetObj.settings.columnDeleteEnabled&&view.flags!==undefined&&$.inArray("default",view.flags)>=0&&blist.data.types[col.type].deleteable&&view&&view.rights&&$.inArray("remove_column",view.rights)>=0&&(!datasetObj.settings._model.isGrouped()||$.grep(view.query.groupBys,function(g,i){return g.columnId==col.id
}).length<1)){features.remove=true
}if(datasetObj.settings.columnPropertiesEnabled){features.properties=true
}var haveFeatures=false;
for(var x in features){haveFeatures=true;
break
}if(!haveFeatures){return
}$colDom.append('<a class="menuLink action-item" href="#column-menu_'+col.uid+'"></a>');
$colDom.one("mouseover",function(){if($colDom.find("ul.menu").length>0){return
}var htmlStr='<ul class="menu columnHeaderMenu action-item" id="column-menu_'+col.uid+'">';
if(features.sort){htmlStr+='<li class="sortAsc singleItem"><a href="#column-sort-asc_'+col.uid+'"><span class="highlight">Sort Ascending</span></a></li><li class="sortDesc singleItem"><a href="#column-sort-desc_'+col.uid+'"><span class="highlight">Sort Descending</span></a></li><li class="sortClear singleItem"><a href="#column-sort-clear_'+col.uid+'"><span class="highlight">Clear Sort</span></a></li>'
}if(features.sort||features.filter){htmlStr+='<li class="filterSeparator separator singleItem" />'
}htmlStr+='<li class="hideCol" ><a href="#hide-column_'+col.id+'"><span class="highlight">Hide Column</span></a></li>';
if(features.remove){htmlStr+='<li class="delete" ><a href="#delete-column_'+col.id+'"><span class="highlight">Delete Column</span></a></li>'
}if(features.properties){htmlStr+='<li class="separator singleItem" />';
htmlStr+='<li class="properties singleItem"><a href="#edit-column_'+col.id+(col.nestedIn?"_"+col.nestedIn.header.id:"")+'"><span class="highlight">Edit Column Properties</span></a></li>'
}htmlStr+='<li class="footer"><div class="outerWrapper"><div class="innerWrapper"><span class="colorWrapper"></span></div></div></li></ul>';
$colDom.append(htmlStr);
var $menu=$colDom.find("ul.columnHeaderMenu");
hookUpHeaderMenu(datasetObj,$colDom,$menu);
addFilterMenu(datasetObj,col,$menu)
})
};
var hookUpHeaderMenu=function(datasetObj,$colHeader,$menu){$menu.dropdownMenu({triggerButton:$colHeader.find("a.menuLink"),openCallback:function($menu){columnMenuOpenCallback(datasetObj,$colHeader,$menu)
},linkCallback:function(e){columnHeaderMenuHandler(datasetObj,e)
},forcePosition:true,pullToTop:true}).find(".autofilter ul.menu").scrollable()
};
var columnMenuOpenCallback=function(datasetObj,$colHeader,$menu){if($colHeader.isSocrataTip()){$colHeader.socrataTip().hide()
}var selCols=$(datasetObj.currentGrid).blistTableAccessor().getSelectedColumns();
var col=$colHeader.data("column");
var numSel=0;
$.each(selCols,function(){numSel++
});
if(numSel<1||(numSel==1&&selCols[col.id]!==undefined)){$menu.find(".singleItem").show();
if(col){loadFilterMenu(datasetObj,col,$menu);
var curSort=datasetObj.settings._model.meta().sort[col.id];
$menu.find(".sortAsc").toggle(!curSort||!curSort.ascending);
$menu.find(".sortDesc").toggle(!curSort||curSort.ascending);
$menu.find(".sortClear").toggle(curSort!==undefined)
}}else{$menu.find(".singleItem").hide()
}};
var loadFilterMenu=function(datasetObj,col,$menu){if(datasetObj.summaryStale||datasetObj.settings._columnSummaries===undefined){datasetObj.settings._columnSummaries={};
datasetObj.summaryStale=false
}var colSum=datasetObj.settings._columnSummaries;
var modView=blist.dataset.cleanViewForPost(datasetObj.settings._model.getViewCopy());
if(!modView){return
}if(!blist.data.types[col.type].filterable||datasetObj.settings._model.isGrouped()){return
}if(colSum[col.id]!==undefined){setTimeout(function(){addFilterMenu(datasetObj,col,$menu)
},0);
return
}$menu.children(".autofilter").prev(".separator").andSelf().remove();
var spinnerStr='<li class="autofilter loading"></li>';
var $sortItem=$menu.find("li.filterSeparator");
if($sortItem.length>0){$sortItem.before(spinnerStr)
}else{$menu.prepend(spinnerStr)
}$.ajax({url:"/views/INLINE/rows.json?method=getSummary&columnId="+col.id,dataType:"json",cache:false,type:"POST",contentType:"application/json",data:JSON.stringify(modView),success:function(data){$.each(data.columnSummaries,function(i,s){if(s.topFrequencies===undefined||s.topFrequencies.length<1){return true
}if(colSum[s.columnId]===undefined){colSum[s.columnId]={}
}colSum[s.columnId][s.subColumnType]=s
});
addFilterMenu(datasetObj,col,$menu)
}})
};
var addFilterMenu=function(datasetObj,col,$menu){if(!col.dom){return
}$menu.children(".autofilter.loading").remove();
if(datasetObj.settings._columnSummaries===undefined||!blist.data.types[col.type].filterable){return
}var colFilters=datasetObj.settings._model.meta().columnFilters;
var cf=colFilters?colFilters[col.id]||undefined:undefined;
$menu.children(".autofilter").prev(".separator").andSelf().remove();
var colSum=datasetObj.settings._columnSummaries[col.id];
if(cf===undefined&&colSum===undefined){return
}var filterStr='<li class="autofilter submenu singleItem"><a class="submenuLink" href="#"><span class="highlight">Filter This Column</span></a><ul class="menu optionMenu">';
if(cf!==undefined){filterStr+='<li class="clearFilter"><a href="#clear-filter-column_'+col.uid+'"><span class="highlight">Clear Column Filter</span></a></li>';
if(colSum===undefined){colSum={curVal:{topFrequencies:[{value:cf.value,count:0}]}}
}}filterStr+='<li class="button prev"><a href="#prev" title="Previous"><div class="outerWrapper"><div class="midWrapper"><span class="innerWrapper">Previous</span></div></div></a></li>';
var typeKeys=$.keys(colSum);
if(col.type=="url"){typeKeys.sort()
}else{if(col.type=="phone"){typeKeys.sort().reverse()
}}var sumSections=[];
$.each(typeKeys,function(i,k){var cs=colSum[k];
var section="";
var searchMethod=function(a,b){var av=a.titleValue.toUpperCase();
var bv=b.titleValue.toUpperCase();
return av>bv?1:av<bv?-1:0
};
if(cs.subColumnType=="number"||cs.subColumnType=="money"||cs.subColumnType=="date"||cs.subColumnType=="percent"){searchMethod=function(a,b){return a.value-b.value
}
}if(cs.topFrequencies!==undefined){$.each(cs.topFrequencies,function(i,f){f.isMatching=cf!==undefined&&cf.value==f.value;
var curType=blist.data.types[col.type]||blist.data.types.text;
f.escapedValue=escape(curType.filterValue!==undefined?curType.filterValue(f.value,col):$.htmlStrip(f.value+""));
f.renderedValue=curType.filterRender!==undefined?curType.filterRender(f.value,col,cs.subColumnType):"";
f.titleValue=$.htmlStrip(f.renderedValue+"")
});
cs.topFrequencies.sort(searchMethod);
$.each(cs.topFrequencies,function(i,f){if(f.renderedValue===""){return true
}section+='<li class="filterItem'+(f.isMatching?" active":"")+' scrollable"><a href="'+(f.isMatching?"#clear-filter-column_":"#filter-column_")+col.uid+"_"+cs.subColumnType+":"+f.escapedValue+'|" title="'+f.titleValue+(f.count>1?" ("+f.count+")":"")+'" class="clipText">'+f.renderedValue+(f.count>1?" ("+f.count+")":"")+"</a></li>"
})
}sumSections.push(section)
});
filterStr+=sumSections.join('<li class="separator scrollable"></li>');
filterStr+='<li class="button next"><a href="#next" title="Next"><div class="outerWrapper"><div class="midWrapper"><span class="innerWrapper">Next</span></div></div></a></li><li class="footer"><div class="outerWrapper"><div class="innerWrapper"><span class="colorWrapper"></span></div></div></li></ul></li>';
var $sortItem=$menu.find("li.filterSeparator");
if($sortItem.length>0){filterStr='<li class="separator singleItem" />'+filterStr;
$sortItem.before(filterStr)
}else{$menu.prepend(filterStr)
}hookUpHeaderMenu(datasetObj,$(col.dom),$menu)
};
var columnHeaderMenuHandler=function(datasetObj,event){event.preventDefault();
var href=$(event.currentTarget).attr("href");
var s=href.slice(href.indexOf("#")+1).split("_");
if(s.length<2){return
}var action=s[0];
var colIdIndex=s[1];
var model=datasetObj.settings._model;
switch(action){case"column-sort-asc":model.sort(colIdIndex,false);
break;
case"column-sort-desc":model.sort(colIdIndex,true);
break;
case"column-sort-clear":model.clearSort(colIdIndex);
break;
case"filter-column":var p=s.slice(2).join("_").split(":");
model.filterColumn(colIdIndex,unescape(p.slice(1).join(":").slice(0,-1)),p[0]);
break;
case"clear-filter-column":model.clearColumnFilter(colIdIndex);
break;
case"hide-column":var selHideCols=$(datasetObj.currentGrid).blistTableAccessor().getSelectedColumns();
selHideCols[colIdIndex]=true;
var hideCols=[];
$.each(selHideCols,function(colId,val){hideCols.push(colId)
});
datasetObj.showHideColumns(hideCols,true);
break;
case"delete-column":var view=model.meta().view;
var selCols=$(datasetObj.currentGrid).blistTableAccessor().getSelectedColumns();
selCols[colIdIndex]=true;
var cols=[];
$.each(selCols,function(colId,val){cols.push(colId)
});
datasetObj.deleteColumns(cols);
break;
case"edit-column":datasetObj.settings.editColumnCallback(colIdIndex,s[2]);
break
}$(datasetObj.currentGrid).trigger("header_change",[model])
};
var columnResized=function(datasetObj,col,isFinished){if(isFinished){var view=datasetObj.settings._model.meta().view;
$.each(view.columns,function(i,c){if(c.id==col.id){c.width=col.width;
return false
}});
if(_.include(view.rights,"update_view")){$.ajax({url:"/views/"+view.id+"/columns/"+col.id+".json",data:JSON.stringify({width:col.width}),type:"PUT",contentType:"application/json"})
}}};
var sortChanged=function(datasetObj,skipRequest){var view=datasetObj.settings._model.meta().view;
if(!skipRequest&&_.include(view.rights,"update_view")&&!datasetObj.isTempView){$.ajax({url:"/views/"+view.id+".json",data:JSON.stringify({query:view.query}),type:"PUT",contentType:"application/json"})
}else{var oldSorts=datasetObj.origOrderBys;
var newSorts=[];
if(view.query.orderBys!==undefined){newSorts=view.query.orderBys
}var matches=oldSorts.length==newSorts.length;
if(matches){for(var i=0;
i<oldSorts.length;
i++){var o=oldSorts[i];
var n=newSorts[i];
if(o.columnId!=n.expression.columnId||o.ascending!=n.ascending){matches=false;
break
}}}if(matches){datasetObj.clearTempView("sort")
}else{datasetObj.setTempView("sort")
}}};
var columnsRearranged=function(datasetObj){var view=datasetObj.settings._model.meta().view;
if(_.include(view.rights,"update_view")&&!datasetObj.isTempView){var modView=blist.dataset.cleanViewForPost(datasetObj.settings._model.getViewCopy(),true);
$.ajax({url:"/views/"+view.id+".json",data:JSON.stringify({columns:modView.columns}),type:"PUT",contentType:"application/json",success:function(){$(document).trigger(blist.events.COLUMNS_CHANGED);
datasetObj.settings._model.reloadView()
}})
}};
var columnFilterChanged=function(datasetObj,col,setFilter){if($(col.dom).isSocrataTip()){$(col.dom).socrataTip().hide()
}datasetObj.summaryStale=true;
if(!setFilter){datasetObj.clearTempView("filter_"+col.id)
}else{datasetObj.setTempView("filter_"+col.id)
}};
var viewLoaded=function(datasetObj){datasetObj.origOrderBys=[];
var view=datasetObj.settings._model.meta().view;
if(view.query.orderBys!==undefined){$.each(view.query.orderBys,function(i,o){var curO={columnId:o.expression.columnId};
curO.ascending=o.ascending;
datasetObj.origOrderBys.push(curO)
})
}};
var columnNameEdit=function(datasetObj,event,origEvent){if(!datasetObj.settings.columnNameEdit||datasetObj.isTempView){return
}var $target=$(origEvent.currentTarget).find(".blist-th-name");
var $th=$target.closest(".blist-th").addClass("editable");
var $container=$target.closest(".name-wrapper");
var $edit=$container.find("form");
if($edit.length<1){$container.append('<form class="action-item"><input type="text" /></form>');
$edit=$container.find("form");
$edit.submit(function(e){columnEditSubmit(datasetObj,e)
}).find(":input").keydown(function(e){columnEditKeyHandler(datasetObj,e)
})
}$edit.find(":input").removeAttr("disabled").val($target.text()).focus().select();
$(document).bind("mousedown.columnNameEdit-"+$th.data("column").id,function(e){columnEditDocMouse(datasetObj,e,$th)
}).bind("mouseup.columnNameEdit-"+$th.data("column").id,function(e){columnEditDocMouse(datasetObj,e,$th)
})
};
var columnEditEnd=function(datasetObj,$th){datasetObj.$dom().focus();
$th.removeClass("editable error");
$(document).unbind(".columnNameEdit-"+$th.data("column").id)
};
var columnEditSave=function(datasetObj,$th){var $input=$th.find(":input");
var newName=$input.val();
if(newName===""){alert("You must enter a name for this column");
$th.addClass("error");
return
}var origName=$th.find(".blist-th-name").text();
if(origName==newName){columnEditEnd(datasetObj,$th);
return
}var model=datasetObj.settings._model;
var col=model.getColumnByID($th.data("column").id);
col.name=newName;
$input.attr("disabled","disabled");
$.ajax({url:"/views/"+model.meta().view.id+"/columns/"+col.id+".json",data:JSON.stringify({name:col.name}),type:"PUT",dataType:"json",contentType:"application/json",error:function(xhr){var errBody=JSON.parse(xhr.responseText);
alert(errBody.message);
$th.addClass("error");
$input.removeAttr("disabled")
},success:function(newCol){columnEditEnd(datasetObj,$th);
model.updateColumn(newCol);
$(document).trigger(blist.events.COLUMNS_CHANGED)
}})
};
var columnEditDocMouse=function(datasetObj,event,$th){var $target=$(event.target);
if(($target.is(".name-wrapper :input")&&$target.parents().index($th)>=0)||$target.closest("#jqmAlert").length>0){return
}columnEditSave(datasetObj,$th)
};
var columnEditSubmit=function(datasetObj,event){event.preventDefault();
columnEditSave(datasetObj,$(event.target).closest(".blist-th"))
};
var columnEditKeyHandler=function(datasetObj,event){if(event.keyCode==27){columnEditEnd(datasetObj,$(event.target).closest(".blist-th"))
}}
})(jQuery);