json-object-editor
Version:
JOE the Json Object Editor | Platform Edition
3 lines (2 loc) • 259 kB
JavaScript
var _webworkers=false;var _joeworker;if(!!window.Worker){_webworkers=true}$c.TEMPLATE_VARS.push({variable:"/textarea",value:"</textarea>"},{variable:"textarea",value:"<textarea>"},{variable:"SERVER",value:"//"+$c.SERVER});var __joeFieldTypes=["text","select","code","rendering","date","boolean","geo","image","url","objectList","objectReference","group","content"];function JsonObjectEditor(specs){var self=this;initialized=false;var colCount=1;var listMode=false;var gridMode=false;var tableMode=false,tableSpecs;var multiEdit=false;this.VERSION="1.0.1";window._joes=window._joes||[];this.joe_index=window._joes.length;if(!window._joes.length){window._joe=this}window._joes.push(this);this.history=[];var defaults={container:"body",joeprofile:{lockedFields:["joeUpdated"],hiddenFields:[]},profiles:{},fields:{},schemas:{rendering:{title:"HTML Rendering",callback:function(){alert("yo")}}},compact:false,useControlEnter:true,autoInit:false,dynamicDisplay:30,sans:false,listSubMenu:true};this.specs=$.extend({},defaults,specs||{});this.Data={};this.current={};this.container=$(this.specs.container);this.fields=this.specs.fields;this.schemas=this.specs.schemas;for(var s in _joe.schemas){_joe.schemas[s].__schemaname=s}this.defaultProfile=this.specs.defaultProfile||this.specs.joeprofile;this.current.profile=this.defaultProfile;this.ace_editors={};this.init=function(){if(initialized){return false}self.current={filters:{}};var html=self.renderFramework(self.renderEditorHeader()+self.renderEditorContent()+self.renderEditorFooter());self.container.append(html);self.overlay=$(".joe-overlay[data-joeindex="+self.joe_index+"]");self.panel=self.overlay.find(".joe-overlay-panel");if(self.specs.useBackButton){window.onkeydown=function(e){var code=e.keyCode;var nonBackElements=["input","select","textarea"];var isInputElement=nonBackElements.indexOf(e.target.tagName.toLowerCase())!=-1;if(code==8){if(isInputElement){}else{self.goBack();return false}}else if([38,40,13,16,17].indexOf(code)==-1){if(!listMode)return;var inSearchfield=false;if($(document.activeElement)&&$(document.activeElement)[0]!=$(".joe-submenu-search-field")[0]){self.overlay.find(".joe-submenu-search-field").focus();inSearchfield=true;$(".joe-panel-content-option.keyboard-selected").removeClass("keyboard-selected")}}else{var autocompleteField=$(".joe-text-autocomplete.active").length;if(autocompleteField){var sel=".joe-text-autocomplete-option.visible"+".keyboard-selected";var keyboardSelectedIndex=$(sel).length?$(sel).index():-1;switch(code){case 38:keyboardSelectedIndex--;if(keyboardSelectedIndex>-1){keyboardSelectOption(".joe-text-autocomplete-option.visible")}break;case 40:keyboardSelectedIndex++;if(keyboardSelectedIndex<$(".joe-text-autocomplete-option.visible").length){keyboardSelectOption(".joe-text-autocomplete-option.visible")}break;case 13:if(keyboardSelectedIndex!=-1){$(sel).click()}break}}if(!listMode)return;var keyboardSelectedIndex=$(".joe-panel-content-option.keyboard-selected").length?$(".joe-panel-content-option.keyboard-selected").index():-1;switch(code){case 38:keyboardSelectedIndex--;if(keyboardSelectedIndex>-1){keyboardSelectOption(".joe-panel-content-option",top)}break;case 40:keyboardSelectedIndex++;if(keyboardSelectedIndex<currentListItems.length){keyboardSelectOption(".joe-panel-content-option",top)}break;case 13:if(keyboardSelectedIndex!=-1){$(".joe-panel-content-option.keyboard-selected").find(".joe-panel-content-option-content").click()}break}function keyboardSelectOption(selector,top){$(selector+".keyboard-selected").toggleClass("keyboard-selected");var el=$(selector).eq(keyboardSelectedIndex);el.addClass("keyboard-selected");self.overlay.find(".joe-submenu-search-field").blur();el[0].scrollIntoView(top)}}}}self.readHashLink();var respond_timeout;$(window).on("resize",function(){clearTimeout(respond_timeout);respond_timeout=setTimeout(self.respond,200)});initialized=true};this.getMode=function(){if(listMode){return"list"}return"details"};this.renderFramework=function(content){var style="style-variant1";var html='<div class="joe-overlay cols-'+colCount+" "+style+" "+(self.specs.compact&&" compact "||"")+(self.specs.sans&&" sans "||"")+'" data-joeindex="'+this.joe_index+'">'+'<div class="joe-overlay-panel">'+(content||"")+"</div>"+'<div class="joe-mini-panel">'+"</div>"+"</div>";return html};this.populateFramework=function(data,setts){self.overlay.removeClass("multi-edit");var joePopulateBenchmarker=new Benchmarker;logit("------Beginning joe population");var specs=setts||{};self.current.specs=setts;self.current.data=data;self.current.userSpecs=$.extend({},setts);gridMode=self.current.specs.viewMode=="grid"?true:false;tableMode=self.current.specs.viewMode=="table"?true:false;colCount=self.current.specs.colCount||colCount||1;if(!self.current.specs.noHistory){self.history.push({specs:self.current.userSpecs,data:self.current.data})}var schema=setts.schema||"";var profile=setts.profile||null;var callback=setts.callback||null;var datatype=setts.datatype||"";var title=setts.title||"";if(callback){self.current.callback=callback}else{self.current.callback=null}specs.schema=this.setSchema(schema);specs.preformat=specs.schema&&specs.schema.preformat||specs.preformat||function(d){return d};data=specs.preformat(data);if($.type(data)=="object"||datatype=="object"){specs.object=data;specs.menu=specs.menu||specs.schema&&specs.schema.menu||self.specs.menu||specs.multiedit&&__defaultMultiButtons||__defaultObjectButtons;specs.mode="object";self.current.object=data}if($.type(data)=="string"&&datatype!="string"&&self.getDataset(data,{"boolean":true})){data=self.getDataset(data)}self.toggleMultiEditMode(specs,data);listMode=false;if($.type(data)=="array"||datatype=="array"){listMode=true;specs.list=data;specs.menu=specs.listMenu||specs.schema&&specs.schema.listMenu||__defaultButtons;specs.mode="list";self.current.list=data;var currentSubsets;currentSubsets=setts.subsets||specs.schema&&specs.schema.subsets||null;if(typeof currentSubsets=="function"){currentSubsets=currentSubsets()}if(self.current.specs.subset&¤tSubsets.where({name:specs.subset}).length){self.current.subset=currentSubsets.where({name:specs.subset})[0]||false}else{if(self.current.specs.subset=="All"){self.current.subset={name:"All",filter:{}}}else{self.current.subset=currentSubsets&¤tSubsets.where({"default":true})[0]||null}}self.current.subsets=currentSubsets;self.current.sorter=setts.sorter||self.current.subset&&self.current.subset.sorter||specs.schema&&specs.schema.sorter||"name";if($.type(self.current.sorter)=="string"){self.current.sorter=[self.current.sorter]}}if(specs.mode=="list"){self.current.submenu=self.current.specs.listsubmenu||self.current.specs.submenu||specs.schema&&specs.schema.listSubMenu||self.specs.listSubMenu}else{self.current.submenu=self.current.specs.submenu||specs.schema&&specs.schema.subMenu||self.specs.subMenu}if(self.current.submenu=="none"){self.current.submenu=null}if($.type(data)=="string"&&datatype=="rendering"){specs.rendering=data;specs.menu=[__replaceBtn__];specs.mode="rendering";self.current.rendering=specs.rendering}else if($.type(data)=="string"||datatype=="string"){specs.text=data;specs.menu=__defaultButtons;specs.mode="text";self.current.text=specs.text}specs.listWindowTitle=specs.list&&(specs._listMenuTitle||specs._listWindowTitle||getProperty("specs.list.windowTitle")||specs.schema&&(specs.schema._listMenuTitle||specs.schema._listWindowTitle));specs.title=title||specs.listWindowTitle||specs.schema&&(specs.schema.title||specs.schema._title)||"Viewing "+specs.mode.capitalize();specs.profile=profile?self.specs.profiles[profile]||self.specs.joeprofile:self.specs.joeprofile;self.current.profile=specs.profile;self.cleanUp();if(self.current.schema&&(self.current.schema.table||self.current.schema.tableView)){tableSpecs=$.extend({cols:["name",self.getIDProp()]},self.current.schema&&(self.current.schema.table||self.current.schema.tableView)||{})}else{tableSpecs=null}var content=self.renderEditorContent(specs);var html=self.renderEditorHeader(specs)+self.renderEditorSubmenu(specs)+content+self.renderEditorFooter(specs)+self.renderMessageContainer();self.overlay.find(".joe-overlay-panel").html(html);if(!self.current.specs.noHistory&&self.history.length){$.extend(self.history[self.history.length-1],{_joeHistoryTitle:self.overlay.find(".joe-panel-title").html()})}self.updateHashLink();_bmResponse(joePopulateBenchmarker,"----Joe Populated");return html};this.toggleMultiEditMode=function(specs,data){multiEdit=self.current.userSpecs.multiedit||false};this.renderEditorHeader=function(specs){specs=specs||{};var titleObj=self.current.object;if(specs.list){var lcount=specs.list.length;if(self.current.subset){lcount=specs.list.where(self.current.subset.filter).length}titleObj=$.extend({},self.current.object,{_listCount:lcount||"0"})}self.current.title=specs.title||"Json Object Editor";var title=fillTemplate(self.current.title,titleObj);var close_action=specs.close_action||'onclick="getJoe('+self.joe_index+').closeButtonAction()"';var reload_action=specs.reload_action||'onclick="getJoe('+self.joe_index+').reload()"';function renderHeaderBackButton(){var html="";if(self.history.length>1){html+='<div class="jif-header-back-btn jif-panel-header-button" onclick="getJoe('+self.joe_index+').goBack();" title="go back"><span class="jif-arrow-left"></span></div>'}return html}var reload_button=specs.minimode?"":'<div class="jif-panel-header-button joe-panel-reload" title="reload" '+reload_action+'><span class="jif-reload"></span></div>';var html='<div class="joe-panel-header">'+(specs.schema&&specs.schema.subsets&&self.renderSubsetselector(specs.schema)||specs.subsets&&self.renderSubsetselector(specs)||"")+(!specs.minimode&&renderHeaderBackButton()||"")+'<div class="joe-vcenter joe-panel-title-holder"><span class="joe-panel-title">'+(("<div>"+title+"</div>").toDomElement().innerText||title||"Json Object Editor")+"</span></div>"+reload_button+'<div class="jif-panel-header-button joe-panel-close" title="close" '+close_action+">"+'<span class="jif-close"></span>'+"</div>"+'<div class="clear"></div>'+"</div>";return html};this.closeButtonAction=function(){self.history=[];self.panel.addClass("centerscreen-collapse");self.hide(500);self.clearAuxiliaryData();$(self.container).trigger({type:"hideJoe",index:self.joe_index})};var goingBackFromID;var goingBackQuery;this.goBack=function(obj){if(self.current.object){var gobackItem=self.current.object[self.getIDProp()];if(gobackItem){goingBackFromID=gobackItem}}self.history.pop();var joespecs=self.history.pop();if(!joespecs){self.closeButtonAction();return}else{if(obj&&$c.isArray(joespecs.data)){var objid=obj[self.getIDProp()];if(objid){var query={};query[self.getIDProp()]=objid;var found=joespecs.data.where(query);found.length&&$.extend(found[0],obj)}}if(joespecs.keyword){goingBackQuery=joespecs.keyword}}var specs=$.extend({},joespecs.specs);specs.filters=joespecs.filters;self.show(joespecs.data,specs)};this.clearAuxiliaryData=function(){self.current.list=null;self.current.subsets=null;self.current.subset=null;self.current.filters={};self.current.fields=[]};this.cleanUp=function(){self.current.fields=[];self.shiftSelecting=false;self.allSelected=false;if(self.current.userSpecs.multiedit){self.overlay.addClass("multi-edit")}else{self.overlay.removeClass("multi-edit")}};this.renderEditorSubmenu=function(specs){var sectionAnchors=renderSectionAnchors();if(!self.current.submenu&&!sectionAnchors.count){return""}var showFilters=$c.getProperty(self.current,"userSpecs.filters")||$c.getProperty(self.current,"schema.filters")||$c.getProperty(self.current,"schema.subsets")||false;var subSpecs={search:true,itemcount:true,filters:showFilters,numCols:["1","2","3"]};var userSubmenu=$.type(self.current.submenu)!="object"?{}:self.current.submenu;$.extend(subSpecs,userSubmenu);if(specs.mode=="list"){var submenu='<div class="joe-panel-submenu">'+self.renderViewModeButtons(subSpecs)+self.renderColumnCountSelector(subSpecs.numCols)+(subSpecs.filters&&self.renderSubmenuFilters(subSpecs.filter)||"")+(subSpecs.search&&self.renderSubmenuSearch(subSpecs.search)||"")+(subSpecs.itemcount&&self.renderSubmenuItemcount(subSpecs.itemcount)||"")+"</div>"+"<div class='joe-filters-holder'>"+renderSubsetsDiv()+(self.current.schema&&(self.propAsFuncOrValue(self.current.schema.filters)&&renderFiltersDiv())||"")+"</div>"}else{var submenu='<div class="joe-panel-submenu">'+(sectionAnchors.count&§ionAnchors.code||"")+renderSidebarToggle("left")+renderSidebarToggle("right")+"</div>"}function renderSubsetsDiv(){var sh='<div><div class="joe-menu-label">Subsets</div>';var act;[{name:"All",filter:{}}].concat(_joe.current.subsets||[]).map(function(opt){if(!opt.condition||self.propAsFuncOrValue(opt.condition)){act=self.current.subset&&self.current.subset.name==opt.name||!self.current.subset&&opt.name=="All"?" active ":"";sh+='<div class="joe-subset-option '+act+'" onclick="getJoe('+self.joe_index+").selectSubset('"+(opt.id||opt.name||"")+"');\">"+opt.name+"</div>"}});sh+="</div>";return sh}function renderFiltersDiv(){var fh='<div><div class="joe-menu-label">Filters</div>';var filters=self.current.schema.filters;filters=self.propAsFuncOrValue(filters);(filters||[]).map(function(opt){var idval=opt.id||opt.name||"";if(!opt.condition||self.propAsFuncOrValue(opt.condition)){act=self.current.filters&&self.current.filters[idval]?"active":"";fh+='<div class="joe-filter-option '+act+'" onclick="getJoe('+self.joe_index+").toggleFilter('"+idval+'\',this);"><span class ="joe-option-checkbox"></span>'+opt.name+"</div>"}});fh+="</div>";return fh}return submenu};function renderSectionAnchors(){var anchorhtml='<div class="joe-submenu-section-anchors">';anchorhtml+='<div class="joe-submenu-section" onclick="$(\'.joe-overlay[data-joeindex='+self.joe_index+"]').find('.joe-panel-content').scrollTop(0)\">^ top</div>";var scount=0;var template='<div class="joe-submenu-section" onclick="_joe.gotoSection(\'${id}\','+self.joe_index+');">${name}</div>';var section;for(var secname in self.current.sections){section=_getSection(secname);if(!section.hidden){anchorhtml+=fillTemplate(template,section);scount++}}anchorhtml+="</div>";return{count:scount,code:anchorhtml}}self.gotoSection=function(section,index){if(section){var i=index||self.joe_index;var sectionDom=$(".joe-overlay[data-joeindex="+i+"]").find(".joe-content-section[data-section='"+section+"']");sectionDom.removeClass("collapsed")[0].scrollIntoView();var sidebar=sectionDom.parents(".joe-content-sidebar");if(sidebar&&sidebar.length){var s=sidebar.data("side");self.toggleSidebar(s,true)}else if(self.sizeClass=="small-size"){self.toggleSidebar("left",false);self.toggleSidebar("right",false)}}};this.renderSubmenuFilters=function(s){if(!(s||self.current.subsets)){return""}var action=' onclick="getJoe('+self.joe_index+').toggleFiltersMenu();" ';var html="<div class='jif-panel-submenu-button joe-filters-toggle ' "+action+">"+"</div>";return html};var leftMenuShowing=false;this.toggleFiltersMenu=function(){leftMenuShowing=!leftMenuShowing;self.panel.toggleClass("show-filters",leftMenuShowing)};this.generateFiltersQuery=function(){var query={};var filterobj;for(var f in self.current.filters){filterobj=((self.propAsFuncOrValue(self.current.schema.filters)||[]).where({name:f})[0]||{}).filter;for(var ff in filterobj){if(query[ff]){switch($.type(filterobj[ff])){case"number":case"string":if($.type(query[ff])=="string"||$.type(query[ff])=="number"){query[ff]={$in:[query[ff],filterobj[ff]]}}else if($.type(query[ff])=="object"){if(query[ff].hasOwnProperty("$in")){query[ff]["$in"]=query[ff]["$in"].concat(filterobj[ff])}}break}}else{query[ff]=filterobj[ff]}}}return query};this.renderSubmenuSearch=function(s){var action=' onkeyup="_joe.filterListFromSubmenu(this.value);" ';var submenusearch="<div class='joe-submenu-search '>"+'<input class="joe-submenu-search-field" '+action+' placeholder="find" />'+"</div>";return submenusearch};this.searchTimeout;this.filterListFromSubmenu=function(keyword,now){clearTimeout(self.searchTimeout);self.overlay.removeClass(".multi-edit");if(!now){self.searchTimeout=setTimeout(function(){searchFilter(keyword)},300)}else{searchFilter(keyword)}function searchFilter(keyword){var searchBM=new Benchmarker;keyword=keyword||$(".joe-submenu-search-field").val();var value=keyword.toLowerCase();var keywords=value.replace(/,/g," ").split(" ");var filters=self.generateFiltersQuery();_joe.history[_joe.history.length-1].keyword=value;_joe.history[_joe.history.length-1].filters=self.current.filters;var testable;var idprop=self.getIDProp();var id;var listables=self.current.subset?self.current.list.where(self.current.subset.filter):self.current.list;var searchables=self.current.schema&&self.current.schema.searchables;logit("search where in "+searchBM.stop()+" seconds");currentListItems=listables.where(filters).filter(function(i){id=i[idprop];testable="";if(searchables){searchables.map(function(s){testable+=i[s]+" "});testable=testable.toLowerCase()+id;for(var k=0,tot=keywords.length;k<tot;k++){if(testable.indexOf(keywords[k])==-1){return false}}}else{if(tableMode){testable=self.renderTableItem(i,true)}else if(gridMode){}else{testable=self.renderListItem(i,true)}testable=testable.toLowerCase()+id;for(var k=0,tot=keywords.length;k<tot;k++){if(testable.indexOf(keywords[k])==-1){return false}}}return true});logit("search filter found "+currentListItems.length+" items in "+searchBM.stop()+" seconds");self.overlay.find(".joe-submenu-itemcount").html(currentListItems.length+" item"+(currentListItems.length>1&&"s"||""));self.panel.find(".joe-panel-content").html(self.renderListItems(currentListItems,0,self.specs.dynamicDisplay));var titleObj=$.extend({},self.current.object,{_listCount:currentListItems.length||"0"});self.panel.find(".joe-panel-title").html(fillTemplate(self.current.title,titleObj))}};this.renderSubmenuItemcount=function(s){var submenuitem="<div class='joe-submenu-itemcount'>items</div>";return submenuitem};function renderSubmenuSelectors(specs){var specs=$.extend({options:[],content:"",action:"nothing",buttonTemplate:"<div class='selection-label'>${label}</div>${name}",label:"label",value:"v"},specs||{});var selectionTemplate="<div data-colcount='${name}' "+"onclick='getJoe("+self.joe_index+")"+"."+specs.action+"(${name});' "+"class='jif-panel-button selector-button-${name} joe-selector-button "+"'>"+specs.buttonTemplate+"</div>";var content=specs.content||"<div class='joe-selector-button selector-label'>"+specs.label+"</div>"+fillTemplate(selectionTemplate,specs.options);var html="<div class='joe-submenu-selector opts-"+specs.options.length+"' >"+content+"</div>";return html}this.nothing=function(nothing){alert(value)};this.renderViewModeButtons=function(subspecs){var gridspecs=self.current.schema&&self.current.schema.grid;var tablespecs=tableSpecs;if(!gridspecs&&!tablespecs){return""}var modes=[{name:"list"}];if(gridspecs){modes.push({name:"grid"})}if(tablespecs){modes.push({name:"table"})}var modeTemplate="<div data-view='${name}' "+"onclick='getJoe("+self.joe_index+")"+'.setViewMode("${name}");\' '+"class='jif-panel-button joe-viewmode-button ${name}-button joe-selector-button'> </div>";var submenuitem="<div class='joe-submenu-selector opts-"+modes.length+"' >"+"<div class='joe-selector-button selector-label'>view</div>"+fillTemplate(modeTemplate,modes)+"</div>";return submenuitem};this.setViewMode=function(mode){self.reload(true,{viewMode:mode})};this.renderColumnCountSelector=function(subspecs){if(!subspecs){return""}var modes=[{name:"1"},{name:"2"},{name:"3"}];var h=renderSubmenuSelectors({options:modes,label:"cols",value:colCount,action:"setColumnCount"});return h};this.setColumnCount=function(mode){self.overlay[0].className=self.overlay[0].className.replace(/cols-[0-9]/,"cols-"+mode);if(mode){colCount=mode}};this.renderEditorContent=function(specs){var content;if(!specs){specs={mode:"text",text:"No object or list selected"}}var mode=specs.mode;switch(mode){case"text":content=self.renderTextContent(specs);break;case"rendering":content=self.renderHTMLContent(specs);break;case"list":content=self.renderListContent(specs);break;case"object":content=self.renderObjectContent(specs);break;default:content=content||"";break}var submenu="";if(!specs.minimode){if(mode=="list"&&self.current.submenu||(self.current.submenu||renderSectionAnchors().count)){submenu=" with-submenu "}}var scroll='onscroll="getJoe('+self.joe_index+').onListContentScroll(this);"';var rightC=content.right||"";var leftC=content.left||"";var content_class="joe-panel-content joe-inset "+submenu;var html='<div class="'+content_class+'" '+(listMode&&scroll||"")+">"+(content.main||content)+"</div>"+self.renderSideBar("left",leftC,{css:submenu})+self.renderSideBar("right",rightC,{css:submenu});self.current.sidebars={left:leftC,right:rightC};return html};this.renderSideBar=function(side,content,specs){var side=side||"right";var expanded="";var specs=specs||{};var addCss=specs.css||"";var html="<div class='joe-content-sidebar joe-absolute "+side+"-side "+expanded+addCss+"' data-side='"+side+"'>"+(content||"")+__clearDiv__+"</div>";return html};this.toggleSidebar=function(side,hardset){if(["right","left"].indexOf(side)==-1){return false}self.panel.toggleClass(side+"-sidebar",hardset)};function renderSidebarToggle(side){var html='<div class="jif-panel-submenu-button joe-sidebar-button joe-sidebar_'+side+'-button" '+'title="toggle sidebar" onclick="getJoe('+self.joe_index+").toggleSidebar('"+side+"')\"></div>";return html}this.renderTextContent=function(specs){specs=specs||{};var text=specs.text||specs.object||"";var html='<div class="joe-text-content">'+text+"</div>";return html};this.renderHTMLContent=function(specs){specs=specs||{};var html='<textarea class="joe-rendering-field">'+(specs.rendering||"")+"</textarea>";return html};var currentListItems;this.renderListContent=function(specs){var wBM=new Benchmarker;if(specs.minimode){return self.renderMiniListContent(specs)}currentListItems=[];self.current.selectedListItems=[];self.current.anchorListItem=null;specs=specs||{};var schema=specs.schema;var list=specs.list||[];var html="";var filteredList;if(self.current.sorter&&($.type(self.current.sorter)!="array"||self.current.sorter.length)){list=list.sortBy(self.current.sorter)}logit("list sort complete in "+wBM.stop()+" seconds");var numItemsToRender;if(!self.current.subset){currentListItems=list}else{filteredList=list.where(self.current.subset.filter);currentListItems=filteredList;logit("list where complete in "+wBM.stop()+" seconds")}numItemsToRender=self.specs.dynamicDisplay||currentListItems.length;html+=self.renderListItems(currentListItems,0,numItemsToRender);logit("list complete in "+wBM.stop()+" seconds");return html};this.renderMiniListContent=function(specs){var wBM=new Benchmarker;specs=specs||{};var schema=specs.schema;var list=specs.object||[];var idprop=specs.idprop||"_id";var html="";var sorter=specs.sorter||"name";list=list.sortBy(sorter);var click="getJoe("+self.joe_index+").minis['"+specs.minimode+"'].callback('${"+idprop+"}')";var template=specs.template||"<h4>${name}</h4><div>${"+idprop+"}</div>";template='<div class="joe-field-list-item" onclick="'+click+'">'+template+"</div>";for(var li=0,tot=list.length;li<tot;li++){html+=fillTemplate(template,list[li])}logit("minilist complete in "+wBM.stop()+" seconds");return html};this.renderListItems=function(items,start,stop){var html="";var listItem;var items=items||currentListItems;var start=start||0;var stop=stop||currentListItems.length-1;if(gridMode){html+='<table class="joe-grid-table"><thead><th> </th><th>name</th><th>id</th></thead><tbody>';for(var i=start;i<stop;i++){listItem=items[i];if(listItem){html+=self.renderGridItem(listItem,false,i+1)}}html+="</tbody></table>";return html}else if(tableMode){html+='<table class="joe-item-table" cellspacing="0"><thead class="joe-table-head"><th> </th>';tableSpecs.cols.map(function(c){if($c.isString(c)){html+="<th>"+c+"</th>"}else if($c.isObject(c)){html+="<th>"+(c.header||c.display)+"</th>"}});html+="</thead><tbody>";stop=currentListItems.length-1;for(var i=start;i<stop;i++){listItem=items[i];if(listItem){html+=self.renderTableItem(listItem,false,i+1)}}html+="</tbody></table>";return html}else{for(var i=start;i<stop;i++){listItem=items[i];if(listItem){html+=self.renderListItem(listItem,false,i+1)}}return html}};this.onListContentScroll=function(domObj){var listItem=self.panel.find(".joe-panel-content-option").last()[0];var currentItemCount=self.panel.find(".joe-panel-content-option").length;if(currentItemCount==currentListItems.length){return}var viewPortHeight=self.panel.find(".joe-panel-content").height();var html="";try{if(listItem.getBoundingClientRect().bottom-500<viewPortHeight){if(gridMode){}if(tableMode){}else{html+=self.renderListItems(null,currentItemCount,currentItemCount+self.specs.dynamicDisplay);self.panel.find(".joe-panel-content").append(html)}}}catch(e){logit("error scrolling for more content: \n"+e)}};var renderFieldTo;this.renderObjectContent=function(specs){renderFieldTo="main";specs=specs||{};var object=specs.object;var fields={main:"",left:"",right:""};var propObj;var fieldProp;self.current.fields=[];self.current.sections={};var schemaFields=specs.schema?self.propAsFuncOrValue(specs.schema.fields):false;if(!specs.schema||!schemaFields){for(var prop in object){if(object.hasOwnProperty(prop)){propObj=$.extend({name:prop,type:"text",value:object[prop]},self.fields[prop],{value:object[prop]});fields.main+=self.renderObjectField(propObj)}}}else{var fhtml;(schemaFields||[]).map(function(prop){fhtml=self.renderObjectPropFieldUI(prop,specs);fields[renderFieldTo]+=fhtml})}var html='<div class="joe-object-content">'+fields.main+'<div class="clear"></div></div>';return fields};var rerenderingField=false;this.rerenderField=function(fieldname){rerenderingField=true;if($c.isArray(fieldname)){fieldname=fieldname.join(",")}fieldname.split(",").map(function(f){var fields=self.renderObjectPropFieldUI(f);$(".joe-object-field[data-name="+f+"]").parent().replaceWith(fields)});rerenderingField=false};self.renderObjectPropFieldUI=function(prop,specs){var fields="";var schemaspec=specs||self.current.schema;if($.type(prop)=="string"){var propObj=self.fields[prop]||self.current.fields.filter(function(f){return f.name==prop})[0]||{};var fieldProp=$.extend({},propObj);var propObj=extendField();if(self.constructObjectFromFields()[prop]!==undefined){fieldProp.value=self.constructObjectFromFields()[prop]}fields+=self.renderObjectField(propObj)}else if($.type(prop)=="object"&&prop.name){var fieldProp=$.extend({},prop||{});var propObj=extendField(prop.name);if(self.constructObjectFromFields()[prop.name]!==undefined){fieldProp.value=self.constructObjectFromFields()[prop.name]}fields+=self.renderObjectField(propObj)}else if(prop&&prop.extend){var fieldProp=$.extend({},self.fields[prop.extend]||{},prop.specs||{});var propObj=extendField(prop.extend);if(self.constructObjectFromFields()[prop.extend]!==undefined){fieldProp.value=self.constructObjectFromFields()[prop.extend]}fields+=self.renderObjectField(propObj)}else if($.type(prop)=="object"){if(prop.type){}else if(prop.label){fields+=self.renderContentLabel(prop)}else if(prop.section_start){fields+=self.renderPropSectionStart(prop)}else if(prop.section_end){fields+=self.renderPropSectionEnd(prop)}else if(prop.sidebar_start){renderFieldTo=prop.sidebar_side||prop.sidebar_start||"main"}else if(prop.sidebar_end){renderFieldTo="main"}}function extendField(propname){var propname=propname||prop;return $.extend({name:propname,type:"text"},{onblur:schemaspec.onblur,onchange:schemaspec.onchange,onkeypress:schemaspec.onkeypress,onkeyup:schemaspec.onkeyup},fieldProp,{value:self.current.object[propname]})}return fields};self.renderContentLabel=function(specs){var html="<div class='joe-content-label'>"+fillTemplate(specs.label,self.current.object)+"</div>";return html};self.renderPropSectionStart=function(prop){var show="";var hidden=false;if(prop.condition&&!prop.condition(self.current.object)){show=" no-section ";hidden=true}var secname=fillTemplate(prop.section_label||prop.section_start,self.current.object);var secID=prop.section_start;if(!secname||!secID){return""}var collapsed=self.propAsFuncOrValue(prop.collapsed)?"collapsed":"";var toggle_action="onclick='$(this).parent().toggleClass(\"collapsed\")'";var section_html='<div class="joe-content-section '+show+" "+collapsed+'" data-section="'+secID+'">'+'<div class="joe-content-section-label" '+toggle_action+">"+secname+"</div>"+'<div class="joe-content-section-content">';self.current.sections[secID]={open:true,name:secname,id:secID,hidden:hidden};return section_html};self.renderPropSectionEnd=function(prop){var secID=prop.section_end;var section=_getSection(secID);if(!secID||!(section&§ion.open)){return""}var section_html=__clearDiv__+"</div></div>";section.open=false;return section_html};function _getSection(secname){return self.current.sections[secname]}this.renderEditorFooter=function(specs){var fBM=new Benchmarker;specs=specs||this.specs||{};var menu=specs.minimenu||(listMode&&(specs.schema&&specs.schema.listmenu)||specs.listmenu)||multiEdit&&(specs.multimenu||specs.schema&&specs.schema.multimenu||__defaultMultiButtons)||specs.menu||__defaultObjectButtons;if(typeof menu=="function"){menu=menu()}var html='<div class="joe-panel-footer">'+'<div class="joe-panel-menu">';menu.map(function(m){html+=self.renderFooterMenuItem(m)},this);if(!specs.minimenu&&self.current.list&&$.type(self.current.data)=="array"){html+=self.renderFooterMenuItem(__selectAllBtn__);html+='<div class="joe-selection-indicator"></div>';html+=self.renderFooterMenuItem({label:"Multi-Edit",name:"multiEdit",css:"joe-multi-only",action:"getJoe("+self.joe_index+").editMultiple()"})}html+=__clearDiv__+"</div>"+"</div>";logit("joe footer generated in "+fBM.stop()+" secs");return html};this.renderFooterMenuItem=function(m){if(!m){logit("error loading footer menu button");return""}var display,action,html="";if(m.condition&&!m.condition(self.current.object,m)){return""}display=fillTemplate(self.propAsFuncOrValue(m.label||m.name),self.current.object);action=fillTemplate(self.propAsFuncOrValue(m.action),self.current.object)||"alert('"+display+"')";html+='<div class="joe-button joe-footer-button '+(m.css||"")+'" onclick="'+action+'" data-btnid="'+m.name+'" title="'+(m.title||"")+'">'+display+"</div>";return html};var preProp;var prePropWidths=0;this.renderObjectField=function(prop){if(prop.hasOwnProperty("condition")&&!self.propAsFuncOrValue(prop.condition)){return""}self.current.fields.push(prop);prop.value=self.propAsFuncOrValue(prop.value);if(prop.value==undefined&&prop["default"]!=undefined){prop.value=prop["default"]}var hidden="";var qHidden=self.propAsFuncOrValue(prop.hidden);if(qHidden){if(parseBoolean(qHidden)===undefined){var negated=qHidden[0]=="!";var hiddenPropVal=$.extend({},self.current.object,self.constructObjectFromFields())[qHidden.replace("!","")];hidden=negated^!!hiddenPropVal?"hidden":""}else{hidden="hidden"}}var required="";if(self.propAsFuncOrValue(prop.required)){required="joe-required"}var html="";var propdside=prop.sidebar_side||prop.side||renderFieldTo;if(preProp){if(preProp.width&&!prop.width){html+='<div class="clear"></div>'}}if(prop.width){html+='<div class="joe-field-container joe-fleft" style="width:'+prop.width+';" data-side="'+propdside+'">'}else{html+='<div class="joe-field-container" data-side="'+propdside+'">'}var fieldlabel=self.propAsFuncOrValue(prop.display||prop.label||prop.name);html+='<div class="joe-object-field '+hidden+" "+required+" "+prop.type+'-field " data-type="'+prop.type+'" data-name="'+prop.name+'">'+'<label class="joe-field-label">'+(required&&"*"||"")+fillTemplate(fieldlabel,self.current.object)+self.renderFieldTooltip(prop)+"</label>";html+=self.renderFieldComment(prop);if(self.current.userSpecs.multiedit){html+='<div class="joe-field-multiedit-toggle" onclick="$(this).parent().toggleClass(\'multi-selected\')"></div>';
}html+=self.selectAndRenderFieldType(prop);html+=self.renderGotoLink(prop);html+="</div>";html+="</div>";preProp=prop;return html};this.renderGotoLink=function(prop,style){var goto=self.propAsFuncOrValue(prop.goto);if(goto){var action="";if($.type(goto)=="string"){action=goto;action="getJoe("+self.joe_index+").gotoFieldItem(this,'"+goto+"');"}else{}var btnHtml="";switch(style||prop.type){case"select":btnHtml+='<div class="joe-button inline joe-view-button joe-iconed-button" onclick="'+action+'" title="view '+goto+'">view</div>';break}return btnHtml}else{return""}};this.gotoFieldItem=function(dom,schema){var fieldname=$(dom).parents(".joe-object-field").data("name");var field=self.getField(fieldname);var idprop=prop.idprop||self.getIDProp(schema);var values=self.getFieldValues(field.values);var id=$(dom).siblings(".joe-field").val();var object=values.filter(function(v){return v[idprop]==id})[0]||false;if(!object){return false}self.show(object,{schema:schema})};this.renderFieldComment=function(prop){var comment=self.propAsFuncOrValue(prop.comment);if(!comment){return""}var comment_html='<div class="joe-field-comment">'+comment+"</div>";return comment_html};this.renderFieldTooltip=function(prop){if(!prop.tooltip){return""}var tooltip_html='<span class="joe-field-tooltip" title="'+__removeTags(prop.tooltip)+'">i</span>';return tooltip_html};this.selectAndRenderFieldType=function(prop){var joeFieldBenchmarker=new Benchmarker;var html="";switch(prop.type.toLowerCase()){case"select":html+=self.renderSelectField(prop);break;case"multisort":case"multisorter":html+=self.renderMultisorterField(prop);break;case"sorter":html+=self.renderSorterField(prop);break;break;case"guid":html+=self.renderGuidField(prop);break;case"number":html+=self.renderNumberField(prop);break;case"int":html+=self.renderIntegerField(prop);break;case"code":html+=self.renderCodeField(prop);break;case"rendering":html+=self.renderRenderingField(prop);break;case"date":html+=self.renderDateField(prop);break;case"boolean":html+=self.renderBooleanField(prop);break;case"geo":case"map":html+=self.renderGeoField(prop);break;case"image":case"img":html+=self.renderImageField(prop);break;case"buckets":html+=self.renderBucketsField(prop);break;case"content":html+=self.renderContentField(prop);break;case"url":html+=self.renderURLField(prop);break;case"objectlist":html+=self.renderObjectListField(prop);break;case"objectreference":html+=self.renderObjectReferenceField(prop);break;case"tags":html+=self.renderTagsField(prop);break;case"color":html+=self.renderColorField(prop);break;case"group":html+=self.renderCheckboxGroupField(prop);break;case"uploader":html+=self.renderUploaderField(prop);break;case"preview":html+=self.renderPreviewField(prop);break;case"wysiwyg":html+=self.renderCKEditorField(prop);break;default:html+=self.renderTextField(prop);break}logit("Joe rendered "+(prop.name||"a field")+" in "+joeFieldBenchmarker.stop()+" seconds");return html};this.getActionString=function(evt,prop){var evt=prop[evt];if(!evt){return""}if($.type(evt)=="string"){return evt}var str=prop[evt]?" "+self.functionName(prop[evt])+"(this); ":"";return str};this.renderFieldAttributes=function(prop,evts){evts=evts||{};var bluraction="";var changeaction="";var keypressaction="";var keyupaction="";var rerender=prop.rerender?" getJoe("+self.joe_index+").rerenderField('"+prop.rerender+"'); ":"";var profile=self.current.profile;var disabled=profile.lockedFields.indexOf(prop.name)==-1?"":"disabled";if(evts.onblur||prop.onblur){bluraction='onblur="'+(evts.onblur||"")+" "+self.getActionString("onblur",prop)+'"'}if(evts.onchange||prop.onchange||rerender){changeaction='onchange="'+rerender+(evts.onchange||"")+" "+self.getActionString("onchange",prop)+'"'}if(evts.onkeypress||prop.onkeypress){keypressaction='onkeypress="'+(evts.onkeypress||"")+" "+self.getActionString("onkeypress",prop)+'"'}if(evts.onkeyup||prop.onkeyup){keyupaction='onkeyup="'+(evts.onkeyup||"")+" "+self.getActionString("onkeyup",prop)+'"'}return" "+keyupaction+" "+keypressaction+" "+bluraction+" "+changeaction+" "+disabled+" "};function _disableField(prop){return prop.hasOwnProperty("locked")&&self.propAsFuncOrValue(prop.locked)&&" disabled "||""}function cleanString(value){return((value||"")+"").replace(/\"/g,""")}this.renderTextField=function(prop){var autocomplete;if(prop.autocomplete&&prop.values){if(typeof prop.values=="function"){prop.values=prop.values(self.current.object)}if($.type(prop.values)!="array"){prop.values=[prop.values]}autocomplete=prop.autocomplete}var disabled=_disableField(prop);var fieldtype=prop.ftype&&"data-ftype='"+prop.ftype+"'"||"";var html=(autocomplete&&'<div class="joe-text-autocomplete-label"></div>'||"")+'<input class="joe-text-field joe-field '+(prop.skip&&"skip-prop"||"")+'" '+'type="text" '+disabled+' name="'+prop.name+'" value="'+cleanString(prop.value||"")+'" maxlength="'+(prop.maxlength||"")+'" '+self.renderFieldAttributes(prop)+(autocomplete&&' onkeyup="getJoe('+self.joe_index+').showTextFieldAutoComplete($(this));"'||"")+" "+fieldtype+"/>";if(autocomplete){html+='<div class="joe-text-autocomplete">';var ac_opt;var ac_template=autocomplete.template||"${name}";var ac_id,ac_title;for(var v=0,len=prop.values.length;v<len;v++){ac_opt=$.type(prop.values[v])=="object"?prop.values[v]:{id:prop.values[v],name:prop.values[v]};ac_title=fillTemplate(ac_template,ac_opt);ac_id=autocomplete.idprop&&ac_opt[autocomplete.idprop]||ac_opt._id||ac_opt.id||ac_opt.name;html+='<div class="joe-text-autocomplete-option" '+'onclick="getJoe('+self.joe_index+').autocompleteTextFieldOptionClick(this);" '+'data-value="'+ac_id+'">'+ac_title+"</div>"}html+="</div>"}return html};var textFieldAutocompleteHandler=function(e){var dom=e.target;$(".joe-text-autocomplete").removeClass("active");$("body").unbind("click",textFieldAutocompleteHandler)};this.showTextFieldAutoComplete=function(dom){$("body").unbind("click",textFieldAutocompleteHandler).bind("click",textFieldAutocompleteHandler);var autocomplete=dom.next(".joe-text-autocomplete");var content,show;needles=dom.val().toLowerCase().replace(/,/," ").split(" ");needles.removeAll("");autocomplete.find(".joe-text-autocomplete-option").each(function(i,obj){content=obj.textContent===undefined?obj.innerText:obj.textContent;show=self.checkAutocompleteValue(needles,content.replace(/,/," ").toLowerCase(),obj);$(obj).toggleClass("visible",show)});autocomplete.addClass("active")};this.hideTextFieldAutoComplete=function(dom){var autocomplete=dom.next(".joe-text-autocomplete");autocomplete.removeClass("active")};this.autocompleteTextFieldOptionClick=function(dom){var value=$(dom).data("value");$(dom).parent().prev(".joe-text-field").val(value);$(dom).parent().removeClass("active");$(dom).parent().siblings(".joe-reference-add-button").click()};this.checkAutocompleteValue=function(needles,haystack,dom,additive){var d=$(dom);if(!needles.length){return true}for(var n=0,tot=needles.length;n<tot;n++){if(haystack.indexOf(needles[n])==-1){return false}}return true};this.renderNumberField=function(prop){var disabled=_disableField(prop);var html='<input class="joe-number-field joe-field" type="text" '+disabled+' name="'+prop.name+'" value="'+(prop.value||"")+'" '+self.renderFieldAttributes(prop,{onblur:"getJoe("+self.joe_index+").returnNumber(this);"})+" />";return html};this.returnNumber=function(dom){if(!$(dom).val()){return}$(dom).val(parseFloat($(dom).val()))};this.renderIntegerField=function(prop){var html='<input class="joe-int-field joe-field" type="text" name="'+prop.name+'" value="'+(prop.value||"")+'" '+self.renderFieldAttributes(prop,{onblur:"getJoe("+self.joe_index+").returnInt(this);"})+" />";return html};this.returnInt=function(dom){if(!$(dom).val()){return}$(dom).val(parseInt($(dom).val()))};this.renderSelectField=function(prop){var disabled=_disableField(prop);var values=self.getFieldValues(prop.values);var valObjs=[];if($.type(values[0])!="object"){values.map(function(v){valObjs.push({name:v})})}else{valObjs=values}var selected;var multiple=prop.multiple?" multiple ":"";var selectSize=prop.size||valObjs.length*.5>10?10:valObjs.length/2;if(!prop.size&&!prop.multiple){selectSize=1}var html="<select "+disabled+' class="joe-select-field joe-field" name="'+prop.name+'" value="'+(prop.value||"")+'" size="'+selectSize+'"'+self.renderFieldAttributes(prop)+multiple+" >";var template=self.propAsFuncOrValue(prop.template)||"";var val;var optionVal;valObjs.map(function(v){optionVal=template?fillTemplate(template,v):v.display||v.label||v.name;val=prop.idprop&&v[prop.idprop]||v.value||v.name||"";if($.type(prop.value)=="array"){selected="";selected=prop.value.indexOf(val)!=-1?"selected":""}else{selected=prop.value==val?"selected":""}html+='<option value="'+val+'" '+selected+(self.propAsFuncOrValue(v.disabled)&&'disabled="disabled"'||"")+">"+optionVal+"</option>"});html+="</select>";return html};this.renderDateField=function(prop){var html='<input class="joe-date-field joe-field" type="text" '+_disableField(prop)+' name="'+prop.name+'" value="'+(prop.value||"")+'" '+self.renderFieldAttributes(prop)+" />";return html};this.renderGeoField=function(prop){var center=prop.value&&eval(prop.value)||prop.center||[40.513,-96.02];var zoom=prop.zoom||4;var mapDiv="joeGEO_"+prop.name;var val=prop.value||"";var html='<div class="joe-geo-map joe-field" name="'+prop.name+'" id="'+mapDiv+'" '+'data-center="'+JSON.stringify(center)+'" data-zoom="'+zoom+'" '+'data-value="'+val+'" '+'data-hideattribution="'+(prop.hideAttribution||"")+'" '+'onload="getJoe('+self.joe_index+').initGeoMap(this);"></div>'+'<input class="joe-geo-field joe-field" type="text" value="'+val+'" name="'+prop.name+'" '+_disableField(prop)+"/>"+'<script type="text/javascript">setTimeout(function(){getJoe('+self.joe_index+').initGeoMap("'+mapDiv+'");},100)</script>';return html};this.initGeoMap=function(id){var mapspecs=$("#"+id).data();var map=L.map(id).setView(mapspecs.center,mapspecs.zoom);L.tileLayer("http://{s}.tile.osm.org/{z}/{x}/{y}.png",{}).addTo(map);var searchControl=(new L.esri.Controls.Geosearch).addTo(map);if(mapspecs.hideattribution){$(".leaflet-control-attribution").hide()}map.on("click",self.onMapClick);map.prop=$("#"+id).attr("name");if(mapspecs.value){self.addMapIcon(map,mapspecs.value)}};this.onMapClick=function(e){var map=e.type=="click"?e.target:this.map;var ll=e&&e.latlng||this.getLatLng();map.setView(ll);if(e.type=="dragend"){}else if(map.marker){map.marker.setLatLng(ll)}else{self.addMapIcon(map,ll)}$("input[name="+map.prop+"]").val("["+ll.lat+","+ll.lng+"]")};this.addMapIcon=function(map,latlng,specs){specs=specs||{};var myIcon=L.icon({iconUrl:specs.icon||"/JsonObjectEditor/img/mapstar.png",iconSize:[30,30]});map.marker=L.marker(latlng,{draggable:true,icon:myIcon}).addTo(map);map.marker.map=map;map.marker.on("dragend",self.onMapClick)};this.renderBooleanField=function(prop){var profile=self.current.profile;var html='<label for="joe_checkbox-'+prop.name+'">'+'<input class="joe-boolean-field joe-field" type="checkbox" name="'+prop.name+'" id="joe_checkbox-'+prop.name+'" '+(prop.value==true&&"checked"||"")+self.renderFieldAttributes(prop)+" "+_disableField(prop)+"/> <small>"+(prop.label||"")+"</small></label>";return html};this.renderGuidField=function(prop){var profile=self.current.profile;var html='<input class="joe-guid-field joe-field" type="text" name="'+prop.name+'" value="'+(prop.value||cuid())+'" disabled />';return html};this.renderSorterField=function(prop){};this.renderImageField=function(prop){var html='<input class="joe-image-field joe-field" type="text" name="'+prop.name+'" value="'+(prop.value||"")+'" '+self.renderFieldAttributes(prop)+' onkeyup="_joe.updateImageFieldImage(this);" '+_disableField(prop)+"/>"+'<img class="joe-image-field-image" src="'+(prop.value||"")+'" />'+'<span class="joe-image-field-size"></span>';return html};this.updateImageFieldImage=function(dom,timeout){logit("img update");var src=$(dom).val();var img=$(dom).parent().find(".joe-image-field-image");self.updateImageSize(img);img.attr("src",src)};this.updateImageSize=function(img){var jqImg=$(img);jqImg.siblings(".joe-image-field-size").html(jqImg.width()+"w x "+jqImg.height()+"h")};this.renderMultisorterField=function(prop){var values=self.getFieldValues(prop.values);var valObjs=[];var val;var optionsHtml="";var selectionsHtml="";var idprop=prop["idprop"]||"id"||"_id";var template=prop.template||"${name} (${"+idprop+"})";var value=prop.value||[];var selectionsArray=Array(value.length);var li;function renderMultisorterOption(v){var html='<li data-id="'+v[idprop]+'" ondblclick="_joe.toggleMultisorterBin(this);">'+fillTemplate(template,v)+"</li>";return html}var val_index;if(!values){values=[]}values.map(function(v){li=renderMultisorterOption(v);val_index=value.indexOf(v[idprop]);if(val_index!=-1){selectionsArray[val_index]=li}else{optionsHtml+=li}});var selectionsHtml=selectionsArray.join("");var height=prop.height&&"style='max-height:"+prop.height+";'"||"";var html='<div class="joe-multisorter-field joe-field" name="'+prop.name+'" data-ftype="multisorter" data-multiple="'+(prop.allowMultiple||"false")+'">'+'<div class="joe-filter-field-holder"><input type="text"class="" onkeyup="_joe.filterSorterOptions(this);"/></div>'+'<p class="joe-tooltip"> double click or drag item to switch columns.</p>'+'<ul class="joe-multisorter-bin options-bin" '+height+">"+optionsHtml+"</ul>"+'<ul class="joe-multisorter-bin selections-bin" '+height+">"+selectionsHtml+"</ul>"+__clearDiv__+"</div>";return html};this.filterSorterOptions=function(dom){var sorterBM=new Benchmarker;var query=$(dom).val().toLowerCase();$(dom).parents(".joe-field").find(".joe-multisorter-bin.options-bin").find("li").each(function(){$(this).toggle($(this).html().toLowerCase().indexOf(query)!=-1)});logit("found results for: "+query+" in "+sorterBM.stop()+" secs")};this.toggleMultisorterBin=function(dom){var id=$(dom).data("id");var parent=$(dom).parents(".joe-multisorter-bin");var multisorter=parent.parents(".joe-multisorter-field");var target=parent.siblings(".joe-multisorter-bin");var newDom=parent.find("li[data-id="+id+"]").detach();target.prepend(newDom)};this.renderBucketsField=function(prop){var values=self.getFieldValues(prop.values);var valObjs=[];var val;var bucketCount=typeof prop.bucketCount=="function"?prop.bucketCount():prop.bucketCount||3;var optionsHtml="";var bucketsHtml=[];var value=prop.value||[[],[],[]];for(var i=0;i<bucketCount;i++){bucketsHtml.push("");if(!value[i]){value.push([])}}var idprop=prop[idprop]||"id"||"_id";var template=prop.template||"${name} <br/><small>(${"+idprop+"})</small>";var lihtml;var selected;var foundItem;var bucketItem;var selectedIDs=[];for(var i=0;i<bucketCount;i++){for(var li=0;li<value[i].length;li++){bucketItem=value[i][li];foundItem=values.filter(function(v){return v[idprop]==bucketItem})[0]||false;if(!foundItem){foundItem={};foundItem[idprop]=li}selectedIDs.push(bucketItem);lihtml='<li data-id="'+foundItem[idprop]+'" >'+fillTemplate(template,foundItem)+'<div class="joe-bucket-delete cui-block joe-icon" onclick="$(this).parent().remove()"></div></li>';bucketsHtml[i]+=lihtml}}values.map(function(v){lihtml='<li data-id="'+v[idprop]+'" >'+fillTemplate(template,v)+'<div class="joe-bucket-delete cui-block joe-icon" onclick="$(this).parent().remove()"></div></li>';selected=false;if(selectedIDs.indexOf(v)==-1||prop.allowMultiple){optionsHtml+=lihtml}});function renderBucket(id){return'<ul class="joe-buckets-bin selections-bin">'+bucketsHtml[id]+"</ul>"}var html='<div class="joe-buckets-field joe-field" name="'+prop.name+'" data-ftype="buckets">'+'<div class="joe-filter-field-holder"><input type="text"class="" onkeyup="_joe.filterBucketOptions(this);"/></div>'+'<div class="joe-buckets-field-holder" style="width:25%;">'+'<ul class="joe-buckets-bin options-bin '+(prop.allowMultiple&&"allow-multiple"||"")+'">'+optionsHtml+"</ul>"+"</div>"+'<div class="joe-buckets-field-holder" style="width:75%;">';bucketsHtml.map(function(b,i){html+=renderBucket(i)});html+=__clearDiv__+"</div>"+__clearDiv__+"</div>";return html};this.filterBucketOptions=function(dom){var query=$(dom).val().toLowerCase();$(dom).parents(".joe-buckets-field").find(".options-bin").find("li").each(function(){$(this).toggle($(this).html().toLowerCase().indexOf(query)!=-1)});logit(query)};this.renderContentField=function(prop){var html="";var itemObj=self.current.object;var idProp=self.getIDProp();var constructedItem=self.constructObjectFromFields();if(!self.current.object[idProp]||constructedItem[idProp]&&constructedItem[idProp]==self.current.object[idProp]){itemObj=constructedItem;if(self.current.object[idProp]&&constructedItem[idProp]==self.current.object[idProp]){if(rerenderingField){itemObj=$.extend({},self.current.object,constructedItem)}else{itemObj=$.extend({},constructedItem,self.current.object)}}}try{if(prop.run){html+=prop.run(itemObj,prop)||""}else if(prop.template){html+=fillTemplate(prop.template,itemObj)}}catch(e){return"error rendering field:"+e}return html};this.renderFieldListItem=function(item,contentTemplate,schema,specs){var schemaobj=self.schemas[schema];var idprop=schemaobj.idprop||"_id";var specs=$.extend({deleteButton:false,expander:null,gotoButton:false,itemMenu:false},specs);var hasMenu=specs.itemMenu&&specs.itemMenu.length;var clickablelistitem=!(specs.gotoButton||hasMenu);var deleteButton='<div class="joe-delete-button joe-block-button left" '+'onclick="$(this).parent().remove();"> </div>';var expanderContent=renderItemExpander(item,specs.expander);var click=!clickablelistitem?">":"onclick=\"goJoe(_joe.search('${"+idprop+"}')[0],{schema:'"+schema+"'})\">";var html=fillTemplate('<div class="'+(clickablelistitem&&"joe-field-list-item"||"joe-field-item")+(specs.deleteButton&&" deletable"||"")+(specs.gotoButton&&" gotobutton"||"")+(specs.itemMenu&&" itemmenu"||"")+(specs.expander&&" expander expander-collapsed"||"")+'" '