if(typeof (JSON)=="undefined"){JSON=function(){function f(n){return n<10?"0"+n:n}Date.prototype.toJSON=function(key){return this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z"};String.prototype.toJSON=function(){return this};Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()};var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapeable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapeable.lastIndex=0;return escapeable.test(string)?'"'+string.replace(escapeable,function(a){var c=meta[a];if(typeof c==="string"){return c}return"\\u"+("0000"+(+(a.charCodeAt(0))).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&"toJSON" in value&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(typeof value.length==="number"&&!(value.propertyIsEnumerable("length"))){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}return{quotedForm:quote,stringify:function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})},parse:function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+(+(a.charCodeAt(0))).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}}()}Array.prototype.indexOf=function(D,B){for(var C=0,A=this.length;C<A;C++){if(B?B(this[C],D):(this[C]==D)){return C}}return -1};Array.prototype.indexOfKey=function(D,F,E){for(var C=0,A=this.length;C<A;C++){var B=this[C];if(B){B=B[D]}if(B&&(E?(E(B,F)==0):(B==F))){return C}}return -1};Array.prototype.find=function(E,C){for(var D=0,B=this.length;D<B;D++){var A=this[D];if(C?C(A,E):(A==E)){return A}}return null};Array.prototype.findAll=function(F,D){var C=[];for(var E=0,B=this.length;E<B;E++){var A=this[E];if(D?D(A,F):(A==F)){C.push(A)}}return C};Array.prototype.findAllByKey=function(E,F){var C=[];for(var D=0,B=this.length;D<B;D++){var A=this[D];if(A[E]==F){C.push(A)}}return C};Array.prototype.findByKey=function(D,E){for(var C=0,B=this.length;C<B;C++){var A=this[C];if(A[D]==E){return A}}return null};Array.prototype.map=function(F,B){var A=[];for(var C=0,D=this.length;C<D;C++){var E=F(this[C],C,this);if(E!=null||B){A[A.length]=E}}return A.concat.apply([],A)};Array.prototype.extractColumn=function(C,D){var B=[];for(var E=0,A=this.length;E<A;E++){var F=this[E][C];if(F!=null||D){B.push(F)}}return B};Array.prototype.remove=function(D,B){var E=this.length;for(var C=E-1;C>=0;C--){var A=this[C];if(B?B(A,D):(A==D)){Array.prototype.splice.call(this,C,1);break}}return this};Array.prototype.moveItem=function(C,E){var A=null;if(C<E){var B=this.slice(0,E);var D=B.splice(C,1);A=B.concat(D,this.slice(E))}else{if(C>E){var D=this.splice(C,1);A=this.slice(0,E).concat(D,this.slice(E))}else{A=[].concat(this)}}return A};Array.prototype.sortByKey=function(B,A){this.sort(function(F,D){var E=F&&F[B],G=D&&D[B];var C=E<G?-1:(E>G?1:0);if(A){C*=-1}return C});return this};if(!Array.prototype.filter){Array.prototype.filter=function(B,E){var A=this.length;if(typeof B!="function"){throw new TypeError()}var D=new Array();var E=arguments[1];for(var C=0;C<A;C++){if(C in this){var F=this[C];if(B.call(E,F,C,this)){D.push(F)}}}return D}}String.format=function(A){var B=arguments.length>1?Array.prototype.slice.call(arguments,1):[];return A.replace(/\{(\d+)\}/g,function(C,D){return B[D]})};String.jsEscape=function(A){if(!A){return A}var D="",E=["#",'"',"'","\r","\n","\\"];for(var C=0;C<A.length;C++){var F=A.charAt(C);var B=E.indexOf(F);if(B>=0){D+="\\u"+("0000"+A.charCodeAt(C).toString(16)).slice(-4)}else{D+=F}}return D};String.prototype.htmlUnescape=function(){var F=this;var E="";var B=F.length;for(var C=0;C<B;C++){var G=F.charAt(C);if(G!="&"){E+=G}else{if(C<=B-5&&F.substring(C,C+5)=="&amp;"){E+="&";C+=4}else{if(C<=B-4&&F.substring(C,C+4)=="&lt;"){E+="<";C+=3}else{if(C<=B-4&&F.substring(C,C+4)=="&gt;"){E+=">";C+=3}else{if(C<=B-6&&F.substring(C,C+6)=="&quot;"){E+='"';C+=5}else{if(C<B-1&&F.charAt(C+1)=="#"){var A=F.indexOf(";",C+1);var D=parseInt(F.substring(C+2,A));E+=String.fromCharCode(D);C=A}else{E+=G}}}}}}}return E};String.prototype.htmlEscape=function(){var F=13,C=10,A=9;var E=new RegExp("\\&|<|>|\"|'|\\?","g");var B={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","?":"&#63;"};var D=this.replace(E,function(G){return B[G]});return D};String.htmlEscape=function(A){return A!=null&&typeof (A)!="undefined"?A.toString().htmlEscape():A};String.htmlUnescape=function(A){return A!=null&&typeof (A)!="undefined"?A.toString().htmlUnescape():A};String.prototype.trim=function(){if(this.length>0){var C,A;var B=" \t\r\n",D=this.length;for(C=0;C<D&&B.indexOf(this.charAt(C))>=0;C++){}for(A=D-1;A>=0&&B.indexOf(this.charAt(A))>=0;A--){}if(C<=A){return this.substring(C,A+1)}}return""};String.prototype.startsWith=function(B){if(this==B){return true}var A=Math.min(this.length,B.length);return B&&(this.substring(0,A)==B)};String.prototype.endsWith=function(B){var A=Math.min(this.length,B.length);return B&&(this.substring(this.length-A)==B)};String.prototype.replaceAll=function(C,B){var A=this.replace(new RegExp(C,"g"),B);return A};String.trim=function(A){return A?A.trim():null};String.startsWith=function(B,A){return B?B.startsWith(A):false};String.endsWith=function(B,A){return B?B.endsWith(A):false};Number.prototype.zeroPad=function(A){var D=this.toString();var B=D.length;for(var C=B;C<A;C++){D="0"+D}return D};Number.prototype.formatWithCommas=function(){var C=this.toString();var B="";var F=C.length;var D=C.indexOf(".");if(D>0){F=D;B=C.substring(D)}for(var E=F-1;E>=0;E--){var A=C.charAt(E);if((F-1-E)%3==0&&E<F-1&&E>=0){B=","+B}B=A+B}return B};Number.prototype.formatAsCurrency=function(G){var B=this;if(isNaN(B)){B=0}var A=B<0;B=Math.floor((Math.abs(B)+0.005)*100)/100;var I=new String(B);var F=I.indexOf(".");var H=F>=0?I.substring(0,F):I;var C=F>=0?I.substring(F):"";var J="";for(var E=H.length-1,D=0;E>=0;E--,D++){J=((E>0&&D%3==2)?",":"")+H.charAt(E)+J}if(C==""){J+=".00"}else{if(C.length==2){J+=C+"0"}else{J+=C}}J=A?("("+G+J+")"):(G+J);return J};Date.MILLISECONDS_PER_DAY=86400000;Date.daysInMonth=[31,28,31,30,31,30,31,31,30,31,30,31];Date.monthNames=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];Date.weekdayNames=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];Date.parseDate=function(L,H){var F=-1,M,O;if(typeof (Date.__dateREs)=="undefined"){Date.__dateREs=[/^([0-9]{1,2})\/([0-9]{1,2})\/([0-9]{2,4})/,/^([0-9]{1,2})\-(\w{3})-([0-9]{2,4})/,/^([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})/,/^([0-9]{4})\-([0-9]{1,2})\-([0-9]{1,2})([ T]([0-9]{2}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,3})?)?Z?$/]}var D=Date.__dateREs[0],C=Date.__dateREs[1],B=Date.__dateREs[2],E=Date.__dateREs[3];var K=E.exec(L);if(K&&K.length>=8){if(K[1]=="0000"&&K[2]=="00"&&K[3]=="00"){return null}var N=K[5]!=null;var G=N?String.format("{0}/{1}/{2} {3}:{4}:{5}",K[2],K[3],K[1],K[5],K[6],K[7]):String.format("{0}/{1}/{2}",K[2],K[3],K[1]);return new Date(G)}var K=D.exec(L);if(K&&K.length>=4){M=parseInt(K[1],10);O=parseInt(K[2],10);F=parseInt(K[3],10);if(H){var Q=O;O=M;M=Q}M-=1;if(O>31||M>11){return null}}else{K=C.exec(L);if(K&&K.length>=4){O=parseInt(K[1],10);M=Date.monthNames.indexOf(K[2]);if(M<0){return null}F=parseInt(K[3],10)}else{K=B.exec(L);if(K&&K.length>=4){O=parseInt(K[3],10);M=parseInt(K[2],10)-1;F=parseInt(K[1],10)}}}if(K){if(F<50){F+=2000}else{if(F<100){F+=1900}}L=L.substring(K[0].length);var I=/ ([0-9]{1,2})([:\.]([0-9]{1,2}))?([:\,]([0-9]{1,2}))?( ?[ap]m)?$/i;K=I.exec(L);if(K&&K.length>=4){var S=parseInt(K[1],10),P=K[3]?parseInt(K[3],10):0,G=K[5]?parseInt(K[5],10):0;if(S>23||P>59||G>59){return null}if(K[6]&&S>12){return null}var J=K[6]&&K[6].toLowerCase().trim()=="pm"?"pm":"am";if(J=="pm"){S=S<12?(S+12):12}else{if(S==12){S=0}}return new Date(F,M,O,S,P,G)}return new Date(F,M,O)}var R=new Date(L);var A=R.getTime();if(!isNaN(A)){return R}return null};Date.prototype.closestPreviousWeekday=function(B){if(isNaN(B)||B<0||B>6){return null}var A=this.getDay();if(A<B){A+=7}return new Date(this.getTime()-(A-B)*86400000)};Date.prototype.format=function(A){var B=this.getHours();var C={yyyy:this.getFullYear(),MM:(this.getMonth()+1).zeroPad(2),MMM:Date.monthNames[this.getMonth()],dd:this.getDate().zeroPad(2),EEE:Date.weekdayNames[this.getDay()],HH:B.zeroPad(2),hh:(B>12?(B-12):B).zeroPad(2),mm:this.getMinutes().zeroPad(2),ss:this.getSeconds().zeroPad(2),a:B<=11?"am":"pm"};return A.replace(/(yyyy)|(MMM)|(MM)|(dd)|(EEE)|(HH)|(hh)|(mm)|(ss)|(a)/g,function(D){return C[D]})};Function.prototype.createDelegate=function(C,B,A){var D=this;return function(){var F=B||arguments;if(A===true){F=Array.prototype.slice.call(arguments,0);F=F.concat(B)}else{if(typeof A=="number"){F=Array.prototype.slice.call(arguments,0);var E=[A,0].concat(B);Array.prototype.splice.apply(F,E)}}return D.apply(C||window,F)}};if(typeof (sf)=="undefined"){sf={App:{},core:{},data:{},db:{},util:{}}}apsona=sf;sf.extend=function(A,C,B){var D=function(){};D.prototype=C.prototype;A.prototype=new D();A.prototype.constructor=A;A.superclass=C.prototype;if(C.prototype.constructor==Object.prototype.constructor){C.prototype.constructor=C}if(B){for(var E in B){A[E]=B[E]}}};sf.override=function(A,B,C){if(typeof (C)=="function"){C.super_=A[B];A[B]=C}};sf.doEval=function(aString){eval("__evalResult = "+aString);return __evalResult};sf.util.copyOf=function(A,D){if(!A){return A}var F={};if(D&&D instanceof Array){for(var E=D.length-1;E>=0;E--){var C=D[E];if(Object.hasOwnProperty.call(A,C)){var B=A[C];if(B!==null&&B!==undefined){F[C]=B}}}}else{for(var C in A){if(Object.hasOwnProperty.call(A,C)){F[C]=A[C]}}}return F};sf.util.copyProperties=function(D,F,C){if(!D||!F){return }if(C&&C instanceof Array){for(var E=C.length-1;E>=0;E--){var B=C[E];if(Object.hasOwnProperty.call(D,B)){var A=D[B];if(A!==null&&A!==undefined){F[B]=A}}}}else{for(var B in D){if(Object.hasOwnProperty.call(D,B)){F[B]=D[B]}}}};sf.util.isPrimitiveType=function(A){var B=typeof (A);return B!="string"&&B!="number"&&B!="boolean"&&!(B instanceof Date)};sf.util.sort=function(B,A){if(B&&B instanceof Array&&B.length>=2){if(A){B.sort(A)}else{var C=B[0];if(C instanceof Date){B.sort(function(G,F){var E=G?G.getTime():0,D=F?F.getTime():0;return E<D?-1:(E==D?0:1)})}else{B.sort()}}}return B};sf.util.StringWriter=function(){var A=[];this.write=function(B){if(typeof (B)!="undefined"&&B!=null){A.push(typeof (B)=="string"?B:B.toString())}return this};this.toString=function(){return A.join("")};this.reset=function(){A=[];return this}};sf.util.writeJSON=function(G,M,I){var A=typeof (I)=="string";var K=G;var C=typeof (K);if(K&&typeof (K.getClass)=="function"){var H=String(K.getClass().getName());if(H=="java.lang.String"){C="string"}else{if(H=="java.lang.Double"||H=="java.lang.Float"||H=="java.math.BigDecimal"){K=new Number(K.doubleValue());C="number"}else{if(H=="java.lang.Integer"||H=="java.lang.Long"||H=="java.math.BigInteger"){K=new Number(K.longValue());C="number"}else{if(H=="java.util.Date"||H=="java.sql.Timestamp"){K=new Date(K.getTime());C="date"}}}}}switch(String(C)){case"string":M.write('"'+String.jsEscape(String(K))+'"');break;case"number":case"boolean":case"null":M.write(K);break;case"function":M.write("function(){...}");break;case"object":default:if(!K){M.write("null");return"null"}if("writeJSON" in K&&typeof (K.writeJSON)=="function"){K.writeJSON(M,A?(I+"    "):undefined)}else{if(K instanceof Date){M.write('"'+K.format("yyyy-MM-dd HH:mm:ss")+'"');C="date"}else{if(K instanceof Array||typeof (K.length)==="number"&&!(K.propertyIsEnumerable("length"))){M.write("[");var J=A&&K.length>=1&&typeof (K[0])=="object";if(J){M.write("\n")}for(var E=0,B=K.length;E<B;E++){if(J){M.write(I+"    ")}sf.util.writeJSON(K[E],M,A?(I+"    "):undefined);if(E<B-1){M.write(","+(A?" ":""))}M.write(J?"\n":" ")}M.write(J?I:"");M.write("]");C="array"}else{var F=function(N){var P=0;for(var O in N){var Q=typeof (N[O]);if(Object.hasOwnProperty.call(N,O)&&sf.util.isPrimitiveType(N[O])){return false}P++;if(P>8){return false}}return true};var L=A&&!F(K);M.write("{");if(L){M.write("\n")}var D=0;for(k in K){if(Object.hasOwnProperty.call(K,k)&&typeof (K[k])!=="function"){if(L){M.write(I+"    ")}D++;if(D>1){M.write(","+(A?" ":""))}M.write('"'+String.jsEscape(String(k))+'":'+(A?" ":""));sf.util.writeJSON(K[k],M,A?(I+"    "):undefined);if(L){M.write("\n")}}}M.write((L?I:"")+"}");C="object"}}}}return C};sf.util.toJSONString=function(A,C){var B=new sf.util.StringWriter();sf.util.writeJSON(A,B,C);return B.toString()};sf.util.parseCSV=function(L,K,A){K=K||",";A=A||'"';var C=new RegExp(String.format("([{0}\015\012] *)",K),"g");var H=new RegExp(String.format("({0}{0})*{0}([{1}\015\012] *)",A,K),"g");var N=0;var D=[],B=[];function O(Q){var P=0,R=Q.length;for(;P<R;P++){if(Q[P]!=""){break}}if(P<R){D.push(Q)}}do{var G=(L.charAt(N)==A)?H:C;G.lastIndex=N;var M=G.exec(L);if(!M||!M.length){break}var J=G.lastIndex-M[M.length-1].length;var I=L.substring(N,J);if(I.charAt(0)==A){I=I.substring(1,I.length-1).replaceAll(A+A,A)}else{I=I.trim()}B.push(I);var F=M[0];if(F.indexOf(K)<0){O(B);B=[]}N=G.lastIndex;if(L.charAt(N)=="\n"&&F=="\r"){N++}}while(true);if(N<L.length){var E=L.substring(N).trim();if(E){B.push(E)}}O(B);return D};sf.util.ArrayOfMaps=function(C,B){if(typeof (C)!="string"){throw"ArrayOfMaps: Constructor expects a string as first argument, but found "+typeof (C)}var D=C;this.push=function(F){if(!F||typeof (F[D])=="undefined"){throw"ArrayOfMaps.push: cannot find key field named '"+_keyName+"'"}Array.prototype.push.call(this,F);this[F[C]]=B[A];return this};this.concat=function(){return new sf.util.ArrayOfMaps(_keyName,Array.prototype.concat.apply(this,arguments))};this.pop=function(){var F=Array.prototype.pop.call(this);delete this[F[D]];return F};this.shift=function(){var F=Array.prototype.shift.call(this);delete this[F[D]];return F};this.slice=function(){return new sf.util.ArrayOfMaps(_keyName,Array.prototype.slice.apply(this,arguments))};this.splice=function(){var H=new sf.util.ArrayOfMaps(_keyName,Array.prototype.splice.apply(this,arguments));var G=H?H.length:0;for(var F=0;F<G;F++){delete this[H[j][D]]}return H};this.unshift=function(){Array.prototype.unshift.apply(this,arguments);var H=arguments.length;for(var G=0;G<H;G++){var F=arguments[G];this[F[D]]=F}return this};this.indexOfKey=function(F){return this.indexOf(F,function(H,G){return H[D]==G})};for(var A=0,E=B?B.length:0;A<E;A++){this.push(B[A])}};sf.util.ArrayOfMaps.prototype=new Array();sf.data.PhoneNumber=function(B,C,E,H){var D=String.trim(C);var G=String.trim(E);var F=String.trim(B)||"1";var A=String.trim(H);if(F=="1"&&/^[0-9]{7}$/.test(G)){G=G.substring(0,3)+"-"+G.substring(3)}this.areaCode=function(){return D};this.number=function(){return G};this.countryCode=function(){return F};this.extension=function(){return A};this.isNorthAmerican=function(){return(!F||F=="1")&&/^[0-9]{3}$/.test(D)&&/^[0-9]{3}-[0-9]{4}$/.test(G)};this.toString=function(){var I=(D?("("+D+") "):"")+(G||"")+(A?(" x "+A):"");return(!F||F=="1")?I:String.format("+{0} {1}",F,I)}};sf.data.PhoneNumber.buildFrom=function(B,D){if(!B){return new sf.data.PhoneNumber(null,null,B)}B=B.trim();if(B.startsWith("+")){var E=B.substring(1).split(/[^\d]+/);if(E[0]!="1"){return new sf.data.PhoneNumber(E[0],E[1],E[2],E[3])}}var A=/^(\+?1[ \-\.])?\(?([0-9]{3})\)? *[\-\.]?([0-9]{3}) *[\-\.]?([0-9]{4})( *[ x] *([0-9]+))?$/;var E=A.exec(B);if(E&&E.length){return new sf.data.PhoneNumber("1",String.trim(E[2]),E[3]+"-"+E[4],E[6])}A=/^(\+?1[ \-\.])?\(?([0-9]{3})\)? *[\-\.]?([0-9]+)( *[ x] *([0-9]+))?$/;var E=A.exec(B);if(E&&E.length){return new sf.data.PhoneNumber("1",String.trim(E[2]),E[3],E[5])}var F=/^\+([0-9]+)[ \-\.] *([0-9]+)[ \-\.]*([0-9]*)( *[ x] *([0-9]+))?$/;E=F.exec(B);if(E&&E.length){function C(H,G){return H&&G?(H+G):(H?H:G)}return new sf.data.PhoneNumber(E[1],C(E[2],E[3]),E[5])}return new sf.data.PhoneNumber(null,null,B)};sf.data.Picklist=function(B){var E=B;var D={};var A={};for(var C=0,F=B&&B.length||0;C<F;C++){D[B[C].value]=B[C];A[B[C].text]=B[C]}this.getItemByValue=function(G){return D[G]};this.getItemByText=function(G){return A[G]};this.getItemText=function(H){var G=D[H];return G&&G.text};this.getItemValue=function(H){var G=A[H];return G&&G.value};this.getItems=function(){return E}};sf.data.TypeInfo={DEFAULT_DATE_FORMAT:"MM/dd/yyyy",DEFAULT_CURRENCY_SYMBOL:"$",typeNames:function(){if(!this._names){this._names=[];for(var A in this._desc){this._names.push(A)}}return this._names},comparisonOperators:function(A){if(A=="phone"||A=="emailAddress"||A=="url"||A=="imageUrl"||A=="text"){return this._desc.string.compareOps}var B=this._desc[A];return B&&B.compareOps||sf.data.TypeInfo._defaultComparisonOps},label:function(A){if(A=="text"){return"Text"}var B=this._desc[A];return B&&B.label||A},_defaultColWidthPx:{date:80,datetime:120,picklist:80,number:60,integer:60,currency:60,timeofday:60,phone:120,emailAddress:120,url:40,imageUrl:40,"boolean":40,duration:40},defaultColWidthPx:function(A){return sf.data.TypeInfo._defaultColWidthPx[A]||120},converter:function(A){if(A=="text"){A="string"}var B=this._desc[A];return B&&B.converter},comparator:function(A){var B=null;switch(A){case"date":case"datetime":B=function(D,C){if(D==undefined){D=new Date(0)}if(C==undefined){C=new Date(0)}return D<C?-1:(D>C?1:0)};break;case"picklist":case"reference":B=function(F,E){var D=F instanceof Array&&F.length>=2?F[1]:(F?F.toString():null);var C=E instanceof Array&&E.length>=2?E[1]:(E?E.toString():null);return D<C?-1:(D==C?0:1)};break;case"string":case"text":case"emailAddress":case"url":case"imageUrl":case"zipCode":case"boolean":B=function(D,C){if(D==undefined){D=""}if(C==undefined){C=""}return D<C?-1:(D>C?1:0)};break;default:B=function(D,C){return D<C?-1:(D>C?1:0)};break}return B},htmlFormatter:function(A){if(A=="text"){A="string"}var B=this._desc[A];return B?B.toHTML:(function(C){return C})},storableForm:function(A,C){var B=C==null?"":C;switch(A){case"picklist":case"reference":if(C instanceof Array&&C.length==2){B=C[0]}break;case"date":case"datetime":if(C&&C instanceof Date){B=C.format("yyyy-MM-dd HH:mm:ss")}break}return B==null?"":(typeof (B)=="string"?B:B.toString())},toHTML:function(A,B){if(A=="text"){A="string"}var C=this._desc[A];return C?C.toHTML(B):String(B)},toString:function(A,B){if(A=="text"){A="string"}var C=this._desc[A];return C?C.toString(B):String(B)},allowedConversions:function(A){var B={string:["emailAddress","phone","string","text","imageUrl","url","zipCode"],emailAddress:["emailAddress","phone","string","text","imageUrl","url","zipCode"],phone:["emailAddress","phone","string","text","imageUrl","url","zipCode"],string:["emailAddress","phone","string","text","imageUrl","url","zipCode"],text:["emailAddress","phone","string","text","imageUrl","url","zipCode"],imageUrl:["emailAddress","phone","string","text","imageUrl","url","zipCode"],url:["emailAddress","phone","string","text","imageUrl","url","zipCode"],zipCode:["emailAddress","phone","string","text","imageUrl","url","zipCode"],date:["date","datetime"],datetime:["date","datetime"],number:["number","currency"]};return B[A]||[A]},_desc:{string:{label:"String",compareOps:[{value:"starts with",text:"starts with"},{value:"ends with",text:"ends with"},{value:"eq",text:"equals"},{value:"lt",text:"less than"},{value:"le",text:"at most"},{value:"ge",text:"at least"},{value:"gt",text:"greater than"},{value:"ne",text:"not equal to"},{value:"contains",text:"contains"},{value:"does not contain",text:"does not contain"},{value:"does not start with",text:"does not start with"},{value:"does not end with",text:"does not end with"},{value:"is null",text:"is empty"},{value:"is not null",text:"is not empty"}],converter:function(A){return A!=null?A.toString().trim():null},toHTML:function(A){return A==null?"":String(A).htmlEscape().replaceAll("\n","<br/>")},toString:function(A){return A==null?"":String(A)}},currency:{label:"Currency",converter:function(C){if(typeof (C)!="string"){return typeof (C)=="number"?C:null}var B=C.toString();var A=/^\-?([^0-9]*)([0-9,]+(\.[0-9]*)?)$/.exec(B);if(A&&A.length>=3){B=A[2].replaceAll(",","");return B.indexOf(".")>=0?parseFloat(B,10):parseInt(B,10)}return null},toHTML:function(A){return sf.data.TypeInfo.toString("currency",A)},toString:function(A){if(A==null){return""}if(typeof (A)=="string"){A=A.trim();if(A==""){return""}A=parseFloat(A)}return !isNaN(A)&&typeof (A)=="number"?A.formatAsCurrency(sf.data.TypeInfo.DEFAULT_CURRENCY_SYMBOL):A}},number:{label:"Fractional number",converter:function(A){if(typeof (A)=="string"&&/^\-?[0-9,]+(\.[0-9]*)?$/.test(A.toString())){A=A.replaceAll(",","");return A.indexOf(".")>=0?parseFloat(A,10):parseInt(A,10)}return typeof (A)=="number"?A:null},toHTML:function(A){return sf.data.TypeInfo.toString("number",A)},toString:function(A){if(A==null){return""}return typeof (A)=="number"?A.formatWithCommas():String(A)}},integer:{label:"Whole number",converter:function(A){if(typeof (A)=="string"&&/^\-?[0-9,]+$/.test(A.toString())){return parseInt(A.replaceAll(",",""),10)}return typeof (A)=="number"?A:null},toHTML:function(A){return sf.data.TypeInfo.toString("integer",A)},toString:function(A){if(typeof (A)=="undefined"||A==null){return""}return typeof (A)=="number"?A.toString():A}},date:{label:"Date",compareOps:[{value:"eq",text:"equals"},{value:"lt",text:"earlier than"},{value:"le",text:"not later than"},{value:"ge",text:"not earlier than"},{value:"gt",text:"later than"},{value:"ne",text:"not equal to"},{value:"is null",text:"is empty"},{value:"is not null",text:"is not empty"}],converter:function(A){var B=Date.parseDate(A,sf.data.TypeInfo.DEFAULT_DATE_FORMAT);return B!=null?B:null},toHTML:function(A){return sf.data.TypeInfo.toString("date",A)},toString:function(A){if(A==null){return""}return(A&&typeof (A.format)=="function")?A.format(sf.data.TypeInfo.DEFAULT_DATE_FORMAT):A}},datetime:{label:"Date & time",compareOps:[{value:"eq",text:"equals"},{value:"lt",text:"earlier than"},{value:"le",text:"not later than"},{value:"ge",text:"not earlier than"},{value:"gt",text:"later than"},{value:"ne",text:"not equal to"},{value:"is null",text:"is empty"},{value:"is not null",text:"is not empty"}],converter:function(A){var B=Date.parseDate(A,sf.data.TypeInfo.DEFAULT_DATE_FORMAT);return B!=null?B:null},toHTML:function(A){return sf.data.TypeInfo.toString("datetime",A)},toString:function(A){if(typeof (A)=="undefined"||A==null){return""}return(A&&typeof (A.format)=="function")?A.format(sf.data.TypeInfo.DEFAULT_DATE_FORMAT+" hh:mm a"):A}},timeofday:{label:"Time of day",converter:function(H){var F=new RegExp("^([0-9]{1,2})([:.][0-9]{1,2})?([:.][0-9]{1,2})? *(am|pm)?$","i");var G=F.exec(H);if(G){var E=0,B=0,D=0,A=false;E=parseInt(G[1],10);if(G[2]){B=parseInt(G[2].substring(1),10)}if(G[3]){D=parseInt(G[3].substring(1),10)}if(G[4]){A=G[4].toLowerCase()=="pm"}if(A){if(E>=13){return null}E+=12}return E<24&&B<60&&D<60?(E*3600+B*60+D):null}if(/^[0-9]+$/.test(H)){var C=parseInt(H);if(!isNaN(C)){return C}}if(typeof (H)=="number"){return H}return null},toHTML:function(A){return sf.data.TypeInfo.toString("timeofday",A)},toString:function(E){if(E==null){return""}if(typeof (E)=="string"){var B=parseInt(E,10);if(isNaN(B)){return E}E=B}if(typeof (E)=="number"){var D=Math.floor(E/3600);var A=Math.floor((E%3600)/60);var C=E%60;return D<12?String.format("{0}:{1} am",D.zeroPad(2),A.zeroPad(2)):String.format("{0}:{1} pm",(D>12?D-12:D).zeroPad(2),A.zeroPad(2))}return E}},duration:{label:"Duration",converter:function(B){if(B){B=B.trim()}var D=0,A=0,C=0;var E=/^([0-9]{1,2})(:[0-9]{1,2})(:[0-9]{1,2})?$/.exec(B);if(E){D=parseInt(E[1],10);A=parseInt(E[2].substring(1),10);if(E[3]){C=parseInt(E[3].substring(1),10)}return A<60&&C<60?(D*3600+A*60+C):null}E=/^([0-9]{1,2}h)?( *[0-9]{1,2}m)?( *[0-9]{1,2}s)?$/.exec(B);if(E){if(E[1]){D=parseInt(E[1])}if(E[2]){A=parseInt(E[2].trim())}if(E[3]){C=parseInt(E[3].trim())}return A<60&&C<60?(D*3600+A*60+C):null}return sf.data.TypeInfo.converter("number")(B)},toHTML:function(A){return sf.data.TypeInfo.toString("duration",A)},toString:function(E){if(E==null){return""}if(typeof (E)=="string"){var B=parseInt(E,10);if(isNaN(B)){return E}E=B}if(typeof (E)=="number"){var D=Math.floor(E/3600);var A=Math.floor((E%3600)/60);var C=E%60;return String.format("{0}:{1}:{2}",D.zeroPad(2),A.zeroPad(2),C.zeroPad(2))}return E}},phone:{label:"Phone number",converter:function(B){var A=sf.data.PhoneNumber.buildFrom(B);return A!=null?A:null},toHTML:function(A){return sf.data.TypeInfo.toString("phone",A)},toString:function(A){return A?A.toString():""}},emailAddress:{label:"Email address",converter:function(A){A=A?A.toString().trim():A;var B=/^[a-z0-9_\-\+\.]+@[a-z0-9_\-\+]+(\.[a-z0-9_\-\+]+)*$/i;return B.test(A)?A.toLowerCase():null},toHTML:function(A){return sf.data.TypeInfo.toString("emailAddress",A)},toString:function(A){return A?A.toString():""}},zipCode:{label:"US zip code",converter:function(B){var A=/^[0-9]{5}(\-[0-9]{4})?$/;return A.test(B)?B:null},toHTML:function(A){return A?A.toString():""},toString:function(A){return A?A.toString():""}},url:{label:"Web URL",converter:function(B){var A=new RegExp("(http(s)?://)?[w:.-/]+","i");return A.test(B)?B:null},toString:function(A){if(!value||typeof (value)!="string"){return""}if(!value.startsWith("http://")&&!value.startsWith("https://")){value="http://"+value}return value},toHTML:function(A){if(!A||typeof (A)!="string"){return""}if(!A.startsWith("http://")&&!A.startsWith("https://")){A="http://"+A}return String.format('<a title="{0} (opens in new window)" class="sf-weblink" href="{0}" target="_blank">&nbsp;</a>',A)}},imageUrl:{label:"URL for image",converter:function(B){var A=new RegExp("(http(s)?://)?[w:.-/]+","i");return A.test(B)?B:null},toString:function(A){return(!A||typeof (A)!="string")?"":A},toHTML:function(A){return !A||typeof (A)!="string"?"":String.format('<img src="{0}" class="sf-imageref" />',A)}},"boolean":{label:"Yes/No",compareOps:[{value:"eq",text:"is"}],converter:function(A){switch(typeof (A)){case"string":A=A.toLowerCase();return(A==="1"||A=="y"||A=="yes"||A=="true")?true:false;case"boolean":return A}return null},toString:function(A){return A?"1":""},toHTML:function(A){return A?'<span class="sf-boolean">&radic;</span>':""}},picklist:{label:"Picklist",compareOps:[{value:"in",text:"is"},{value:"not in",text:"is not"},{value:"is null",text:"is empty"},{value:"is not null",text:"is not empty"}],converter:function(A){return A},toString:function(A){if(!A){return""}if(A instanceof Array){return A.length>=2?A[1]:(A.length==1?A[0]:"")}return A},toHTML:function(A){return sf.data.TypeInfo.toString("picklist",A)}},multipick:{label:"Multi-choice picklist",compareOps:[{value:"includes",text:"includes"},{value:"is null",text:"is empty"},{value:"is not null",text:"is not empty"}],converter:function(A){return A},toString:function(A){if(!A){return""}if(A instanceof Array){return A.length>=2?A[1]:(A.length==1?A[0]:"")}return A},toHTML:function(A){return sf.data.TypeInfo.toString("picklist",A)}},reference:{label:"Reference",converter:function(A){return A},toHTML:function(A){return sf.data.TypeInfo.toString("reference",A)},toString:function(A){if(!A){return""}if(A instanceof Array){return A.length>=2?A[1]:(A.length==1?A[0]:"")}return null}}},_defaultComparisonOps:[{value:"lt",text:"less than"},{value:"le",text:"at most"},{value:"eq",text:"equals"},{value:"ge",text:"at least"},{value:"gt",text:"greater than"},{value:"ne",text:"not equal to"},{value:"is null",text:"is empty"},{value:"is not null",text:"is not empty"}],_names:null};if(!window.sf){sf={}}if(!sf.core){sf.core={}}if(!sf.data){sf.data={}}if(!sf.ui){sf.ui={page:{}}}if(!sf.uix){sf.uix={}}if(!sf.util){sf.util={}}sf.core.reportError=function(A){if(typeof (console)!="undefined"){console.log("internalerror",A);console.trace()}alert("Internal error: "+A+"\n\nPlease report this error to bugs@apsona.com")};sf.util.isUpperCase=function(A){return A&&A.toUpperCase()==A};sf.util.isLowerCase=function(A){return A&&A.toLowerCase()==A};sf.util.stackTrace=function(){var C=/function\W+([\w-]+)/i;var D=arguments.callee;var B="";while(D){B+=(C.exec(D))[1]+"(";for(var A=0;A<D.arguments.length-1;A++){B+="'"+D.arguments[A]+"', "}if(arguments.length>0){B+="'"+D.arguments[A]+"'"}B+=")\n";D=D.arguments.callee.caller}return B};sf.util.printableForm=function(C){if(!C){return C}var B=0,E=[],G=C.length;for(var D=1;D<G;D++){var F=C.charAt(D);if(F=="-"||F=="_"){E.push(C.substring(B,D));B=D+1}else{if(sf.util.isUpperCase(F)&&sf.util.isLowerCase(C.charAt(D-1))){E.push(C.substring(B,D));B=D}}}if(B<G-1){E.push(C.substring(B))}var A=(E.map(function(I,H){return H>=1?I.toLowerCase():(I.charAt(0).toUpperCase()+I.substring(1).toLowerCase())}).join(" "));return A};sf.util.makeIdentifier=function(A){return A?A.replace(/[^A-Za-z0-9_\-]/g,"_"):A};sf.util.makeUID=function(B){function A(){var C=new Date();return Math.floor((C.getTime()-new Date(2009,4,1,0,0,0).getTime())/1000).toString(35)}return B?(B.replace(/[^A-Za-z0-9_\-]/g,"_")+"_"+A()):B};sf.util.truncatedForm=function(A,B){if(typeof (B)=="undefined"){B=32}if(typeof (A)=="string"){if(A.length>B){A=String.format('<span title="{0}" class="sf-truncated-string">{1}...</span>',A.htmlEscape(),A.substring(0,B).htmlEscape())}else{A=A.htmlEscape()}}return A};sf.util.interceptMethod=function(B,D,A,C){B[D+"_without_"+A]=B[D];B[D]=C};sf.__id=0;sf.allocateId=function(){return"sf_id_"+(++sf.__id)};sf.nextGUID=function(){return(++sf.__id)};sf.core.Template=function(D,C){var H=0;var B=["function (model) { \nvar result = [];\nwith (model){\n"],E="";var F=/<%([\s\S]*?)%>|\$\{(.*?[^\\])\}/g;D.replace(F,function(L,J,I,K){E=D.substring(H,K);if(J){B.push("result.push ('"+String.jsEscape(E)+"');\n");if(!J.startsWith("--")&&!J.endsWith("--")){B.push(J+"\n")}H=K+J.length+4}else{B.push("result.push ('"+String.jsEscape(E)+"');\n");B.push("result.push ("+I+");\n");H=K+I.length+3}});B.push("result.push ('"+String.jsEscape(D.substring(H))+"');\n}\nreturn result.join ('');\n}");var A=B.join("");try{this.process=sf.doEval(A)}catch(G){if(typeof (sf.core.reportError)=="function"){sf.core.reportError(String.format("Template {1} expansion error:\n{0}\n",G.message,C||""))}else{throw G}}this.codeString=function(){return A}};sf.core.RecordList=function(C,F){if(typeof (C)!="string"){throw"RecordList: Constructor expects a string as first argument, but found "+typeof (C)}var B=F||[];var E={};function A(){E={};for(var G=0,H=B.length;G<H;G++){E[B[G][C]]=B[G]}}A();this.get=function(G){return B[G]};this.getByKey=function(G){return E[G]};this.getKeyMap=function(){return sf.util.copyOf(E)};this.filter=function(){return Array.prototype.filter.apply(B,arguments)};this.indexOf=function(){return Array.prototype.indexOf.apply(B,arguments)};this.map=function(){return Array.prototype.map.apply(B,arguments)};this.push=function(G){if(!G||typeof (G[C])=="undefined"){alert("RecordList.push: cannot find key field named '"+C+"'");return this}B.push(G);E[G[C]]=G;return this};this.pop=function(){var G=B.pop();delete E[G[C]];return G};this.shift=function(){var G=B.shift();delete E[G[C]];return G};this.size=function(){return B.length};this.slice=function(){return new sf.data.RecordList(C,Array.prototype.slice.apply(B,arguments))};this.sort=function(G){B.sort(G);return this};this.splice=function(){var G=Array.prototype.splice.apply(B,arguments);A();return G};this.unshift=function(){Array.prototype.unshift.apply(B,arguments);var I=arguments.length;for(var H=0;H<I;H++){var G=arguments[H];E[G[C]]=G}return this};this.indexOfKey=function(G){return B.indexOf(G,function(I,H){return I[C]==H})};this.indexOf=function(H,G){return B.indexOf(H,G)};this.find=function(I,G){var H=this.indexOf(I,G);return H>=0?B[H]:null};this.toJSONString=function(){return sf.util.toJSONString(B)};var D={"starts with":function(H,G){return H&&G&&H.toString().toLowerCase().startsWith(G.toLowerCase())},"ends with":function(H,G){return H&&G&&H.toString().toLowerCase().endsWith(G.toLowerCase())},eq:function(H,G){return typeof (H)=="string"&&typeof (G)=="string"?H.toLowerCase()==G.toLowerCase():H==G},lt:function(H,G){return H<G},le:function(H,G){return H<=G},ge:function(H,G){return H>=G},gt:function(H,G){return H>G},ne:function(H,G){return H!=G},contains:function(H,G){return H&&G&&H.toString().indexOf(G)>=0},"does not contain":function(H,G){return H&&G&&H.toString().indexOf(G)<0},"does not start with":function(H,G){return H&&G&&!H.toString().startsWith(G)},"does not end with":function(H,G){return H&&G&&!H.toString().endsWith(G)},"is null":function(G){return G==null||typeof (G)=="undefined"},"is not null":function(G){return G!=null&&typeof (G)!="undefined"}};this.applyFilter=function(K){var H=[];var I=function(O,L){for(var M=0;M<O.length;M++){var N=O[M];var R=L[N.fieldId];var P=D[N.op];var Q=P?P(R,N.value):false;if(!Q){return false}}return true};for(var J=0,G=this.size();J<G;J++){if(!K||!K.length||I(K,this.get(J))){H.push(J)}}return H};return this};sf.core.Observable=function(){var A={};this.bind=function(B,E){var C=A[B];if(!C){C={};A[B]=C}var D=E._sf_fid;if(!D){D=sf.nextGUID();E._sf_fid=D}C[D]=E;return this};this.unbind=function(B,E){var D=E?E._sf_fid:null;if(D){var C=A[B];if(C){delete C[D]}}return this};this.notifyListeners=function(B){var C=A[B];if(C){for(var D in C){C[D].apply(this,arguments)}}return this}};sf.data.Field=function(A,D){this.metadata=D;this.objectName=D.name;this.getChoicesList=function(F,E,G){switch(this.fieldType){case"picklist":if(typeof (G)=="function"){G(this.choicesList)}return this.choicesList;case"reference":if(!this.metadata.dataService){sf.core.reportError(String.format("sf.data.Field: Field {0}: No data service available.",this.fieldId));return null}return this.metadata.dataService.getChoicesForReference(this.objectName,this.refersToObject,E,null,G)}return null};this.fromString=function(E){if(this.fieldType=="multipick"){return new sf.data.MultiPickValue(this.picklistItems,E)}return sf.data.Field.fromString(E,this.fieldType)};var C=null;this.lookupChoicesList=function(G){var H=this.choicesList?this.choicesList.length:0;if(H>0){if(!C){C={};for(var E=0;E<H;E++){var F=this.choicesList[E];C[F.value]=F.text}}return C[G]}return null};this.toHTML=function(F){var E=typeof (F);switch(this.fieldType){case"choicesList":return !F||!F.length?"":F.map(function(G){return G.text}).join("<br/>");case"reference":if(!F){return""}if(F instanceof Array){return F.length>=2?F[1]:(F.length==1?F[0]:"")}return F;case"picklist":if(!F){return""}if(F instanceof Array){return F.length>=2?F[1]:(F.length==1?F[0]:"")}return this.lookupChoicesList(F);case"multipick":if(!F){return""}if(F instanceof sf.data.MultiPickValue){return F.toHTML()}return F.toString();case"string":case"text":if(this.renderAsHTML){return F?String(F).replace(/<script/ig,"&lt;script"):F}return sf.data.TypeInfo.htmlFormatter(this.fieldType)(F);default:return sf.data.TypeInfo.htmlFormatter(this.fieldType)(F)}};for(var B in A){this[B]=A[B]}if(this.fieldType=="multipick"){this.picklistItems=new sf.data.Picklist(this.choicesList)}};sf.data.Field.fromString=function(B,A){switch(A){case"date":case"datetime":return(typeof (B)=="string")?Date.parseDate(B):B;case"number":case"integer":case"currency":case"duration":case"timeofday":case"boolean":if(typeof (B)=="string"){return sf.data.TypeInfo.converter(A)(B)}return B;case"boolean":return B&&B!=="0"&&String(B).toLowerCase()!=="n"?true:false;case"phone":return sf.data.PhoneNumber.buildFrom(B);case"address":return new sf.data.Address(B[0],B[1],B[2],B[3],B[4]);default:return B}};sf.data.Metadata=function(D){for(var A in D){this[A]=D[A]}if(typeof (this.created)=="string"){this.created=Date.parseDate(this.created)}if(typeof (this.modified)=="string"){this.modified=Date.parseDate(this.modified)}var E=this.fields?this.fields.length:0;var C=[];for(var B=0;B<E;B++){C[B]=new sf.data.Field(this.fields[B],this);if(C[B].systemGenerated){C[B].disallowEdit=true}}this.fields=new sf.core.RecordList("fieldId",C);this.addField=function(F){if(!F){return null}if(this.fields.getByKey(F.fieldId)){return String.format("A field with name '{0}' already exists.",F.fieldId)}this.fields.push(F);return null};this.deleteField=function(F){var G=this.fields.indexOfKey(F);if(G>=0){this.fields.splice(G,1);return true}return false};this.getFieldIdMap=function(){return this.fields.getKeyMap()};this.getFieldWithId=function(F){return this.fields.getByKey(F)};this.getFieldIndex=function(F){return this.fields.indexOfKey(F)};this.buildArrayFromMap=function(I){if(!I){return null}var F=[];for(var G=0,H=this.fields.size();G<H;G++){F.push(I[this.fields[G].fieldId])}return F};this.buildMapFromArray=function(G){if(!G){return null}E=G.length;if(E!=0&&E!=this.fields.size()){throw (String.format("data.metadata.buildMapFromArray: Invalid length {0}, expecting {1}",E,this.fields.size()))}var H={};for(var F=0;F<E;F++){if(F in G){H[this.fields.get(F).fieldId]=G[F]}}return H};this.buildDataRecord=function(F,J){var K=Math.min(fields.length,J.length);var G=new Array(K);for(var I=0;I<K;I++){var H=this.getFieldWithId(F[I]);G[I]=H.fromString(J[I])}return G}};sf.data.objectMetadata=new sf.data.Metadata({name:"sys.object_descriptor",label:"Table",pluralLabel:"Tables",keyFieldId:"name",displayFieldId:"label",fields:[{fieldId:"name",label:"Name",fieldType:"string",disallowEmpty:true,disallowEdit:true,validator:function(A){return !A?{errorMessage:"Please provide a name for the object."}:(A.match(/^[a-z][a-z_\-0-9]+$/i)?{result:A}:{errorMessage:"Please use only alphabets, numerics, underscores and dashes."})}},{fieldId:"label",label:"Label",fieldType:"string",disallowEmpty:true},{fieldId:"pluralLabel",label:"Plural label",fieldType:"string",disallowEmpty:true},{fieldId:"displayFieldId",label:"Display field",fieldType:"reference",refersToObject:"sys.field_descriptor",disallowEmpty:true,editorType:"picklistEditor"},{fieldId:"keyFieldId",label:"Key field",fieldType:"reference",refersToObject:"sys.field_descriptor",disallowEmpty:true,disallowEdit:true,editorType:"picklistEditor"},{fieldId:"description",label:"Description",fieldType:"text"},{fieldId:"created",label:"Created date",fieldType:"datetime",systemGenerated:true},{fieldId:"modified",label:"Modified date",fieldType:"datetime",systemGenerated:true}]});sf.data.fieldMetadata=new sf.data.Metadata({name:"sys.field_descriptor",label:"Field",pluralLabel:"Fields",description:"The properties of a particular field of an object",keyFieldId:"fieldId",displayFieldId:"label",fields:[{fieldId:"fieldId",label:"Name",fieldType:"string",disallowEmpty:true,disallowEdit:true,validator:function(A){if(!A){return{errorMessage:"Please provide a field name."}}if(A.match(/^[a-z][a-z_\-0-9]+$/i)){return{result:A}}return{errorMessage:"Please use only alphabets, numerics, underscores and dashes."}}},{fieldId:"label",label:"Label",fieldType:"string",disallowEmpty:true},{fieldId:"shortLabel",label:"Short label",fieldType:"string"},{fieldId:"fieldType",label:"Data type",fieldType:"picklist",disallowEmpty:true,choicesList:[{value:"string",text:"String"},{value:"text",text:"Text"},{value:"date",text:"Date"},{value:"datetime",text:"Date & time"},{value:"timeofday",text:"Time of day"},{value:"duration",text:"Duration"},{value:"boolean",text:"Yes/No"},{value:"picklist",text:"Picklist"},{value:"multipick",text:"Multi-choice picklist"},{value:"phone",text:"Phone"},{value:"address",text:"Address"},{value:"emailAddress",text:"Email address"},{value:"imageUrl",text:"Image URL"},{value:"url",text:"Web URL"},{value:"zipCode",text:"US zip code"},{value:"integer",text:"Whole number"},{value:"number",text:"Fractional number"},{value:"currency",text:"Currency"},{value:"reference",text:"Reference"}]},{fieldId:"choicesList",label:"Picklist values",fieldType:"choicesList"},{fieldId:"defaultValue",label:"Default value",fieldType:"string"},{fieldId:"description",label:"Description",fieldType:"text"},{fieldId:"disallowEmpty",label:"Required",fieldType:"boolean"},{fieldId:"disallowEdit",label:"Read only",fieldType:"boolean"},{fieldId:"refersToObject",label:"Reference to",fieldType:"reference",refersToObject:"sys.object_descriptor",disallowEmpty:true,disallowEdit:true,editorType:"picklistEditor"},{fieldId:"objectName",label:"Object name",fieldType:"string",systemGenerated:true},{fieldId:"created",label:"Created date",fieldType:"datetime",systemGenerated:true},{fieldId:"modified",label:"Modified date",fieldType:"datetime",systemGenerated:true},{fieldId:"systemGenerated",label:"Built-in",fieldType:"boolean",systemGenerated:true}]});sf.data.Service=function(){this.getTypeNames=function(){sf.core.reportError("sf.data.Service: getTypeNames unimplemented, must be provided by derived class.");return null};this.getMetadata=function(B){sf.core.reportError("sf.data.Service: getMetadata unimplemented, must be provided by derived class.");return null};this.getRecords=function(C,B,D){sf.core.reportError("sf.data.Service: getRecords unimplemented, must be provided by derived class.");return null};this.storeRecords=function(C,B,D){sf.core.reportError("sf.data.Service: storeRecord unimplemented, must be provided by derived class.");return null};this.deleteRecords=function(B,D,C){sf.core.reportError("sf.data.Service: deleteRecords unimplemented, must be provided by derived class.");return null};this.getFieldMetadata=function(){return sf.data.FieldMetadata};var A=50;this.getChoicesForReference=function(C,H,B,F,G){var D=this.getMetadata(H);if(!D){return null}var E={neededFields:[{fieldId:D.keyFieldId},{fieldId:D.displayFieldId}],sort:[{fieldIndex:1,direction:+1}],recordCount:A,filter:F};this.getRecords(H,E,function(J){var K=D.getFieldWithId(D.displayFieldId).fieldType;var I=J.records.map(function(N){var M=N[D.displayFieldId];var L=K=="string"?M:sf.data.TypeInfo.toString(K,M);return{value:N[D.keyFieldId],text:L}});if(G){G(I,J.totalRecords)}});return null};this.storableForm=function(C,B){switch(B){case"reference":case"picklist":if(!C){return""}if(C instanceof Array){return C.length>=1?C[0]:""}return C;default:return C}};this.storableRecord=function(G,C){var D={},F=this.getMetadata(C);for(var B in G){var E=F.getFieldWithId(B);if(E){D[B]=this.storableForm(G[B],E.fieldType)}}return D};this.buildArrayFromMap=function(H,E){if(!H){return null}var B=[];for(var D=0,G=E.fields.length;D<G;D++){var C=E.fields[D];var F=H[C.fieldId];B.push(this.storableForm(F,C.fieldType))}return B};this.buildMapFromArray=function(D,C){if(!D){return null}n=D.length;if(n!=0&&n!=this.fields.length){throw (String.format("data.Service.buildMapFromArray: Invalid length {0}, expecting {1}",n,this.fields.length))}var E={};for(var B=0;B<n;B++){if(B in D){E[this.fields[B].fieldId]=D[B]}}return E}};sf.data.InMemoryService=function(B){sf.data.InMemoryService.superclass.constructor.call(this,arguments);var I=B.metadataMap;for(var E in I){if(Object.hasOwnProperty.call(I,E)){var K=I[E];K.dataService=this}}var H={};if(B.dataMap){var N=B.recordFormat=="map";for(var E in B.dataMap){if(Object.hasOwnProperty.call(B.dataMap,E)){var J=I[E],A=[],M=B.dataMap[E];for(var F=0;F<M.length;F++){A.push(N?M[F]:J.buildMapFromArray(M[F]))}H[E]=new sf.core.RecordList(J.keyFieldId,A)}}}this.getTypeNames=function(){var P=[];for(var O in I){P.push(O)}return P};this.getMetadata=function(O){return I[O]};function D(P,O){if(!O||!O.length){return P}P.sort(function(W,V){for(var T=0;T<O.length;T++){var R=O[T];var U=W[R.fieldId],S=V[R.fieldId];var Q=(U<S?-1:(U>S?1:0))*R.direction;return Q}})}this.recordsOfType=function(O,P){return H[O]};this.getReferenceDisplayValue=function(Q,O,U,T){var V=U.refersToObject;var S=this.getMetadata(V);var R=this.recordsOfType(V).getByKey(T);var P=R?R[S.displayFieldId]:null;return[T,P]};function L(O,Y,U,b){if(!U||!U.length){return O}var c=[],P=U.length;for(var V=0,Q=O.length;V<Q;V++){var T=O[V],R={};for(var W=0;W<P;W++){var X=U[W].fieldId;var a=null,S=T[X],Z=Y.getFieldWithId(X);switch(Z.fieldType){case"reference":if(S){a=b.getReferenceDisplayValue(Y,T,Z,S)}else{a=[S,""]}break;default:a=S;break}R[X]=a}c[V]=R}return c}this.getRecords=function(Z,U,V){var P=this.recordsOfType(Z,U&&U.filter);if(!P||P.size()<=0){var W={totalRecords:0,records:[]};if(V){V(W)}return W}var X=this.getMetadata(Z);var Q=P.applyFilter(U.filter);var Y=[];for(var S=0;S<Q.length;S++){Y[S]=P.get(Q[S])}if(U.sort&&U.sort.length){for(var S=0;S<U.sort.length;S++){var a=U.sort[S].fieldIndex;if(a>=0&&a<U.neededFields.length){U.sort[S].fieldId=U.neededFields[a].fieldId}}D(Y,U.sort)}Y=L(Y,X,U.neededFields,this);var O=U.firstRecord||0;var T=U.recordCount||Y.length;var R=Math.min(O+T,Y.length);var b={totalRecords:Y.length,records:Y.slice(O,R)};if(V){V(b)}return b};var G=function(P,O){switch(O){case"reference":case"picklist":if(!P){return""}if(P instanceof Array){return P.length>=1?P[0]:""}return P;default:return P}};var C=function(O,P){var Q=H[P];return P+"_"+(Q&&Q.size()||0)};this.storeRecords=function(Q,P,R){var O=this._doStoreRecords(Q,P,R);if(R){R(P)}this.notifyListeners(eventName,Q,P,this);return O};this._doStoreRecords=function(c,R,Z){var b=this.getMetadata(c);if(!b){return null}var P=b.keyFieldId;if(!P){return null}var Q=this.recordsOfType(b.name);var Y=R?R.length:0;var W="insert";for(var T=0;T<Y;T++){var U=R[T];var S=U[P];var a=typeof (S)!="undefined"?Q.getByKey(S):null;if(a){for(var X in U){var V=b.getFieldWithId(X).fieldType;a[X]=this.storableForm(U[X],V)}W="update"}else{var O=U[b.keyFieldId];if(!O){U[b.keyFieldId]=O=C(U,c)}H[c].push(sf.util.copyOf(U))}}return R};this.deleteRecords=function(P,R,Q){var O=this._doDeleteRecords(P,R,Q);this.notifyListeners("delete",P,O,this);if(Q){Q(O)}return O};this._doDeleteRecords=function(P,T,R){if(!T||!T.length){return null}var V=this.recordsOfType(P,T);if(!V){return null}var O=V.applyFilter(T);var U=O.length;if(U<=0){return null}var Q=[];for(var S=U-1;S>=0;S--){Q[S]=V.splice(O[S],1)[0]}return Q};sf.core.Observable.call(this)};sf.extend(sf.data.InMemoryService,sf.data.Service);sf.data.RemoteService=function(C){sf.data.RemoteService.superclass.constructor.call(this,arguments);var A=C.baseURL;var E=C.sessionId;var G=C.metadataMap;var H=null;if(G){H=[];for(var D in G){H.push(D);G[D].dataService=this}}var F=function(O,L,M,N){var K=String.format("{0}/{1}/{2}.js",A,O,L==null?"metadata":("data/"+L));return J(K,M,O=="get"?"get":"post",N)};var I=function(M,K,L){};var J=function(M,K,Q,P){var O=function(S){var R=S;if(typeof (S)=="string"){if(S.trim()==""){S="null"}R=sf.doEval("("+S+")")}if(R&&R.error){if(R.error.startsWith("Session timed out")){sf.App.enableWindowCloseWarning(false);window.location.href="/";return }var T="Server error:\n"+R.error+"\n\n\nPlease notify bugs@apsona.com";sf.ui.Util.reportError(T)}else{P(R)}};var N="";if(E){N+="sessionId="+E}if(K){var L=sf.util.toJSONString(K);N+=(E?"&":"?")+"parameters="+escape(L)}return jQuery.ajax({url:M,data:N,dataType:"text",type:Q=="get"&&N.length<4000?"get":"post",success:O,timeout:20000,error:I})};this.invoke=function(K,L,M){J(A+K,L,K.startsWith("/put/")?"put":"get",M);return this};this.getUrlContent=function(M,N){var K=A+M;var L=document.forms["sf-default-form"];L.action=K;L.elements.sessionId.value=E;L.elements.parameters.value=encodeURIComponent(sf.util.toJSONString(N));L.submit()};this.getTypeNames=function(K){return sf.data.ObjectRegistry.objectNames()};this.getMetadata=function(K){var L=G?G[K]:sf.data.ObjectRegistry.get(K);L.dataService=this;return L};this.getRecords=function(L,K,M,N){F("get",L,K,function(T){if(N){M(T);return null}var S=L.indexOf("/");if(S>0){L=L.substring(0,S)}var X=this.getMetadata(L);if(!X){sf.core.reportError("RemoteService: Cannot find metadata for '"+L+"'");return null}var V=null;if(T.fieldIds){V=T.fieldIds.map(function(Y){return X.getFieldWithId(Y)})}else{V=K.neededFields.map(function(Z,Y){return X.getFieldWithId(Z.fieldId)})}var W=T&&T.records?T.records.length:0,Q=V.length;var P=[];for(var U=0;U<W;U++){P[U]={};for(var R=0;R<Q;R++){var O=V[R];P[U][O.fieldId]=O.fromString(T.records[U][R])}}if(!T){T={}}T.records=P;M(T);return null}.createDelegate(this));return null};var B=100;this.invokeServiceIncremental=function(L,R,N){if(typeof (N)=="function"){var P=sf.allocateId();var T=sf.allocateId();var O=encodeURIComponent(sf.util.toJSONString(R));var M="cb__"+sf.allocateId();window[M]=function(U){N(U)};var K=String.format('              <div>                <iframe name="{0}" class="sf-progress-frame" src="about:blank"></iframe>                <form method="post" name="{1}" action="{6}{2}" target="{0}">                  <input type="hidden" name="sessionId" value="{3}" />                  <input type="hidden" name="parameters" value="{4}" />                  <input type="hidden" name="callback" value="{5}" />                  <input type="hidden" name="_dontBuffer" value="1" />                  <input type="hidden" name="showProgress" value="1" />                </form>              </div>',P,T,L,E,O,M,A);var Q=$(K);$(document.body).append(Q);$("form",Q)[0].submit();$("iframe",Q).load(function(){N(null);setTimeout(function(){Q.remove();window[M]=undefined;try{delete window[M]}catch(U){}},50)});return }var S=document.forms["sf-progress-form"];S.action=L;S.elements.sessionId.value=E;S.elements.parameters.value=encodeURIComponent(sf.util.toJSONString(R));S.submit()};this.storeRecords=function(T,M,V){var R=M!=null?M.length:0;var S=this.getMetadata(T);var P={};for(var O=0;O<R;O++){var N=M[O];for(var Q in N){var U=N[Q];if(!P[Q]){P[Q]=S.getFieldWithId(Q).fieldType}var L=P[Q];if(U instanceof Date){U=U.format("yyyy-MM-dd HH:mm:ss")}else{if(L=="boolean"){switch(typeof (U)){case"string":U=U.toLowerCase();U=(U=="true"||U=="y"||U=="yes"||U=="1")?"1":"0";break;case"boolean":default:U=U?"1":"0"}}else{if(U instanceof Array&&U.length>=2&&(L=="picklist"||L=="reference")){U=U[0]}}}N[Q]=U}}if(R>=B){var K=String.format("{0}/put/data/{1}.html",A,T);this.invokeServiceIncremental(K,M)}else{F("put",T,M,V)}};this.deleteRecords=function(K,M,L){F("delete",K,M,L);return this}};sf.extend(sf.data.RemoteService,sf.data.Service);sf.data.ObjectRegistryClass=function(){var F=10;var B=0;sf.data.ObjectRegistryClass.superclass.constructor.call(this,{metadataMap:{"sys.object_descriptor":sf.data.objectMetadata,"sys.field_descriptor":sf.data.fieldMetadata}});var C=[];this.initialize=function(G){this.refresh(G)};var A=function(O){var L={};var K=[];for(var I in O){var N=O[I];if(!N||!N.fields){continue}for(var J=0,H=N.fields.length;J<H;J++){var M=N.fields[J];if(M.fieldType=="reference"&&(!M.refersToObject||!O[M.refersToObject])){M.fieldType="string"}}K.push(new sf.data.Metadata(O[I]))}C=sf.core.RecordList("name",K);var G=C.filter(function(P){return P.name.startsWith("builtin.")});B=G.length};var E=function(){return(C.size()-B<F)};this.canCreateNewObject=function(){var G=E();if(!G){sf.ui.Util.reportError(String.format("Cannot create any more tables: Max {0} allowed",F))}return G};this.refresh=function(G){A(G);this.notifyListeners("metadataChanged",this)};this.get=function(G){switch(G){case"sys.object_descriptor":return sf.data.objectMetadata;case"sys.field_descriptor":return sf.data.fieldMetadata;default:return C.getByKey(G)}};var D=[{fieldId:"uuid",label:"x-Record UID",fieldType:"string",shortLabel:"x-Id",systemGenerated:true,disallowEmpty:true},{fieldId:"created",label:"x-Created date",fieldType:"datetime",shortLabel:"x-Created",systemGenerated:true,disallowEmpty:true},{fieldId:"created_by",label:"x-Creator",fieldType:"string",shortLabel:"x-Creator",systemGenerated:true,disallowEmpty:true},{fieldId:"modified",label:"x-Modified date",fieldType:"datetime",shortLabel:"x-Modified",systemGenerated:true},{fieldId:"modified_by",label:"x-Modified by",fieldType:"string",shortLabel:"x-Modified by",systemGenerated:true}];this.isBuiltinField=function(G){return D.indexOfKey("fieldId",G)>=0};this.createObject=function(J,G,Q){if(!this.canCreateNewObject()){return }var M=J.name;var N=D;if(G&&G.length){var P=[].concat(G);for(var K=0,H=N.length;K<H;K++){if(G.indexOfKey("fieldId",N[K].fieldId)<0){P.push(N[K])}}N=P}var O=new Date().format("yyyy-MM-dd HH:mm:ss");var L={name:M,label:J.label,pluralLabel:J.pluralLabel,description:J.description,created:O,keyFieldId:"uuid",displayFieldId:J.displayFieldId||"uuid",fields:N};sf.App.invokeDataService(String.format("/put/metadata/{0}.js",M),L,function(R){if(R&&R.error){sf.ui.Util.reportError(R.error)}else{if(Q){Q(L)}}});var I=new sf.data.Metadata(L);C.push(I);return I};this.objectNames=function(){var H=[];for(var G=0,J=C?C.size():0;G<J;G++){var I=C.get(G).name;if(!I.startsWith("builtin.")){H.push(I)}}H.sort();return H};this.recordsOfType=function(N,G){switch(N){case"sys.object_descriptor":return C;case"sys.field_descriptor":if(G&&G.length>0){var O=G.indexOfKey("fieldId","objectName");if(O>=0){var I=G[O];var L=I.value;var M=L&&I.op=="eq"?C.getByKey(L).fields:null;if(G.length==1){return M}if(M){G.splice(O,1);var H=M.applyFilter(G);var J=[];for(var K=0;K<H.length;K++){J[K]=M.get(H[K])}return new sf.core.RecordList("fieldId",J)}}}return null;default:return null}};this.getMetadata=function(G){var H={"sys.object_descriptor":sf.data.objectMetadata,"sys.field_descriptor":sf.data.fieldMetadata};return H[G]};this.getReferenceDisplayValue=function(J,I,M,K){var H,L;switch(M.fieldId){case"displayFieldId":case"keyFieldId":L=C.getByKey(I.name);if(!L){sf.core.reportError("getReferenceDisplayValue: Cannot find metadata for '"+I.name+"'");return[K,""]}var G=L.getFieldWithId(K);if(!G){sf.core.reportError("getReferenceDisplayValue: Cannot find field '"+K+"' in '"+L.label+"'");return[K,""]}return[K,G.label];case"refersToObject":L=C.getByKey(I.refersToObject);return[K,L.label]}return null};this.storeRecords=function(R,J,Q){var I=J?J.length:0;var G,N,O="insert",P=I;var S=function(){if((--P)<=0){if(Q){Q(J)}this.notifyListeners(O,R,J,this)}}.createDelegate(this);for(var L=0;L<I;L++){var M=J[L];switch(R){case"sys.object_descriptor":G=C.getByKey(M.name);if(G){var K=this.storableRecord(M,R);sf.util.copyProperties(K,G);G.modified=new Date();sf.App.invokeDataService("/put/metadata/"+M.name+".js",K,S);O="update"}else{this.createObject(this.storableRecord(M,R),null,Q)}break;case"sys.field_descriptor":G=C.getByKey(M.objectName);if(G){var K=this.storableRecord(M,R);N=G.getFieldWithId(M.fieldId);if(N){sf.util.copyProperties(K,N);N.modified=new Date();O="update"}else{G.fields.push(new sf.data.Field(K,G))}var H=String.format("/put/metadata/{0}/{1}.js",M.objectName,M.fieldId);sf.App.invokeDataService(H,K,S)}break}}return J};this.getPicklist=function(J,G,I){var H=String.format("/get/picklist/{0}/{1}.js",J,G);sf.App.invokeDataService(H,null,function(N){var L=[];for(var M=0,O=N.records&&N.records.length||0;M<O;M++){var K=N.records[M];L.push({value:K[1],text:K[0],count:K[2]})}if(I){I(L)}});return this};sf.override(this,"deleteRecords",function(M,I,L){var G=null;switch(M){case"sys.object_descriptor":var J=C.applyFilter(I);if(J.length==1){var H=C.splice(J[0],1)[0];G=String.format("/delete/metadata/{0}.js",H.name)}break;case"sys.field_descriptor":var N=I.indexOfKey("fieldId","objectName");if(N>=0){var O=I[N];var K=C.getByKey(O.value);if(K){I.splice(N,1);var J=K.fields.applyFilter(I);if(J.length==1){var H=K.fields.splice(J[0],1)[0];G=String.format("/delete/metadata/{0}/{1}.js",H.objectName,H.fieldId)}}}break}if(G){sf.App.invokeDataService(G,null,function(Q){if(Q&&Q.error){sf.ui.Util.reportError(Q.error)}else{var P=M=="sys.object_descriptor"?H.name:H.objectName;if(L){L()}this.notifyListeners("delete",H,this)}}.createDelegate(this))}});sf.override(this,"getChoicesForReference",function(H,K,G,I,J){if(H=="sys.object_descriptor"&&G){if(!I){I=[]}I.push({fieldId:"objectName",op:"eq",value:G.name})}return arguments.callee.super_.apply(this,arguments)})};sf.extend(sf.data.ObjectRegistryClass,sf.data.InMemoryService);sf.data.ObjectRegistry=new sf.data.ObjectRegistryClass();sf.data.Address=function(E,H,B,A,F){var I=E;var D=H;var G=B;var J=A;var C=F;this.street=function(){return I};this.city=function(){return D};this.state=function(){return G};this.country=function(){return C};this.zipCode=function(){return J};this.toString=function(){return this.constructor.toString(this)}};sf.data.Address.toString=function(I){var J='<div class="sf-address"><span class="street">{0}</span><span class="city">{1}</span><span class="state">{2}</span><span class="zip-code">{3}</span><span class="country">{4}</span></div>';var D=I.street().replaceAll("\n","<br/>");var G=I.city();var A=I.state();A=A?(", "+A):"";var B=I.zipCode();B=B?" "+B:"";var E=I.country();var F=this.countryList();for(var H=0,C=F.length;H<C;H++){if(E==F[H].value){E=F[H].text;break}}return String.format(J,D,G,A,B,E)};sf.data.Address.countryList=function(){var A=[{value:"ca",text:"Canada"},{value:"in",text:"India"},{value:"uk",text:"United Kingdom"},{value:"us",text:"United States"}];return A};sf.data.Address.statesList=function(B){var A={us:[{value:"CA",text:"California"},{value:"IN",text:"Indiana"},{value:"OK",text:"Oklahoma"},{value:"WV",text:"West Virginia"}],ca:[{value:"SK",text:"Saskatchewan"},{value:"BC",text:"British Columbia"},{value:"ON",text:"Ontario"},{value:"NS",text:"Nova Scotia"}]};return A[B]};sf.data.Address.defaultCountry=function(){return"us"};sf.data.parseCSV=function(K,G){var c=G&&G.firstLineIsData||false;var H=G&&G.separator||",";var L=G.dateFormat=="dd/MM/yyyy";var N=sf.util.parseCSV(K,H,'"');var T=0;for(var b=0,I=N.length;b<I;b++){T=Math.max(T,N[b].length)}var g=c?{data:N}:{header:N[0],data:N.slice(1)};var a=/^\-?[0-9,]+$/;var C=/^\-?\$[0-9,]+(\.[0-9]{0,3})?$/;var f=/^\-?[0-9,]+(\.[0-9]{0,3})?$/;var A=/^([0-9]{1,2})(:[0-9]{1,2})(:[0-9]{1,2})? *(am|pm)$/i;var B=/^([0-9]{1,2})(:[0-9]{1,2})(:[0-9]{1,2})?$/;var e=/^[a-z0-9_\-\+\.]+@[a-z0-9_\-\+\.]+\.[a-z]{2,4}$/i;var J={integer:function(i){return a.test(i)},currency:function(i){return C.test(i)},number:function(i){return f.test(i)},date:function(i){return Date.parseDate(i,L)!=null},datetime:function(m){var i=Date.parseDate(m);return i!=null&&(i.getHours()>0||i.getMinutes()>0)},timeofday:function(i){return sf.data.TypeInfo.converter("timeofday")(i)},duration:function(i){return sf.data.TypeInfo.converter("duration")(W)},url:function(i){return i&&i.match(/^https?:\/\//)&&sf.data.TypeInfo.converter("url")(i)},phone:function(m){var i=sf.data.PhoneNumber.buildFrom(m);return i.isNorthAmerican()},zipCode:function(i){return sf.data.TypeInfo.converter("zipCode")(i)},emailAddress:function(i){return sf.data.TypeInfo.converter("emailAddress")(i)}};var F=[];var Q=["url","emailAddress","date","datetime","timeofday","duration","currency","number","integer","phone","zipCode"];var I=g.data.length;for(var b=0;b<T;b++){var d=Q.map(function(){return 0});var S={},l=0;var O=Math.min(I,50);for(var Z=0,V=O;Z<V;Z++){for(var X=0;X<Q.length;X++){var h=Q[X];var W=(b in g.data[Z])?g.data[Z][b]:null;if(!W||(W=W.trim()).length<=0){continue}var P=J[h](W);if(P){d[X]++}else{S[W]=1}}}var E=-1,D=0;for(var X=0;X<d.length;X++){var Y=d[X];if(Y>0&&Y>=D){D=Y;E=X}}if(E>=0){F[b]={fieldType:Q[E]}}else{var M=0;for(var R in S){M++}if(M>0&&(M<=8&&O>=20||M<O/3)){var U=[];for(var R in S){U.push({value:U.length+1,text:R})}F[b]={fieldType:"picklist",choicesList:U}}else{F[b]={fieldType:"string"}}}}g.inferredTypes=F;return g};sf.data.ListModel=function(){this.getColumns=function(){sf.core.reportError("sf.data.ListModel: getColumns not implemented, must be provided by derived class.");return null};this.getRecords=function(B,C){sf.core.reportError("sf.data.ListModel: getRecords not implemented, must be provided by derived class.");return null};var A={};this.toDisplayString=function(E,D){if(E==null){return""}var B=A[D];if(typeof (B)=="undefined"){var C=this.getColumnDataType(D);if(C){var B=sf.data.TypeInfo.htmlFormatter(C);if(B){A[D]=B}}}return B?B(E):String(E)};this.getColumnDataType=function(C){var B=this.getColumnWithId(C);return B?B.dataType:null};this.getComparator=function(B){return sf.data.TypeInfo.comparator(this.getColumnDataType(B))};this.getColumnWithId=function(B){var C=this.getColumns();return C.find(B,function(E,D){return E.columnId==D})}};sf.data.ListModel.getDistinctValues=function(C,A,G){var J={},I=[],E=C.length;for(var D=0;D<E;D++){var B=C[D];var H=G=="string"||G=="text"?B[A]:sf.data.TypeInfo.toHTML(G,B[A]);if(typeof (J[H])=="undefined"){J[H]=1;I.push(H)}}var F=G=="picklist"||G=="reference"?null:sf.data.TypeInfo.comparator(G);sf.util.sort(I);return I};sf.data.SimpleListModel=function(E,C,H){sf.data.SimpleListModel.superclass.constructor.apply(this,arguments);var I=E;var G=I.name;var F=null;var B=C.map(function(J){return J&&E.getFieldWithId(J)?J:null});var A=function(){if(!F){var M=B.length;F=new Array(M);for(var J=0;J<M;J++){var K=B[J];var L=I.getFieldWithId(K);if(!L){sf.core.reportError(String.format("SimpleListModel: Can't find field id '{0}'",K));return null}L.columnId=K;L.dataType=L.fieldType;F[J]=L}}return F};this.getColumns=function(){return A()};this.getRecords=function(J,K){J.neededFields=B.map(function(L){return{fieldId:L}});J.neededFields.push({fieldId:I.keyFieldId});return H.getRecords(G,J,K)};this.getColumnWithId=function(J){return A().find(J,function(L,K){return L.columnId==K})};this.getMetadata=function(){return I};this.getColumnDataType=function(K){var J=I.getFieldWithId(K);return J?J.fieldType:null};var D=function(J){return function(M,L){var K=M instanceof Array?M[1]:J.lookupChoicesList(M);var N=L instanceof Array?L[1]:J.lookupChoicesList(L);if(!K){return N?-1:0}if(!N){return K?1:0}K=K.toLowerCase();N=N.toLowerCase();return K<N?-1:(K>N?1:0)}};this.getComparator=function(K){var J=this.getColumnDataType(K);return J=="picklist"?D(I.getFieldWithId(K)):sf.data.TypeInfo.comparator(J)}};sf.extend(sf.data.SimpleListModel,sf.data.ListModel);sf.data.ListModelFromArray=function(B,D){sf.data.ListModelFromArray.superclass.constructor.apply(this,arguments);var C=D;var A=function(){var F=[];for(var K=0,H=C&&C.length||0;K<H;K++){var E=C[K];var G={};var L=B.map(function(N){return sf.data.TypeInfo.converter(N.dataType)});for(var J=0,I=Math.min(E.length,B.length);J<I;J++){var M=E[J];G[B[J].columnId]=typeof (M)=="string"?L[J](M):M}F.push(G)}return F};this.getColumns=function(){return B};this.getRecords=function(M,L){var F=A();var J=M&&M.sort&&M.sort[0].direction;if(J){var E=B[M.sort[0].fieldIndex].columnId;var G=this.getColumnDataType(E);var K=sf.data.TypeInfo.comparator(G);F.sort(function(P,O){return K(P[E],O[E])*J})}var I=M&&M.firstRecord||0;var H=F.length;var N=M&&M.recordCount||(F.length-I);if(I>0||N<F.length){F=F.slice(I,N+I)}L({totalRecords:H,records:F})}};sf.extend(sf.data.ListModelFromArray,sf.data.ListModel);sf.data.GroupingListModel=function(M,K,G,I,H){sf.data.ListModelFromArray.superclass.constructor.apply(this,arguments);var J=M;var B={columnId:K,intervalsBuilder:G,dataType:J.getColumnDataType(K)};var A=null;var D=null;var C={value:"",sum:"Total ",avg:"Average of ",max:"Largest of ",min:"Smallest of ",count:"Count of "};var F=function(O,N){if(!O){return"Record count"}return C[N]+J.getColumnWithId(O).label};var L="record_count__";var E=function(){var N=J.getColumnWithId(K);A=[{columnId:K,dataType:N.dataType,label:N.label}];if(I=="all"){J.getColumns().map(function(P){if(P.columnId!=K){A.push(P)}})}else{if(I=="count"&&!H){D=L;A.push({columnId:D,label:"Record count",dataType:"number"})}else{var O=I=="count"?"number":J.getColumnDataType(H);D=H+"__"+I;A.push({columnId:D,label:F(H,I),dataType:O})}}};E();this.groupColumnId=function(){return K};this.aggregationColumnId=function(){return D};this.getColumns=function(){return A};this.getRecords=function(N,P){if(!N){N={}}if(!N.sort||!N.sort.length){N.sort=[]}N.sort=[{fieldIndex:A.indexOf(B.columnId,function(Q,R){return Q.columnId==R}),direction:1}].concat(N.sort);var O=I=="count"?"number":this.getColumnDataType(D);J.getRecords(N,function(a){var T=false;var b=B.intervalsBuilder(a.records,B.columnId);if(!b){T=true;var c=sf.data.ListModel.getDistinctValues(a.records,B.columnId,B.dataType);b=new sf.data.StringsAsIntervalList(c)}var f=a,W=0;var Q=b.count(),V=new Array(Q);for(var Z=0;Z<Q;Z++){V[Z]={records:[],label:b.labelString(Z)}}for(var Z=0,U=a.records&&a.records.length||0;Z<U;Z++){var R=a.records[Z];var S=R[B.columnId];var Y=B.dataType;if(T&&Y!="string"&&Y!="text"){S=sf.data.TypeInfo.toHTML(Y,S)}var W=b.matchingIntervalIndex(S);if(W>=0){V[W].records.push(R)}}f={aggrFunction:I,columnIdForGroup0:B.columnId};if(I=="all"){var d=[];for(var Z=0;Z<Q;Z++){d=d.concat(V[Z].records);V[Z].recordCount=V[Z].records.length;delete V[Z].records}f.groups=V;f.records=d;f.totalRecords=d.length}else{var X=new Array(Q);var e=sf.data.GroupingListModel.applyAggregateFunction;for(var Z=0;Z<Q;Z++){X[Z]={};X[Z][K]=V[Z].label;X[Z][D]=e(I,V[Z].records,H,O)}f.records=X;f.totalRecords=X.length}P(f)})}};sf.extend(sf.data.GroupingListModel,sf.data.ListModel);sf.data.GroupingListModel.applyAggregateFunction=function(L,D,C,I){if(!(D instanceof Array)){return null}if(L=="count"){if(!C){return D.length}var A={},F=0;for(var E=0,G=D.length;E<G;E++){var K=D[E][C];if(K!=null){var M=String(K);if(typeof (A[M])=="undefined"){A[M]=K;F++}}}return F}var J=undefined,G=D.length;for(var E=0;E<G;E++){var B=D[E];var H=B[C];if(I=="picklist"){H=sf.data.TypeInfo.toHTML(I,H)}switch(L){case"sum":case"avg":J=(J==undefined?0:J)+H;break;case"min":J=(J==undefined||J>H)?H:J;break;case"max":J=(J==undefined||J<H)?H:J;break;case"value":if(J==undefined){J=[]}J.push(H);break}}if(L=="avg"&&G>0){J=J/D.length}return J};sf.data.AbstractIntervalList=function(){this.count=function(){return 0};this.labelString=function(A){return""};this.matchingIntervalIndex=function(A){return -1}};sf.data.YearIntervalList=function(A,B){this.count=function(){return B};this.labelString=function(C){return String(A+C)};this.matchingIntervalIndex=function(D){if(D instanceof Date){var C=D.getFullYear()-A;return C>=0&&C<B?C:-1}return -1}};sf.extend(sf.data.YearIntervalList,sf.data.AbstractIntervalList);sf.data.MonthIntervalList=function(C,B,A){this.count=function(){return A};this.labelString=function(D){if(D<0||D>=A){return""}var E=B+D;return(1+E%12)+"/"+(C+Math.floor(E/12))};this.matchingIntervalIndex=function(G){if(G instanceof Date){var E=G.getFullYear(),F=G.getMonth();var D=(E-C)*12+F-B;return D>=0&&D<A?D:-1}return -1}};sf.extend(sf.data.MonthIntervalList,sf.data.AbstractIntervalList);sf.data.WeekIntervalList=function(C,B){if(!C instanceof Date){sf.core.reportError("WeekIntervalList: First parameter must be a Date object.");return }var A=new Date(C-C.getDay()*Date.MILLISECONDS_PER_DAY);var D=new Date(A.getFullYear(),A.getMonth(),A.getDate(),0,0,0).getTime();this.count=function(){return B};this.labelString=function(E){if(E<0||E>=B){return""}var F=new Date(D+E*7*Date.MILLISECONDS_PER_DAY);return sf.data.TypeInfo.toHTML("date",F)};this.matchingIntervalIndex=function(F){if(F instanceof Date){var E=(F.getTime()-D)/(7*Date.MILLISECONDS_PER_DAY);return E<0?-1:(Math.floor(E)<B?Math.floor(E):-1)}return -1}};sf.extend(sf.data.WeekIntervalList,sf.data.AbstractIntervalList);sf.data.DateIntervalList=function(A,B){if(!A instanceof Date){sf.core.reportError("DateIntervalList: First parameter must be a Date object.");return }this.count=function(){return B};this.labelString=function(D){if(D<0||D>B){return""}var C=new Date(A.getTime()+D*Date.MILLISECONDS_PER_DAY);return sf.data.TypeInfo.toHTML("date",C)};this.matchingIntervalIndex=function(D){if(D instanceof Date){var C=(D.getTime()-A.getTime())/(Date.MILLISECONDS_PER_DAY);return C<0?-1:(Math.ceil(C)<B?Math.ceil(C):-1)}return -1}};sf.extend(sf.data.DateIntervalList,sf.data.AbstractIntervalList);sf.data.DayOfWeekIntervalList=function(){this.count=function(){return 7};this.labelString=function(A){return A>=0&&A<=6?Date.weekdayNames[A]:""};this.matchingIntervalIndex=function(A){return A instanceof Date?A.getDay():-1}};sf.extend(sf.data.DayOfWeekIntervalList,sf.data.AbstractIntervalList);sf.data.NumberIntervalList=function(C,A,B){if(typeof (C)!="number"){sf.core.reportError("NumberIntervalList: First parameter must be a Number object.");return }if(A<1){sf.core.reportError("NumberIntervalList: second parameter must be 1 or more.");return }this.count=function(){return B};this.labelString=function(F){var D=C+F*A,E=D+A;return(F<0||F>=B)?"":String.format("{0} - {1}",D,E)};this.matchingIntervalIndex=function(E){var D=(E-C)/A;return D>=B?-1:Math.floor(D)}};sf.extend(sf.data.NumberIntervalList,sf.data.AbstractIntervalList);sf.data.StringsAsIntervalList=function(A){if(!A instanceof Array){sf.core.reportError("StringsAsIntervalList: Parameter must be an array.");return }this.count=function(){return A.length};this.labelString=function(B){return B<0||B>=A.length?"":A[B]};this.matchingIntervalIndex=function(B){return A.indexOf(B)}};sf.extend(sf.data.StringsAsIntervalList,sf.data.AbstractIntervalList);sf.data.MultiPickValue=function(B,E){var A=B;var C=function(F){if(F.startsWith("#")&&F.endsWith("#")){F=F.substring(1,F.length-1);var G=A.getItems();var H=F.split("##").map(function(J){var I=G.indexOfKey("value",J);return I<0?null:G[I].value});H.sort();return H}return[]};var D=E?(typeof (E)=="string"?C(E):[].concat(E)):[];this.toHTML=function(){var F=D.map(function(G){var H=A.getItemByValue(G);return H?H.text:null});F.sort();return F.join(", ")};this.toString=function(){if(D.length<=0){return""}D.sort();return"#"+D.join("##")+"#"};this.choices=function(){return D};this.allowedChoices=function(){return A}};sf.ui.Util={fillSelector:function(J,K,L,E){while(J.hasChildNodes()){J.removeChild(J.firstChild)}var B=J;var D=K?K.length:0,F=false,H=[],M=-1,N=0;J.options.length=0;var C=!!jQuery.browser.msie;for(var I=0;I<D;I++){var G=K[I];var A=null;if(G.isGroupHeader){A=document.createElement("optgroup");A.label=G.text;B=A;J.appendChild(A);N++}else{A=new Option(G.text,G.value);A._index=I;if(B==J){J.options[J.options.length]=A}else{if(C){A.innerHTML=G.text}B.appendChild(A)}}sf.util.copyProperties(G,A);if(G.value==L){M=I-N}}if(E){J.options[J.options.length]=new Option("","");if(!L){M=J.options.length-1}}if(M>=0){J.selectedIndex=M}return J},setSelectValue:function(A,D){var C=A.options;var E=C&&C.length||0;for(var B=0;B<E;B++){if(C[B].value==D){C[B].selected=true;A.selectedIndex=B;break}}},askForConfirmation:function(A){return confirm(A)},informationAlert:function(A){alert(A)},getPositionOnScreen:function(B){if(!B){return null}var A=curTop=0;do{A+=B.offsetLeft;curTop+=B.offsetTop}while(B=B.offsetParent);return{left:A,top:curTop}},reportError:function(F,C){if(C){if(typeof (C)=="string"){C=$("#"+C)}else{if(!C.jquery){C=$(C)}}if(!C.length){alert(F);return }var D=$(".sf-error-panel");if(!D.length){D=$('<div class="sf-error-panel"><span class="sf-error-msg"></span></div>');$(document.body).prepend(D)}var G=this.getPositionOnScreen(C[0]);var B=C.height();$(".sf-error-msg",D).html(F);var E=G.left;D.css({top:B+G.top+10+"px",left:E+"px"}).show();var A=document.documentElement.scrollLeft||document.body.scrollLeft||0;if(G.left+200>$(window).width()){D.css({left:G.left+C.width()-200+"px"})}setTimeout(function(){D.fadeOut(2000)},2000)}else{alert(F)}},_modalBox:null,showModal:function(A){if(!sf.ui.Util._modalBox){sf.ui.Util._modalBox=new sf.ui.ModalDialog()}sf.ui.Util._modalBox.show(A.getRootElement());return A},hideModal:function(){if(sf.ui.Util._modalBox){sf.ui.Util._modalBox.hide()}},makeDraggable:function(G,F){var B=G.jquery?G:$(G);var E=0,C=0;var I=function(J,L){var K=B.position();E=J-K.left;C=L-K.top};var D=function(J,L){var K={left:J-E,top:L-C};B.css(K)};var A=function(J,K){E=0;C=0};var H=new sf.ui.DragWatcher(F,I,D,A);H.enable()},setTextboxSelection:function(E,A,B){if(E.createTextRange){var D=E.createTextRange();D.moveStart("character",A);D.moveEnd("character",B-E.value.length);D.select()}else{if(E.setSelectionRange){try{E.setSelectionRange(A,B)}catch(C){}}}}};if(navigator&&navigator.userAgent.indexOf("MSIE")<0){HTMLElement.prototype.__defineGetter__("outerHTML",function(){var D=this.nodeName.toLowerCase(),B=this.attributes,C="";for(var A=0;A<B.length;A++){C+=" "+B[A].nodeName+'="'+B[A].nodeValue+'"'}return"<"+D+C+">"+this.innerHTML+"</"+D+">"})}jQuery.fn.addHoverClass=function(A){return this.hover(function(){$(this).addClass(A)},function(){$(this).removeClass(A)})};jQuery.fn.containsElement=function(D){for(var B=0,F=this.length;B<F;B++){var E=D,C=this[B];while(E&&E!=C){try{E=E.parentNode}catch(A){E=C}}if(E==C){return true}}return false};jQuery.fn.setTrigger=function(C){var A=$(this);var B=function(D){if(!A.containsElement(D.target)&&!C.containsElement(D.target)){A.hide();$(document.documentElement).unbind("click",B)}};C.bind("click",function(D){A.show();$(document.documentElement).bind("click",B)});return A};jQuery.fn.showTooltip=function(G,C){var E=$("#sf-tooltip");var F=20,B=20;var A={xOffsetPx:F,yOffsetPx:B,tooltipWidth:"150px",tooltipHeight:"auto"};if(C){sf.util.copyProperties(C,A,["xOffsetPx","yOffsetPx","width","height","followMouse"])}if(!E.length){$(document.body).append('<div id="sf-tooltip"></div>');E=$("#sf-tooltip")}var D=function(M){var I=M.pageX+A.xOffsetPx,N=M.pageY+A.yOffsetPx;var J=document.documentElement.scrollLeft||document.body.scrollLeft||0;var H=document.documentElement.scrollTop||document.body.scrollTop||0;var L=E.width(),K=E.height();if(I+L+10-J>3*$(window).width()/4){I-=L+2*A.xOffsetPx}if(N+K+10-H>$(window).height()){N-=K+2*A.yOffsetPx}return{left:I,top:N}};$(this).hover(function(I){var H=G(this);if(H){E.html(H);var K=D(I);var J={top:K.top+"px",left:K.left+"px"};if(A.width){J.width=A.width}if(A.height){J.height=A.height}E.show().css(J)}},function(){E.hide()});if(A.followMouse){$(this).mousemove(function(H){var I=D(H);E.css({top:I.top+"px",left:I.left+"px"})})}};sf.ui.TemplateStore=(function(){var A={"edit-layout.html":new sf.core.Template('<div class="sf-fov sf-fov-editlayout" id="${id}" style="display: none;">  <div class="sf-fov-captionbar" style="text-align: left;">    <h2 class="sf-fov-caption sf-preview-editable" ftype="string">${caption}</h2>  </div>  <div class="sf-fov-caption-extra sf-preview-editable" ftype="text"></div>  <div class="sf-fov-contentarea-preview">    <table cellpadding="0" cellspacing="0" class="sf-fov-listanddetail" id="${id}-listanddetail">      <tr><td colspan="2"><div class="sf-find-extended-fieldsbox"></div></td></tr>      <tr valign="top">        <td style="padding: 5px; width: 320px;">          <table class="sf-list-table" cellspacing="0" cellpadding="0">            <thead>              <tr>                <th class="sf-preview-editable" ftype="chooser" height="25"><span class="sf-lighter-color">Choose...</span></th>                <th class="sf-preview-editable" ftype="chooser"><span class="sf-lighter-color">Choose...</span></th>                <th class="sf-preview-editable" ftype="chooser"><span class="sf-lighter-color">Choose...</span></th>              </tr>            </thead>            <tbody>              <% for (var i = 0; i < 10; i++) { %><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td></tr><% } %>            </tbody>          </table>        </td>        <td class="sf-fov-detail"></td>      </tr>    </table>  </div></div>            '),"filter-list.html":new sf.core.Template('<div class="sf-filterlist" id="${id}">  <h3>Filters</h3>  <div class="sf-filterlist-listpanel" id="${id}-listpanel"></div>  <div class="sf-filterlist-editpanel" id="${id}-editpanel">    <h4 class="sf-filteredit-caption">Edit filter terms</h4>    <div style="padding: 10px; clear: both;">      <table cellspacing="0">        <tr valign="top"><td>Name:</td><td><input id="${id}-filtername" size="30" maxlength="60" /></td></tr>        <tr valign="top"><td>Description:</td><td><textarea id="${id}-filterdesc" rows="2" cols="30"></textarea></td></tr>      </table>    </div>    <div class="sf-filterlist-edit" id="${id}-edit">    </div>    <div class="sf-filteredit-buttons">      <button class="sf-filteredit-save">Save</button> or <span class="sf-pseudolink sf-filteredit-cancel">Cancel</span>    </div>  </div></div>            '),"full-object-view.html":new sf.core.Template('<div class="sf-fov" id="${id}">  <div class="sf-page-caption-bar" id="${id}-fov-captionbar">    <table cellpadding="0" cellspacing="0" summary="" class="sf-page-captionbar-table">      <tr valign="bottom">        <td width="45%"><h2 class="sf-page-caption">${caption}</h2></td>        <td width="28%" nowrap class="sf-fov-tools-box">          <table cellpadding="0" cellspacing="0" summary="" class="sf-fov-searchtools">            <tr valign="bottom"><td><div class="sf-fov-finder"></div></td><td><span class="sf-fov-filterlabel">Filter:</span></td><td><select class="sf-fov-filterselect"></select></td></tr>          </table>        </td>        <td width="18%" class="sf-fov-toolbar" id="${id}-fov-toolbar"></td>        <td width="5%" align="right">          <div class="sf-fov-tools-widget">            <div class="sf-menu-trigger sf-fov-tools-menu-trigger">              <span class="sf-menu-trigger-label sf-tools-menu-trigger-label">Tools</span>              <div  class="sf-fov-tools-list-wrapper">                <ul class="sf-fov-tools-list">                </ul>              </div>            </div>          </div>        </td>      </tr>    </table>  </div>  <div class="sf-fov-caption-extra">${textUnderCaption}</div>  <div class="sf-fov-contentarea">    <span class="sf-fov-statusreport"></span>    <div class="sf-find-extended-fieldsbox"></div>    <table cellpadding="0" cellspacing="0" class="sf-fov-listanddetail" id="${id}-listanddetail">      <tr valign="top">        <td class="sf-fov-list" rowspan="2"></td>        <td class="sf-fov-detail" id="${id}-fov-rightside">          <div id="${id}-fov-detailpanel" class="sf-fov-detailpanel"></div>          <div id="${id}-fov-childpanel" class="sf-fov-childpanel"></div>        </td>      </tr>    </table>  </div>  <div class="sf-fov-wl-choosecols"></div></div>            '),"fov-toolbar.html":new sf.core.Template('    <table class="sf-fov-datatools" cellpadding="0" cellspacing="0">      <tr valign="bottom">        <td><button class="sf-toolbar-btn sf-fov-refresh" title="Refresh this list from the server">Refresh</button></td>        <% if (allowAdd) { %><td><button class="sf-toolbar-btn sf-fov-add" title="Add a new ${objectName}">Add</button></td><% } %>        <% if (allowDelete) { %><td><button class="sf-toolbar-btn sf-fov-del" title="Delete the selected ${objectName}">Delete</button></td><% } %>      </tr>    </table>'),"import-from-csv.html":new sf.core.Template('<div class="sf-import" id="${id}">  <div class="sf-import-ribbon">    <ul class="sf-import-ribbon-ul">      <li class="sf-import-ribbon-li sf-import-1" forStep="sf-import-wizard-step1">1. Provide CSV data</li>      <li class="sf-import-ribbon-li sf-import-2" forStep="sf-import-wizard-step2">2. Set up fields</li>      <li class="sf-import-ribbon-li sf-import-3" forStep="sf-import-wizard-step3">3. Finish import</li>    </ul>  </div>  <div class="sf-import-steps-container">    <span class="sf-import-error-message"></span>    <div class="sf-import-step sf-import-wizard-step1">      <div class="sf-import-step-content">        <h3>Input CSV data</h3>        <div style="clear: left;">The first data row should contain field names.</div>        <div class="sf-import-datasourcespec">          Data source:          <input type="radio" name="sf-import-datasrc" value="pastedata" id="${id}-import-datasrc-1" checked> <label for="${id}-import-datasrc-1">Copy/pasted data</label>          <input type="radio" name="sf-import-datasrc" value="file" id="${id}-import-datasrc-0"> <label for="${id}-import-datasrc-0">File</label>          <span class="sf-import-datasrc-file"><input type="file" size="30" name="${id}-import-datafile" id="${id}-import-datafile" /></span>        </div>        <div style="clear: both;" class="sf-import-datasrc-pastedata">          Paste the data into the box below.<br/>          <textarea class="sf-import-csv-data"></textarea>        </div>        <table class="sf-import-step1-options">          <tr>            <td align="right">Fields are separated by</td>            <td class="sf-import-fldsep-group">              <input type="radio" name="sf-import-fldsep" id="${id}-import-fldsep-0" value="comma" checked/><label for="${id}-import-fldsep-0">commas</label>              <input type="radio" name="sf-import-fldsep" id="${id}-import-fldsep-1" value="tab"/><label for="${id}-import-fldsep-1">tabs</label>            </td>          </tr>          <tr>            <td align="right" style="padding-left: 45px;">Date format</td>            <td class="sf-import-datefmt-group">              <input type="radio" name="sf-import-datefmt" id="${id}-import-datefmt-0" value="MM/dd/yyyy" checked/>              <label for="${id}-import-datefmt-0">US (MM/dd/yyyy)</label>              <input type="radio" name="sf-import-datefmt" id="${id}-import-datefmt-1" value="dd/MM/yyyy"/>              <label for="${id}-import-datefmt-1">India (dd/MM/yyyy)</label>            </td>          </tr>        </table>      </div>      <div class="sf-import-buttons">        <button class="sf-import-cancel" >Cancel</button>        <button class="sf-import-next sf-import-dostep1">Next &raquo; </button>      </div>    </div>    <div class="sf-import-step sf-import-wizard-step2">      <div class="sf-import-step2-errors-wrap">        <button class="sf-panelclose" style="position: absolute; top: 3px; right: 3px;"></button>        <h4>Data errors</h4>        <div class="sf-import-step2-errors"></div>      </div>      <div class="sf-import-step-content">        <h3>Set up fields</h3>        <span class="sf-import-step2-progress"></span>        <div class="sf-import-step2-erropts-wrap">          On data errors:          <select class="sf-import-step2-erropts">            <option value="stop" selected>Stop and show errors</option>            <option value="ignore">Omit erroneous records</option>          </select>        </div>        <div class="sf-import-wizard-step2-tablewrap">        </div>      </div>      <div class="sf-import-buttons">        <button class="sf-import-cancel" >Cancel</button>        <button class="sf-import-backto1">&laquo; Back</button>        <button class="sf-import-next sf-import-dostep2" >Next &raquo;</button>      </div>    </div>    <div class="sf-import-step sf-import-wizard-step3">      <div class="sf-import-step-content">        <h3>Finish import</h3>        <div class="sf-import-step3-detail">        </div>      </div>      <div class="sf-import-progressbar-wrap"></div>      <div class="sf-import-buttons">        <button class="sf-import-cancel" >Cancel</button>        <button class="sf-import-step3-back sf-import-backto2">&laquo; Back</button>        <button class="sf-import-next sf-import-step3-import">Import</button>      </div>    </div>  </div></div>            '),"new-from-csv.html":new sf.core.Template('<div class="sf-import" id="${id}">  <h3>Create a new table from CSV data</h3>  <span class="sf-import-error-message"></span>  <div class="sf-import-ribbon">    <ul class="sf-import-ribbon-ul">      <li class="sf-import-ribbon-li sf-import-1" forStep="sf-import-wizard-step1">1. Provide CSV data</li>      <li class="sf-import-ribbon-li sf-import-2" forStep="sf-import-wizard-step2">2. Set up fields</li>      <li class="sf-import-ribbon-li sf-import-3" forStep="sf-import-wizard-step3">3. Finish import</li>    </ul>  </div>  <div class="sf-import-steps-container">    <div class="sf-import-step sf-import-wizard-step1">      <div class="sf-import-step-content">        <h3>Input CSV data</h3>        <div style="clear: both;">          Table name: <input type="text" class="sf-import-new-tablename" size="20" maxlength="32" />          <div class="sf-import-datasourcespec">            Data source:            <input type="radio" name="sf-import-datasrc" value="pastedata" id="${id}-import-datasrc-1" checked> <label for="${id}-import-datasrc-1">Copy/pasted data</label>            <input type="radio" name="sf-import-datasrc" value="file" id="${id}-import-datasrc-0"> <label for="${id}-import-datasrc-0">File</label>            <span class="sf-import-datasrc-file"><input type="file" size="30" name="${id}-import-datafile" id="${id}-import-datafile" /></span>          </div>          The first data row should contain field names.          <div style="clear: both;" class="sf-import-datasrc-pastedata">            Paste your data into the box below.<br/>            <textarea class="sf-import-csv-data"></textarea>          </div>        </div>        <table class="sf-import-step1-options">          <tr>            <td align="right">Fields are separated by</td>            <td class="sf-import-fldsep-group">              <input type="radio" name="sf-import-fldsep" id="sf-importnew-fldsep-0" value="comma" checked/><label for="sf-importnew-fldsep-0">commas</label>              <input type="radio" name="sf-import-fldsep" id="sf-importnew-fldsep-1" value="tab"/><label for="sf-importnew-fldsep-1">tabs</label>            </td>          </tr>          <tr>            <td align="right" style="padding-left: 45px;">Date format</td>            <td class="sf-import-datefmt-group">              <input type="radio" name="sf-import-datefmt" id="sf-importnew-datefmt-0" value="MM/dd/yyyy" checked/>              <label for="sf-importnew-datefmt-0">US (MM/dd/yyyy)</label>              <input type="radio" name="sf-import-datefmt" id="sf-importnew-datefmt-1" value="dd/MM/yyyy"/>              <label for="sf-importnew-datefmt-1">India (dd/MM/yyyy)</label>            </td>          </tr>        </table>      </div>      <div class="sf-import-buttons">        <button class="sf-import-cancel" >Cancel</button>        <button class="sf-import-next" onclick="sf.App.importNew.doStep1();">Next &raquo; </button>      </div>    </div>    <div class="sf-import-step sf-import-wizard-step2">      <div class="sf-import-step2-errors-wrap">        <button class="sf-panelclose" style="position: absolute; top: 3px; right: 3px;"></button>        <h4>Data errors</h4>        <div class="sf-import-step2-errors"></div>      </div>      <div class="sf-import-step-content">        <h3>Set up fields</h3>        <span class="sf-import-step2-progress"></span>        <div class="sf-import-step2-erropts-wrap">          On data errors:          <select class="sf-import-step2-erropts">            <option value="stop" selected>Stop and show errors</option>            <option value="ignore">Omit erroneous records</option>          </select>        </div>        <div class="sf-import-wizard-step2-tablewrap"></div>      </div>      <div class="sf-import-buttons">        <button  class="sf-import-cancel">Cancel</button>        <button onclick="sf.App.importNew.showStep (\'sf-import-1\');">&laquo; Back</button>        <button class="sf-import-next" onclick="sf.App.importNew.doStep2 ();">Next &raquo;</button>      </div>    </div>    <div class="sf-import-step sf-import-wizard-step3">      <div class="sf-import-step-content">        <h3>Finish import</h3>        <div class="sf-import-step3-detail">        </div>      </div>      <div class="sf-import-progressbar-wrap"></div>      <div class="sf-import-buttons">        <button class="sf-import-cancel" >Cancel</button>        <button class="sf-import-step3-back"  onclick="sf.App.importNew.showStep (\'sf-import-2\');">&laquo; Back</button>        <button class="sf-import-next sf-import-step3-import">Import</button>      </div>    </div>  </div></div>            '),"sf-form.html":new sf.core.Template('<form class="sf-form<% if (formClassName) { %> ${formClassName}<% } %><% if (fields.length <= 6) { %> sf-form-singlecolumn<% } %>" id="${id}" method="${method}" <% if (action) { %>action="${action}"<% } %> >  <% if (caption) { %><div class="sf-form-caption"><h3>${caption}</h3></div><% } %>  <% if (textUnderCaption) { %><div class="sf-form-textundercaption">${textUnderCaption}</div><% } %>  <div class="sf-form-contentwrapper">    <% for (var j = 0; j < layout.panels.length; j++) {        var pnl = layout.panels[j];    %>        <% if (pnl.heading) { %> <div class="sf-form-sectionhdr">${pnl.heading}</div> <% } %>      <div class="sf-form-sectionwrap">    <%         for (var i = 0, nElts = pnl.fieldIds.length; i < nElts; i++) {             var fieldId = pnl.fieldIds[i];             var fieldDesc = fields[fieldId];    %>         <% if (i % 2 == 0) { %><div class="sf-rv-row"><% } %>         <div class="sf-form-item sf-form-item-${fieldId}" field_id="${fieldId}" <% if (fieldDesc.systemGenerated) { %>style="display: none;"<% } %> >           <label class="sf-form-label<% if (fieldDesc.disallowEmpty) { %> sf-form-label-required<% } %>" id="${id}-label-${fieldId}" for="${id}-cell-${fieldId}">${fieldDesc.label}</label>           <div id="${id}-${fieldId}" class="sf-form-cell sf-form-cell-${fieldDesc.fieldType}"><span class="sf-form-cell-value"></span></div>         </div>         <% if (i % 2 == 1) { %></div><% } %>    <%   } %>         <% if (nElts % 2 == 1) { %></div><% } %>      </div>    <% } %>    <div class="sf-form-buttons" align="center">      <input type="submit" class="sf-form-button" value="Save" /><input type="button" class="sf-form-button sf-form-button-cancel" value="Cancel"/>    </div>  </div></form>'),"sf-list.html":new sf.core.Template('<div class="sf-list ${tableClassName}" id="${id}">  <table class="sf-list-table" cellspacing="0" cellpadding="0" id="${id}-table">    <%  var nCols = columns.length + (showCheckboxes ? 1 : 0);        for (var i = 0; i < nCols; i++) {            var colWidthPx = colWidths ? (showCheckboxes ? (i == 0 ? sf.ui.Table.CHECKBOX_COL_WIDTH_PX : colWidths[i-1]) : colWidths[i]) : 0;    %>    <col id="${id}-col-${i}" class="sf-list-col-${i}<% if (showCheckboxes && i == 0) { %> sf-list-checkboxcol<% } %>"<% if (colWidthPx > 0) { %> style="width: ${colWidthPx}px;"<% } %> />    <% } %>    <thead>      <tr class="sf-list-captionregion"><td colspan="${nCols}">        <table cellspacing="0" cellpadding="0" class="sf-list-captiontable">          <% if (caption) { %><tr><td colspan="2"><h2 class="sf-list-caption">${caption}</h2></td></tr><% } %>          <tr>            <td width="150"><div class="sf-list-loadingwrap"><span class="sf-list-reccount">${count}</span><div class="sf-loading-state">Loading...</div></div></td>            <td width="160" align="right" class="sf-list-pagercell"></td>            <% if (needsToolsArea) { %><td class="sf-list-tools"></td><% } %>          </tr>        </table>      </td></tr>      <tr class="sf-list-header">        <% if (showCheckboxes) { %><th class="sf-list-colcaption sf-list-checkboxcol"></th><% } %>        <% for (var i = 0; i < columns.length; i++) { var columnId = columns[i].columnId; %>          <th class="sf-list-colcaption"><div <% if (columnId) { %> id="${id}-hdrcell-${columnId}" fid="${columnId}" <% } %> title="Sort by ${columns[i].label}">${columns[i].shortLabel || columns[i].label}</div></th>        <%}%>      </tr>    </thead>    <tbody class="sf-list-body" id="${id}-tbody"></tbody>  </table></div>            '),"sf-rv.html":new sf.core.Template('<div class="sf-rv" id="${id}">  <button style="float: right; display: none; margin-right: 2px;" title="Save changes" class="sf-icon-btn sf-btn-save">Save</button>  <h3>${caption}</h3>  <% for (var j = 0; j < layout.panels.length; j++) {      var pnl = layout.panels[j];  %>    <div class="sf-rv-sectionwrap">      <% if (pnl.heading) { %> <div class="sf-rv-sectionhdr">${pnl.heading}</div> <% } %>  <%       for (var i = 0, nElts = pnl.fieldIds.length; i < nElts; i++) {           var fieldId = pnl.fieldIds[i];           var fieldDesc = fields[fieldId];           var fieldLabel = fieldDesc && fieldDesc.label || "Unknown field";  %>       <% if (i % 2 == 0) { %><div class="sf-rv-row"><% } %>       <div class="sf-rv-item sf-rv-item-${fieldId}" field_id="${fieldId}">         <% if (fieldDesc && !fieldDesc.disallowEdit) { %><span class="sf-rv-edit-trigger sf-pseudolink" fieldId="${fieldId}">Edit</span><% } %>         <div class="sf-rv-label" id="${id}-label-${fieldId}">${fieldLabel}</div>         <div class="sf-rv-cell" id="${id}-cell-${fieldId}">${getFieldHTML (fieldId)}</div>       </div>       <% if (i % 2 == 1) { %></div><% } %>  <%   } %>       <% if (nElts %2 == 1) { %></div><% } %>    </div>  <% } %></div>',"recordView"),"popupmenu.html":new sf.core.Template('<div class="sf-dynmenu-shadowbox" id="${id}">  <div class="sf-dynmenu-wrap">    <ul class="sf-dynmenu">      <% for (var i = 0; i < items.length; i++) {           var item = items[i];          if (item.label == "---") { %>            </ul>            <div class="sf-dynmenu-rule">&nbsp;</div>            <ul class="sf-dynmenu">          <% } else { var hasSubmenu = item.submenuId ? true: false; var submenuClass = hasSubmenu ? " sf-dynmenuitem-withsubmenu" : ""; %>            <li><div <% if (item.tooltip) { %>title="${item.tooltip}"<% } %> id="${item.id}" class="sf-dynmenuitem${submenuClass}">${item.label}<% if (hasSubmenu) { %><div id="${item.submenuId}" class="sf-dynmenu-submenubox"></div><% } %></div></li>          <% } %>      <% } %>  </div></div>'),"tbl-list.html":new sf.core.Template('<div id="${id}" class="sf-tbl-list">    <ul id="${id}-ul" class="sf-ul">      <% for (var i = 0, n = tables ? tables.length : 0; i < n; i++) { %>        <li class="sf-list-ul-li">          ${tables[i].label}          <% if (tables[i].description) { %><div class="sf-tbl-description"> ${tables[i].description}</div><% } %>        </li>      <% } %>    </ul></div>            '),"monthview-grid":new sf.core.Template('        <div class="sf-monthview-container" id="${id}">          <table class="sf-monthview-tbl" cellspacing="0" cellpadding="0" summary="">            <thead>              <tr>                <th colspan="7" style="padding: 8px 0; border: 1px solid #aaa;">                  <span class="sf-monthview-heading-left">&nbsp;</span>                  <span class="sf-monthview-heading-right"></span>                  <span class="sf-monthview-heading-center">                    <span class="sf-monthview-fieldchooser"></span>                    <span class="sf-monthchooser-wrap"></span>                  </span>                </th>              </tr>              <tr><th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th></tr>            </thead>            <tbody class="sf-monthview-body">              <tr><td class="sf-monthview-wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="sf-monthview-wkend"></td></tr>              <tr><td class="sf-monthview-wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="sf-monthview-wkend"></td></tr>              <tr><td class="sf-monthview-wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="sf-monthview-wkend"></td></tr>              <tr><td class="sf-monthview-wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="sf-monthview-wkend"></td></tr>              <tr class="sf-monthview-row4"><td class="sf-monthview-wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="sf-monthview-wkend"></td></tr>              <tr class="sf-monthview-row5"><td class="sf-monthview-wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="sf-monthview-wkend"></td></tr>            </tbody>          </table>        </div>'),"monthview-grid-cell":new sf.core.Template('        <% if (cellDate >= 0) { %><div class="sf-monthview-date-heading">${cellDate}</div>        <div class="sf-monthview-day">          <% for (var i = 0; i < recs.length; i++) { %>            <div class="sf-monthview-item" rec_index="${recs[i].index}">${recs[i].label}</div>          <% } %>        </div><% } %>'),"home-tab":new sf.core.Template('      <div class="sf-page-caption-bar"></div>      <div class="ap-home-apps">        <div class="ap-home-apps-list"></div>      </div>      <div id="ap-home-useracct">        <h3>My account</h3>        <button class="sf-toolbar-btn sf-btn-edit" title="Edit my account info" id="ap-edit-myacct">Edit</button>        <ul class="ap-home-acctinfo-items">         <li><div class="ap-item-label">Name</div><div class="ap-item-value">${userProfile.name}</div></li>         <li><div class="ap-item-label">Email</div><div class="ap-item-value">${userProfile.emailAddress}</div></li>         <li><div class="ap-item-label">Password</div><div class="ap-item-value"><i>Not shown</i></div></li>        </ul>      </div>'),"edit-app-props":new sf.core.Template('          <form class="ap-appshare-form" action="#">            <div class="sf-form-caption"><h3>Edit application properties</h3></div>            <div class="ap-appshare-form-content">              <table class="ap-appshare" cellspacing="0">                <tr valign="top"><td>Name</td><td><input type="text" name="name" class="ap-appshare-app-name" size="40" /></td></tr>                <tr valign="top"><td>Description</td><td><textarea name="desc" class="ap-appshare-app-desc" rows="2" cols="40"></textarea></td></tr>                <tr valign="top"><td>Currency</td><td>                  <select name="currency">                    <option value="$">$ (US)</option>                    <option value="Rs">Rs (India)</option>                    <option value="pound">&pound; (Britain)</option>                    <option value="euro">&euro; (Europe)</option>                    <option value="yen">&yen; (Japan)</option>                  </select>                </td></tr>                <tr>                  <td colspan="2">                    Shared with                    <span class="sf-icon-help">                      <span style="background-color: ivory;">                        Provide the names and email addresses of people with whom you want to share this app.                        Those who are not already Apsona users will be sent an email invitation to sign up.                      </span>                    </span>                  </td>                </tr>                <tr><td colspan="2">                  <table class="ap-appshare-users">                    <thead><tr><th></th><th>User name</th><th>Email address</th></tr></thead>                    <tbody>                      <% for (var i = 0; i < maxSharedUsers; i++) { %>                      <tr>                        <td></td>                        <td><input type="text" class="ap-appshare-username"/></td><td><input type="text" class="ap-appshare-user-email" /></td>                      </tr>                      <% } %>                    </tbody>                  </table>                  </td>                </tr>                <tr>                  <td colspan="2">                    <div style="text-align: center;">                      <input type="submit" class="sf-form-button" value="Save" />                      <input type="button" class="sf-form-button sf-form-button-cancel" value="Cancel" id="${id}-cancel" />                    </div>                  </td>                </tr>              </table>            </div>          </form>        ',"edit-app-props")};return{get:function(B){return A[B]},put:function(B,C){A[B]=new sf.core.Template(C)}}})();sf.ui.Widget=function(C){sf.ui.Widget.superclass.constructor.call(this,C);this.getRootElement=function(){sf.core.reportError("ui.Widget: getRootElement: Should be implemented by derived class.");return null};this.contains=function(J){var G=false,I=J;var K=this.getRootElement();if(!K.length){return false}var H=K[0];while(I&&!G){if(I==H){G=true;break}I=I.parentNode}return G};this.renderTo=function(G){return this};this.hide=function(){this.getRootElement().css("display","none");this.notifyListeners("hide",this);return this};this.show=function(I){var H=this.getRootElement();if(!H.length){return this}var G={display:"block"};if(I){var J=this.getPositionToShow(I);if(typeof (J.top)!="undefined"){G.top=J.top+"px"}if(typeof (J.left)!="undefined"){G.left=J.left+"px"}}$(H).css(G);this.notifyListeners("show",this);return this};this.isShown=function(){var G=this.getRootElement();return G.length?G.css("display")!="none":false};this.toggleShown=function(){if(this.isShown()){this.hide()}else{this.show()}return this};var B=null;var F=null;var D=null;var E=this;var A=function(G){D=this;E.show(this);var H=function(I){if(!E.getRootElement().containsElement(I.target)&&B&&!B.containsElement(I.target)){E.hide();D=null}};$(document.documentElement).bind("click",H)};this.setTrigger=function(I,G){var H=G||["click"];if(B){F.map(function(J){B.unbind(J,A)})}if(I){if(typeof (I)=="string"){I=$(I)}else{if(!I.jquery){sf.core.reportError("setTrigger: Parameter must be a jQuery object.");return }}H.map(function(J){I.bind(J,A)})}B=I;F=H;return this};this.getCurrentTrigger=function(){return D};this.destroyDOM=function(){var G=this.getRootElement();if(G){G.remove()}return this};this.getPositionToShow=function(K){var O=typeof (K)=="string"?("#"+K):(K.jquery?K:$(K));var J=O.offset();var P={left:J.left,top:J.top};for(var G=O[0].parentNode;G&&G.nodeName.toLowerCase()!="body";G=G.parentNode){if(G.style.position=="relative"||G.style.position=="absolute"){var M=$(G).offset();P.left-=M.left;P.top-=M.top;break}}var I=P.left;var R=O.outerHeight();var L=P.top+R+2;var N=document.documentElement.scrollLeft||document.body.scrollLeft||0;var Q=document.documentElement.scrollTop||document.body.scrollTop||0;var H=this.getRootElement();if(J.top+H.height()+10-Q>$(window).height()){L=P.top-2-H.height()}if(J.left+H.width()+10-N>$(window).width()){I=P.left+O.width()-2-H.width()}return{left:I,top:L}};return this};sf.extend(sf.ui.Widget,sf.core.Observable);sf.ui.SimpleForm=function(A){sf.ui.SimpleForm.superclass.constructor.call(this,A);var I=A.formHTML;var D=A.cancelButtonSelector;var K={};for(var G in A.fieldsMap){K[G]={errorMessage:A.fieldsMap[G]}}if(!I){sf.core.reportError("ui.SimpleForm: No formHTML parameter provided.");return }var B=null;var E=function(){if(B){for(var O in K){var L=K[O].uiElt;if(!L){continue}if(L.is("input[type=radio]")){var N=K[O].defaultValue;if(N){var M=jQuery.grep(L,function(P){return P.value==N});if(M&&M.length){M[0].checked=true}}}else{L.val(K[O].defaultValue||"")}}}};this.reset=function(){E();return this};var J=this;var C=function(){var L=J.okToSubmit();if(L){J.hide();J.notifyListeners("submit",L,J)}return false};this.bind("show",function(){for(var L in K){if(K[L].uiElt){K[L].uiElt.removeClass("sf-invalid")}}});this.renderTo=function(O){O=O.jquery?O:$(O);if(!O.length){sf.core.reportError("ui.SimpleForm.renderTo: No valid container provided.");return this}B=$(I);O.append(B);for(var P in K){var N=$("[name="+P+"]",B);K[P].uiElt=N;if(N.length>0){if(N.is("input[type=radio]")){var M=jQuery.grep(N,function(Q){return Q.checked});if(M&&M.length){K[P].defaultValue=M[0].value}}else{if(N.is("select")){K[P].defaultValue=N.val()}}}}B[0].onsubmit=C;var L=$(D);if(L.length){L.bind("click",function(){J.hide()})}this.onRender(B);this.notifyListeners("render",this);return this};this.onRender=function(L){return this};this.update=function(O){for(var M in O){var L=$("[name="+M+"]",B);if(L){if(L.is("input[type=radio]")){var N=jQuery.grep(L,function(P){return P.value==O[M]});if(N&&N.length){N[0].checked=true}}else{L.val(O[M]||"")}}}return this};var F=function(){var O=false,L={};for(var N in K){var P=K[N];var Q=P.uiElt;if(Q.length){Q.removeClass("sf-invalid");var R=null;if(Q.is("input[type=radio]")){var M=jQuery.grep(Q,function(S){return S.checked});R=M&&M.length?M[0].value:null}else{R=Q.val().trim()}if(!R&&P.errorMessage){sf.ui.Util.reportError(P.errorMessage,Q);Q.addClass("sf-invalid").focus();O=true}else{L[N]=R}}}return O?null:L};this.okToSubmit=function(){return F()};this.getRootElement=function(){return B};var H=false;this.showModal=function(){if(!B){this.renderTo(document.body)}sf.ui.Util.showModal(this);this.notifyListeners("show",this);H=true;return this};this.hide=function(){if(H){sf.ui.Util.hideModal();H=false}else{B.hide()}this.notifyListeners("hide",this);return this}};sf.extend(sf.ui.SimpleForm,sf.ui.Widget);sf.ui.SimpleWidget=function(A){sf.ui.SimpleWidget.superclass.constructor.call(this,{});var C=A,B=null;this.renderTo=function(D){D=D.jquery?D:$(D);if(!D||D.length<=0){sf.core.reportError("SimpleWidget: renderTo: Cannot find container to render into.");return }B=$(C);D.append(B);this.notifyListeners("render",this);return this};this.getRootElement=function(){return B}};sf.extend(sf.ui.SimpleWidget,sf.ui.Widget);sf.ui.ToolBar=function(C){sf.ui.ToolBar.superclass.constructor.call(this,C);var E=C.domElementId||sf.allocateId();var B=[].concat(C.tools);var F=new sf.core.Template('        <table class="sf-toolbar" cellpadding="0" cellspacing="0" summary="" id="${id}">          <tr>            <% for (var i = 0; i < tools.length; i++) {                var btn = tools[i];               var clz = (btn.hasMenu ? "sf-toolbar-menu-trigger" : "sf-toolbar-btn sf-icon-btn") +  (btn.className ? (" " + btn.className) : ""); %>              <td class="sf-toolbar-cell"><button id="${id}-tool-${i}" class="${clz}" <% if (tools[i].tooltip){ %>title="${tools[i].tooltip}"<% } %>>${tools[i].label}</button></td>            <% } %>          </tr>        </table>',"ui.toolbar.template");var D=null;var A=this;var G=function(H){if($(H.target).is("button")){var I=$(".sf-toolbar-cell button",D).index(H.target);var J=B[I]&&B[I].action;if(J){J(H.target,H,B[I],A)}}};this.renderTo=function(H){H=typeof (H)=="string"?$("#"+H):H;if(!H||H.length<=0){sf.core.reportError("ui.ToolBar: renderTo: Cannot find container to render into.");return }D=$(F.process({id:E,tools:B}));H.append(D);D.bind("click",G);this.notifyListeners("render",this);return this};this.getRootElement=function(){return D}};sf.extend(sf.ui.ToolBar,sf.ui.Widget);sf.ui.Table=function(b){sf.ui.Table.superclass.constructor.call(this,b);var s=b.listModel;var F=b.caption;var H=b.defaultFilter||[];var C=b.domElementId||sf.allocateId();var X=b.template||sf.ui.TemplateStore.get("sf-list.html");var I=Math.max((b.recordsPerPage||10),10);var l=b.enableRowHoverHighlight;var Q=b.enableRowSelection;var e=b.widthPx||0;var R=b.columnWidthsPx;var V=b.showTotalsRow;var t=!!b.showSelectionCheckboxes;var d=b.minRowsToShow||0;var U=b.tools||[];var f=null;var r=b.tableClassName||"";var W=new sf.core.Template(b.recordCountTemplateString||"${firstRecordInPage}&ndash;${lastRecordInPage} of ${totalRecords}");if(!s){sf.core.reportError("ui.table: No listModel!");return }var p=null;var J=null;var P=1;var m=0;var g=null;var A=0;var E=1;var q=null;var L=null;var i=-1;var G=this;var D=null,M=null;var u=function(AB,v){var w={caption:F,count:0,id:C,colWidths:R,tableClassName:r,showCheckboxes:t,showTotals:V};var AA=[];var z=s.getColumns();for(var y=0;y<z.length;y++){var x=z[y];AA.push(x?{columnId:x.columnId,label:x.label}:{})}w.columns=AA;w.needsToolsArea=b.needsToolsArea||U.length>0;for(var y=0;y<U.length;y++){U[y].id=C+"-tools-"+y}w.tools=U;p=$(X.process(w));v.append(p);q=$(".sf-list-colcaption div",p).click(K);if(U&&U.length){f=new sf.ui.ToolBar({tools:U}).renderTo($(".sf-list-tools",p))}M=new sf.ui.PageSelector().renderTo($(".sf-list-pagercell",p));M.tableObj=AB;M.bind("change",function(AD,AC){P=AC;M.tableObj.update()})};var K=function(AD){var z=AD.target;var AE=q.index(z);var y=z.getAttribute("fid");var w=(g==z)?(-E):1;q.removeClass("sf-list-hdr-sort-up").removeClass("sf-list-hdr-sort-down");$(z).addClass("sf-list-hdr-sort-"+(w>0?"down":"up"));g=z;E=w;A=AE;if(m==1&&L.records){var v=null;if(L.groups&&L.groups.length>1){var x=L.columnIdForGroup0;var AC=sf.data.TypeInfo.comparator(s.getColumnDataType(x));var AB=y!=x?sf.data.TypeInfo.comparator(s.getColumnDataType(y)):null;v=function(AH,AG){var AF=AC(AH[x],AG[x]);if(AF==0&&AB!=null){AF=AB(AH[y],AG[y])*E}return AF}}else{var AA=s.getComparator(s.getColumns()[AE].columnId);v=function(AG,AF){return AA(AG[y],AF[y])*E}}L.records.sort(v);O(L);B()}else{P=1;G.update()}Y()};var Y=function(){if(m<=1){M.hide()}else{M.show().setPageCount(m).setCurrentPage(P)}};this.currentFilter=function(){return J};this.update=function(w,y){var x=$(".sf-loading-state",p);setTimeout(function(){x.css("display","block")},50);if(y){J=y.length>0?y:null;m=0;P=1}var v={firstRecord:(P-1)*I,recordCount:I,sort:(A>=0)?[{fieldIndex:A,direction:E}]:null,filter:H.concat(J||[])};s.getRecords(v,function(AA){L={totalRecords:AA&&AA.totalRecords||0,records:[]};for(var z=0,AB=(AA&&AA.records?AA.records.length:0);z<AB;z++){L.records[z]=sf.util.copyOf(AA.records[z])}if(AA.groups){L.groups=AA.groups;L.columnIdForGroup0=AA.columnIdForGroup0}B();O(L);if(w){w(L.records,G)}setTimeout(function(){x.css("display","none")},50)});return this};this.getListModel=function(){return s};this.getDataRecords=function(){return L&&L.records||[]};this.getDataRecord=function(v){var w=L&&L.records?L.records.length:0;return v>=0&&v<w?L.records[v]:null};this.getRecordCount=function(){return L&&L.records?L.records.length:0};this.getSelectedRowIndex=function(){return i};this.setSelectedRowIndex=function(v){var w=$(String.format(".sf-list-body tr:eq({0})",v),p);if(w.length){c(v,w[0],false)}};var S=function(AA){var x=AA;if(x&&x.totalRecords){var z=(P-1)*I+1;var w=Math.min(z+I-1,x.totalRecords);var v=x.records&&x.records.length||0;var y=W.process({firstRecordInPage:z,lastRecordInPage:w,totalRecords:x.totalRecords,recordCount:v});$(".sf-list-reccount",p)[0].innerHTML=y}else{$(".sf-list-reccount",p)[0].innerHTML="No data records."}};var N=function(){if(l){$(".sf-list-body td",p).hover(function(v){var w=$(v.target).parent();if(!w.hasClass("sf-list-row-selected")){w.addClass("highlight")}},function(v){$(v.target).parent().removeClass("highlight")})}if(t){$(".sf-list-checkbox",p).click(function(){var v=$(this.parentNode.parentNode);this.checked?v.addClass("sf-list-row-selected"):v.removeClass("sf-list-row-selected");var w=this.getAttribute("value");G.notifyListeners(this.checked?"selectRow":"deselectRow",w,G)})}};var a=function(y,x){for(var w=0,v=0;w<y.length;w++){if(y[w]==x){return v}if(y[w].tagName==x.tagName){v++}}return -1};var T=function(x){if($(x).is("#"+C+" tbody td")){var v=x.parentNode;var w=parseInt(x.getAttribute("col"));var y=parseInt(v.getAttribute("row"));return w<0||y<0?null:{row:y,column:w}}return null};var B=function(){if(i>=0){var v=String.format(".sf-list-body tr:eq({0})",i);$(v,p).removeClass("sf-list-row-selected")}i=-1};var c=function(w,v,x){if(w==i){return }B();$(v).addClass("sf-list-row-selected");i=w;if(x){G.notifyListeners("selectRow",w,G)}};var h=new sf.core.Template('        <%          var i = 0;          for (var g = 0; g < groups.length; g++) {              var grp = groups[g];              var cnt = grp.recordCount || 0;              if (grp.label) {                  var lbl = grp.label;        %>          <tr><th colspan="${cols.length}" group="${g}" class="sf-list-table-grouplabel">${lbl} (${cnt} record<% if (cnt != 1) { %>s<% } %>)</th></tr>        <%              }              for (var k = 0; k < cnt; k++, i++) {                  var rec = records[i];        %>          <tr row="${i}" group="${g}" class="${ i % 2 == 0 ? \'sf-evenrow\' : \'sf-oddrow\' }">          <% if (showCheckboxes) { %><td class="sf-list-checkboxcol" col="${j}"><input type="checkbox" class="sf-list-checkbox" value="${i}"/></td><% } %>        <%                  for (var j = 0; j < cols.length; j++) {                      var fld = cols[j];                      var content = formatCellContent (rec, j, i, fld);                      var dataType = fld && fld.dataType || null;        %>           <td class="sf-list-col-${j}<% if (dataType) { %> sf-list-datacell sf-datacell-${dataType}"<% } %> col="${j}">${content}</td>        <%        } %>          </tr>        <%              }          }          if (showTotals) {        %>        <tr class="sf-list-table-totalsrow"><% for (var j = 0; j < cols.length; j++) { %><td></td><% } %></tr>        <%          }        %>    ');var o=function(y,v,x,w){return G.formatCellContent(y,v,x,w)};var O=function(AB){var AK=[],v=AB.records,AG=s.getColumns();var AD=document.getElementById(C+"-tbody");var AK=AD.getElementsByTagName("tr");if(!AB.groups&&v.length==AK.length){for(var AC=0,w=AK.length;AC<w;AC++){var z=v[AC];var AJ=AK[AC].getElementsByTagName("td");var AJ=$("td.sf-list-datacell",$(AK[AC]));for(var AA=0,y=AJ.length;AA<y;AA++){AJ[AA].innerHTML=o(z,AA,AC,AG[AA])}$(".sf-list-checkbox",p).attr("checked",false);$(".sf-list-body tr",p).removeClass("sf-list-row-selected")}}else{var AF=h.process({minRowsToShow:d,records:v,groups:AB.groups||[{recordCount:v&&v.length||0}],inGroup:function(AM,AL){return false},formatGroupLabel:function(AL){return String(AL)},cols:AG,showTotals:V,showCheckboxes:t,formatCellContent:o});$(".sf-list-body",p).html(AF);$(".sf-list-reccount",p)[0].innerHTML=AB.totalRecords||"No data records";for(var AC=0;AC<AG.length;AC++){var x=AG[AC];$(String.format("#{0}-hdrcell-{1}",C,x.columnId))[0].innerHTML=x.shortLabel||x.label}N()}if(V){var AI=$("tr.sf-list-table-totalsrow td",p);if(AI.length){for(var AA=AG.length-1;AA>=0;AA--){var AH=AG[AA].dataType;if(AH=="number"||AH=="integer"||AH=="currency"){var AE=0;for(var AC=v.length-1;AC>=0;AC--){AE+=v[AC][AG[AA].columnId]}AI[AA].innerHTML=sf.data.TypeInfo.toHTML(AH,AE)}}}}if(AB.totalRecords){m=Math.ceil(AB.totalRecords/I)}else{m=0;P=1}S(AB);Y();G.notifyListeners("redraw",G)};var Z=function(w){var x=w.target,y=$(x);if(Q&&y.is("td.sf-list-datacell")){var v=x.parentNode;c(T(x).row,v,true)}if(y.is("th.sf-list-table-grouplabel")){$(String.format("tr[group={0}]",x.getAttribute("group")),p).toggle()}G.notifyListeners("bodyClicked",w,G)};this.renderTo=function(v){v=typeof (v)=="string"?$("#"+v):v;if(!v||v.length<=0){sf.core.reportError("ui.Table: renderTo: Cannot find container to render into.");return }u(this,v);$(".sf-list-body",p).click(Z);this.notifyListeners("render",this);return this};this.getRootElement=function(){return p};this.getCell=function(v){return T(v)};this.formatCellContent=function(z,w,v,y){var x=z?z[y.columnId]:"";return x!=""?s.toDisplayString(x,y.columnId):""}};sf.ui.Table.CHECKBOX_COL_WIDTH_PX=25;sf.extend(sf.ui.Table,sf.ui.Widget);sf.ui.PageSelector=function(){sf.ui.PageSelector.superclass.constructor.call(this);var C=0,E=1;var D=null,G=null;var B='        <table class="sf-list-pager" cellspacing="0">          <tr>            <td><button class="sf-list-prev-btn"  title="Previous page"/></td>            <td><select class="sf-list-pagesel"><option value="1">Page 1/1</option></select></td>            <td><button class="sf-list-next-btn" title="Next page"/></td>          </tr>        </table>';this.setPageCount=function(J){C=Math.max(0,J);var I=G.options;if(C!=I.length){I.length=0;for(var H=0;H<C;H++){I[H]=new Option("Page "+(H+1)+"/"+C)}}return this};this.setCurrentPage=function(H){G.selectedIndex=Math.max(H-1,0);E=H;return this};var A=this;var F=function(H){if(E!=H&&H>0&&H<=G.options.length){E=H;G.selectedIndex=E-1;A.notifyListeners("change",E,A)}};this.renderTo=function(H){H=typeof (H)=="string"?$("#"+H):H;if(!H||H.length<=0){sf.core.reportError("ui.PageSelector: renderTo: Cannot find container to render into.");return }D=$(B);H.append(D);var I=$(".sf-list-pagesel",D);G=I[0];I.bind("change",function(){F(G.selectedIndex+1)});$("button.sf-list-prev-btn",D).click(function(){F(E-1)});$("button.sf-list-next-btn",D).click(function(){F(E+1)});return this};this.getRootElement=function(){return D}};sf.extend(sf.ui.PageSelector,sf.ui.Widget);sf.ui.EditableTable=function(C){var G={};var B=function(K){var J=0;for(var I in G){G[I].element.removeClass("sf-data-modified");J++}if(J>0){this.notifyListeners("save",this.editedRows(),this);G={}}else{sf.ui.Util.reportError("No changes need to be saved.",$(K))}}.createDelegate(this);var E="sf-editable-table";if(C.tableClassName){E+=" "+C.tableClassName}C.tableClassName=E;C.tools=(C.tools||[]).concat([{label:"Save",tooltip:"Save changes",className:"sf-btn-save",action:B}]);sf.ui.EditableTable.superclass.constructor.call(this,C);var D=C.listModel.getColumns();var H=function(P,M,J){var R=this.getCell(J);var L=this.getDataRecord(R.row);var I=M.columnId,N=M.dataType;var Q=sf.data.TypeInfo.toString(N,L[I]),O=sf.data.TypeInfo.toString(N,P);if(Q!=O){var K=$(J);K.addClass("sf-data-modified");G[R.row+"_"+R.column]={row:R.row,col:R.column,element:K,value:P};this.notifyListeners("recordModified",P,I,R.row,L,J,this)}}.createDelegate(this);this.isCellEditable=function(I,J){var K=D[J];return K&&!K.disallowEdit};this.editedRows=function(){var L=[];for(var K in G){var J=G[K];if(J.row in L){var I=L[J.row];I[J.col]=J.value}else{L[J.row]=new Array();L[J.row][J.col]=J.value}}return L};var A=function(){}.createDelegate(this);var F=function(L){var J=$(L.target);if(J.is("td.sf-list-datacell")){var I=this.getCell(L.target);var K=I&&this.isCellEditable(I.row,I.column)?this.getDataRecord(I.row):null;if(K){var M=D[I.column].columnId;sf.ui.InPlaceEditManager.startEdit(L.target,D[I.column],K[M],K,A,H)}}}.createDelegate(this);this.bind("redraw",function(K,P){$("tbody.sf-list-body",J).click(F);var J=P.getRootElement();var O=$("tbody.sf-list-body tr",J);for(var N=0;N<O.length;N++){var M=$("td",O[N]);for(var L=0;L<M.length;L++){if(this.isCellEditable(N,L)){$(M[L]).addClass("sf-editable")}}}for(var I in G){G[I].element.removeClass("sf-data-modified")}sf.ui.InPlaceEditManager.reset()});this.bind("hide",function(){sf.ui.InPlaceEditManager.abortEditing()})};sf.extend(sf.ui.EditableTable,sf.ui.Table);sf.ui.Form=function(b){sf.ui.Form.superclass.constructor.call(this,b);var C=b.caption;var E=b.textUnderCaption||"";var L=b.method||"GET";var H=b.formClassName;var B=b.layout;var O=b.fieldsMap;var V={};var Z=[];for(var R=0;R<B.panels.length;R++){Z=Z.concat(B.panels[R].fieldIds)}var P=1000;for(var T=Z.length-1;T>=0;T--){if(!O[Z[T]]){sf.core.reportError(String.format("Warning: Form: Can't find field id '{0}'",Z[T]));Z.splice(T,1)}}var I=b.actionURL||"#";var S=b.nCols&&b.nCols>=1?b.nCols:2;var A=b.template||sf.ui.TemplateStore.get("sf-form.html");var N=!!b.useExistingDOM;if(N){if(!b.domElementId){sf.core.reportError("ui.Form: useExistingDOM specified, but no domElementId given: Need the id of the existing form's DOM element.");return }}else{if(b.domElementId&&document.getElementById(b.domElementId)){sf.core.reportError(String.format("ui.Form: attempt to create duplicate DOM element id {0}",b.domElementId));return }}var K=b.domElementId||sf.allocateId();var c=[];var a=null;var U=null;var D=null;var M=this;var G=function(){M.handleEditEvent.apply(M,arguments)};var Q=function(d){return d?(K+"-"+d):null};this.handleEditEvent=function(f,h,e,d,g){return this};var Y=function(){var g={id:K,caption:C,layout:B,fields:O,textUnderCaption:E,method:L,action:I,formClassName:H};a=$(A.process(g));D.prepend(a);if(jQuery.browser.msie){var h=a[0].getElementsByTagName("*");for(var m=20000,f=0,l=h.length;f<l;f++){var d=h[f];var e=d.nodeName.toLowerCase();if((e=="span"||e=="div")&&d.currentStyle.position=="relative"){d.style.zIndex=m--}}}sf.ui.Util.makeDraggable(a,$(".sf-form-caption",a))};function X(d){var e=M.prepareToSubmit();if(e){M.notifyListeners("submit",e,M,d);return M.handleSubmit(e,d,M)}return null}var J=null;var F=function(){if(a.length<=0){sf.core.reportError("ui.Form: Can't find root element with id "+K);return }for(var g=0,l=Z.length;g<l;g++){var h=Z[g];var e=$("#"+Q(h));var f=O[h];if(e.length>0&&!f.systemGenerated){if(!V[h]){var d=M.createEditor(f).bind("editComplete",G);d.renderTo(e);c[g]=d;V[h]=d}}}a[0].onsubmit=function(m){if(J){return false}J=setTimeout(function(){J=null},P);try{X(m)}catch(o){var i=jQuery.browser.mozilla?o.stack:"";sf.core.reportError("Form submit error:\n"+o.message+"\n"+i)}return false};$(".sf-form-button-cancel",a).click(function(i){M.notifyListeners("cancel",i,M);return M.handleCancel(i)})};this.simulateSubmit=function(d){X(d);return this};this.renderTo=function(d){D=d.jquery?d:$(d);if(!N){Y();F()}this.notifyListeners("render",this);return this};this.update=function(h){if(!h){return this}U=sf.util.copyOf(h);for(var e=0,l=Z.length;e<l;e++){var d=Z[e];var g=h[d];var f=V[d];if(f){f.setValue(g).setDisabled(O[d].disallowEdit)}}return this};this.shownRecord=function(){return U};this.createEditor=function(e){var d=e.editor||sf.ui.Editor.create(e);return d};this.editor=function(d){return V[d]};this.getRootElement=function(){return a};this.prepareToSubmit=function(){var l=true,h={};for(var e in O){var d=V[e];if(!d||!this.isFieldShown(e)){continue}var i=d.updateUI();if(!i||i.errorMessage){l=false}else{var g=O[e];var f=i.result;if(g&&g.fieldType=="picklist"){f=sf.data.TypeInfo.storableForm("picklist",f)}h[e]=f}}return l&&this.validate(h)?h:null};this.handleSubmit=function(e,d){return false};this.handleCancel=function(d){return false};this.validate=function(d){return true};this.reset=function(){for(var e in V){var d=V[e];if(d){d.reset().setDisabled(false).show()}}U=null;$(".sf-form-cell-value",a).each(function(){this.innerHTML=""});return this};this.getField=function(d){return $(".sf-form-item-"+d,a)};this.showField=function(d,e){this.getField(d).css("display",e?"block":"none");return this};this.isFieldShown=function(d){return N||this.getField(d).css("display")!="none"};this.setCaption=function(d){C=d;if(a){$("h3",a)[0].innerHTML=d}return this};var W=false;this.showModal=function(){a.addClass("ap-box-shadow");sf.ui.Util.showModal(this);this.notifyListeners("show",this);W=true;return this};this.hide=function(){if(W){sf.ui.Util.hideModal();W=false}else{a.hide()}this.notifyListeners("hide",this);return this};this.bind("show",function(){for(var d=0,e=c.length;d<e;d++){if(c[d]){c[d].focus();break}}});if(N){a=$("#"+K);F()}};sf.extend(sf.ui.Form,sf.ui.Widget);sf.ui.Form.createFromDOM=function(E,C){var B={panels:[{fieldIds:[]}]},G={};for(var A=0,F=C&&C.length||0;A<F;A++){var D=C[A];G[D.fieldId]=D;B.panels[0].fieldIds.push(D.fieldId)}return new sf.ui.Form({useExistingDOM:true,layout:B,fieldsMap:G,domElementId:E})};sf.ui.DatePicker=function(B){sf.ui.DatePicker.superclass.constructor.call(this,B);var D=B&&B.mode||"dynamic";var C,F;var E=null;var J='        <div class="sf-datepicker-container{1}" id="{0}">          <table class="sf-datepicker" cellspacing="0">            <thead>              <tr>                <th colspan="7" nowrap>                  <table cellspacing="0" width="100%"><tr>                  <td class="nav nav-pre-yr" title="Previous year"></td>                  <td class="nav nav-pre-mo" title="Previous month"></td>                  <td class="month-name"></td>                  <td class="nav nav-nxt-mo" title="Next month"></td>                  <td class="nav nav-nxt-yr" title="Next year"></td></tr></table>                </th>              </tr>              <tr>                <th>S</th><th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th>              </tr>            </thead>            <tbody class="sf-datepicker-body">              <tr><td class="wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="wkend"></td></tr>              <tr><td class="wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="wkend"></td></tr>              <tr><td class="wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="wkend"></td></tr>              <tr><td class="wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="wkend"></td></tr>              <tr><td class="wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="wkend"></td></tr>              <tr><td class="wkend"></td><td></td><td></td><td></td><td></td><td></td><td class="wkend"></td></tr>            </tbody>          </table>        </div>';var K=function(R,S){var N=new Date();var T=N.getDate(),Q=N.getMonth(),U=N.getFullYear();var P=new Date(S,R,1).getDay();var V=$("tbody.sf-datepicker-body td",E);var L="";var M=Date.daysInMonth[R];if(R==1&&S%4==0&&(S%100!=0||S%400==0)){M=29}for(var O=0;O<V.length;O++){L=O>=P&&O<M+P?(O-P+1).toString():-1;V[O].innerHTML=L>0?L.toString():"";if(L==T&&Q==R&&U==S){$(V[O]).addClass("sf-datepicker-todaycell")}else{$(V[O]).removeClass("sf-datepicker-todaycell")}}$("td.month-name",E)[0].innerHTML=Date.monthNames[R]+" "+S;C=R;F=S};var H=function(){var M=C-1,L=F;if(M<0){M=11;L--}K(M,L)};var I=function(){var M=C+1,L=F;if(M>11){M=0;L++}K(M,L)};var G=function(L){K(C,L)};var A=function(L,O){var P=$(L.target);if(P.is("td")){var N=P.html().trim();if(N!=""){var M=sf.data.TypeInfo.toHTML("date",new Date(F,C,N));O.notifyListeners("select",M,L,O);return true}}return false};this.renderTo=function(L,O){var N=sf.allocateId();var M=typeof (L)=="string"?$("#"+L):L;E=$(String.format(J,N,D=="dynamic"?" sf-datepicker-container-dyn":""));M.append(E);$(".nav",M).addHoverClass("nav-hover");$("tbody.sf-datepicker-body td",M).addHoverClass("nav-hover");$(".nav-pre-mo",M).click(function(P){H()});$(".nav-nxt-mo",M).click(function(P){I()});$(".nav-pre-yr",M).click(function(P){G(F-1)});$(".nav-nxt-yr",M).click(function(P){G(F+1)});$("tbody.sf-datepicker-body",M).click(function(P){if(this.isShown()){if(!A(P,this)&&D=="dynamic"){this.hide()}}}.createDelegate(this));if(!O){O=new Date()}this.update(O.getMonth(),O.getFullYear());this.notifyListeners("render",this);return this};this.update=function(M,L){K(M,L);return this};this.getRootElement=function(){return E};return this};sf.ui.DatePicker.globalInstance=function(){var A=sf.ui.DatePicker;if(!A._instance){A._instance=new sf.ui.DatePicker().renderTo($(document.body))}return A._instance};sf.extend(sf.ui.DatePicker,sf.ui.Widget);sf.ui.Editor=function(A){sf.ui.Editor.superclass.constructor.call(this,A);this._fieldId=A.fieldId;this.fieldId=function(){return this._fieldId};this.dataTypeName=function(){return null};this.value=function(){return null};this.minWidthPx=function(){return 0};this.minHeightPx=function(){return 0};this.abortEditing=function(){var B=this.getRootElement();if(B.length){$(".sf-ipe-error",B).css("display","none")}this.notifyListeners("editAborted",this);return this};this.editInPlace=function(B,D,C,E){return this};this.setValue=function(B){return this};this.validate=function(){return{result:this.value()}};this.updateUI=function(){var B=this.validate();return B&&B.result?B:null};this.finishEditing=function(B){var C=this.updateUI();this.notifyListeners("editComplete",C,this._fieldId,B,this)};this.reset=function(){this.setValue("");this.clearErrorState();return this};this.isInErrorState=function(){return $(".sf-ipe-error",this.getRootElement()).css("display")=="block"};this.setErrorState=function(C){var B=this;setTimeout(function(){if(B.isShown()){var D=B.getRootElement();D.addClass("sf-invalid");sf.ui.Util.reportError(C,D);if(D.is("input")||D.is("select")||D.is("textarea")){D.focus()}}},200);return this};this.clearErrorState=function(){var B=this.getRootElement();$(".sf-ipe-error",B).html("").css("display","none");B.removeClass("sf-invalid");return this};this.focus=function(){return this};this.setDisabled=function(B){var C=this.getRootElement();$("input,select",C).each(function(){this.disabled=!!B});return this};this._computeInPlaceEditStyle=function(E){var C=$(E);var F=C.offset();var B,D;if(jQuery.browser.msie){B=E.offsetWidth;D=E.offsetHeight}else{B=parseInt(C.css("width"))+parseInt(C.css("padding-left"))+parseInt(C.css("padding-right"));D=E.offsetHeight+parseInt(C.css("padding-top"))+parseInt(C.css("padding-bottom"))}return{display:"block",position:"absolute",zIndex:25,top:F.top+"px",left:F.left+"px",minWidth:Math.max(this.minWidthPx(),B)+"px"}}};sf.extend(sf.ui.Editor,sf.ui.Widget);sf.ui.ReadOnlyText=function(C){var A=C||{};sf.ui.ReadOnlyText.superclass.constructor.call(this,A);var B="";this.dataTypeName=function(){return"string"};this.value=function(){return B};this.setValue=function(D){B=D!=null?D.toString():"";_editorElement.html(B);return this};this.toHTML=function(D){return D};this.renderTo=function(D){var H=sf.allocateId();var F='<span id="${elementId}-wrap" class="sf-ipe-wrapper">${value}</span>';var E=new sf.core.Template(F).process({elementName:this._fieldId,elementId:H,value:B});var G=typeof (D)=="string"?$("#"+D):D;G.append(E);_editorElement=$("#"+H+"-wrap");this.notifyListeners("render",this);return _editorElement[0]};this.getRootElement=function(){return _editorElement}};sf.extend(sf.ui.ReadOnlyText,sf.ui.Editor);sf.ui.StringEditor=function(C){var J=C||{};sf.ui.StringEditor.superclass.constructor.call(this,J);var M=J.domElementId||sf.allocateId();var P=J.matchRegex;var N=J.disallowEmpty;var E=J.emptyErrorMessage||"Please provide a non-empty value.";var O=J.validityErrorMessage||"Please provide a valid value.";var A=J.validator;var B=J.boxSize||250;var H=null;var G=null;var D="static";var I=J.multiLine;var L=J.helpText||"";var K=!!J.isPassword;var F=function(Q){if(G){G[0].value=String(Q)}};this.dataTypeName=function(){return"string"};this.value=function(){var R=G&&G.val();if(R){var Q=this.dataTypeName();R=sf.data.TypeInfo.converter(Q)(R)}else{R=null}return R};this.inputElement=function(){return G};this.validate=function(){var S=G?G.val():null;if(A&&S){var R=A(S,this);if(R!=undefined){var Q=this.toHTML(R);if(Q!=S){F(R)}return{result:R}}return{errorMessage:O,userInput:S}}var T=null;S=S.trim();if(S){if(P&&!P.test(S)){T=O}}else{if(N){T=E}}return{result:S,errorMessage:T,userInput:S}};this.setValue=function(Q){F(Q!=null?Q:"");return this};this.editInPlace=function(R,U,S,V){if(!H){D="inplace";this.renderTo($(document.body))}H.css(this._computeInPlaceEditStyle(R));var T={width:$(R).width()+2+"px"};if(G.is("textarea")){T.height=$(R).height()+18+"px"}G.css(T).focus();var Q=U!=undefined&&U!=null?this.toHTML(U):$(R).text();F(Q);return this};this.toHTML=function(Q){return Q};this.renderTo=function(Q){var T='            <span id="${elementId}-wrap" class="sf-ipe-wrapper">              <% if (multiLine) { %>                <textarea class="sf-textarea" id="${elementId}" name="${elementName}" rows="2" cols="25"></textarea>              <% } else { %>                <input class="sf-textbox sf-textbox-${dataType}" type="${isPassword ? "password" : "text"}" id="${elementId}" name="${elementName}" size="${size}" />              <% } %>              <% if (helpText) { %><span class="sf-icon-help"><span>${helpText}</span></span><% } %>              <span class="sf-ipe-error"></span>            </span>';var S=new sf.core.Template(T).process({elementName:this._fieldId,elementId:M,multiLine:I,size:B,dataType:this.dataTypeName(),isPassword:K,helpText:L});var U=typeof (Q)=="string"?$("#"+Q):Q;U.append(S);G=$("#"+M);var R=this;if(D=="inplace"){G.blur(function(V){R.finishEditing(V)})}G.keydown(function(V){R.notifyListeners("change",V,R);var W=13;if(V.keyCode==W&&D=="inplace"&&!I){R.finishEditing(V)}});this.notifyListeners("render",this);H=G.parent();return H[0]};this.getRootElement=function(){return H};this.updateUI=function(){var Q=this.validate();if(Q.errorMessage){this.setErrorState(Q.errorMessage)}else{var R=sf.data.TypeInfo.toString(this.dataTypeName(),Q.result);if(G.val()!=R){F(R)}this.clearErrorState()}return Q};this.focus=function(){if(G){G.focus()}return this};this.selectAll=function(){var Q=G.val();if(Q&&Q.length){sf.ui.Util.setTextboxSelection(G[0],0,Q.length)}}};sf.extend(sf.ui.StringEditor,sf.ui.Editor);sf.ui.NumberEditor=function(B){var A=B||{};A.validator=function(C){return sf.data.TypeInfo.converter(_fieldType)(C)};A.boxSize=6;sf.ui.NumberEditor.superclass.constructor.call(this,A);_fieldType=B.fieldType||"number";this.dataTypeName=function(){return _fieldType};this.toHTML=function(C){return sf.data.TypeInfo.htmlFormatter(_fieldType)(C)}};sf.extend(sf.ui.NumberEditor,sf.ui.StringEditor);sf.ui.CurrencyEditor=function(B){var A=B||{};A.validator=function(C){return sf.data.TypeInfo.converter("currency")(C)};sf.ui.NumberEditor.superclass.constructor.call(this,A);this.dataTypeName=function(){return"currency"};this.toHTML=function(C){return sf.data.TypeInfo.htmlFormatter("currency")(C)}};sf.extend(sf.ui.NumberEditor,sf.ui.StringEditor);sf.ui.DurationEditor=function(B){var A=B||{};A.validator=function(D){var C=sf.data.TypeInfo.converter("duration")(D);return typeof (C)!="undefined"?C:null};sf.ui.DurationEditor.superclass.constructor.call(this,A);this.dataTypeName=function(){return"duration"};this.toHTML=function(C){return sf.data.TypeInfo.htmlFormatter("duration")(C)}};sf.extend(sf.ui.DurationEditor,sf.ui.StringEditor);sf.ui.TimeOfDayEditor=function(B){var A=B||{};A.validator=function(D){var C=sf.data.TypeInfo.converter("timeofday")(D);return typeof (C)!="undefined"?C:null};sf.ui.TimeOfDayEditor.superclass.constructor.call(this,A);this.dataTypeName=function(){return"timeofday"};this.toHTML=function(C){return sf.data.TypeInfo.htmlFormatter("timeofday")(C)}};sf.extend(sf.ui.TimeOfDayEditor,sf.ui.StringEditor);sf.ui.PhoneNumberEditor=function(D){var B=D||{};sf.ui.PhoneNumberEditor.superclass.constructor.call(this,B);var A=B.disallowEmpty;var E=B.validator;this.dataTypeName=function(){return"phone"};this.updateUI=function(){var F=this.validate();if(F&&F.errorMessage){this.setErrorState(F.errorMessage)}else{this.clearErrorState();if(F.result){this.inputElement().val(F.result.toString())}}return F};var C=null;this.toHTML=function(F){if(!C){C=sf.data.TypeInfo.htmlFormatter("phone")}return C(F)};this.validate=function(){var G=$("input",this.getRootElement()).val();var H=null,F={result:null,userInput:G};if(G){H=sf.data.PhoneNumber.buildFrom(G);F=H?{result:H,errorMessage:null}:{result:null,errorMessage:"Please provide a valid phone number."}}else{if(A){F={result:null,errorMessage:"Please provide a phone number."}}}return E?E(H,this):F}};sf.extend(sf.ui.PhoneNumberEditor,sf.ui.StringEditor);sf.ui.PicklistEditor=function(A){var D=A||{};sf.ui.PicklistEditor.superclass.constructor.call(this,D);var I=D.domElementId||sf.allocateId();var C=null;var G=D.choicesList;var F=D.selectHTML||"";var H=D.helpText||"";var B=null;var J=this;var E=function(K){if(K.type=="change"){J.notifyListeners("change",J)}var L=(K.type!="click"||K.target!=B[0])&&J.isShown();if(L){J.finishEditing(K);$(document.documentElement).unbind("click",E)}};this.dataTypeName=function(){return"picklist"};this.editInPlace=function(L,N,M,O){if(!C){this.renderTo($(document.body))}var K=typeof (N)=="string"?N:(N&&N.length?N[0]:null);if(G&&O&&this.fieldId()==O.fieldId){sf.ui.Util.fillSelector(B[0],G,K,!O.disallowEmpty)}else{if(typeof (O.getChoicesList)=="function"){O.getChoicesList(N,M,function(Q,P){sf.ui.Util.fillSelector(B[0],Q,K,!O.disallowEmpty)})}}C.css(this._computeInPlaceEditStyle(L));setTimeout(function(){$(document.documentElement).bind("click",E)},300);return this};this.fillSelector=function(L,K,M){G=L;if(B&&B[0]){sf.ui.Util.fillSelector(B[0],L,K,M)}return this};this.renderTo=function(K){var M=F||String.format('<select id="{0}" name="{1}" ></select>',I,this._fieldId);var L=String.format('<span id="{0}-wrap" class="sf-ipe-wrapper">  {1}  <span class="sf-ipe-error"></span>{2}</span>',I,M,(H?'<span class="sf-icon-help"><span>'+H+"</span></span>":""));var N=typeof (K)=="string"?$("#"+K):K;N.append(L);C=$("#"+I+"-wrap");B=$("select",C);if(G){this.fillSelector(G,null,!D.disallowEmpty)}B.bind("change",E).bind("blur",E);this.notifyListeners("render",this);return this};this.getRootElement=function(){return C};this.value=function(){return B?[B.val(),$("option:selected",B).text()]:null};this.setValue=function(L){if(!B){return this}var K=typeof (L)=="string"?L:(L&&L.length?L[0]:"");B.val(K);return this};this.updateUI=function(){var L=this.validate();var K=$(".sf-ipe-error",C);if(L.errorMessage){K.html(L.errorMessage).css("display","block");B.addClass("sf-invalid");_isValid=false;setTimeout(function(){errBlock.fadeOut("slow")},1500)}else{K.css("display","none");B.val(L.result);B.removeClass("sf-invalid");_isValid=true}return L};this.validate=function(){var L=B[0].options;var K=B[0].selectedIndex;if(L&&K>=0){return{result:[L[K].value,L[K].text]}}return{result:null}};this.getChoicesList=function(){return G};this.getSelectedIndex=function(){return B&&B.length>0?B[0].selectedIndex:-1};this.getSelectedItem=function(){var L=B&&B.length>0?B[0].selectedIndex:-1;if(L>=0){var M=B[0].options[L];var K=parseInt(M._index);return isNaN(K)?null:G[K]}return null};this.focus=function(){if(B){B.focus()}return this}};sf.extend(sf.ui.PicklistEditor,sf.ui.Editor);sf.ui.DateEditor=function(S){var G=S||{};sf.ui.DateEditor.superclass.constructor.call(this,G);var L=G.validator;var A=G.editTime;var O=G.helpText||"";var T=null;var N=null;var Q=null;var C=false;var E=null;var B="static";var K=true;var D='<span id="${id}-wrap" class="sf-date-ipe-wrapper">           <% if (editTime) { %>             <table cellspacing="0"><tr>               <td><input type="text" id="${id}-date" class="sf-datebox" maxlength="10" /></td>               <td><input type="text" id="${id}-time" maxlength="10" /></td>             </tr></table>           <% } else { %>             <input type="text" name="${name}" id="${id}-date" class="sf-datebox" maxlength="10"/>           <% } %>           <% if (helpText) { %><span class="sf-icon-help"><span>${helpText}</span></span><% } %>           <div id="${id}-picker-wrap"></div>           <span class="sf-ipe-error"></span>         </span>';var I=sf.allocateId();var H=new sf.core.Template(D).process({id:I,name:this._fieldId,editTime:A,helpText:O});this.dataTypeName=function(){return A?"datetime":"date"};this.getRootElement=function(){return T};var M=false;var J=function(X){if(!M){return }var V=E.getRootElement();var W=[N,V,Q].filter(function(Y){return Y&&Y.containsElement(X.target)});if(!W.length){this.finishEditing(X);M=false}else{if(Q&&W[0]==Q[0]){E.hide()}}}.createDelegate(this);$(document.documentElement).bind("click",J);var U=function(V,X,W){N.val(X);if(A&&Q){Q.focus();E.hide()}else{this.finishEditing(W);M=false}this.notifyListeners("change",W,this)}.createDelegate(this);var R=function(){return(N.val()+(A?(" "+Q.val()):"")).trim()};this.editInPlace=function(V,X,W,Y){M=false;B="inplace";if(!T){this.renderTo($(document.body))}T.css(this._computeInPlaceEditStyle(V));this.setValue(X);var Z=X?X:new Date();E.show().update(Z.getMonth(),Z.getFullYear());N.focus();C=Y.disallowEmpty;setTimeout(function(){M=true},500);return this};this.updateUI=function(){var W=this.validate();if(W.errorMessage){var V=$(".sf-ipe-error",T);V.html(W.errorMessage).css("display","block");N.addClass("sf-invalid");K=false;setTimeout(function(){V.fadeOut("slow")},1500)}else{var X=W&&W.result?sf.data.TypeInfo.toHTML("date",W.result):"";N.val(X);$(".sf-ipe-error",T).css("display","none");E.hide();N.removeClass("sf-invalid");K=true}return W};var P=function(){return sf.data.TypeInfo.DEFAULT_DATE_FORMAT=="dd/MM/yyyy"};this.renderTo=function(V){var X=H;var Y=typeof (V)=="string"?$("#"+V):V;Y.append(X);T=$("#"+I+"-wrap");N=$("#"+I+"-date",T);Q=A?$("#"+I+"-time",T):null;E=new sf.ui.DatePicker().renderTo(I+"-picker-wrap");E.show=function(){E.getRootElement().css("display","block");return this};if(B!="inplace"){E.setTrigger(N,["focus"])}N.bind("focus",function(){var Z=Date.parseDate(N.val(),P());if(!Z){Z=new Date()}E.update(Z.getMonth(),Z.getFullYear())});E.bind("select",U);if(Q){Q.focus(function(Z){E.hide()}).blur(function(Z){this.finishEditing(Z)}.createDelegate(this))}var W=9;N.keydown(function(Z){if(Z.keyCode==W){if(A){E.hide()}else{this.finishEditing(Z)}}else{this.notifyListeners("change",Z,this)}}.createDelegate(this));if(Q){Q.keydown(function(Z){this.notifyListeners("change",Z,this)}.createDelegate(this))}this.notifyListeners("render",this);return this};var F=function(V){if(typeof (V)=="string"){V=Date.parseDate(V,P())}if(V){N.val(sf.data.TypeInfo.toHTML("date",V));if(A){Q.val(V.format("hh:mm a"))}}else{N.val("");if(A){Q.val("")}}};this.setValue=function(V){F(V);return this};this.value=function(){return Date.parseDate(R(),P())};this.validate=function(){var Z=A?"Please provide a valid date/time in the format MM/dd/yyyy hh:mm a (e.g., 2/13/2008 11:10 am).":"Please provide a valid date in  MM/dd/yyyy format (e.g., 2/13/2008).";var W=null;var V=R();var X={};if(!V){X=C?{errorMessage:Z}:{result:null}}else{var Y=Date.parseDate(V,P());X=Y?{result:Y}:{errorMessage:Z};if(L){X=L(Y,this)}}X.userInput=V;return X};this.focus=function(){if(N){N.focus()}return this}};sf.extend(sf.ui.DateEditor,sf.ui.Editor);sf.ui.DateTimeEditor=function(B){var A=B||{};A.editTime=true;sf.ui.DateTimeEditor.superclass.constructor.call(this,A)};sf.extend(sf.ui.DateTimeEditor,sf.ui.DateEditor);sf.ui.BooleanEditor=function(B){var A=B||{};sf.ui.BooleanEditor.superclass.constructor.call(this,A);var E=null;var D=null;var C=function(F){var G=D[0].checked;this.finishEditing(F)}.createDelegate(this);this.getRootElement=function(){return E};this.dataTypeName=function(){return"boolean"};this.editInPlace=function(F,G){if(!E){this.renderTo($(document.body))}E.css(this._computeInPlaceEditStyle(F));D[0].checked=G?true:false;return this};this.renderTo=function(F){var J=sf.allocateId();var H=String.format('<span id="{0}-wrap" class="sf-boolean-ipe-wrapper">  <input type="checkbox" name="{1}" id="{0}" value="1" /></span>',J,this._fieldId);var I=typeof (F)=="string"?$("#"+F):F;I.append(H);E=$("#"+J+"-wrap");D=$("#"+J);var G=this;D.blur(C).click(function(K){G.notifyListeners("change",K,G)});this.notifyListeners("render",this);return this};this.value=function(){return D&&D[0].checked?true:false};this.setValue=function(F){if(D){D[0].checked=F?true:false}return this};this.updateUI=function(){return{result:D&&D[0].checked}};this.reset=function(){if(D){D[0].checked=false}return this}};sf.extend(sf.ui.BooleanEditor,sf.ui.Editor);sf.ui.ReferenceEditor=function(D){var E=D&&D.field||{};sf.ui.ReferenceEditor.superclass.constructor.call(this,{disallowEmpty:E.disallowEmpty,fieldId:E.fieldId});var J=null;var I=E.metadata.dataService;var B=I.getMetadata(E.refersToObject).displayFieldId;var G=[{fieldId:B,op:"starts with",value:null}];var F=function(N,O,M){G[0].value=N;I.getChoicesForReference(E.objectName,E.refersToObject,J,G,function(Q,P){M({records:Q,totalRecords:P})})};var A=null;this.dataTypeName=function(){return"reference"};this.value=function(){var M=A.getSelectedItem();return M?[M.value,M.text]:null};var K=function(N){var M=N instanceof Array&&N.length>=2?{value:N[0],text:N[1]}:(N?{text:String(N)}:null);A.focus().setSelectedItem(M)};this.setValue=function(M){K(M);return this};this.toHTML=function(M){return M&&M.text||""};this.editInPlace=function(M,O,N,P){if(!A){this.renderTo($(document.body))}E=P;J=N;A.getRootElement().css(this._computeInPlaceEditStyle(M));K(O);A.clearCache();return this};var L=this;var H=function(M){L.finishEditing(M)};var C=function(M){L.notifyListeners(M,L)};this.renderTo=function(M){var N=typeof (M)=="string"?$("#"+M):M;A=new sf.ui.AutoCompleter({dataProvider:F,completionDelayMS:sf.ui.ReferenceEditor.COMPLETION_DELAY_MS,disallowEmpty:!!E.disallowEmpty}).renderTo(N);A.bind("change",C).bind("select",H);this.notifyListeners("render",this);return this};this.getRootElement=function(){return A.getRootElement()};this.reset=function(){this.setValue("");this.clearErrorState();A.clearCache();return this};this.updateUI=function(){var M=this.validate();if(M&&M.errorMessage){this.setErrorState(M.errorMessage)}else{this.clearErrorState()}return M};this.validate=function(){var O=!E.disallowEmpty;var M=A.getSelectedItem();if(M||O){return{result:M&&[M.value,M.text]||null}}var N="Please provide a non-empty value.";this.setErrorState(N);return{errorMessage:N}}};sf.extend(sf.ui.ReferenceEditor,sf.ui.Editor);sf.ui.ReferenceEditor.COMPLETION_DELAY_MS=450;sf.ui.MultiPickEditor=function(A){var E=A||{};sf.ui.MultiPickEditor.superclass.constructor.call(this,E);var G=A.choicesList||[];var B=null;var H=A.domElementId||sf.allocateId();var I=new sf.core.Template('      <% for (var i = 0; i < range.length; i++) { %>        <div class="ap-multipick-item">          <table cellspacing="0" cellpadding="0">            <tr valign="top"><td><input class="ap-multipick-ckbox" type="checkbox" value="${range[i].value}" id="${id}_${range[i].value}" /></td>            <td><label for="${id}_${range[i].value}" class="ap-multipick-text">${range[i].text}</label></td></tr>          </table>        </div>      <% } %>    ');var J=this;this.dataTypeName=function(){return"multiPicklist"};this.value=function(){return D()};this.minWidthPx=function(){return 100};this.minHeightPx=function(){return 100};this.editInPlace=function(K,M,L,N){if(!B){_mode="inplace";this.renderTo($(document.body));B.addClass("ap-multipick-ipe")}G=N.picklistItems;B[0].innerHTML=I.process({range:G.getItems(),id:H});B.css(this._computeInPlaceEditStyle(K));this.setValue(M);setTimeout(function(){$(document.documentElement).bind("click",F)},300);return this};this.setValue=function(K){if(K||K==""){if(typeof (K)=="string"){K=new sf.data.MultiPickValue(G,K)}var L=K.choices();jQuery(".ap-multipick-ckbox",B).each(function(){this.checked=L.indexOf(this.getAttribute("value"))>=0})}return this};this.renderTo=function(K){var O=H;var M=I.process({range:G.getItems(),id:O});var L=String.format('<div class="ap-multipick-wrap" id="{0}-wrap">{1}</div>',O,M);var N=typeof (K)=="string"?$("#"+K):K.jquery?K:$(K);B=$(L);N.append(B);$("#"+O+"-wrap .ap-multipick-ckbox").live("click",C);this.notifyListeners("render",this);return B[0]};this.getRootElement=function(){return B};var D=function(){var K=[];$("input[type=checkbox]",B).each(function(){if(this.checked){K.push(this.value)}});K.sort();return new sf.data.MultiPickValue(G,K)};var C=function(){J.notifyListeners("change",J.value(),J)};var F=function(K){if(K.type!="click"||!B.containsElement(K.target)&&J.isShown()){J.finishEditing(K);$(document.documentElement).unbind("click",F)}}};sf.extend(sf.ui.MultiPickEditor,sf.ui.Editor);sf.ui.AddressEditor=function(B){var A=B||{};sf.ui.AddressEditor.superclass.constructor.call(this,A);var C=null;this.dataTypeName=function(){return"address"};this.getRootElement=function(){return C};this._fillSelectors=function(F){var E=this.getRootElement();var H=F.country();var D=sf.data.Address.statesList(H);if(D){var G=$("select.state",E);sf.ui.Util.fillSelector(G[0],D);G.val(F.state());G.css("display","inline");$("input.state",E).css("display","none")}else{$("input.state",E).css("display","inline").val(F.state());$("select.state",E).css("display","none")}$(".street",E).val(F.street());$(".city",E).val(F.city());$(".zipCode",E).val(F.zipCode());$(".country",E).val(H);if(H=="us"||H=="ca"){$(".zipLabel",E).html("Zip");$(".stateLabel",E).html("State")}else{$(".zipLabel",E).html("Postcode");$(".stateLabel",E).html("Region")}};this.editInPlace=function(D,G,F,H){if(!C){this.renderTo($(document.body))}C.css(this._computeInPlaceEditStyle(D));if(G){var J=G.country();var E=sf.data.Address.statesList(J);if(E){var I=$("select.state",elt);sf.ui.Util.fillSelector(I[0],E);I.val(G.state());I.css("display","inline");$("input.state",elt).css("display","none")}else{$("input.state",elt).css("display","inline").val(G.state());$("select.state",elt).css("display","none")}$(".street",elt).val(G.street());$(".city",elt).val(G.city());$(".zipCode",elt).val(G.zipCode());$(".country",elt).val(J);if(J=="us"||J=="ca"){$(".zipLabel",elt).html("Zip");$(".stateLabel",elt).html("State")}else{$(".zipLabel",elt).html("Postcode");$(".stateLabel",elt).html("Region")}}return this};this.minWidthPx=function(){return 250};this.minHeightPx=function(){return 130};this.renderTo=function(D){var G="sf-address-edit-"+sf.allocateId();var E=String.format('<div class="sf-address-edit" id="{0}">\n  <table cellspacing="0" cellpadding="0">\n    <tr>\n     <td class="label">Street</td>\n     <td colspan="3"><textarea class="street" name="{1}__street" ></textarea></td>\n    </tr>\n    <tr>\n     <td class="label">City</td>\n     <td colspan="3"><input name="{1}__city" class="city" size="20" value="" /></td>\n    </tr>\n    <tr>\n     <td class="label stateLabel">State</td>\n     <td>       <select name="{1}__state" class="state">\n</select>\n       <input class="state" size="20" maxlength="64" />\n     </td>\n     <td class="label zipLabel">Zip</td>\n     <td><input name="{1}__zipCode" class="zipCode" size="7" value="" /></td>\n    </tr>\n    <tr>\n     <td class="label">Country</td>\n     <td colspan="3">\n       <select name="{1}__country" class="country">\n       </select>\n     </td>\n    </tr>\n  </table>\n  <div class="btns">\n    <button class="save">Save</button>\n    <button class="cancel">Cancel</button>\n  </div></div>\n',G,this._fieldId);var F=typeof (D)=="string"?$("#"+D):D;F.append(E);C=$("#"+G);sf.ui.Util.fillSelector($("#"+G+" .country")[0],sf.data.Address.countryList());$(".cancel",C).click(this.abortEditing.createDelegate(this));$(".save",C).click(this.finishEditing.createDelegate(this));$("input[type=text]",C).keydown(function(H){this.notifyListeners("change",H,this)}.createDelegate(this));$("textarea",C).keydown(function(H){this.notifyListeners("change",H,this)}.createDelegate(this));return this};this.updateUI=function(){return true};this.value=function(){return this._value}};sf.extend(sf.ui.AddressEditor,sf.ui.Editor);sf.ui.ChoicesListEditor=function(C){var A=C||{};sf.ui.ChoicesListEditor.superclass.constructor.call(this,A);this.dataTypeName=function(){return"choicesList"};var F=C.domElementId||sf.allocateId();var E=null;var G=[];var H=null;var B=function(){B.superclass.constructor.apply(this,arguments);this.getColumns=function(){return[{columnId:"text",dataType:"string"},{columnId:"count",dataType:"integer",disallowEdit:true}]};this.getRecords=function(K,L){var J=G&&G.length?G.map(function(N,M){return N.text?{index:M,text:N.text,value:N.value,count:N.count}:null}):[];var I={totalRecords:J.length,records:J};if(L){L(I)}return I}};sf.extend(B,sf.data.ListModel);var D=String.format('        <div class="sf-cl-editorwrap" id="{0}">          <div style="margin-bottom: 5px;">            New value: <input type="text" class="sf-cl-editor-newitem" style="width: 100px;" /><button class="sf-cl-editor-addnew">Add</button>          </div>          <div class="sf-cl-editor"></div>        </div>    ',F);this.renderTo=function(I){I=typeof (I)=="string"?$("#"+I):I;if(!I||I.length<=0){sf.core.reportError("ChoicesListEditor: renderTo: Cannot find container to render into.");return }E=$(D);I.append(E);H=new sf.ui.EditableTable({domElementId:F+"-table",listModel:new B(),recordsPerPage:500,minRowsToShow:6,columnWidthsPx:[158,30]});var J='<input type="button" class="sf-delete-small sf-cl-delete-btn" rowNo="{0}" title="Delete this item" />';sf.override(H,"formatCellContent",function(N,K,L,M){if(K==1&&N){if(!N.count){return String.format(J,N.index)}var O=arguments.callee.super_.apply(this,arguments);return String.format('<a title="{0} data records use this picklist value.">{0}</a>',O)}return arguments.callee.super_.apply(this,arguments)});H.renderTo($(".sf-cl-editor",E));H.bind("bodyClicked",function(K,L){if($(L.target).is(".sf-cl-delete-btn")){var M=L.target.getAttribute("rowNo");delete G[M].text;if(typeof (G[M].value)=="undefined"){G.splice(M,1)}H.update();L.stopPropagation()}});H.bind("recordModified",function(M,O,L,N,P,K){if(O){G[N][L]=O}else{sf.ui.Util.reportError("Please provide a non-empty picklist item",K)}});$(".sf-cl-editor-addnew",E).bind("click",function(){var K=$(".sf-cl-editor-newitem",E);var L=K.val().trim();if(!L){sf.ui.Util.reportError("Please provide a value for the new item.",K);K.focus()}else{if(G.find(L,function(N,M){return N.text&&N.text.toLowerCase()==M.toLowerCase()})){sf.ui.Util.reportError(String.format("The picklist already contains '{0}'",L),K);K.focus()}else{G.push({text:L});H.update();K.focus().val("")}}return false});this.notifyListeners("render",this);return this};this.value=function(){return G};this.setValue=function(I){G=I||[];H.update();return this};this.getRootElement=function(){return E}};sf.extend(sf.ui.ChoicesListEditor,sf.ui.Editor);sf.ui.Editor.create=function(B){var A=null;var C=B.helpText||"";switch(B.fieldType){case"date":A=new sf.ui.DateEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,validator:B.validator,helpText:C});break;case"datetime":A=new sf.ui.DateTimeEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,validator:B.validator,helpText:C});break;case"boolean":A=new sf.ui.BooleanEditor({fieldId:B.fieldId,helpText:C});break;case"phone":A=new sf.ui.PhoneNumberEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,validator:B.validator,helpText:C});break;case"address":A=new sf.ui.AddressEditor({fieldId:B.fieldId});break;case"number":case"integer":A=new sf.ui.NumberEditor({fieldId:B.fieldId,fieldType:B.fieldType,disallowEmpty:B.disallowEmpty,validator:B.validator||null,validityErrorMessage:"Please provide a valid number.",helpText:C});break;case"currency":A=new sf.ui.CurrencyEditor({fieldId:B.fieldId,disallowEmpty:B.disallowEmpty,validator:B.validator||null,validityErrorMessage:"Please provide a valid currency value.",helpText:C});break;case"duration":A=new sf.ui.DurationEditor({fieldId:B.fieldId,disallowEmpty:B.disallowEmpty,validator:B.validator||null,validityErrorMessage:"Please provide a valid duration in the format h:mm[:ss] (e.g., 4:13:25), or like 4h 13m 25s.",helpText:C});break;case"timeofday":A=new sf.ui.TimeOfDayEditor({fieldId:B.fieldId,disallowEmpty:B.disallowEmpty,validator:B.validator||null,validityErrorMessage:"Please provide a valid time of day in the format h:mm[:ss].",helpText:C});break;case"reference":if(B.editorType=="picklistEditor"){A=new sf.ui.PicklistEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,choicesList:B.choicesList,validator:B.validator,helpText:C})}else{A=new sf.ui.ReferenceEditor({field:B,helpText:C})}break;case"picklist":A=B.editorType=="autocompleter"?new sf.ui.ReferenceEditor({field:B}):new sf.ui.PicklistEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,choicesList:B.choicesList,validator:B.validator,helpText:C});break;case"choicesList":A=new sf.ui.ChoicesListEditor({fieldId:B.fieldId,helpText:C});break;case"multipick":A=new sf.ui.MultiPickEditor({fieldId:B.fieldId,choicesList:new sf.data.Picklist(B.choicesList),helpText:C});break;case"zipCode":A=new sf.ui.StringEditor({disallowEmpty:B.disallowEmpty,validator:sf.data.TypeInfo.converter("zipCode"),validityErrorMessage:"Please provide a zip code in the format nnnnn or nnnnn-nnnn",boxSize:10,helpText:C});break;case"string":case"text":default:A=B.choicesList?new sf.ui.PicklistEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,choicesList:B.choicesList,validator:B.validator,helpText:C}):new sf.ui.StringEditor({disallowEmpty:B.disallowEmpty,fieldId:B.fieldId,multiLine:B.fieldType=="text",validator:B.validator,isPassword:B.isPassword,helpText:C});break}B._editor=A;B.getEditor=function(){return this._editor};return A};sf.ui.InPlaceStringEditor=function(){var A=null;var D=null;var C=null;function E(){C.hide();if(A){A(C.value(),D)}}function B(){C.hide()}this.doEdit=function(G,F){A=F;D=G;if(!C){C=new sf.ui.StringEditor({fieldId:"ipse.string"}).bind("editComplete",E).bind("editAborted",B)}C.editInPlace(G,G.innerHTML);return this};this.selectAll=function(){if(C){C.selectAll()}}};sf.ui.InPlaceEditManager=(function(){var G={},E=null,D=null;var C=function(L,P,Q,M,I,J){if(D){D.abortEditing().clearErrorState().hide()}var T=P;var R=P.fieldId;var N=G[R];if(!N){N=sf.ui.Editor.create(T);G[R]=N}var K=$(L);var O=K.css("backgroundColor");var S=K.css("color");K.css("color",O);E=L;L._textColor=S;var H=function(W,V){F();if(V.errorMessage){L.innerHTML=V.userInput||"";sf.ui.Util.reportError(V.errorMessage,L)}else{var X=V.result;var U=X!=null&&X!=""?(T.toHTML?T.toHTML(X):X.toString()):"";if(typeof (U)!="string"){sf.core.reportError(String.format("InPlaceEdit: bad HTML value: need a string, found\n{0}",sf.util.toJSONString(X)));return }L.innerHTML=U;Q=X}if(J){J(Q,T,L,N)}if(I){D.unbind("change",I)}D.unbind("editComplete",H).hide()};N.editInPlace(L,Q,M,T);N.getRootElement().addClass("sf-ipe");N.bind("editComplete",H);N.bind("editAborted",function(U){K.css("color",S);A()});if(I){N.bind("change",I)}D=N};var A=function(){var H=D;if(H){H.clearErrorState().hide()}};var B=function(){var H=D;if(H){H.clearErrorState().hide();F()}};function F(){if(E){if(E._textColor){$(E).css("color",E._textColor);E._textColor=null}E=null}}return{startEdit:C,abortEditing:A,reset:B}})();sf.ui.RecordView=function(V){sf.ui.RecordView.superclass.constructor.call(this,V);var L=V.metadata;if(!L){sf.core.reportError("ui.recordview: No metadata given.");return }var G=V.caption||((L.label||L.name)+" details");var E=V.layout;var T=V.editable||false;var O=V.nCols&&V.nCols>1?V.nCols:2;var J=V.domElementId||sf.allocateId();if(document.getElementById(J)){sf.core.reportError(String.format("ui.RecordView: attempt to create duplicate DOM element id {0}",J));return }var C=sf.ui.TemplateStore.get("sf-rv.html");var R=[];for(var N=0;N<E.panels.length;N++){R=R.concat(E.panels[N].fieldIds)}for(var P=R.length-1;P>=0;P--){if(!L.getFieldWithId(R[P])){sf.core.reportError(String.format("Warning: RecordView: Can't find field id '{0}'",R[P]));R.splice(P,1)}}var U=null;var Q={};var I=null;var B=function(W){return $("#"+J+"-"+W)};this.computeFieldCellId=function(W){return J+"-"+(W?W.fieldId:"unknown")};this.shownRecord=function(){return I};this.shownFieldIds=function(){return R};this.showField=function(W,X){$(".sf-rv-item-"+W,U).css("display",X?"block":"none")};var K=function(){$(".sf-btn-save",U).show()};var S=function(W){var X=this.getAttribute("fieldId");var Z=X&&L.getFieldWithId(X);if(Z){var Y=$(".sf-rv-cell",$(this).parent())[0];U.removeClass("sf-rv-editable");sf.ui.InPlaceEditManager.startEdit(Y,Z,Y.dataValue__,I,K,function(a){if(String(this.dataValue__)!=String(a)){this.dataValue__=a;$(this).addClass("sf-data-modified");Q[Z.fieldId]=a;$(".sf-btn-save",U).show()}U.addClass("sf-rv-editable")}.createDelegate(Y));W.stopPropagation()}};var A=function(c,W){Q[L.keyFieldId]=I[L.keyFieldId];var b=$(".sf-btn-save",U);var Z=true;for(var X in Q){var Y=L.getFieldWithId(X);var a=Q[X];if(!a&&Y.disallowEmpty){sf.ui.Util.reportError("Please provide a valid value for "+Y.label,b);Z=false;break}}if(Z){c.notifyListeners("doSave",Q,W,c);b.hide();Q={};$(".sf-rv-cell",U).removeClass("sf-data-modified")}return Z};var M=function(W){$(".sf-btn-save",U).click(function(X){setTimeout(function(){if(A(W,X)){sf.ui.InPlaceEditManager.reset()}},200)});if(T){U.addClass("sf-rv-editable");$(".sf-rv-edit-trigger",U).click(S)}};var H={};this.renderTo=function(W){W=typeof (W)=="string"?$("#"+W):W;var Z={id:J,caption:G,layout:E,fields:L.getFieldIdMap(),getFieldHTML:F};U=$(C.process(Z));W.append(U);for(var Y=0;Y<R.length;Y++){var X=R[Y];H[X]=document.getElementById(String.format("{0}-cell-{1}",J,X))}M(this);this.notifyListeners("render",this);return this};this.shownFieldIds=function(){var X=[];for(var W=0,Y=E.panels.length;W<Y;W++){X=X.concat(E.panels[W].fieldIds)}return X};this.update=function(Z){I=sf.util.copyOf(Z||{});for(var Y=0;Y<R.length;Y++){if(!R[Y]){continue}var W=H[R[Y]];var X=L.getFieldWithId(R[Y]);if(W){W.innerHTML=this.formatCellContent(I,X);W.dataValue__=I[X.fieldId]}}$(".sf-rv-cell",U).removeClass("sf-data-modified");$(".sf-btn-save",U).hide();$(".sf-imagelink",U).showTooltip(function(b){var a=b.getAttribute("target_url");return a?String.format('<img src="{0}" />',a):null});sf.ui.InPlaceEditManager.reset();if(T){U.addClass("sf-rv-editable")}return this};var F=function(W){return I&&this.formatCellContent(I,L.getFieldWithId(W))||""}.createDelegate(this);this.formatCellContent=function(X,W){return W.toHTML(X[W.fieldId])};var D=new sf.core.Template('<a id="${id}" <% if (title) { %> title="${title}"<% } %> href="javascript:void(0)" class="sf-action-link">${text}</a>');this.addToolbarItem=function(W){if(W){var Y=W.id||sf.allocateId();$(".sf-rv-toolbar",U).append(D.process({id:Y,title:W.tooltip,text:W.label}));if(W.action){var X=this;$("#"+Y).click(function(Z){W.action(X,Z)})}}};this.getRootElement=function(){return U}};sf.extend(sf.ui.RecordView,sf.ui.Widget);sf.ui.FinderWidget=function(A){sf.ui.FinderWidget.superclass.constructor.call(this,A);var M=A.metadata;var D=A.searchFieldIds;var O=A.extendedSearchPanel;var E=A.filterLister;if(!M){sf.core.reportError("ui.FinderWidget: No metadata provided.");return }if(!O||!O.jquery){sf.core.reportError("ui.FinderWidget: config.extendedSearchPanel must be a jQuery object.");return }var B=null;var F=null;var H='<form class="sf-finder-form" action="#" >           <table cellpadding="0" cellspacing="0" class="sf-finder">            <tr>              <td>                <div class="sf-menu-trigger sf-find-menu-trigger"><span class="sf-menu-trigger-label">Search</span></div>                <div class="sf-find-fieldsbox-wrapper">                  <div class="sf-find-fieldsbox"></div>                </div>              </td>              <td><input type="text" size="12" class="sf-find-text" title="Search"/></td>              <td><button type="submit" class="sf-find-btn" value="submit" title="Click to search"/></td>              <td><a class="sf-find-clear-btn" href="javascript:void(0)" onclick="return false;" title="Clear the search and filter conditions for this view"/></a></td>            </tr>          </table>        </form>';var G='<span title="Close the enhanced search panel" class="sf-pseudolink sf-find-extended-close-trigger" onclick="$(this).parent().hide();">Close</span>         <h4 class="sf-find-extended-caption">Filter data</h4><div class="sf-clearer"></div>         <div class="sf-find-filtereditor"></div>         <button class="sf-find-extended">Search</button>         <span style="margin: 3px 10px;" class="sf-pseudolink sf-find-extended-reset" title="Remove all search terms">Reset</span>         <span style="margin: 3px 10px;" class="sf-pseudolink sf-find-save">Save as filter</span>         <span class="sf-save-search-form">           Filter name: <input title="Name of filter" class="sf-search-name" type="text" size="30" maxlength="60" />           <button>Save</button> or <span class="sf-pseudolink sf-find-save-cancel">Cancel</span>         <div class="sf-clearer">&nbsp;</div>';var K=null;var C=function(Q,R){var P=K.validate();if(P&&P.length){R.notifyListeners("doFind",P,Q,R)}};var I=function(R){var Q=$(".sf-find-text",F);var P=Q.val();if(P&&P!=""){Q.val("")}if(K){K.resetUI()}this.notifyListeners("doFind",[],R,this)}.createDelegate(this);var L=function(){if(!K){var P=$(".sf-find-filtereditor",O);K=new sf.ui.FilterEditor({metadata:M,caption:"Specify search terms:",excludeAggregatesForMainTable:true}).renderTo(P)}K.resetUI();O.slideDown("slow")};var J=function(V){var W=new sf.core.Template('<table class="sf-find-fields" cellspacing="0">              <% for (var i = 0; i < Math.min (5,fields.length); i++ ) { %>               <tr>                 <td width="10"><input type="checkbox" name="${boxGroupName}" ${ i<=2 ? "checked" : ""} id="${fields[i].buttonId}" value="${fields[i].fieldId}"></td>                 <td><label for="${fields[i].buttonId}">${fields[i].label}</label></td>               </tr>              <% } %>              <tr><td colspan="2"><span class="sf-pseudolink sf-find-extended-trigger">More options...</span></tr>            </table>');var P=D.map(function(Y){var Z=M.getFieldWithId(Y);return{buttonId:sf.allocateId(),fieldId:Y,label:Z?Z.label:"--Unknown--"}});var X=sf.allocateId();var R=[];if(E){var Q=E();for(var S in Q){R.push({id:S,name:Q[S]})}}var T=W.process({boxGroupName:X,fields:P,filters:R});var U=$(".sf-find-fieldsbox",F);U[0].innerHTML=T;U.boxGroupName=X;O[0].innerHTML=G;$("button.sf-find-extended",O).click(function(Y){C(Y,V)});$(".sf-find-extended-trigger",U).click(L);$(".sf-find-extended-reset",O).click(I);$(".sf-save-search-form button",O).click(N);$(".sf-find-save",O).click(function(){if(!K.validate()){return }var Y=$(".sf-save-search-form",O).css("display","inline");$(".sf-search-name",Y).focus().val("")});$(".sf-find-save-cancel",O).click(function(){$(".sf-save-search-form",O).css("display","none")});return U};var N=function(){var S=K.validate();if(!S){return }var Q=$(".sf-search-name",O);var P=Q.val().trim();if(P.length<=0){sf.ui.Util.reportError("Please provide a name for the filter.",Q);return }var R={name:P,condition:JSON.stringify(S),entity_name:M.name};sf.App.getDataService().storeRecords("builtin.filter",[R],function(T){if(T&&T.length){R.filter_id=T[0].filter_id}$(".sf-save-search-form",O).css("display","none");R.condition=S;this.notifyListeners("filterSaved",R,this)}.createDelegate(this))}.createDelegate(this);this.showExtSearchBox=function(){L();return this};this.renderTo=function(P){F=typeof (P)=="string"?$("#"+P):P;B=$(H);F.append(B);var Q=J(this);var R=$(".sf-find-menu-trigger",F);$(".sf-find-fieldsbox",F).setTrigger(R).click(function(T){var U=$(this);setTimeout(function(){U.hide()},50)});var S=B;S[0].onsubmit=function(Y){var a=$(String.format("input[name='{0}']:checked",Q.boxGroupName));var Z=[];for(var V=a.length-1;V>=0;V--){Z.push(a[V].getAttribute("value"))}if(!Z){sf.core.reportError("Internal error: No search field?");return false}var U=$(".sf-find-text",F);var X=U.val();if(X.trim().length<=0){sf.ui.Util.reportError("Please provide a search string.",F);return false}var T=X.toLowerCase();var W=[{fieldId:Z[0],op:"starts with",value:T}];for(var V=a.length-1;V>=1;V--){W.push({or:[{fieldId:Z[V],op:"starts with",value:T}]})}this.notifyListeners("doFind",W,Y,this);return false}.createDelegate(this);$(".sf-find-clear-btn",F).click(I);this.notifyListeners("render",this);return this};this.getRootElement=function(){return B}};sf.extend(sf.ui.FinderWidget,sf.ui.Widget);sf.ui.FilterEditor=function(R){sf.ui.FilterEditor.superclass.constructor.call(this,R);var I=R&&R.domElementId||sf.allocateId();var K=R.metadata;var G=R.caption||"Specify search terms:";var L=R.excludeAggregatesForMainTable;if(document.getElementById(I)){sf.core.reportError(String.format("ui.FilterEditor: attempt to create duplicate DOM element id {0}",I));return }var P=null;var Q=new sf.core.Template('      <table cellspacing="0" class="sf-fe-term" id="${rootId}-item-{0}" itemno="{0}">         <tr>           <td width="15" align="center"><button class="sf-delete-small sf-fe-delete-term" title="Remove this term"></button></td>           <td class="sf-fe-fieldid-cell" itemno="{0}"></td>           <td width="100"><select class="sf-fe-op" itemno="{0}"  id="${rootId}-op-{0}"><option value="">Choose...</option></select></td>           <td width="100" class="sf-fe-valuecell"  itemno="{0}" id="${rootId}-valuecell-{0}">             <input class="sf-fe-value"  id="${rootId}-value-{0}"  type="text" size="10"/>             <select class="sf-fe-value-choices" style="display: none;" id="${rootId}-value-choices-{0}"></select>           </td>         </tr>      </table>').process({rootId:I});var E='<div class="sf-fe-wrapper" id="{0}">           <span class="sf-fe-caption">{1}</span>           <span unselectable="on" class="sf-pseudolink sf-fe-addterm-trigger" title="Add more search terms">Add term</span>           <span class="sf-fe-error"></span><div class="sf-clearer"></div>         </div>         <div class="sf-clearer"></div>';var D=String.format(E,I,G);var C=null,H=[];var J=sf.ui.FilterEditor.getSelectorChoices(K.name,L).map(function(S){return S.fieldType!="reference"?S:null});J=[{value:"",text:"Choose..."}].concat(J);var O=function(){if(!C){var S=I+"-date-fixed";C=new sf.ui.PopupMenu({boxWidthPx:90,items:[{label:"Fixed date",submenuId:S},{label:"---"},{label:"Today",id:I+"-date-today"},{label:"Tomorrow",id:I+"-date-tomorrow"},{label:"Yesterday",id:I+"-date-yesterday"},{label:"---"},{label:"Next 7 days",id:I+"-date-this-7"},{label:"Last 7 days",id:I+"-date-last-7"},{label:"---"},{label:"Next 15 days",id:I+"-date-this-15"},{label:"Last 15 days",id:I+"-date-last-15"},{label:"---"},{label:"Next 30 days",id:I+"-date-this-30"},{label:"Last 30 days",id:I+"-date-last-30"},{label:"---"},{label:"Next 60 days",id:I+"-date-this-60"},{label:"Last 60 days",id:I+"-date-last-60"}]});C.handleSelect=function(T,V,U){if(U&&!U.submenuId){$(C.getCurrentTrigger()).val(U.label);C.hide()}};C.handleDateSelect=function(U,T){$(C.getCurrentTrigger()).val(T);C.hide()};C.bind("select",C.handleSelect);C.picker=new sf.ui.DatePicker().renderTo(S).show();C.picker.bind("select",C.handleDateSelect)}return C};var M=function(W,S){var Z=W.getRootElement().parent().attr("itemno");if(Z){var Y=W.getSelectedOption();var a=Y.fieldType;var b=Y.aggrFn;if(b=="count"){a="integer"}var X=$("#"+I+"-value-"+Z).removeClass("sf-inputbox-with-menu");X[0].readOnly=false;X.parent().removeClass("sf-fe-datevaluecell");var U=document.getElementById(I+"-op-"+Z);var c=sf.data.TypeInfo.comparisonOperators(a);if(U){sf.ui.Util.fillSelector(U,c)}var T=a=="boolean"?[{value:"true",text:"Yes"},{value:"false",text:"No"}]:(a=="picklist"||a=="multipick"?Y.choicesList:null);if(T&&T.length>0){X.hide();var V=document.getElementById(I+"-value-choices-"+Z);$(V).show();sf.ui.Util.fillSelector(V,T);if(S){$(V).val(S)}}else{if(a=="date"||a=="datetime"){X.parent().addClass("sf-fe-datevaluecell");X.show().addClass("sf-inputbox-with-menu").val("");$("#"+I+"-value-choices-"+Z).hide();O().setTrigger($(".sf-fe-datevaluecell .sf-fe-value",P));X[0].readOnly=true;U.focus();if(S){X.val(S)}}else{X.show();$("#"+I+"-value-choices-"+Z).hide();if(S){X.val(S)}}}$("#"+I+"-valuecell-"+Z).css("visibility","visible")}};var A=function(){var S=this.getAttribute("itemno");if(S){var T=this.options[this.selectedIndex].value;$("#"+I+"-valuecell-"+S).css("visibility",T=="is null"||T=="is not null"?"hidden":"visible")}};function N(){var T=$(".sf-fe-term",P);for(var S=T.length-1;S>=0;S--){B(T[S].getAttribute("itemno"))}}function B(S){var T=H[S];if(T){T.destroyDOM();delete H[S];H[S]=null}$("#"+I+"-item-"+S).remove()}function F(W){var U=sf.nextGUID();var T=$(String.format(Q,U));P.append(T);var V=I+"-item-"+U;var S=new sf.uix.FieldSelector({updateSelection:true,domElementId:I+"-itemsel-"+U}).renderTo($(".sf-fe-fieldid-cell",T));S.update(J,W);S.bind("change",function(){M(this)});$("select.sf-fe-op",T).bind("change",A);$("button.sf-fe-delete-term",T).bind("click",function(){var X=$(this).parents(".sf-fe-term");B(X.attr("itemno"))});H[U]=S;return{id:V,itemNo:U,fieldIdSelector:S}}this.resetUI=function(){N();F()};this.renderTo=function(T,S){T=typeof (T)=="string"?$("#"+T):T;T.append(D);P=$("#"+I);if(!S){F()}else{this.setCondition(S)}$(".sf-fe-addterm-trigger",P).click(function(){F()});this.notifyListeners("render",this);return this};this.setCondition=function(W){N();for(var U=0,V=W.length;U<V;U++){var T=F(W[U]);M(T.fieldIdSelector,W[U].value);var S=$("#"+T.id+" select.sf-fe-op").val(W[U].op);A.call(S[0])}};this.validate=function(){var l=[],S=true;var V=$(".sf-fe-valuecell",P);function T(i,p){var o=null,r=null;if(i=="fieldId"){if(H[p]){o=H[p].getSelectedOption();r=H[p].getRootElement().parent()[0]}}else{var q="#"+I+"-"+i+"-"+p;var m=$(q);o=m[0].options[m[0].selectedIndex];r=m[0].parentNode}o?$(r).removeClass("sf-invalid"):$(r).addClass("sf-invalid");return o}var d=null;for(var Z=0;Z<V.length;Z++){var a=V[Z].getAttribute("itemno");var g=T("fieldId",a);var X=T("op",a);if(!g||!g.fieldId||!X||!X.value){S=false;continue}var c={op:X.value};sf.util.copyProperties(g,c,["fieldId","tableName","joinChain","aggrFn"]);c.fieldSpecStr=sf.ui.FilterEditor.getFieldSpecString(c.fieldId,c.tableName,c.joinChain,c.aggrFn);if(V[Z].style.visibility!="hidden"){var h=$(V[Z]);h.removeClass("sf-invalid");var W=$("input",h);var f=$("select",h);if(W[0].style.display!="none"){var Y=W.val();if(!Y){h.addClass("sf-invalid");S=false;d=h;continue}var e=g.fieldType;var b=Y;if(e=="date"||e=="datetime"){b=Y}else{if(e=="number"||e=="integer"||e=="currency"||e=="duration"){var U=sf.data.TypeInfo.converter(e);b=U(Y);if(b==null){h.addClass("sf-invalid");S=false;d=h;continue}}else{if(e=="emailAddress"){b=b.toLowerCase()}}}c.value=b.toString()}else{c.value=f.val()}}l.push(c)}if(S){return l}this.reportError(d);return null};this.reportError=function(S){sf.ui.Util.reportError("Please provide complete search terms.",S);return this};this.getRootElement=function(){return P}};sf.extend(sf.ui.FilterEditor,sf.ui.Widget);sf.ui.FilterEditor.getFieldSpecString=function(B,A,D,C){var E=(A?(A+"__"):"")+B;if(D){E=D.thisSide?String.format("{0}__{1}",D.thisSide,E):String.format("{0}.{1}__{2}",D.tableName,D.thatSide,E)}if(C){E=C+"___"+E+"___"}return E};sf.ui.FilterEditor.getSelectorChoices=function(D,I,H){var F=function(V,X,U,W){var T=sf.ui.FilterEditor.getFieldSpecString(X.fieldId,U,W);var S={value:T,text:V,fieldId:X.fieldId,fieldType:X.fieldType,tableName:U};if(X.fieldType=="picklist"||X.fieldType=="multipick"){S.choicesList=X.choicesList}if(W){S.joinChain=W}return S};var R=function(b,U){var S=b.name;var W=b.getFieldWithId(b.keyFieldId);var Y=F("# Records",W,b.name,U);Y.agfns=[{value:"count",text:"Count"}];var T=[],a=[Y];for(var X=0;X<b.fields.size();X++){var d=b.fields.get(X);var c=d.fieldType;if(c=="reference"&&!H){continue}var V=F(d.label,d,b.name,U);T.push(V);if(!I||U){if(c=="date"||c=="datetime"){V=F(d.label,d,b.name,U);V.agfns=[{value:"max",text:"Newest"},{value:"min",text:"Oldest"}];a.push(V)}else{if(c=="number"||c=="integer"||c=="currency"){V=F(d.label,d,b.name,U);V.agfns=[{value:"sum",text:"Sum"},{value:"avg",text:"Average"},{value:"min",text:"Lowest"},{value:"max",text:"Highest"}];a.push(V)}}}}T.sortByKey("text");var Z=[{text:"Fields",className:"ap-fieldsel-subgrp-caption",notSelectable:true}].concat(T);if(!I||U){a.sortByKey("text");Z=Z.concat([{text:"Metrics",className:"ap-fieldsel-subgrp-caption",notSelectable:true}],a)}return{groupValue:S,groupText:b.label,opts:Z}};var G=sf.data.ObjectRegistry.get(D);if(!G){sf.core.reportError("FilterEditor.getSelectorChoices: no metadata for "+D);return }var J=[];for(var M=0;M<G.fields.size();M++){var A=G.fields.get(M);if(A.fieldType=="reference"){var Q=sf.data.ObjectRegistry.get(A.refersToObject);if(Q){J.push(R(Q,{thisSide:A.fieldId}))}}}var E=function(V){var b=[],X=sf.data.ObjectRegistry.objectNames();for(var a=0,T=X?X.length:0;a<T;a++){var Y=sf.data.ObjectRegistry.get(X[a]);var S=Y.fields;for(var Z=0,U=S.size();Z<U;Z++){var W=S.get(Z);if(W.refersToObject==V){b.push(W)}}}return b};var L=E(D);var O={};for(var M=0;M<L.length;M++){var C=L[M];O[C.objectName]=(O[C.objectName]||0)+1}for(var M=0;M<L.length;M++){var C=L[M];var P=sf.data.ObjectRegistry.get(C.objectName);var N=R(P,{tableName:P.name,thatSide:C.fieldId});N.groupText=P.label+(O[C.objectName]>1?(" via "+C.label):"");J.push(N)}var K=[R(G)];var B=J.length;if(B>0){for(var M=0;M<J.length;M++){K=K.concat(J[M])}}return K};sf.ui.FilterList=function(Q){sf.ui.FilterList.superclass.constructor.call(this,Q);var G=Q.domElementId||sf.allocateId();var C=Q.dataService;var J=Q.metadata;if(!J){sf.core.reportError("ui.FilterList: No metadata.");return }var A=G+"-listpanel";var L={};var N=[];var F=null;var M=null;var I=null;var O=null;var P=null;var H=new sf.core.Template('<ul class="sf-filterlist-ul" id="${id}-ul">          <% for (var i = 0, n = dataRecords ? dataRecords.length : 0; i < n; i++) { %>            <li class="sf-list-ul-li">              <button class="sf-delete-small sf-fe-delete-filter" title="Delete this filter" for_filter="${dataRecords[i].filter_id}"></button>              <span class="sf-pseudolink" for_filter="${dataRecords[i].filter_id}">${dataRecords[i].name}</span>              <% if (dataRecords[i].description) { %><br/> ${dataRecords[i].description} <% } %>            </li>          <% } %>        </ul>',"filterListTemplate");this.getFilterRecords=function(){return N};this.getFilterRecordByKey=function(S){return L[S]};var E=function(S){if(F==null){F=new sf.ui.FilterEditor({metadata:J,caption:"&nbsp;"}).renderTo($(".sf-filterlist-edit",I),S.condition).show();$(".sf-filteredit-save",I).click(K);$(".sf-filteredit-cancel",I).click(function(){I.hide()})}else{F.setCondition(S.condition)}I.show();P=S.filter_id};var R=function(){$("#"+G+"-listpanel")[0].innerHTML=H.process({id:G,dataRecords:N});$(".sf-pseudolink",M).click(function(){var T=this.getAttribute("for_filter");var S=L[T];var U=S.condition;$("#"+G+"-filtername").val(S.name);$("#"+G+"-filterdesc").val(S.description||"");E(S)});$(".sf-fe-delete-filter",M).click(B);I.hide()}.createDelegate(this);var D=function(T){var S={neededFields:[{fieldId:"filter_id"},{fieldId:"name"},{fieldId:"description"},{fieldId:"condition"},{fieldId:"entity_name"}],filter:[{fieldId:"entity_name",op:"eq",value:J.name}]};C.getRecords("builtin.filter",S,function(U){L={};N=U&&U.records?U.records.map(function(W){var V=W.condition;if(typeof (V)=="string"){W.condition=JSON.parse(V)}L[W.filter_id]=W;return W}):[];if(this.isShown()){R()}if(T){T(N,this)}this.notifyListeners("change",N,this)}.createDelegate(this))}.createDelegate(this);var K=function(){var S=$("#"+G+"-filtername");var V=S.val();if(!V){sf.ui.Util.reportError("Please provide a name for the filter.",S);return }var W=F.validate();if(W){var U=P;var T=L[U];T.condition=W;T.name=$("#"+G+"-filtername").val();T.description=$("#"+G+"-filterdesc").val();var X={name:T.name,description:T.description,filter_id:P,condition:JSON.stringify(W),entity_name:T.entity_name};C.storeRecords("builtin.filter",[X],function(){D()})}};var B=function(){if(sf.ui.Util.askForConfirmation("This filter will be deleted.\nProceed?")){if(sf.App.configParameter("isDemoVersion")){sf.ui.Util.reportError("Cannot delete filters in the demo version.");return }var S=this.getAttribute("for_filter");C.deleteRecords("builtin.filter",[{fieldId:"filter_id",op:"eq",value:S}],function(){D()})}};this.renderTo=function(S){S=typeof (S)=="string"?$("#"+S):S;S.append(sf.ui.TemplateStore.get("filter-list.html").process({id:G}));O=$("#"+G);M=$("#"+G+"-listpanel");M[0].innerHTML=H.process({id:G,dataRecords:N});I=$("#"+G+"-editpanel");this.notifyListeners("render",this);return this};this.appendFilterLocal=function(S){N.push(S);L[S.filter_id]=S;return this};this.show=function(){O.show();D()};this.getRootElement=function(){return O};this.update=function(S){D(S)};this.captionString=function(){return"Available filters"};this.toolbar=function(){return null}};sf.extend(sf.ui.FilterList,sf.ui.Widget);sf.ui.MetadataForm=function(C){var A=["label","fieldType","shortLabel","description","disallowEmpty","choicesList"];var H=sf.data.fieldMetadata.getFieldIdMap();var F=C.domElementId||sf.allocateId();var C={domElementId:F,layout:{panels:[{fieldIds:A}]},fieldsMap:H,actionURL:"#",caption:"Add field"};H.fieldType.editor=new sf.ui.PicklistEditor({fieldId:"fieldType",selectHTML:sf.uix.NewTableForm.getFieldTypeSelectorHTML(null,null,"string",false,true)});sf.ui.MetadataForm.superclass.constructor.call(this,C);var G=null;var B=this;var E=function(){var N=B.shownRecord();var M=B.editor("fieldType");if(N){var J=N.fieldType;if(J=="picklist"||J=="multipick"){B.showField("choicesList",true);M.fillSelector([{value:J,text:sf.data.TypeInfo.label(J)}],J)}else{if(J=="reference"){var L=N.refersToObject;M.fillSelector([{value:"ref:"+L,text:">> "+sf.data.ObjectRegistry.get(L).label}],"ref:"+L)}else{if(J&&!sf.data.ObjectRegistry.isBuiltinField(N.fieldId)){var K=sf.data.TypeInfo.allowedConversions(J);if(K&&K.length){var I=K.map(function(O){return{value:O,text:sf.data.TypeInfo.label(O)}});M.fillSelector(I,J,false)}}else{M.fillSelector([{value:J,text:sf.data.TypeInfo.label(J)}],J)}}}}else{M.setValue("string")}};this.bind("show",E);this.handleEditEvent=function(K,M,J,I,L){var N=L&&L.value();if(N instanceof Array&&N.length>=2){N=N[0]}switch(J){case"fieldType":this.showField("choicesList",N=="picklist"||N=="multipick");break}};var D=function(I){var L=sf.data.ObjectRegistry.get(G);if(!L){sf.core.reportError("MetadataForm: "+G+": No fields?");return null}for(var K=L.fields.size();;K++){var J=String.format("{0}__{1}__{2}",G,sf.util.makeIdentifier(I),K).toLowerCase();if(!L.getFieldWithId(J)){return J}}throw"ui.MetadataForm: should never-happen??"};this.showField=function(I,J){this.getField(I).css("visibility",J?"visible":"hidden");return this};this.isFieldShown=function(I){return this.getField(I).css("visibility")!="hidden"};this.setTableName=function(I){G=I;return this};this.validate=function(K){var O=this.shownRecord();var J=O==null;K.fieldId=J?D(K.label):O.fieldId;var Q=sf.data.ObjectRegistry.get(G);var I=Q.fields;var S=I.indexOf(K.label,function(U,T){return U.label.toLowerCase()==T.toLowerCase()});var L="There is already a field named '"+K.label+"'.\n<br/>Please choose a different name.";if(S>=0&&(J||S!=I.indexOf(O.label,function(U,T){return U.label.toLowerCase()==T.toLowerCase()}))){sf.ui.Util.reportError(L,F+"-label");return false}var R=K.fieldType;if(R.startsWith("ref:")){K.fieldType="reference";K.refersToObject=R.substring(4)}K.objectName=G;var M=K.choicesList;if(M&&M.length){for(var N=M.length-1;N>=0;N--){var P=M[N];delete P.count}}return true}};sf.extend(sf.ui.MetadataForm,sf.ui.Form);sf.ui.MenuBar=function(C){sf.ui.MenuBar.superclass.constructor.call(this,C);var I=C.items;var O=C.domElementId||sf.allocateId();var D=[];var M='<ul class="sf-menubar-ul" unselectable="on" id="${id}">          <% for (var i = 0; i < barItems.length; i++) {             var barItem = barItems[i]; %>             <li class="sf-menubar-li">              <div id="${barItem.id}" class="sf-menubar-item" title="${barItem.tooltip}">${barItem.label}</div>              <% if (barItem.subItems) { %>                <div class="sf-menubox-wrap sf-menubox-wrap-hover">                  <ul class="sf-menubox-ul" id="${barItem.id}-menubox-ul">                    <% for (var j = 0; j < barItem.subItems.length; j++) {                       var subItem = barItem.subItems[j];                      if (subItem.label == "---") { %>                        <li class="sf-menuseparator"><div>&nbsp;</div></li>                      <% } else { %>                        <li class="sf-menubox-li"><div id="${subItem.id}" class="sf-menuitem sf-menuitem-highlight" title="${subItem.tooltip}">${subItem.label}</div></li>                      <% }                      } %>                  </ul>                </div>              <% } %>            </li>          <% } %>        </ul>';var P=new sf.core.Template(M);var F=null;var E=null;var N=null;if(document.getElementById(O)){sf.core.reportError(String.format("ui.MenuBar: attempt to create duplicate DOM element id {0}",O));return }for(var H=0;H<I.length;H++){var B=I[H];var L=B.id||String.format("{0}-{1}",O,sf.nextGUID());B.id=L;D[L]=B;var J=B.subItems?B.subItems.length:0;for(var G=0;G<J;G++){var A=B.subItems[G];var L=A.id||String.format("{0}-{1}",O,sf.nextGUID());A.id=L;A.topLevelItemId=B.id;D[L]=A}}this.showTab=function(Q){var R=D[Q];var S=R.topLevelItemId||R.id;$(".sf-menubar-li",F).removeClass("sf-menubaritem-selected");setTimeout(function(){$("#"+S).parent().addClass("sf-menubaritem-selected")},100);if(typeof (R.action)=="function"){R.action(R,this)}N=S};this.getItems=function(){return I};var K=function(S,Q){this.showTab(S.id);this.notifyListeners("select",D[S.id],S.innerHTML,Q,this);var R=$(Q.target).parents(".sf-menubox-wrap");if(R.length>0){R.removeClass("sf-menubox-wrap-hover");setTimeout(function(){R.addClass("sf-menubox-wrap-hover")},50)}}.createDelegate(this);this.addItem=function(U,R){var T=D[U];if(T){var S=R.id||String.format("{0}-{1}",O,sf.nextGUID());if(D[R.id]){sf.core.reportError(String.format("Menubar.addItem: item id {0} already exists",R.id));return this}T.subItems.push(R);D[S]=R;R.topLevelItemId=U;var Q=String.format('<li class="sf-menubox-li"><div id="{0}" class="sf-menuitem" title="{1}">{2}</div></li>',S,R.tooltip||"",R.label);$("#"+U+"-menubox-ul").append(Q);$("#"+S).click(function(V){K(this,V)})}return this};this.renderTo=function(Q){F=typeof (Q)=="string"?$("#"+Q):Q;F.append(P.process({id:O,barItems:I}));E=$("#"+O);$(".sf-menubox-ul .sf-menuitem",F).click(function(R){K(this,R)});$(".sf-menubar-item",F).click(function(R){K(this,R)});this.notifyListeners("render",this);return this};this.getRootElement=function(){return E}};sf.extend(sf.ui.MenuBar,sf.ui.Widget);sf.ui.ModalDialog=function(){var F="sf-modalbox-overlay";var I=jQuery.browser.msie?19000:15;var H=0.5;var D="#ccc";var G=null;var K=null;function B(){return{x:window.pageXOffset||document.documentElement&&document.documentElement.scrollLeft||document.body.scrollLeft,y:window.pageYOffset||document.documentElement&&document.documentElement.scrollTop||document.body.scrollTop,w:window.innerWidth||document.documentElement&&document.documentElement.clientWidth||document.body.clientWidth,h:window.innerHeight||document.documentElement&&document.documentElement.clientHeight||document.body.clientHeight}}var E="top: 0; left: 0; z-index: "+I+"; display: none;background-color: "+D+";";var A=B();K=jQuery("#"+F);if(K.length<=0){var J=null;if(jQuery.browser.msie){E+="filter: alpha(opacity="+((100*H))+");position: absolute;width:"+(A.x+A.w)+"px;height:"+Math.max(A.y+A.h,jQuery(document.body).height())+"px;";J="<iframe  src='javascript:false' id='"+F+"' style='"+E+"'></iframe>"}else{E+="position:fixed; opacity: "+H+"; width: 100%; height: 100%; ";J="<div id='"+F+"' style='"+E+"'></div>"}jQuery(document.body).prepend(J);if(jQuery.browser.msie){var C=document.getElementById(F).contentWindow.document;C.open();C.write("<html><body style='background-color: "+D+"; filter:alpha(opacity="+(100*H)+");'></body></html>");C.close()}K=jQuery("#"+F)}this.show=function(N){G=N;var M=B();K.css({display:"block"});if(jQuery.browser.msie){K.css({width:M.x+M.w+"px",height:M.y+M.h+"px"})}var L=M.y+100;G.css({display:"block",position:"absolute",visibility:"hidden",zIndex:I+1,top:L+"px"});setTimeout(function(){G.css({left:(M.x+(M.w-G.width())/2)+"px",visibility:"visible"})},100)};this.hide=function(){K.css({display:"none"});G.css({display:"none"})}};sf.ui.PopupMenu=function(T){sf.ui.PopupMenu.superclass.constructor.call(this,T);T=T||{};var Q=T.boxWidthPx||80;var C=T.items;var L=T.domElementId||sf.allocateId();var R=null;var N=[];var B=sf.ui.TemplateStore.get("popupmenu.html");var A=B.process({id:L,items:C});var G=null;var S=null;if(document.getElementById(L)){sf.core.reportError(String.format("ui.PopupMenu: attempt to create duplicate DOM element id {0}",L));return }var M=L;for(var P=0;P<C.length;P++){var F=C[P];var J=F.id||String.format("{0}-{1}",M,P);F.id=J;N[J]=F;var D=F.subItems?F.subItems.length:0;for(var O=0;O<D;O++){var K=F.subItems[O];var J=K.id||String.format("{0}-{1}-{2}",M,P,O);K.id=J;K.topLevelItemId=F.id;N[J]=K}}var I=null;var H=function(V){var W=V.type;switch(W){case"focus":case"click":if(!this.isShown()){var U=$(R);var X=U.offset();this.showAt(X.left,X.top+U.outerHeight())}break;case"blur":I=setTimeout(function(){this.hide()}.createDelegate(this),300);break}}.createDelegate(this);var E=function(V,U){if(I){clearTimeout(I);I=null}this.notifyListeners("select",V.id,N[V.id],U,this)}.createDelegate(this);this.addItems=function(U){for(var V=0,Y=U?U.length:0;V<Y;V++){var W=U[V];var X=W.id;if(N[X]){sf.core.reportError(String.format("PopupMenu.addItem: item id {0} already exists.",X));return this}C.push(W);N[X]=W}S=null;return this};this.showAt=function(U,V){if(!S){this.renderTo($(document.body))}S.css({left:(U+6+"px"),top:(V+6+"px"),display:"block"});return this};this.attachTo=function(U){if(!S){this.renderTo($(document.body))}var V=U&&U.length>0?U[0]:null;if(V==R){return this}if(R){$(R).unbind("click",H).unbind("focus",H).unbind("blur",H)}R=V;if(R){$(R).bind("click",H).bind("focus",H).bind("blur",H)}return this};this.getAttachee=function(){return R};this.renderTo=function(U){G=typeof (U)=="string"?$("#"+U):U;G.append(A);S=$("#"+L,G);S.css("width",Q+"px");$(".sf-dynmenu-wrap",S).css("width",Q-4+"px");if(jQuery.browser.msie){$(".sf-dynmenuitem",S).css("width",Q-15+"px")}$(".sf-dynmenuitem",S).addHoverClass("sf-dynmenuitem-highlight").click(function(V){E(this,V)});$(".sf-dynmenuitem-withsubmenu",S).hover(function(V){var X=$(this);var W=X.parent().width()-4;$(".sf-dynmenu-submenubox",X).css({left:W+"px",display:"block"})},function(V){$(".sf-dynmenu-submenubox",$(this)).css("display","none")});this.notifyListeners("render",this);return this};this.getRootElement=function(){return S};sf.override(this,"getPositionToShow",function(U){var V=arguments.callee.super_.apply(this,arguments);V.top+=4;V.left+=6;return V});this.renderTo($(document.body)).hide()};sf.extend(sf.ui.PopupMenu,sf.ui.Widget);sf.ui.SimpleLayoutEditor=function(S){sf.ui.SimpleLayoutEditor.superclass.constructor.call(this,S);var O=S.metadata;var I=S.domElementId||(sf.allocateId()+"-editlayout");var Q=S.detailLayout;var L=O.fields.map(function(U){return{value:U.fieldId,text:U.label}});var C={chooser:new sf.ui.PicklistEditor({fieldId:"chooser",choicesList:L}),string:new sf.ui.StringEditor({fieldId:"string",multiLine:false}),text:new sf.ui.StringEditor({fieldId:"text",multiLine:true})};var F=null,G=null,H=null;var R=null;var A=sf.ui.TemplateStore.get("edit-layout.html");var B={listFieldIds:[],detailFieldIds:[],searchFieldIds:[],formFieldIds:[],caption:"",textUnderCaption:""};function D(Y,U){if(F){F.hide()}var Z=U.result&&U.result[0]||"";if(G){var V=G.getAttribute("ftype");var a=$(G);if(V=="chooser"){var X=Z=="";a[0].innerHTML=(X?'<span class="sf-lighter-color">Choose...</span>':O.getFieldWithId(Z).label);var W=$(".sf-fov-detail .sf-rv-item",R).index(G);if(W>=0){if(X){B.detailFieldIds.splice(W,1)}else{B.detailFieldIds[W]=Z}}else{W=$(".sf-list-table thead th",R).index(G);if(W>=0){if(B.listFieldIds.length<W){B.listFieldIds.push(Z)}else{B.listFieldIds[W]=Z}}}}else{a[0].innerHTML=Z;if(a.hasClass("sf-fov-caption")){B.caption=Z}else{if(a.hasClass("sf-fov-caption-extra")){B.textUnderCaption=Z}}}G.dataValue=Z}F=null;G=null}function P(){if(F){F.hide()}F=null;G=null}function M(){$(this).removeClass("sf-preview-editable-highlight");var X=this.getAttribute("ftype");var Y=L;if($(this).hasClass("sf-rv-item")&&!this.dataValue){Y=[];for(var V=0;V<O.fields.length;V++){var U=O.fields[V];if(B.detailFieldIds.indexOf(U.fieldId)<0){Y.push({value:U.fieldId,text:U.label})}}}var W=C[X].editInPlace(this,this.dataValue,false,Y);W.bind("editComplete",D).bind("editAborted",P);F=W;G=this}var K=this;var J=function(){K.notifyListeners("cancel");return K};var E=function(){B.formFieldIds=B.detailFieldIds;B.detailLayout=H.getLayout();K.notifyListeners("save",B,K);return K};this.renderTo=function(U){U=typeof (U)=="string"?$("#"+U):U;R=$(A.process({id:I,caption:O.label}));U.append(R);H=new sf.uix.RecordViewLayoutEditor({caption:O.label+" details",layout:Q,fieldsMap:O.getFieldIdMap()});H.renderTo($(".sf-fov-detail",R));$(".sf-preview-editable",R).addHoverClass("sf-editable-highlight").click(M);this.notifyListeners("render",this);return this};var N=function(U){var V={listFieldIds:U.listFieldIds?[].concat.apply(U.listFieldIds):[],detailFieldIds:U.detailFieldIds?[].concat.apply(U.detailFieldIds):[],searchFieldIds:U.searchFieldIds?[].concat.apply(U.searchFieldIds):[],formFieldIds:U.formFieldIds?[].concat.apply(U.formFieldIds):[],caption:U.caption,textUnderCaption:U.textUnderCaption};return V};this.doEdit=function(X){B=N(X);var Y=$(".sf-list-table thead th",R);for(var W=0;W<Y.length;W++){var U=Y[W];var V=O.getFieldWithId(B.listFieldIds[W]);var Z=V?V.label:"";U.innerHTML=Z;U.dataValue=[B.listFieldIds[W],Z]}$(".sf-fov-caption",R)[0].innerHTML=B.caption;$(".sf-fov-caption-extra",R).innerHTML=B.textUnderCaption;H.setLayout(X.detailLayout)};this.getRootElement=function(){return R};this.captionString=function(){return"Edit layout"};var T=null;this.toolbar=function(){if(!T){T=new sf.ui.ToolBar({tools:[{label:"Save",tooltip:"Save changes",className:"sf-btn-save",action:E},{label:"Cancel",tooltip:"Cancel changes",className:"sf-btn-cncl",action:J}]})}return T}};sf.extend(sf.ui.SimpleLayoutEditor,sf.ui.Widget);sf.ui.HTMLFragment=function(A){sf.ui.HTMLFragment.superclass.constructor.call(this,A);var C=A.domElementId||sf.allocateId();var E=A.template;var D=A.dataModel||{};var B=null;this.renderTo=function(F){F=typeof (F)=="string"?$("#"+F):F;F.append(String.format('<div id="{0}"></div>',C));B=$("#"+C);this.update(D);this.notifyListeners("render",this);return this};this.getRootElement=function(){return B};this.update=function(G){var F=E.process(G||D);B[0].innerHTML=F;return this}};sf.extend(sf.ui.HTMLFragment,sf.ui.Widget);sf.ui.WidgetGroup=function(B){sf.ui.WidgetGroup.superclass.constructor.call(this,B);var D=B.domElementId||sf.allocateId();var G=B.className||"sf-widgetgroup";var E=String.format('<div id="{0}" class="{1}">{2}</div>',D,G,B.templateString||"");var A=B.widgets;var F=new sf.core.Template(E);var C=null;this.renderTo=function(H){H=typeof (H)=="string"?$("#"+H):H;H.append(E);C=$("#"+D);for(var I in A){A[I].renderTo($("#"+I))}return this};this.getRootElement=function(){return C}};sf.extend(sf.ui.WidgetGroup,sf.ui.Widget);sf.ui.DragWatcher=function(I,M,L,C){sf.ui.DragWatcher.superclass.constructor.call(this,{});var B=null,J=I;var K=false,A=null,G=-1,F=-1;var H=function(N){if(G>0){if(!K){K=true;M(N.clientX,N.clientY,N,this);this.notifyListeners("dragBegin",N.clientX,N.clientY,N,this)}L(N.clientX,N.clientY,N,this);this.notifyListeners("drag",N.clientX,N.clientY,N,this)}}.createDelegate(this);var E=function(N){if(K){C(N.clientX,N.clientY,N,this);this.notifyListeners("dragEnd",N.clientX,N.clientY,N,this)}K=false;G=-1;A=null}.createDelegate(this);var D=function(O){if(O.which==1){G=O.clientX;F=O.clientY;A=O.target;var N=$(A);if(!N.is(J)){N=N.parent(J);if(N.length){A=N[0]}}$(document).bind("mousemove",H).bind("mouseup",E);if(O.preventDefault){O.preventDefault()}}}.createDelegate(this);this.dragStartElement=function(){return A};this.inDrag=function(){return K};this.enable=function(){B=$(I);B.bind("mousedown",D);if(jQuery.browser.msie){document.body.onselectstart=function(O){var N=$((O||window.event).srcElement);if(N.is(".sf-drag-proxy")||N.is(I)){return false}}}return this};this.disable=function(){B.unbind("mousedown",D);$(document).unbind("mousemove",H).unbind("mouseup",E);G=-1;F=-1;A=null;return this};this.reEnable=function(){this.disable();this.enable();return this}};sf.extend(sf.ui.DragWatcher,sf.core.Observable);sf.ui.ColumnResizeProxy=function(A,C,E){var D=$("#sf-colresize-proxy");if(D.length<=0){$(document.body).append('<div id="sf-colresize-proxy" class="sf-colresize-proxy"></div>');D=$("#sf-colresize-proxy")}var F=function(H,J){var I=$(C);D.css({display:"block",left:H+"px",top:I.offset().top+"px",height:I.height()+"px"})}.createDelegate(this);var B=function(H,I){D.css({left:H+"px"})};var G=function(H,J){D.css({display:"none"});var I=document.elementFromPoint(H,J);E(this.dragStartElement(),H,J,I,this)}.createDelegate(this);sf.ui.DragWatcher.call(this,A,F,B,G);this.enable()};sf.extend(sf.ui.ColumnResizeProxy,sf.ui.DragWatcher);sf.ui.DragDropProxy=function(H,C,E){var B=$("#sf-drag-proxy");if(B.length<=0){$(document.body).append('<div id="sf-drag-proxy" class="sf-drag-proxy"></div>');B=$("#sf-drag-proxy")}var I=this;var D=function(K,L){var J=I.getTextInProxy(I.dragStartElement());B.html(J).css({display:"block"})};var G=function(J,L){B.css({left:J+"px",top:L+"px"});var K=F(J,L);if(K.length){B.removeClass("sf-drag-proxy-dontdrop")}else{B.addClass("sf-drag-proxy-dontdrop")}};var A=function(J,L){B.css("display","none");var K=F(J,L);if(K.length){E(I.dragStartElement(),K[0],I)}};sf.ui.DragWatcher.call(this,H,D,G,A);var F=function(J,L){var K=$(document.elementFromPoint(J-2,L-2));return K.is(C)?K:K.parents(C)};this.getTextInProxy=function(J){return J.innerHTML};this.enable()};sf.extend(sf.ui.DragDropProxy,sf.ui.DragWatcher);sf.ui.TabGroup=function(C){sf.ui.TabGroup.superclass.constructor.call(this,C);var H=C.tabs||[];var N=C.domElementId||sf.allocateId();var E=null;var P=new sf.core.Template('        <div class="sf-tabset-wrapper" id="${id}">          <div class="sf-tablist">            <% for (var i = 0; i < tabs.length; i++) { %>              <span class="sf-tab" id="${id}-tab-${tabs[i].id}" title="${tabs[i].label}">${tabs[i].label}</span>            <% } %>          </div>          <div class="sf-tabcontent-wrapper">            <div class="sf-tabcontent-topstripe"></div>            <% for (var i = 0; i < tabs.length; i++) { %>              <div id="${id}-content-${tabs[i].id}" class="sf-tabcontent"></div>            <% } %>          </div>        </div>    ');var A=null,B={},D=false;var K=function(Q){return B[Q]};var F=function(Q){if(A&&Q[0].id==A[0].id){return }Q.addClass("sf-tab-selected");if(A){A.removeClass("sf-tab-selected");K(A[0].id).css("display","none")}A=Q;K(A[0].id).css("display","block")};var O=this;var J=function(S,R){F($(R));var Q=M();O.notifyListeners("tabSelect",Q.id,S,O)};var I=function(Q){J(Q,this)};var L=function(Q){$(".sf-tab",E).unbind("click",I).bind("click",I)};this.selectTab=function(Q){F(D?$("#"+Q):$("#"+N+"-tab-"+Q));return this};this.getContentElementFor=function(Q){return K(N+"-tab-"+Q)};this.getRootElement=function(){return E};this.renderTo=function(Q){Q=typeof (Q)=="string"?$("#"+Q):Q;E=$(P.process({id:N,tabs:H}));Q.append(E);for(var S=0;S<H.length;S++){var R=H[S].id;B[N+"-tab-"+R]=$("#"+N+"-content-"+R)}L(this);this.notifyListeners("render",this);return this};this.createFromDOM=function(T){E=$(T);if(!E.length){sf.ui.Util.reportError("TabGroup.createFromDOM: No container.");return }if(!$(".sf-tabcontent-topstripe",E).length){$(".sf-tabcontent-wrapper",E).prepend('<div class="sf-tabcontent-topstripe"></div>')}var Q=$(".sf-tab",E);for(var S=0;S<Q.length;S++){var R=Q[S].id;H.push({id:R});B[R]=$("#"+Q[S].getAttribute("for"))}D=true;L(this);return this};var G=function(){var Q=A&&A[0]?A[0].id:null;if(Q&&!D){Q=Q.substring(N.length+5)}return Q};var M=function(){var R=G();var S=H.indexOfKey("id",R);var Q=S>=0?H[S]:null;if(Q&&typeof (Q.action)=="function"){Q.action(Q)}return Q};this.getSelectedTabId=function(){return G()};this.update=function(){M();return this}};sf.extend(sf.ui.TabGroup,sf.ui.Widget);sf.ui.WeekView=function(U){sf.ui.WeekView.superclass.constructor.call(this,U);var L=U.domElementId||sf.allocateId();var M=U.listModel;var E=U.labelColumnId;var A=U.dateColumnId;var P=U.showFieldChooser;var K=[];var I=M.getColumnDataType(E);var G=new sf.ui.RecordTooltipProvider(M.getColumns());var R=function(W){var V=parseInt(W.getAttribute("rec_index"));return isNaN(V)?null:G.getTooltipFor(K[V])};var K=null;var H=8;var B=17;var Q=5;var D='      <div class="ap-weekcal" id="${id}">        <div class="ap-weekcal-caption">          <span class="ap-weekcal-fieldchooser">View by <select class="ap-weekcal-fieldsel"></select><button class="ap-weekcal-go">Go</button></span>          <span class="ap-weekcal-caption-center">            <button class="sf-image-btn sf-prev" title="Previous week"></button>            Week of <span class="ap-weekcal-caption-date">${startDate.format ("MMM dd, yyyy")}</span>            <button class="sf-image-btn sf-next" title="Next week"></button>          </span>          <div style="clear: both;"></div>        </div>        <table class="ap-weekcal-table" summary="" cellspacing="0" id="${id}">          <thead>            <tr><th colspan="2" style="width:50px;"></th>            <%                for (var j = 0; j < nCols; j++) { var dt = new Date(startDate.getTime() + j * Date.MILLISECONDS_PER_DAY).format ("EEE, MMM dd");            %><th class="ap-weekcal-colcaption">${dt}</th><% } %>            </tr>          </thead>          <tbody>          <% for (var i = startHour; i <= endHour; i++) { %>            <tr>              <td rowspan="2" class="ap-weekcal-hourlabel ap-weekcal-cell">${i <= 12 ? i : (i - 12)}</td>              <td class="ap-weekcal-cell ap-weekcal-evenrowcell">${ i == 12 ? "pm" : "00" }</td>              <% for (var j = 0; j < nCols; j++) { %><td class="ap-weekcal-cell ap-weekcal-evenrowcell"></td><% } %>            </tr>            <tr>              <td class="ap-weekcal-cell">30</td>              <% for (var j = 0; j < nCols; j++) { %><td class="ap-weekcal-cell ap-weekcal-datacell"></td><% } %>            </tr>          <% } %>          </tbody>        </table>      </div>';var F=new sf.core.Template(D,"week-cal");var J=new sf.core.Template('        <% for (var i = 0; i < records.length; i++) { var aRec = records[i]; var ndx = aRec["__ap__indx"]; %>          <div class="ap-weekcal-item" rec_index="${ndx}">${aRec[labelFieldId]}</div>        <% } %>');var T=null,S=null;var N=this;var O=function(V){N.update(new Date(S.getTime()+7*V*Date.MILLISECONDS_PER_DAY))};this.renderTo=function(W){var X=new Date();T=$(F.process({startDate:X,nCols:Q,startHour:H,endHour:B,id:L}));W.append(T);$(".ap-weekcal-caption .sf-prev",T).click(function(){O(-1)});$(".ap-weekcal-caption .sf-next",T).click(function(){O(1)});if(P){$(".ap-weekcal-fieldchooser",T).show();var Y=$(".ap-weekcal-fieldsel",T);var V=M.getColumns().map(function(Z){return Z.dataType=="date"||Z.dataType=="datetime"?{value:Z.columnId,text:Z.label}:null});if(V.length>0){if(!A){A=V[0].value}sf.ui.Util.fillSelector(Y[0],V);$(".ap-weekcal-go",T).click(function(){A=Y.val();N.update(S)})}}this.update(X);return this};var C=function(f,X){K=[];var d=[];for(var c=0;c<X.length;c++){var e=X[c][A];var V=Math.floor((e.getTime()-f.getTime())/Date.MILLISECONDS_PER_DAY);if(V>=0&&V<Q){if(!d[V]){d[V]=[]}var Z=e.getHours();var W=2*(Z-H)+Math.floor(e.getMinutes()/30);if(!d[V][W]){d[V][W]=[]}d[V][W].push(X[c])}}var l=$("tbody tr",T);var h=0;for(var b=0;b<Q;b++){for(var c=0;c<l.length;c++){var g=l[c].cells;var X=d[b]?d[b][c]:null;var a=c%2==0?2:1;if(X){X.sortByKey(A);for(var Y=0;Y<X.length;Y++){X[Y]["__ap__indx"]=h++;K.push(X[Y])}g[b+a].innerHTML=J.process({records:X,labelFieldId:E})}else{g[b+a].innerHTML=""}}}$(".ap-weekcal-caption-date",T)[0].innerHTML=f.format("MMM dd, yyyy");$(".ap-weekcal-item",T).showTooltip(R,{yOffsetPx:0,width:"auto"});S=f};this.update=function(V){if(!V){V=S}var Y=V.closestPreviousWeekday(1);Y=new Date(Y.getFullYear(),Y.getMonth(),Y.getDate());var X=new Date(V.getTime()+4*Date.MILLISECONDS_PER_DAY);var b=$("th.ap-weekcal-colcaption",T);var a=Y.getTime();for(var Z=0;Z<b.length;Z++){b[Z].innerHTML=new Date(a).format("EEE, MMM dd");a+=Date.MILLISECONDS_PER_DAY}var W={firstRecord:0,recordCount:1000,sort:[{fieldIndex:0,direction:1}],filter:[{fieldId:A,op:"ge",value:Y.format("yyyy-MM-dd 00:00:00")},{fieldId:A,op:"le",value:X.format("yyyy-MM-dd 23:59:59")}]};M.getRecords(W,function(c){C(Y,c&&c.records||[])});return this};this.getRootElement=function(){return T};this.captionString=function(){return"Calendar: Week view"};this.toolbar=function(){return null}};sf.extend(sf.ui.WeekView,sf.ui.Widget);sf.ui.MonthView=function(R){sf.ui.MonthView.superclass.constructor.call(this,R);var L=R.domElementId||sf.allocateId();var M=R.listModel;var H=R.labelColumnId;var B=R.dateColumnId;var N=R.showFieldChooser;var J=M.getColumnDataType(H);var I=new sf.ui.RecordTooltipProvider(M.getColumns());var P=function(T){var S=parseInt(T.getAttribute("rec_index"));return isNaN(S)?null:I.getTooltipFor(K[S])};var K=null;var C=null;var G=function(S){return{label:sf.data.TypeInfo.toHTML(J,S.record[H]),index:S.index}};var D=R.view||({draw:function(S,U){var V=sf.ui.TemplateStore.get("monthview-grid");var T=$(V.process({id:L,fields:U}));S.append(T);return T},update:function(q,f,e,o){var V=new Date();var p=V.getDate(),g=V.getMonth(),b=V.getFullYear();var c=new Date(f,q,1).getDay();var a=$("tbody.sf-monthview-body td",Q);var W="";var S=Date.daysInMonth[q];if(q==1&&f%4==0&&(f%100!=0||f%400==0)){S=29}$(".sf-monthview-row5",Q).css("display",c+S<=35?"none":"");$(".sf-monthview-row4",Q).css("display",c+S<=28?"none":"");var Y=[];for(var m=0;m<o.length;m++){var U=o[m];var l=U[e],Z=U[H];if(l&&l instanceof Date&&l.getMonth()==q&&l.getFullYear()==f){var X=l.getDate();var d=c+X-1;if(!Y[d]){Y[d]=[]}Y[d].push({record:U,index:m})}}var T=sf.ui.TemplateStore.get("monthview-grid-cell");for(var m=0;m<a.length;m++){W=m>=c&&m<S+c?(m-c+1).toString():-1;if(Y[m]){Y[m].sort(function(s,i){var r=s.record[e],t=i.record[e];return r<t?-1:(r>t?1:0)})}var h=Y[m]?Y[m].map(G):[];a[m].innerHTML=T.process({recs:h,cellDate:W,cellDayOfWeek:((m+7-c)%7)});if(W==p&&g==q&&b==f){$(a[m]).addClass("sf-monthview-todaycell")}else{$(a[m]).removeClass("sf-monthview-todaycell")}}}});var E=function(V,U,T,S){K=S;D.update(V,U,T,S);$(".sf-monthview-item",Q).showTooltip(P,{yOffsetPx:0,width:"auto"})};var O=function(V,U,T){var S={firstRecord:0,recordCount:1000,sort:[{fieldIndex:0,direction:1}],filter:[{fieldId:B,op:"ge",value:String.format("{1}/1/{0} 00:00:00",U,(V+1))},{fieldId:B,op:"le",value:String.format("{1}/31/{0} 23:59:59",U,(V+1))}]};if(T){S.filter=S.filter.concat(T)}M.getRecords(S,function(W){E(V,U,B,W&&W.records||[])})}.createDelegate(this);this.update=function(T,S){if(!arguments.length){var U=C.chosenMonth();T=U.month;S=U.year}O(T,S);C.moveTo(T,S);return this};this.setDateColumnId=function(S){if(!M.getColumnDataType(S)){sf.ui.Util.reportError(String.format("MonthView.setDateColumnId: invalid column '{0}'",S));return this}B=S;var T=C.chosenMonth();if(K){D.update(T.month,T.year,B,K)}else{O(T.month,T.year)}return this};var F=function(S){this.setDateColumnId(S)}.createDelegate(this);this.filterBy=function(T){var S=C.chosenMonth();O(S.month,S.year,T);return this};var Q=null;function A(T){var V=new Date();var U=M.getColumns().map(function(X){return X.dataType=="date"||X.dataType=="datetime"?{fieldId:X.columnId,label:X.label}:null});Q=D.draw(T,U);C=new sf.ui.MonthChooser().renderTo($(".sf-monthchooser-wrap",Q));C.bind("change",function(X,Z,Y){O(Z,Y)});if(N){var W=$('<select class="sf-monthview-fieldsel"></select>');$(".sf-monthview-fieldchooser",Q).append(W);var S=M.getColumns().map(function(X){return X.dataType=="date"||X.dataType=="datetime"?{value:X.columnId,text:X.label}:null});if(S.length>0){if(!B){B=S[0].value}sf.ui.Util.fillSelector(W[0],S);W.change(function(){B=this.options[this.selectedIndex].value})}}}this.renderTo=function(S){S=typeof (S)=="string"?$("#"+S):S;if(!S||S.length<=0){sf.core.reportError("MonthView: renderTo: Cannot find container to render into.");return }A(S);var T=C.chosenMonth();this.update(T.month,T.year);this.notifyListeners("render",this);return this};this.getRootElement=function(){return Q};this.captionString=function(){return"Calendar view"};this.toolbar=function(){return null}};sf.extend(sf.ui.MonthView,sf.ui.Widget);sf.ui.MonthViewVertical=function(A){var C=A.domElementId||sf.allocateId();var G=A.listModel;var E=A.labelColumnId;var D=new sf.core.Template('        <div class="sf-mvv" id="${id}">          <table class="sf-mvv-days" cellpadding="0" cellspacing="0" summary="">            <thead><tr><th colspan="2" class="sf-mvv-caption"><span class="sf-monthview-fieldchooser"></span><span class="sf-monthchooser-wrap"></span></th></tr></thead>            <% for (var i = 0; i < 31; i++) { %>              <tr class="sf-mvv-dayrow" valign="top"><td class="sf-mvv-daylabel"><span class="sf-mvv-wkday"></span>${i+1}</td><td class="sf-mvv-daycell"></td></tr>            <% } %>          </table>        </div>    ',"monthViewVertical");var F=new sf.core.Template('          <% for (var i = 0; i < recs.length; i++) { %>            <div class="sf-monthview-item" rec_index="${recs[i].index}">${recs[i].label}</div>          <% } %>        ',"mvvCellTemplate");var B=null;var H={draw:function(I,J){B=$(D.process({id:C,fields:J}));I.append(B);return B},update:function(P,R,S,L){var T=new Array(31);for(var M=0;M<L.length;M++){var J=L[M];var K=J[S];if(K&&K instanceof Date&&K.getMonth()==P&&K.getFullYear()==R){var I=K.getDate()-1;if(!T[I]){T[I]=[]}T[I].push({index:M,label:J[E],record:J})}}var W=new Date(R,P,1).getDay();var V=$(".sf-mvv-dayrow",B);for(var N=0;N<T.length;N++){var O=T[N]||[];O.sort(function(Z,X){var Y=Z.record[S],c=X.record[S];return Y<c?-1:(Y>c?1:0)});var Q=F.process({recs:O});var U=$(V[N]);$(".sf-mvv-daycell",U)[0].innerHTML=Q;$(".sf-mvv-wkday",U)[0].innerHTML=Date.weekdayNames[W];U.removeClass("sf-mvv-dayrow-0").removeClass("sf-mvv-dayrow-6");if(W==0){U.addClass("sf-mvv-dayrow-0")}else{if(W==6){U.addClass("sf-mvv-dayrow-6")}}W=(1+W)%7;U.css("display",N<Date.daysInMonth[P]?"":"none")}}};sf.ui.MonthViewVertical.superclass.constructor.call(this,{listModel:G,dateColumnId:A.dateColumnId,labelColumnId:E,view:H});this.getRootElement=function(){return B}};sf.extend(sf.ui.MonthViewVertical,sf.ui.MonthView);sf.ui.ScrollableList=function(A){sf.ui.ScrollableList.superclass.constructor.call(this,A);var B=null;var G=A.domElementId||sf.allocateId();var I=String.format('<div class="sf-scrollable-list sf-outset" id="{0}">          <ul class="sf-scrollable-list-ul" unselectable="on"></ul>         </div>',G);var F=[];var C=-1;var D=null;var E=function(K){return this.htmlFormatItem(K)}.createDelegate(this);var H=function(M){var K=$("li",B);$(K[C]).removeClass("sf-scrollable-list-focusitem");var L=$(K[M]);var O=L[0].offsetTop;var N=B.scrollTop();if(O<N||O+L.height()>D+N){B.scrollTop(O)}C=M;L.addClass("sf-scrollable-list-focusitem")};var J=function(L){var K=L.map(function(N,M){return String.format('<li unselectable="on" index="{0}" {2}>{1}</li>',M,E(N.text),N.className?('class="'+N.className+'"'):"")});$("ul",B)[0].innerHTML=K.join("");F=L;if(this.getItemCount()>0){C=0;H(0)}}.createDelegate(this);this.update=function(K){J(K);this.notifyListeners("contentChanged",this);return this};this.renderTo=function(K){K=typeof (K)=="string"?$("#"+K):K;if(!K||K.length<=0){sf.core.reportError("ScrollableList: renderTo: Cannot find container to render into.");return }B=$(I);K.append(B);D=B.height();var L=this;B.click(function(N){if($(N.target).is("li")){var M=N.target.getAttribute("index");H(parseInt(M));L.notifyListeners("select",M,L)}});this.notifyListeners("render",this);return this};this.htmlFormatItem=function(K){return K};this.scrollBy=function(L){var K=Math.min(Math.max(C+L,0),this.getItemCount()-1);if(K!=C){H(K)}return this};this.getRootElement=function(){return B};this.getItemCount=function(){return F&&F.length||0};this.getItems=function(){return F};this.getSelectedIndex=function(){return C};this.getSelectedItem=function(){return C>=0&&C<F.length?F[C]:null}};sf.extend(sf.ui.ScrollableList,sf.ui.Widget);sf.ui.SelectBox=function(V){sf.ui.SelectBox.superclass.constructor.call(this,V);var L=V.domElementId||sf.allocateId();var D=V.widthPx||125;var R=8;var Q=9;var I=13;var M=27;var W=33;var S=34;var X=37;var O=38;var E=39;var C=40;var K=46;var T=null,H=null,U;var B=String.format('<div class="sf-selectbox" id="{0}">          <button class="sf-selectbox-button" style="display: block;"><span></span></button>          <div class="sf-selectbox-list"></div>        </div>',L);var G=null;var N=function(){G=H.getSelectedItem();U[0].innerHTML=G.text};var A=function(){N();H.hide();this.notifyListeners("change",G,this)}.createDelegate(this);var J=function(Y){H.toggleShown()};var P={};P[C]=1;P[O]=-1;P[S]=8;P[W]=-8;var F=function(Y){if(P[Y.keyCode]){H.show().scrollBy(P[Y.keyCode]);N();return }switch(Y.keyCode){case Q:case M:A();break}};this.getRootElement=function(){return T};this.setChoices=function(Y){H.update(Y);return this};this.getChoices=function(){return H.getItems()};this.getSelectedItem=function(){return G};this.renderTo=function(Y){Y=typeof (Y)=="string"?$("#"+Y):Y;if(!Y||Y.length<=0){sf.core.reportError("SelectBox: renderTo: Cannot find container to render into.");return }T=$(B);Y.append(T);H=new sf.ui.ScrollableList({domElementId:L+"-list"}).renderTo($(".sf-selectbox-list",T)).hide();var Z=$(".sf-selectbox-button",T).click(J).keydown(F);H.show=function(){this.getRootElement().css("display","block");return this};H.setTrigger(Z);H.bind("select",A);$(".sf-selectbox-button",T).css("width",D+"px");U=$(".sf-selectbox-button span",T).css("width",D-25+"px");$(".sf-scrollable-list",T).css("width",D+"px");this.notifyListeners("render",this);return this}};sf.extend(sf.ui.SelectBox,sf.ui.Widget);sf.ui.AutoCompleter=function(a){sf.ui.AutoCompleter.superclass.constructor.call(this,a);var B=a.domElementId||sf.allocateId();var C=a.dataProvider;var H=a.disallowEmpty;var S=a.minimumMatchLength||1;var b=a.completionDelayMS||450;var i=!!a.enableAutofillTextBox;var N=8;var c=9;var Z=13;var Y=27;var F=33;var E=34;var P=37;var d=38;var R=39;var T=40;var Q=46;var g=null,O=null,G=null,I=null,h=null,J=null;var l=String.format('<div class="sf-autocompleter" id="{0}">          <input class="sf-autocomplete-box" autocomplete="off" type="text" style="display: block;"/>          <div class="sf-selectbox-list"></div>        </div>',B);var f=function(){O.hide();if(!J){G.val("")}else{if(J.text!=G.val()){G.val("");J=null}}this.notifyListeners("select",J,this)}.createDelegate(this);var L=function(){J=O.getSelectedItem();if(J){G.val(J.text);sf.ui.Util.setTextboxSelection(G[0],h.length,J.text.length)}};var M=null;var X=function(){if(M){clearTimeout(M);M=null}};var W=function(m){if(O.isShown()){M=setTimeout(f,150)}else{f(m)}};var D=this;var K=null;var U=function(){var m=G.val().trim();if(!m||m.length<S){O.hide();h=null}else{if(!h||m!=h){if(!h||!m.toLowerCase().startsWith(h.toLowerCase())){I=null}h=m;I?A(I):C(h,D,A)}}D.notifyListeners("change",D);K=null};var e={};e[T]=1;e[d]=-1;e[E]=8;e[F]=-8;var V=function(m){if(e[m.keyCode]){if(G.val()){O.show().scrollBy(e[m.keyCode]);L()}return }switch(m.keyCode){case c:case Y:case Z:f();break;default:if(m.keyCode>=33||m.keyCode==N){if(K){clearTimeout(K)}K=setTimeout(U,b)}break}};this.getRootElement=function(){return g};var A=function(m){var p=h.toLowerCase();var o=m.records.map(function(r){var q=r.text||"";return q&&q.toLowerCase().startsWith(p)?r:null});O.show().update(o);if(i){L()}if(m.totalRecords<=o.length){I=m}};this.getChoices=function(){return O.getItems()};this.getSelectedItem=function(){return J};this.setSelectedItem=function(m){G.val(m&&m.text||"");J=m;return this};this.renderTo=function(m){m=typeof (m)=="string"?$("#"+m):m;if(!m||m.length<=0){sf.core.reportError("AutoCompleter: renderTo: Cannot find container to render into.");return }g=$(l);m.append(g);G=$("input",g).blur(W);var o=B+"-list";O=new sf.ui.ScrollableList({domElementId:o}).renderTo($(".sf-selectbox-list",g)).hide();$("#"+o).click(X);O.bind("select",function(){L();f()});$(".sf-autocomplete-box",g).keydown(V);this.notifyListeners("render",this);return this};this.focus=function(){if(G){G.focus()}return this};this.useDataProvider=function(m){C=m};this.clearCache=function(){I=null;return this}};sf.extend(sf.ui.AutoCompleter,sf.ui.Widget);sf.ui.RecordTooltipProvider=function(A){var B={};A.map(function(E){B[E.columnId]={label:E.label,dataType:E.dataType}});var D=function(E){var G={};for(var F in E){var H=B[F];if(H){G[H.label]=sf.data.TypeInfo.toHTML(H.dataType,E[F])}}return C.process({record:G})};var C=new sf.core.Template('        <div class="sf-record-tooltip">          <table class="sf-record-tooltip-table" style="width: 250px;">            <% for (var k in record) { %>              <tr><td width="30%" class="sf-record-tooltip-itemlabel">${k}</td><td>${record[k]}</td></tr>            <% } %>            </table>        </div>',"recordTooltip");this.getTooltipFor=function(E){return E?D(E):null}};sf.ui.BarChart=function(R){sf.ui.BarChart.superclass.constructor.call(this,R);var H=R.listModel;var Q=R.barLabelFieldId;var E=R.barValueFieldId;var D=R.maxBarWidthPx||370;var C=new sf.core.Template('        <table class="sf-barchart-table" cellpadding="0" cellspacing="0" summary="">          <thead><tr><th class="sf-barchart-table-th"><div>${barLabelCaption}</div></th><th class="sf-barchart-table-th"><div>${barValueCaption}</div></th></tr></thead>          <tbody>            <% for (var i = 0; i < nBars; i++) { %>              <tr class="sf-barchart-item">                <td class="sf-barchart-label"></td>                <td class="sf-barchart-barcell<% if (i == nBars-1) { %> sf-barchart-barcell-last<% } %>" ><div rec_index="${i}" class="sf-barchart-bar"></div></td>              </tr>            <% } %>          </tbody>        </table>',"barChartTemplate");var P=H.getColumnWithId(Q);var B=H.getColumnWithId(E);var K=P&&P.label||'<span style="color: red;">Error: Invalid field for bar label</span>';var I=B&&B.label||'<span style="color: red;">Error: Invalid field for bar value</span>';var J=null,O=null,G=sf.allocateId(),A=[];var F=new sf.ui.RecordTooltipProvider(H.getColumns());var N=function(T){var S=parseInt(T.getAttribute("rec_index"));return isNaN(S)?null:F.getTooltipFor(J[S])};function L(S){return H.toDisplayString(S,E)}var M=function(b){if(!b){return }var V=b?b.records.length:0;if(J==null||b&&J.length!=V){O[0].innerHTML=C.process({nBars:V,id:G,barLabelCaption:K,barValueCaption:I});var c=$(".sf-barchart-item",O);A=[];for(var S=0;S<c.length;S++){var X=c[S];A.push({labelCell:$(X.cells[0]),bar:$(".sf-barchart-bar",X.cells[1])})}$(".sf-barchart-bar",O).showTooltip(N,{yOffsetPx:0,width:"auto"})}var W=sf.data.TypeInfo.comparator(H.getColumnDataType(Q));J=b&&[].concat(b.records);var Y=Number.POSITIVE_INFINITY,U=Number.NEGATIVE_INFINITY;for(var S=0;S<V;S++){var a=J[S][E];if(typeof (a)=="number"&&!isNaN(a)){Y=Math.min(a,Y);U=Math.max(a,U)}}Y=Math.min(0,Y);var T=Math.max(U-Y,1);for(var S=0;S<V;S++){A[S].labelCell[0].innerHTML=H.toDisplayString(J[S][Q],Q);var a=J[S][E];if(typeof (a)=="number"&&!isNaN(a)){var Z=(a-Y)*D/T;A[S].bar.css("display","block").width(Z+"px");A[S].bar[0].innerHTML=L(a)}else{A[S].bar.css("display","none")}}};this.update=function(S){H.getRecords(S,M)};this.getRootElement=function(){return O};this.renderTo=function(S){S=typeof (S)=="string"?$("#"+S):S;if(!S||S.length<=0){sf.core.reportError("ui.BarChart: renderTo: Cannot find container to render into.");return }O=$(String.format('<div class="sf-barchart" id="{0}" ></div>',G));S.append(O);M();return this}};sf.extend(sf.ui.BarChart,sf.ui.Widget);sf.ui.VerticalBarChart=function(S){sf.ui.VerticalBarChart.superclass.constructor.call(this,S);var L=S.listModel;var R=S.barLabelFieldId;var F=S.barValueFieldId;var E=S.maxBarHeightPx||220;var K=46;var H=12;var I=25;var D=new sf.core.Template('      <table cellspacing="0" cellpadding="0" summary="" class="sf-vbarchart-wrap" id="${id}">        <tr>          <td class="sf-vbarchart-ylabels"></td>          <td width="${nBars * totalBarWidthPx}px">            <div class="sf-vbarchart-bars-wrap" style="width: ${nBars * totalBarWidthPx}px;">              <% for (var i = 0; i < 5; i++) { %>                <div class="sf-vbarchart-marker"><span class="sf-vbarchart-marktxt"></span></div>              <% } %>              <% for (var i = 0; i < nBars; i++) { %>                <div class="sf-vbarchart-bar" rec_index="${i}"></div>              <% } %>              <% for (var i = 0; i < nBars; i++) { %>                <div class="sf-vbarchart-barlabel"></div>              <% } %>            </div>          </td>        </tr>      </table>',"verticalBarChart");var Q=L.getColumnWithId(R);var B=L.getColumnWithId(F);var M=null,P=null,J=sf.allocateId(),C=[];var G=new sf.ui.RecordTooltipProvider(L.getColumns());var O=function(U){var T=parseInt(U.getAttribute("rec_index"));return isNaN(T)?null:G.getTooltipFor(M[T])};function A(T){var V=Math.ceil(Math.log(T)/Math.log(10));if(V<=1){return Math.ceil(T)}var U=Math.pow(10,V-2);return Math.ceil(T/U)*U}var N=function(g){if(!g){return }var d=g?g.records.length:0;if(M==null||g&&M.length!=d){if(d>=I){P[0].innerHTML=String.format("Too many data elements for vertical bar chart (max {0} allowed)",I);return }P[0].innerHTML=D.process({nBars:d,id:J,totalBarWidthPx:K});var h=$(".sf-vbarchart-bar",P),a=$(".sf-vbarchart-barlabel",P);C=[];for(var Y=0;Y<d;Y++){C.push({bar:$(h[Y]),label:a[Y]})}$(".sf-vbarchart-bar",P).showTooltip(O,{yOffsetPx:0,width:"auto"})}M=g&&[].concat(g.records);var e=Number.POSITIVE_INFINITY,b=Number.NEGATIVE_INFINITY;for(var Y=0;Y<d;Y++){var f=M[Y][F];if(typeof (f)=="number"&&!isNaN(f)){e=Math.min(f,e);b=Math.max(f,b)}}e=Math.min(0,e);var l=A(b);var Z=Math.max(b-e,1);for(var Y=0;Y<d;Y++){var f=M[Y][F];if(typeof (f)=="number"&&!isNaN(f)){f=Math.max(f,0);var c=f*E/l;var X=Y*K+(K-H)/2;C[Y].bar.css({display:"block",left:X+"px",height:c+"px"});C[Y].label.innerHTML=L.toDisplayString(M[Y][R],R);C[Y].label.style.width=K+"px"}else{C[Y].bar.css("display","none")}}var W=$(".sf-vbarchart-marktxt",P);var U=l;var V=l/W.length;for(var Y=0;Y<W.length;Y++){W[Y].innerHTML=L.toDisplayString(U,F);U-=V}var T=L.toDisplayString(l,F).length+1+"ex";$(".sf-vbarchart-marktxt",P).css("left","-"+T);$(".sf-vbarchart-ylabels",P).css("width",T)};this.update=function(T){L.getRecords(T,N)};this.getRootElement=function(){return P};this.renderTo=function(T){T=typeof (T)=="string"?$("#"+T):T;if(!T||T.length<=0){sf.core.reportError("ui.VerticalBarChart: renderTo: Cannot find container to render into.");return }P=$(String.format('<div class="sf-vbarchart" id="{0}" ></div>',J));T.append(P);N();return this}};sf.extend(sf.ui.VerticalBarChart,sf.ui.Widget);sf.ui.PieChart=function(T){sf.ui.PieChart.superclass.constructor.call(this,T);var J=T.listModel;var H=T.labelFieldId;var W=T.valueFieldId;var U=J.getColumnWithId(H);var A=J.getColumnWithId(W);var M=U&&U.label||'<span style="color: red;">Error: Invalid field for label</span>';var B=A&&A.label||'<span style="color: red;">Error: Invalid field for value</span>';var L=null,S=null,I=sf.allocateId();var F=new sf.ui.RecordTooltipProvider(J.getColumns());var P=function(Y){var X=parseInt(Y.getAttribute("rec_index"));return isNaN(X)?null:F.getTooltipFor(L[X])};var V=190,K=60,R=100,N=200,Q=12,D=12;var E=["e7f1cf","d8e7b0","c9dc8b","b7d365","a1be4a","839b3b","63752b"];function C(X,Y){return"#"+E[X%E.length]}var G=String.format('        <img src="/img/piechart-imagemap.gif" style="position: absolute; top:0;left:0;border:none;" width="{1}" height="{1}" usemap="#{0}-map"/>        <canvas width="{1}" height="{1}"></canvas>        <table cellspacing="1" class="sf-piechart-items"><tr><th>{2}</th><th>{3}</th></tr></table>        <map id="{0}-map" name="{0}-map"></map>',I,N,M,B);function O(p){if(!p){return }var y=p.records;var h=y.length;if(h>=D){S[0].innerHTML=String.format("Too many data elements for pie chart (max {0} allowed)",D);return }L=y;S[0].innerHTML=G;var g=$("map",S);var a=jQuery("canvas",S)[0];if(jQuery.browser.msie){a=G_vmlCanvasManager.initElement(a)}var u=a.getContext("2d");var z=0,Y=[];for(var x=0;x<h;x++){Y[x]=y[x][W];if(isNaN(Y[x])||Y[x]==null){Y[x]=0}z+=Y[x]}var c=0,w=0,m=[],l=[];for(var x=0;x<h;x++){var s=Y[x];var X=z>0?(s/z):0;var r=2*Math.PI*(c+X);u.beginPath();u.moveTo(R,R);u.arc(R,R,R,w,r,false);u.closePath();u.fillStyle=C(x,h);u.fill();var e=String.format('<tr style="background-color: {0}"><td>{1}</td><td class="sf-piechart-items-pct">{2} ({3}%)</td></tr>',u.fillStyle,J.toDisplayString(y[x][H],H),J.toDisplayString(s,W),Math.ceil(X*100));l.push(e);u.lineWidth=1;u.beginPath();u.moveTo(R,R);u.arc(R,R,R,w,r,false);u.closePath();u.strokeStyle="#FFF";u.stroke();var q=(r-w)/Q;var d=R+Math.round(Math.cos(w)*R);var o=R+Math.round(Math.sin(w)*R);var t=[];var b=1;for(j=0;j<(Q*2-2);j+=2){var v=w+q*b;t[j]=R+Math.round(Math.cos(v)*R);t[j+1]=R+Math.round(Math.sin(v)*R);b++}var f=R+Math.round(Math.cos(r)*R);var Z=R+Math.round(Math.sin(r)*R);t=[R,R,d,o].concat(t,[f,Z]);m.push(String.format('<area rec_index="{0}" style="display: block;" id="{1}-area-{0}" shape="poly" coords="{2}"></area>',x,I,t.join(",")));c+=X;w=r}g[0].innerHTML=m.join("");$(".sf-piechart-items",S).append(l.join(""));$("area",g).showTooltip(P,{yOffsetPx:0,width:"auto"});return S}this.update=function(X){J.getRecords(X,O)};this.getRootElement=function(){return S};this.renderTo=function(X){X=typeof (X)=="string"?$("#"+X):X;if(!X||X.length<=0){sf.core.reportError("ui.PieChart: renderTo: Cannot find container to render into.");return }S=$(String.format('<div class="sf-piechart" id="{0}" style="position: relative; width: {1}px; height:{1}px;"></div>',I,N));X.append(S);O();return this}};sf.extend(sf.ui.PieChart,sf.ui.Widget);sf.ui.GroupedRendering=function(D){sf.ui.GroupedRendering.superclass.constructor.call(this,D);var B=D.listModel;var A=D.cellSpec;var H=D.domElementId||sf.allocateId();var E=null;var I=new sf.core.Template('        <table class="sf-report-grouping-table" cellpadding="0" cellspacing="0" summary="">          <thead>            <tr valign="top" class="sf-report-grouping-head"><th>${rowHeading}</th><th class="sf-report-grouping-head-cell">${cellHeading}</th></tr>          </thead>          <tbody>            <% for (var i = 0, n = groups.length; i < n; i++) {  var grp = groups[i]; %>              <tr valign="top">                <td class="sf-report-grouping-cell">${grp.label}</td>                <td class="sf-report-grouping-cell">                <% if (typeof (aggrFunction) == "undefined" || aggrFunction == "value") { var value = grp.records; %>                  <ul class="sf-report-grouping-cell-list">                    <% for (var k = 0; k < value.length; k++) { %>                    <li class="sf-datacell-${cellDataType}">${cellFormat(value[k][cellFieldId])}</li>                    <% } %>                  </ul>                <% } else {  var value = grp.aggrValue; %>                  <div class="sf-datacell-${cellDataType}">${cellFormat(value)}</div>                <% } %>              </tr>            <% } %>          </tbody>        </table>    ',"groupingTemplate");var F={value:"",sum:"Total ",avg:"Average of ",max:"Largest of ",min:"Smallest of "};var C=function(L,K){if(!L){return"Records"}return F[K]+B.getColumnWithId(L).label};var G=function(K){return B.toDisplayString(K,A.fieldId)};var J=function(L){var K=C(A.fieldId,L.aggrFunction);var M=B.getColumnWithId(L.columnIdForGroup0).label;E[0].innerHTML=I.process({cellHeading:K,rowHeading:M,intervals:L.intervals,groups:L.groups,records:L.records,aggrFunction:L.aggrFunction,cellFormat:G,cellFieldId:A.fieldId,cellDataType:B.getColumnDataType(A.fieldId)})};this.update=function(K){B.getRecords(K,J);return this};this.renderTo=function(K){_container=typeof (K)=="string"?$("#"+K):K;E=$('<div class="sf-report-matrix"></div>');_container.append(E);return this};this.getRootElement=function(){return E}};sf.extend(sf.ui.GroupedRendering,sf.ui.Widget);sf.ui.MatrixRendering=function(D){sf.ui.MatrixRendering.superclass.constructor.call(this,D);var C=D.listModel;var I=D.rowGroupId;var H=D.colGroupId;var E=D.rowIntervalsBuilder;var J=D.colIntervalsBuilder;var B=D.cellSpec;var F=null;var A=new sf.core.Template('        <table class="sf-report-matrix-table" cellpadding="0" cellspacing="0" summary="">          <thead>            <tr valign="top"><th class="sf-report-matrix-mainheading" colspan="${1+cols.count()}">${mainHeading}</th></tr>            <tr valign="top" class="sf-report-matrix-col-labels"><th rowspan="2" valign="bottom">${rowHeading}</th><th colspan="${cols.count()}">${columnHeading}</th></tr>            <tr valign="top">              <% for (var i = 0, m = cols.count(); i < m; i++) { %><th class="sf-report-matrix-head-cell">${cols.labelString (i)}</th><% } %>            </tr>          </thead>          <tbody>            <% for (var i = 0, n = rows.count(); i < n; i++) { %>              <tr valign="top">                <td class="sf-report-matrix-cell sf-report-matrix-leftcol">${rows.labelString (i)}</td>                <% for (var j = 0, m = cols.count(); j < m; j++) { var value = cells[i] ? cells[i][j] : null; %>                  <td class="sf-report-matrix-cell">                  <% if (value instanceof Array) { %>                    <% if (value.length > 1) { %>                      <ul class="sf-report-matrix-cell-list">                        <% for (var k = 0; k < value.length; k++) { %>                        <li class="sf-datacell-${cellDataType}">${cellFormat(value[k])}</li>                        <% } %>                      </ul>                    <% } else {%>                      <div class="sf-datacell-${cellDataType}">${cellFormat (value[0])}</div>                    <% } %>                  <% } else { %>                    <div class="sf-datacell-${cellDataType}">${cellFormat (value)}</div>                  <% } %>                <% } %>              </tr>            <% } %>          </tbody>        </table>',"matrixTemplate");var G={value:"",sum:"Total ",avg:"Average of ",max:"Largest of ",min:"Smallest of "};var K=function(l){var e=l&&l.records||[];var W=C.getColumnWithId(I),L=C.getColumnWithId(H);var R=E(l.records,I)||new sf.data.StringsAsIntervalList(sf.data.ListModel.getDistinctValues(e,W.columnId,W.dataType));var Q=J(l.records,H)||new sf.data.StringsAsIntervalList(sf.data.ListModel.getDistinctValues(e,L.columnId,L.dataType));var V=R.count(),X=Q.count();if(V*X>5000){sf.ui.Util.reportError(String.format("Matrix too big ({0}x{1}): At most 5,000 cells allowed.",V,X));return }var O=new Array(V);for(var d=0,N=e.length;d<N;d++){var M=e[d];var f=M[I],h=M[H];var S=R.matchingIntervalIndex(E?f:sf.data.TypeInfo.toHTML(W.dataType,f));var Y=Q.matchingIntervalIndex(J?h:sf.data.TypeInfo.toHTML(L.dataType,h));if(S>=0&&S<V&&Y>=0&&Y<X){if(!O[S]){O[S]=new Array(X)}if(!O[S][Y]){O[S][Y]=[]}var b=M[B.fieldId];var T={};T[B.fieldId]=b;O[S][Y].push(T)}}var a=sf.data.GroupingListModel.applyAggregateFunction;var g=C.getColumnDataType(B.fieldId);for(var d=0;d<V;d++){for(var c=0,X=(O[d]&&O[d].length||0);c<X;c++){O[d][c]=a(B.content,O[d][c],B.fieldId,g)}}var U=function(i){return C.toDisplayString(i,B.fieldId)};var P=C.getColumnWithId(B.fieldId);var Z=B.fieldId?(G[B.content]+(P&&P.label||"")):(B.content=="count"?"Record count":"");if(Z!=""){Z+=" by "+W.label+" and "+L.label}F[0].innerHTML=A.process({rows:R,cols:Q,cells:O,cellFormat:U,rowHeading:W.label,columnHeading:L.label,mainHeading:Z,cellDataType:C.getColumnDataType(B.fieldId)})};this.update=function(L){C.getRecords(L,K);return this};this.renderTo=function(L){_container=typeof (L)=="string"?$("#"+L):L;F=$('<div class="sf-report-matrix"></div>');_container.append(F);return this};this.getRootElement=function(){return F}};sf.extend(sf.ui.MatrixRendering,sf.ui.Widget);sf.ui.MonthChooser=function(A){A=A||{};sf.ui.MonthChooser.superclass.constructor.call(this,A);var G=A.startYear||2005;var J=A.endYear||2010;var B='      <span class="sf-monthchooser">        <select class="sf-month-sel">          <option value="0" selected>Jan</option>          <option value="1">Feb</option>          <option value="2">Mar</option>          <option value="3">Apr</option>          <option value="4">May</option>          <option value="5">Jun</option>          <option value="6">Jul</option>          <option value="7">Aug</option>          <option value="8">Sep</option>          <option value="9">Oct</option>          <option value="10">Nov</option>          <option value="11">Dec</option>        </select>        <select class="sf-year-sel"><option value="2009" selected>2009</option></select>        <button class="sf-action-btn sf-changedate" style="margin-right: 15px;">Go</button>        <button title="Show previous month" class="sf-image-btn sf-prev"></button>        <button title="Show next month" class="sf-image-btn sf-next"></button>      </span>';var E=null,H=null,C=null,K=0,I=G;var F=function(L){var N=parseInt(E.options[E.selectedIndex].value);var M=parseInt(H.options[H.selectedIndex].value);this.notifyListeners("change",N,M,L,this)}.createDelegate(this);var D=function(M,L){$(H).val(L);$(E).val(M);K=M;I=L};this.moveTo=function(M,L){D(M,L);return this};this.chosenMonth=function(){return{month:K,year:I}};this.renderTo=function(L){L=typeof (L)=="string"?$("#"+L):L;if(!L||L.length<=0){sf.core.reportError("MonthChooser: renderTo: Cannot find container to render into.");return }C=$(B);L.append(C);var N=new Date();var M=N.getFullYear();if(G<=M&&J>=M){K=N.getMonth();I=M}E=$(".sf-month-sel",C)[0];H=$(".sf-year-sel",C)[0];var P=[];for(var O=G;O<=J;O++){P.push({value:O,text:O})}sf.ui.Util.fillSelector(H,P,I);$(E).val(K);$(".sf-prev",C).click(function(){var Q=K-1,R=I;if(Q<0){Q=11;R--}D(Q,R);F()});$(".sf-next",C).click(function(){var Q=K+1,R=I;if(Q>=12){Q=0;R++}D(Q,R);F()});$(".sf-changedate",C).click(function(){K=parseInt($(E).val());I=parseInt($(H).val());F()});return this};this.getRootElement=function(){return C}};sf.extend(sf.ui.MonthChooser,sf.ui.Widget);sf.ui.ProgressBar=function(A){A=A||{};sf.ui.ProgressBar.superclass.constructor.call(this,A);var D=null,J=null,F=null,K=null,E=null;var B='<div class="sf-progressbar"><div class="sf-progressbar-inner"></div><div class="sf-progressbar-msg"></div><div class="sf-progressbar-time"></div></div>';var H=new Date().getTime();this.getRootElement=function(){return D};this.reset=function(){F.html("");K.html("");H=new Date().getTime();J.width("0px");return this};this.renderTo=function(L){L=typeof (L)=="string"?$("#"+L):L;if(!L||L.length<=0){sf.core.reportError("ProgressBar: renderTo: Cannot find container to render into.");return }D=$(B);L.append(D);J=$(".sf-progressbar-inner",D);F=$(".sf-progressbar-msg",D);K=$(".sf-progressbar-time",D);this.reset();return this};var I=function(){var L=Math.round((new Date().getTime()-H)/1000);K.html(String.format("{0} m {1} s",Math.floor(L/60),L%60))};var C=function(){clearInterval(E);E=null;this.notifyListeners("finish",this)}.createDelegate(this);var G=function(L){clearInterval(E);E=null;J.width("100%");F.html(L)};this.start=function(){this.reset();J.show();if(E){clearInterval(E)}E=setInterval(I,1000);return this};this.stop=function(L){G(L);return this};this.update=function(M,L){if(M<=0){this.reset()}else{J[0].style.width=M+"%";F[0].innerHTML=L;if(M>=100){setTimeout(C,50)}}return this}};sf.extend(sf.ui.ProgressBar,sf.ui.Widget);sf.ui.SubsetSelector=function(D){if(!D){D={}}sf.ui.SubsetSelector.superclass.constructor.call(this,D);var L=D.domElementId||sf.allocateId();var K=D.caption||"";var I=D.textUnderCaption||"";var F=null,H=null,C=null;var N=new sf.core.Template('        <div class="sf-subsel" id="${id}">          <% if (caption) { %><h3>${caption}</h3><% } %>          <div class="sf-subsel-content">            <% if (textUnderCaption) { %><span class="sf-subsel-textundercaption">${textUnderCaption}</span><% } %>            <div class="sf-subsel-group-wrap"><b>Available</b><div class="sf-subsel-group sf-subsel-availables"></div><span class="sf-pseudolink sf-moveall">Add all</span></div>            <div class="sf-subsel-group-wrap"><b>Selected</b><div class="sf-subsel-group sf-subsel-selected"></div><span class="sf-pseudolink sf-moveall">Remove all</span></div>          </div>        </div>',"subsetselector");var G=new sf.core.Template('        <% for (var i = 0, n = items.length; i < n; i++) {             var item = items[i];        %>          <div class="sf-subsel-item" item_value="${item.value}" index="${i}">${item.label}</div>        <% } %>    ');var P=function(){for(var Q=0;Q<H.length;Q++){H[Q].checked=this.checked}};this.renderTo=function(Q){if(!Q){sf.core.reportError("SubsetSelector: No container provided.");return }Q=Q.jquery?Q:$(Q);var R={id:L,caption:K,textUnderCaption:I};F=$(N.process(R));Q.append(F);$(".sf-subsel-allbox",F).click(P);return this};var O=null,B=null;var J=function(S,U){var Q=[];for(var R=S.length-1;R>=0;R--){var T=S[R];if(U.indexOf(T,function(W,V){return W.value==V.value})<0){Q.push(T)}}Q.sort(function(W,V){return W.label<V.label?-1:(W.label>V.label?1:0)});return Q};var A=function(Q){var R=$(Q);return R.hasClass("sf-subsel-item")&&$(Q.parentNode).hasClass("sf-subsel-selected")};var M=function(){$(".sf-subsel-availables",F)[0].innerHTML=G.process({items:B});$(".sf-subsel-selected",F)[0].innerHTML=G.process({items:O});if(!C){C=new sf.ui.DragDropProxy(".sf-subsel-item",".sf-subsel-group,.sf-subsel-item",E)}else{C.reEnable()}};var E=function(Q,W){var R=Q.getAttribute("item_value");var T=W.getAttribute("item_value");var X=$(W);var U=parseInt(Q.getAttribute("index"));if(isNaN(U)){return }var S=X.hasClass("sf-subsel-item")?$(W.parentNode).hasClass("sf-subsel-selected"):X.hasClass("sf-subsel-selected");if(S){if(A(Q)){var V=parseInt(W.getAttribute("index"));if(V>=0&&U!=V){O=O.moveItem(U,V)}else{if(U<O.length-1){O=O.moveItem(U,O.length)}}}else{var Y=B.splice(U,1)[0];var V=parseInt(W.getAttribute("index"));if(isNaN(V)){O.push(Y)}else{O.splice(V,0,Y)}}}else{B.push(O.splice(U,1)[0])}M()};this.update=function(R,Q){O=[].concat(Q);B=J(R,Q);M();return this};this.getRootElement=function(){return F};this.getSelectedItems=function(){return O}};sf.extend(sf.ui.SubsetSelector,sf.ui.Widget);sf.ui.ItemSelector=function(V){sf.ui.ItemSelector.superclass.constructor.call(this,V);var O=V&&V.domElementId||sf.allocateId();var J=V.labelRenderer;var M=V.displayRenderer;var K=!!V.animateGroups;var W=V.className;var F=230;var E=String.format('      <span class="ap-itemsel{1}" id="{0}">        <span class="ap-itemsel-selectedbox">Choose...</span>        <ul class="ap-itemsel-choices"></ul>      </span>',O,W?(" "+W):"");var B=new sf.core.Template('      <% var seenFirstGroup = false; %>      <% for (var i = 0, n = groups.length; i < n; i++) {  var grp = groups[i]; %>        <% if (grp.opts) { %>          <% var cls = "ap-itemsel-grphdr-closed"; %>          <% if (!seenFirstGroup) { cls = "ap-itemsel-grphdr-open"; seenFirstGroup = true; }; %>          <li class="ap-itemsel-grphdr ${cls}">${labelRenderer (grp)}</li>          <li class="ap-itemsel-grp">            <ul class="ap-itemsel-options">            <% for (var j = 0, m = grp.opts.length; j < m; j++) { %>              <% var opt = grp.opts[j]; var cls = [opt.notSelectable ? "" : "ap-itemsel-option", opt.className || ""].join (" "); %>              <li <% if (cls) { %>class="${cls}"<% } %><% if (opt.value) { %> optvalue="${opt.value}"<% } %> >${labelRenderer (opt)}</li>            <% } %>            </ul>          </li>        <% } else { %>          <li class="ap-itemsel-option" optvalue="${groups[i].value}">${labelRenderer (groups[i])}</li>        <% } %>      <% } %>',"fieldSelector");var I=null,D=null,T=null,L=null,S=null,G=null,U=null,R=null;var H={};var P=this;function Q(){return S.css("display")!="none"}function N(X){var Y=$(X);if(Y.hasClass("ap-itemsel-grphdr-closed")){if(R){$(R).removeClass("ap-itemsel-grphdr-open").addClass("ap-itemsel-grphdr-closed").next().hide()}$(Y).removeClass("ap-itemsel-grphdr-closed").addClass("ap-itemsel-grphdr-open");if(Q()){K?Y.next().slideDown("slow"):Y.next().show()}else{Y.next().show()}R=X}}function A(Y){if(I){I.removeClass("ap-itemsel-selected")}I=Y;I.addClass("ap-itemsel-selected");var Z=Y.attr("optvalue");var X=D[Z];L[0].innerHTML=M(X);return X}this.getSelectedValue=function(){return I!=null?I.attr("optvalue"):null};this.getOptionForValue=function(X){return D[X]};this.getSelectedOption=function(){var X=I!=null?I.attr("optvalue"):null;return X!=null?D[X]:null};function C(Z){if(I){I.removeClass("ap-itemsel-selected")}if(!Z){$(".ap-itemsel-selectedbox",T).html("Choose...");I=null;return }var Y=$(H[Z]);A(Y);if(Y&&Y.length){var X=Y[0];X=X.parentNode&&X.parentNode.parentNode;X=$(X).prev();if(X.length){N(X[0])}}}this.setSelectedValue=function(X){C(X);return this};this._optionClicked=function(Y,X){S.hide();return A($(Y))};this.update=function(a,c){var Z={groups:a,labelRenderer:J};$(".ap-itemsel-choices",T)[0].innerHTML=B.process(Z);G=$(".ap-itemsel-grphdr",T);U=$(".ap-itemsel-grp",T);if(U.length){$(U[0]).show();R=G[0]}D={};for(var b=a.length-1;b>=0;b--){if(a[b].opts){var X=a[b].opts;for(var Y=X.length-1;Y>=0;Y--){D[X[Y].value]=X[Y]}}else{if(a[b].value){D[a[b].value]=a[b]}}}H={};$(".ap-itemsel-options > li",T).each(function(){H[this.getAttribute("optvalue")]=this});if(c){C(c)}G.click(function(){N(this)});this.notifyListeners("update",this);return this};this.renderTo=function(X){X=X.jquery?X:$(X);T=$(E);X.append(T);var Y=T.width()||F;L=$(".ap-itemsel-selectedbox",T).css("width",Y+"px");S=$(".ap-itemsel-choices",T);S.css("width",Y+15+"px");S.setTrigger(L);$("#"+O+" .ap-itemsel-option").live("click",function(Z){var a=P._optionClicked(this,Z);if(a){P.notifyListeners("change",a,Z)}});this.notifyListeners("render",this);return this};this.getRootElement=function(){return T}};sf.extend(sf.ui.ItemSelector,sf.ui.Widget);sf.uix.Application=function(){sf.uix.Application.superclass.constructor.call(this);var C="apsona";var K="bugs@apsona.com";var c="/app/app_admin/logout",N=null,B=null,T=null,U=null,J=null,E=null,Z=null,L={},V=false,a=null,R=null;var l=null,S=null,h=null;var F=null;var H=this;this.showMenuBarTabFor=function(m){return !m.startsWith("builtin.")};this.productName=function(){return C};this.bugsEmail=function(){return K};this.baseURL=function(){return"http://"+window.location.host+"/app/"+Z};this.adminDataService=function(){return U};var Y=function(m){var r=m;var s=r.length>=1?r[0]:"";var q=r.length>=2?r[1]:null;var p=r.length>=3?r[2]:null;J.showTab("mainmenu-table-"+q);var o=H.showPageForObject(q);if(p&&o){o.showPageComponent(p)}};var e=function(m){var p=m;var q=p.length>=1?p[0]:"";var o=p.length>=2?p[1]:null;J.showTab("mainmenu-setup");switch(o){case"apps":Q();break;case"tables":default:H.showManageTablesPage();break}};var d=function(){if(!F){F=new sf.uix.AppPropsForm()}F.showModal();U.getRecords("User/allowedForApp",{appId:Z,neededFields:[{fieldId:"personal_name"},{fieldId:"email_address"}]},function(m){F.update({user_app_id:Z,name:l,description:S,currency:h,sharedWith:m.records})})};var D=[{prefix:"setup/cartconnect",handler:b},{prefix:"table",handler:Y},{prefix:"setup",handler:e}];this.addLocation=function(m,o){D=[{prefix:m,handler:o}].concat(D);return this};this.navigateTo=function(o){$("#sf-no-tables-blurb").css("display","none");I();for(var p=0,r=D.length;p<r;p++){var m=D[p].prefix;if(o==m||o.startsWith(m+"/")){var q=o?o.split("/"):[];D[p].handler(q);window.location.hash=o||"";this.notifyListeners("navigate",o);break}}return this};this.getMenubarItems=function(){var q=[];if(!!L.includeHomeTab){q.push({label:"Home",id:"mainmenu-home",location:"home",subItems:[{id:"mainmenu-home-dashboard",label:"Dashboard",location:"home/dashboard"}]});this.addLocation("home",g)}var r=sf.data.ObjectRegistry,m=null;if(L.menuBarItems&&jQuery.isArray(L.menuBarItems)){q=q.concat(L.menuBarItems)}else{if(L.menuBarItemNames&&L.menuBarItemNames.length){m=L.menuBarItemNames.map(function(t){return r.get(t)!=null?t:null})}else{m=r.objectNames();m.sort(function(u,t){var w=r.get(u).pluralLabel,v=r.get(t).pluralLabel;return w<v?-1:(w==v?0:1)})}for(var p=0;p<m.length;p++){var s=m[p];if(this.showMenuBarTabFor(s)){var o=sf.data.ObjectRegistry.get(s);q.push({label:o.pluralLabel,id:"mainmenu-table-"+s,location:"table/"+s,subItems:[{id:"mainmenu-data-"+s,label:"All "+o.pluralLabel,location:"table/"+s+"/listanddetail"},{id:"mainmenu-widelist-"+s,label:"Tabular view",location:"table/"+s+"/widelist"},{id:"mainmenu-calendar-"+s,label:"Calendar Month",location:"table/"+s+"/calendar"},{id:"mainmenu-calendarweek-"+s,label:"Calendar Week",location:"table/"+s+"/calendarweek"},{id:"mainmenu-reports-"+s,label:"Reports",location:"table/"+s+"/reports"}]})}}q.push({label:"Settings",id:"mainmenu-setup",location:"setup",subItems:[{label:"Manage tables",id:"mainmenu-tables",location:"setup/tables"},{label:"Configure app...",id:"mainmenu-appconfig",action:d},{label:"Account info",id:"mainmenu-apps",location:"setup/apps"}]})}return q};function b(){var m=A("page-zencart",function(){return new sf.uix.ZenCartConnection()});I();return m.show()}function g(){var m=A("page-home",function(){return new sf.uix.Dashboard({dataService:B})});I();J.showTab("mainmenu-home");return m.show()}this.rebuildMenubar=function(){var o=this.getMenubarItems();var m=function(p,t,r,q,s){if(t.location){H.navigateTo(t.location)}};$("#mainMenuBar").html("");J=new sf.ui.MenuBar({items:o}).renderTo("mainMenuBar").bind("select",m);$("#sf-no-tables-blurb").css("display",sf.data.ObjectRegistry.objectNames().length<=0?"block":"none");return o};var Q=function(){var m=N.apps;if(!m){m=new sf.uix.HomePage(a.userProfile).renderTo("#sf-content-pane");N.apps=m}m.show()};var G=function(m,p){var o=p.getAppDescriptors().find(Z,function(r,q){return r.user_app_id==q});if(o){document.title=o.name+" - "+C;$(".sf-banner h1").html(o.name)}};var W=function(m){sf.data.TypeInfo.DEFAULT_DATE_FORMAT=m.date_format;var p=parseInt(m.autocomplete_delay_ms);if(!isNaN(p)){sf.ui.ReferenceEditor.COMPLETION_DELAY_MS=p}var o=parseInt(m.items_per_page);if(!isNaN(o)){sf.uix.FullObjectView.ITEMS_PER_PAGE=o}if(m.font_size){document.body.style.fontSize=m.font_size}if(m.font_family){document.body.style.fontFamily=m.font_family}};var i=null;var P=function(){var r=$(".sf-prefs");if(!r.length){return }$(".sf-prefslink").click(function(){if(!i){i=new sf.ui.ModalDialog()}i.show(r)});$(".sf-prefs .sf-prefs-cncl").click(function(){i.hide()});var q={font_size:".sf-prefs-fontsize",font_family:".sf-prefs-fontfamily",date_format:".sf-prefs-dateformat",autocomplete_delay_ms:".sf-prefs-autocompletedelay",items_per_page:".sf-prefs-itemsperpage"};var m=R;if(m){for(var p in m){var o=m[p];if(o){$(q[p],r).val(o)}}}r[0].onsubmit=function(){var u={};for(var s in q){u[s]=$(q[s],r).val()}W(u);var t=sf.util.toJSONString(u);var v=sf.util.toJSONString([{user_id:a.userId,preferences:t}]);$.post("/app/app_admin/put/data/User.js",{sessionId:E,parameters:v},function(){sf.ui.Util.informationAlert("Changes will be fully effective on your next login.")});i.hide();return false}};var X=function(r,o){var q=o.getAppDescriptors();for(var m=q.length-1,p=0;m>=0;m--){if(q[m].owner_id&&q[m].owner_id[0]==a.userId){p++}}if(a.userProfile.maxApps>p){$(".sf-banner").append('<span id="sf-app-add" class="sf-pseudolink" title="Create a new app">Add app</span>');$("#sf-app-add").click(function(){sf.App.enableWindowCloseWarning(false);window.location.href="/app/app_admin/pages/choose_app.html?sessionId="+E})}if(q.length<=1){$("#sf-appchooser").hide()}};var M=function(p){sf.data.ObjectRegistry.initialize(p);var o=H.rebuildMenubar();$(".sf-banner").append('<span id="sf-appchooser">Switch to app</span>');$("#sf-no-tables-blurb .sf-new-from-csv").click(function(){H.navigateTo("setup/tables/newTableImport")});var q=window.location.hash;if(q){if(q.startsWith("#")){q=q.substring(1)}H.navigateTo(q)}else{if(L.locationOnFirstLogin&&!a.lastLogin){H.navigateTo(L.locationOnFirstLogin)}else{if(L.initialLocation){H.navigateTo(L.initialLocation)}else{if(o.length>1){var r=o[0].subItems?o[0].subItems[0].location:o[0].location;H.navigateTo(r)}}}}var m=new sf.uix.AppList({dataService:B}).renderTo("sf-appchooser");m.bind("update",X);H.notifyListeners("initialize",H)};this.configParameter=function(m){return L&&L[m]||undefined};this.initialize=function(p,t,m,s,r){Z=t;l=m;S=s;h=r;L=sf.App.Config;N={};T="/app/"+t;E=p;var u=document.getElementById("sf-currency-"+r);if(u){r=u.innerHTML}sf.data.TypeInfo.DEFAULT_CURRENCY_SYMBOL=r;B=new sf.data.RemoteService({baseURL:T,sessionId:p,metadataMap:null});U=new sf.data.RemoteService({baseURL:"/app/app_admin",sessionId:E,metadataMap:{UserApp:new sf.data.Metadata({pluralLabel:"Applications",displayFieldId:"name",keyFieldId:"user_app_id",label:"Application",name:"UserApp",fields:[{fieldId:"user_app_id",fieldType:"string",label:"App id"},{label:"Name",fieldId:"name",fieldType:"string"},{fieldId:"description",fieldType:"text",label:"Description"},{label:"Created date",fieldId:"created",fieldType:"datetime"},{label:"Owner",fieldId:"owner_id",fieldType:"reference",refersToObject:"User"},{refersToObject:"User",label:"Last accessed by",fieldId:"last_accessed_by",fieldType:"reference"},{label:"Last access date",fieldId:"last_accessed",fieldType:"datetime"},{label:"Disk space",fieldId:"disk_space_bytes",fieldType:"integer"}]}),User:new sf.data.Metadata({pluralLabel:"App users",displayFieldId:"personal_name",keyFieldId:"user_id",isFixedStructure:true,label:"App user",name:"User",fields:[{systemGenerated:true,label:"User id",fieldId:"user_id",fieldType:"string"},{label:"Email address",fieldId:"email_address",fieldType:"string",disallowEmpty:true},{label:"Password",fieldId:"password",fieldType:"string",disallowEmpty:true},{label:"Personal name",fieldId:"personal_name",fieldType:"string",disallowEmpty:true},{fieldId:"preferences",fieldType:"text",label:"Preferences"}]})}});B.invoke("/get/session.js",null,function(v){a=v;if(a&&a.userProfile){if(a.userProfile.prefsStr){try{R=sf.doEval(a.userProfile.prefsStr)}catch(w){sf.ui.Util.reportError("Bad prefs string: "+a.userProfile.prefsStr)}W(R)}P();V=true;M(sf.App.metadata)}});var q=null;$(".sf-feedbacklink").click(function(){if(!q){q=new sf.uix.FeedbackForm()}q.showModal()});var o=null;$(".sf-profilelink").click(function(){if(!o){o=new sf.uix.MyAccountForm()}o.showModal()});$(".sf-logoutlink").click(function(){V=false;document.body.innerHTML='<div class="sf-logged-out">You have been logged out.</div>';jQuery.get(c+"?sessionId="+E,function(){window.location.href="/"})});window.onbeforeunload=function(){if(V){var v="If you click OK, you will leave this application.";if(window.event){window.event.returnValue=v}else{return v}}}};this.addMenubarItem=function(o,m){J.addItem(o,m)};var I=function(){for(var p in N){var m=N[p];if(m){m.hide()}}};var A=function(m,o){var p=N[m];if(!p){p=o();N[m]=p;p.renderTo("sf-content-pane")}return p};this.addToPageMap=function(m,o){N[m]=o;return this};var O=function(m){return"page-obj-"+m};this.getPageForObject=function(m){return A(O(m),function(){return H.createPageForObject(m)})};this.showPageForObject=function(o){var m=this.getPageForObject(o);return m.show()};this.showManageTablesPage=function(){var m=A("page-managetables",function(){return new sf.uix.ObjectsView({domElementId:"sf-objects-view"})});return m.show()};this.showPageForSFDC=function(){var m=A("page-sfdc",function(){return new sf.uix.sfdcConnection()});return m.show()};this.createPageForObject=function(m){return new sf.uix.FullObjectView({domElementId:m+"-fov",dataService:B,objectName:m,createChildTabs:true,layout:sf.App.defaultLayout[m]})};this.invokeDataService=function(m,o,p){B.invoke(m,o,p)};this.getDataService=function(){return B};this.getSessionId=function(){return E};this.getSession=function(){return a};this.getUserProfile=function(){return a&&a.userProfile};this.reloadLayouts=function(m){jQuery.get(String.format("/app/{0}/js/sys/layouts.js?sessionId={1}",Z,E),function(o){if(typeof (o)=="string"){sf.doEval(o);if(m){m()}}})};this.invalidatePage=function(p){var m=O(p);var o=N[m];if(o){delete N[m];o.destroyDOM()}this.reloadLayouts()};this.enableWindowCloseWarning=function(m){V=m?true:false};var f=null;this.setProgressBar=function(m){f=m;return this};this.isProgressBarBusy=function(){return f!=null};this.showProgress=function(m){if(f){f.update(m.amountPercent,m.message)}return this};this.accessAppWithId=function(p,m){var o=$(".sf-applist-appinvoker");o[0].action="/app/"+p+(m?("#"+m):"");$("input[name=sessionId]",o).val(E);this.enableWindowCloseWarning(false);o.submit()};this.reloadThisApp=function(m){this.accessAppWithId(Z,m)};this.mainMenuBar=function(){return J};this.addToHistory=function(m){};_historyCallback=function(m){}.createDelegate(this)};sf.extend(sf.uix.Application,sf.core.Observable);sf.App=new sf.uix.Application();sf.uix.AppList=function(B){sf.uix.AppList.superclass.constructor.call(this,B);var I=B.domElementId||sf.allocateId();var H=sf.App.adminDataService();var J=I+"-listpanel";var G=null;var D=null;var E=[];var A=new sf.core.Template('<div id="${id}" class="sf-applist">              <div class="sf-applist-listpanel"></div>            </div>');var F=new sf.core.Template('<ul class="sf-applist-ul" id="${id}-ul">              <% for (var i = 0, n = dataRecords ? dataRecords.length : 0; i < n; i++) { %>                <li class="sf-applist-li">                  <span class="sf-applist-invoke sf-pseudolink" <% if (dataRecords[i].description) { %>title="${dataRecords[i].description}" <% } %> for_app="${dataRecords[i].user_app_id}">${dataRecords[i].name}</span>                </li>              <% } %>            </ul>');var C=function(){sf.App.accessAppWithId(this.getAttribute("for_app"))};var L=function(){$("#"+I+" .sf-applist-listpanel")[0].innerHTML=F.process({id:I,dataRecords:E});$("#"+I+" .sf-applist-invoke").click(C)}.createDelegate(this);this.renderTo=function(M){M=typeof (M)=="string"?$("#"+M):M;M.append(A.process({id:I,dataRecords:E}));D=$("#"+I);G=$("#"+I+"-listpanel");this.update();this.notifyListeners("render",this);return this};this.getRootElement=function(){return D};var K=function(M){if(M&&M.error){sf.ui.Util.reportError("Can't get app list: "+M.error);return }E=M?M.records:[];L();this.notifyListeners("update",this)}.createDelegate(this);this.getAppDescriptors=function(){return E};this.update=function(){var M={neededFields:[{fieldId:"user_app_id"},{fieldId:"name"},{fieldId:"description"},{fieldId:"created"},{fieldId:"owner_id"}],filter:[{fieldId:"inactive",op:"eq",value:"0"},{fieldId:"user_id",op:"eq",value:sf.App.getSession().userId,joinChain:{tableName:"AppAccess",thatSide:"user_app_id"}}],sort:[{fieldIndex:1}]};H.getRecords("UserApp",M,K);return this}};sf.extend(sf.uix.AppList,sf.ui.Widget);sf.uix.AppPropsForm=function(){var C=sf.allocateId();var G=3;var B=sf.ui.TemplateStore.get("edit-app-props").process({id:C,maxSharedUsers:G});var E={name:"Please provide a valid name.",desc:"",currency:""};sf.uix.AppPropsForm.superclass.constructor.call(this,{formHTML:B,fieldsMap:E,cancelButtonSelector:"#"+C+"-cancel"});function D(H){var I=$(this).parents(".ap-appshare-users tbody tr");$(".ap-appshare-username",I).val("").attr("readonly","");$(".ap-appshare-user-email",I).val("").attr("readonly","")}var F=null;sf.override(this,"update",function(I){F=I;arguments.callee.super_.call(this,{name:I.name,desc:I.description,currency:I.currency});$(".ap-appshare-form input[type=text]").removeClass("sf-invalid");var M=$(".ap-appshare-users tbody tr",this.getRootElement());var K=I.sharedWith&&I.sharedWith.length||0;for(var J=0,N=M.length;J<N;J++){var L=J<K?I.sharedWith[J]:{personal_name:"",email_address:""};var H=$(M[J]);$(".ap-appshare-username",H).val(L.personal_name).attr("readonly",J<K?"readonly":"");$(".ap-appshare-user-email",H).val(L.email_address).attr("readonly",J<K?"readonly":"");$(".sf-delete-small",H).css("visibility","visible").click(D)}});var A=function(H){sf.App.reloadThisApp("setup/apps")};sf.override(this,"okToSubmit",function(){var N=arguments.callee.super_.apply(this,arguments);if(N&&F){var S=$(".ap-appshare-users tbody tr",this.getRootElement());var M=[];var P=false;for(var L=0,K=S.length;L<K;L++){var Q=$(S[L]);var H=$(".ap-appshare-username",Q),R=$(".ap-appshare-user-email",Q);if(H.attr("readonly")){continue}var J=H.val().trim(),O=R.val().trim();if(!J&&!O){continue}O=sf.data.TypeInfo.converter("emailAddress")(O);if(!O){R.addClass("sf-invalid").focus();sf.ui.Util.reportError("Please provide a valid email address",R);P=true;break}if(!J){H.addClass("sf-invalid").focus();P=true;sf.ui.Util.reportError("Please provide both name and email address",H);break}M.push({personal_name:J,email_address:O})}if(!P){N.shares=M;var I={user_app_id:F.user_app_id,name:N.name,description:N.desc,currency_format:N.currency,access:M};sf.App.adminDataService().invoke("/ext/setaccess.js",I,A)}else{N=null}}return N})};sf.extend(sf.uix.AppPropsForm,sf.ui.SimpleForm);sf.uix.ColumnChooser=function(B){sf.uix.ColumnChooser.superclass.constructor.call(this,B);var F=B.fields;var G=B.domElementId||sf.allocateId();var C=null;var H=String.format('        <div class="sf-colchooser ap-box-shadow" id="{0}">          <div class="sf-selwrap"></div>          <div class="sf-colchooser-btns">            <button class="sf-colchooser-appl">Apply</button><button class="sf-colchooser-cncl">Cancel</button>          </div>        </div>',G);var D=null;var I=this;var E=function(){I.notifyListeners("cancel")};var A=function(){var J=D.getSelectedItems().map(function(K){return K.value});I.notifyListeners("select",J)};this.updateSelectedFields=function(J){if(D){D.update(F,J)}return this};this.renderTo=function(J){if(!J){sf.core.reportError("SubsetSelector: No container provided.");return }J=J.jquery?J:$(J);C=$(H);J.append(C);D=new sf.ui.SubsetSelector({caption:"Choose columns",textUnderCaption:"Drag fields between the left and right lists below."});D.renderTo($(".sf-selwrap",C));$(".sf-colchooser-cncl",C).bind("click",E);$(".sf-colchooser-appl",C).bind("click",A);return this};this.getRootElement=function(){return C}};sf.extend(sf.uix.ColumnChooser,sf.ui.Widget);sf.uix.Dashboard=function(A){sf.uix.Dashboard.superclass.constructor.call(this);var K=A.dataService;var D=null,O={};var J=sf.App.dashboard;var L=new sf.core.Template('    <% for (var j = 0; j < columns.length; j++) { %>      <div class="ap-dashboard-col-${j} ap-dashboard-col">        <% for (var i = 0; i < columns[j].length; i++) { %>          <div class="ap-dashboard-cell" id="ap-dashboard-cell-${columns[j][i].reportId}">            <div class="ap-dashboard-caption">              <h4>No such report</h4><span class="ap-dashboard-action" title="Show menu" for="${columns[j][i].reportId}"></span>            </div>            <div class="ap-dashboard-report ap-dashboard-report-raw"><div style="padding: 20px; color: red;">Report not found</div></div>            <div class="ap-dashboard-report ap-dashboard-report-rendered"><div style="padding: 20px; color: red;">No visualization is set for this report</div></div>          </div>        <% } %>      </div>    <% } %>    <div class="sf-clearer"></div>',"widgets");var B='  <div class="ap-dashboard-wrap">    <div class="sf-page-caption-bar">      <h2 class="sf-page-caption">Dashboard</h2>      <button title="Edit this dashboard\'s layout" class="sf-toolbar-btn sf-icon-btn sf-btn-edit ap-dashboard-editlayout">Edit</button>    </div>    <div class="ap-dashboard"></div>  </div>';var C=null;function I(Q,P){switch(P){case"raw":$(".ap-dashboard-report-raw",Q).show();$(".ap-dashboard-report-rendered",Q).hide();break;case"rendered":$(".ap-dashboard-report-raw",Q).hide();$(".ap-dashboard-report-rendered",Q).show();break}}function G(P,U){var R=D.getCurrentTrigger();var S=R.getAttribute("for");D.hide();var T=$("#ap-dashboard-cell-"+S);var Q=O[S];switch(U){case"refresh":H([S]);break;case"raw":I(T,"raw");break;case"rendered":I(T,"rendered");break}}function H(Q){var P={neededFields:[{fieldId:"report_id"},{fieldId:"name"},{fieldId:"description"},{fieldId:"report_descriptor"},{fieldId:"created"},{fieldId:"entity_name"}],filter:[{fieldId:"report_id",op:"in",value:Q}]};K.getRecords("builtin.report",P,function(X){for(var Y=0;Y<X.records.length;Y++){var V=X.records[Y];var W=V.report_id;var a=sf.doEval(V.report_descriptor);var Z=$("#ap-dashboard-cell-"+W);O[W]={descriptor:a,entityName:V.entity_name};var R="raw";if(a.defaultRendering&&a.defaultRendering.type!="rawdata"){R="rendered"}var S=$(".ap-dashboard-report-"+R,Z);var U=sf.uix.runReport(a,V.entity_name,K,a.defaultRendering,S);if(R!="raw"){S=$(".ap-dashboard-report-raw",Z);sf.uix.runReport(a,V.entity_name,K,null,S,U)}var T=$(".ap-dashboard-caption h4",Z);T[0].innerHTML=V.name;T.attr("title",V.entity_name+" report"+(V.description?(": "+V.description):""));I(Z,R)}if(!D){D=new sf.ui.PopupMenu({boxWidthPx:110,items:[{id:"refresh",label:"Refresh",tooltip:"Rerun this report"},{id:"raw",label:"Show raw data",tooltip:"Show the raw data for this report, in tabular form"},{id:"rendered",label:"Show visualized",tooltip:"Show the report in visualized form"}]})}D.setTrigger(null);D.setTrigger($(".ap-dashboard-action",C));D.unbind("select",G).bind("select",G)})}var F=null;function E(){var P={neededFields:[{fieldId:"report_id"},{fieldId:"name"},{fieldId:"entity_name"}]};K.getRecords("builtin.report",P,function(R){if(!F){F=new sf.uix.DashboardLayoutEditor().renderTo(document.body);F.bind("saveLayout",N)}sf.ui.Util.showModal(F);var Q=R.records;function U(X){var W=Q.indexOfKey("report_id",X.reportId);if(W>=0){var V=Q.splice(W,1);return{report_id:V[0].report_id,name:V[0].name,entity_name:V[0].entity_name}}return null}var S=J.columns[0].map(U);var T=J.columns[1].map(U);F.update(Q,S,T)})}function N(Q,P){sf.App.dashboard={columns:P.columns};J=sf.App.dashboard;K.invoke("/put/dashboard.js",sf.App.dashboard,function(){});M()}function M(){function Q(R){return R.reportId}$(".ap-dashboard",C)[0].innerHTML=L.process(J);var P=J.columns[0].map(Q).concat(J.columns[1].map(Q));H(P)}this.renderTo=function(P){P=P&&P.jquery?P:jQuery("#"+P);C=$(B);P.append(C);M();$(".ap-dashboard-editlayout",C).click(E);return this};this.getRootElement=function(){return C}};sf.extend(sf.uix.Dashboard,sf.ui.Widget);sf.uix.DashboardLayoutEditor=function(){sf.uix.DashboardLayoutEditor.superclass.constructor.call(this);var A;var F=[];var B='  <div class="ap-dble ap-box-shadow">    <div class="ap-modal-captionbar"><h2>Edit dashboard layout</h2></div>    <div class="ap-modal-content">      <p>Drag and drop the reports between the availables list and the dashboard below.</p>      <div class="ap-dble-captions">        <h3 class="ap-dble-caption-available">Available reports</h3>        <h3 class="ap-dble-caption-layout">Dashboard layout</h3>      </div>      <div class="ap-dble-availables ap-dble-dropable" list_no="0">        <table>          <thead><tr><th class="ap-dble-availables-col1">Report name</th><th class="ap-dble-availables-col2">Table</th></tr></thead>          <tbody></tbody>        </table>      </div>      <div class="ap-dble-layout">        <div class="ap-dble-col ap-dble-sel-0 ap-dble-dropable" list_no="1">          <h4>Left column</h4>          <div class="ap-dble-col-content"></div>        </div>        <div class="ap-dble-col ap-dble-sel-1 ap-dble-dropable" list_no="2">          <h4>Right column</h4>          <div class="ap-dble-col-content"></div>        </div>      </div>      <div class="sf-clearer"></div>      <div class="sf-form-buttons" align="center">        <input type="submit" class="sf-form-button sf-form-button-save" value="Save" /><input type="button" class="sf-form-button sf-form-button-cancel" value="Cancel"/>      </div>    </div>  </div>';function D(O,P){O=O.jquery?O:$(O);P=P.jquery?P:$(P);var K=parseInt(O.attr("index"));var J=parseInt(O.attr("list_no"));var N=parseInt(P.attr("index"));var M=parseInt(P.attr("list_no"));if(J!=M){var L=F[J].splice(K,1)[0];if(!isNaN(N)){F[M].splice(N,0,L)}else{F[M].push(L)}}else{if(!isNaN(N)&&K!=N){F[J]=F[J].moveItem(K,N)}else{if(K<F[J].length-1){var L=F[J].splice(K,1)[0];F[J].push(L)}}}H()}var C=new sf.core.Template('      <% for (var i = 0; i < items.length; i++) { %>        <tr valign="top"><td class="ap-dble-dragable" index="${i}" list_no="${list_no}">${items[i].name}</td><td>${items[i].entity_name}</td></tr>      <% } %>    ');var I=new sf.core.Template('      <% for (var i = 0; i < items.length; i++) { %>        <div class="ap-dble-dragable" index="${i}" list_no="${list_no}">${items[i].name}</div>      <% } %>    ');var E=null;function H(){$(".ap-dble-availables tbody",E)[0].innerHTML=C.process({items:F[0],list_no:0});$(".ap-dble-sel-0 .ap-dble-col-content",E)[0].innerHTML=I.process({items:F[1],list_no:1});$(".ap-dble-sel-1 .ap-dble-col-content",E)[0].innerHTML=I.process({items:F[2],list_no:2});if(!A){A=new sf.ui.DragDropProxy(".ap-dble-dragable",".ap-dble-dragable,.ap-dble-dropable",D)}else{A.reEnable()}}var G=this;this.renderTo=function(J){J=J.jquery?J:$(J);E=$(B);J.append(E);$(".sf-form-button-cancel",E).click(function(){sf.ui.Util.hideModal()});function K(L){return{reportId:L.report_id}}$(".sf-form-button-save",E).click(function(){sf.ui.Util.hideModal();var L={columns:[F[1].map(K),F[2].map(K)]};G.notifyListeners("saveLayout",L,this)});return this};this.getRootElement=function(){return E};this.update=function(J,K,L){F[0]=J;F[1]=K;F[2]=L;H()}};sf.extend(sf.uix.DashboardLayoutEditor,sf.ui.Widget);sf.uix.FullObjectView=function(x){sf.uix.FullObjectView.superclass.constructor.call(this,x);var W=x&&x.domElementId||sf.allocateId();var AQ=x.dataService;var AU=x.objectName;var AD=x.layout;var AM=x.caption||AD.caption;var y=x.createChildTabs;var O=x.defaultFilter?[].concat(x.defaultFilter):null;var p=x.initialMetadata||AQ.getMetadata(AU);if(!p){sf.core.reportError("ui.fullObjectView: No metadata for "+AU);return }var w=[];var d=sf.uix.FullObjectView.computeDetailLayout(AD,p);var Y=d.layout;w=d.fieldIds;var B=120;var X=8;var m=400;var AI="-";var q="=";var AT="+";var C=null;var AX=sf.ui.TemplateStore.get("full-object-view.html");var a=null,A=null,P=null,AV=null;var AJ=null,AP=null,M=null;var AC=null,AR=null;var AL=W+"-import-existing";var AF=null;var s=null;var AH=this;var E=function(Ae){var Ac={};for(var Ab in Ae){if(Object.hasOwnProperty.call(Ae,Ab)){var z=Ae[Ab];var Ad=p.getFieldWithId(Ab);var i=Ad&&Ad.fieldType||"string";Ac[Ab]=sf.data.TypeInfo.storableForm(i,z)}}return Ac};var U=function(z){var i=a&&a.getDataRecord(z);return i?i[p.keyFieldId]:null};var N=function(Ab,Ad){if(Ab.allowSaving(Ad)){var z=E(Ad);var Ae=a.getSelectedRowIndex();var Ac=z[p.keyFieldId];var i=$(".sf-fov-statusreport",C).show();i[0].innerHTML="Saving...";AQ.storeRecords(AU,[z],function(){a.update(function(Ag){var Af=Ag?Ag.indexOfKey(p.keyFieldId,Ac):-1;if(Af>=0){a.setSelectedRowIndex(Af);l(Af,Ab)}});setTimeout(function(){i.slideUp("slow")},300)})}};var Q=null;var l=function(Ag,Ac){if(Q){return }Q=setTimeout(function(){Q=null},m);var Ab=[{fieldId:p.keyFieldId,op:"eq",value:U(Ag)}];if(O&&O.length){Ab=Ab.concat(O)}var z=A.shownFieldIds().map(function(i){return i?{fieldId:i}:null});if(w.indexOf(p.keyFieldId)<0){z.push({fieldId:p.keyFieldId})}var Af=K&&K.shownReferenceFieldIds()||[];for(var Ad=0,Ae=Af.length;Ad<Ae;Ad++){if(w.indexOf(Af[Ad])<0){z.push({fieldId:Af[Ad]})}}AQ.getRecords(AU,{neededFields:z,filter:Ab},function(Ah){var i=Ah.records[0];A.update(i);if(K){K.update()}Ac.notifyListeners("renderRecordView",i,A,Ac)})};var K=null;var D=function(z,Ab){if(!A){A=new sf.ui.RecordView({metadata:p,layout:Y,editable:!p.disallowEdit,caption:String.format("{0} details",p.label)}).renderTo(AR);AR.css("display","block");var i=this;A.bind("doSave",function(Ac,Af){var Ae=A.shownRecord();var Ad=Ae&&Ae[p.keyFieldId];if(Ad){Af[p.keyFieldId]=Ad;N(i,Af)}});this.notifyListeners("initializeRecordView",A,this);if(y&&!K){K=new sf.uix.FovChildTabGroup(this,AQ,p,W+"-c")}}AW(true);l(Ab,this)}.createDelegate(this);this.createAddForm=function(){var i=new sf.ui.Form({fieldsMap:p.getFieldIdMap(),formClassName:"sf-fov-addform",layout:Y,caption:x.formCaption||String.format("Add {0}",p.label)});i.handleSubmit=function(z){AQ.storeRecords(AU,[E(z)],function(){a.update();i.notifyListeners("saveComplete",z,i,AH)});setTimeout(function(){this.hide()}.createDelegate(this),100);return false}.createDelegate(i);i.handleCancel=function(){i.hide();return false};i.renderTo($(document.body));return i};var AO=function(){if(!P){P=this.createAddForm();this.notifyListeners("initializeForm",P,this)}P.reset().showModal();this.notifyListeners("renderForm",P,this)}.createDelegate(this);var J=function(i,z){if(sf.App.configParameter("isDemoVersion")){sf.ui.Util.reportError("Cannot save layouts in the demo version.");return }AQ.invoke("/put/data/builtin.layout.js",{objectName:AU,layout:z},function(Ab){if(Ab&&Ab.error){sf.ui.Util.reportError(Ab.error)}else{sf.App.reloadThisApp("table/"+AU+"/listanddetail")}})};var Aa=function(z,Ac){var i=z.reportId||sf.util.makeUID(AU+"_"+z.name.substring(0,15));var Ab={report_id:i,name:z.name,description:z.description,entity_name:AU,report_descriptor:sf.util.toJSONString(z)};AQ.storeRecords("builtin.report",[Ab],function(Ad){if(Ad&&Ad[0]&&Ad[0].report_id){z.reportId=Ad[0].report_id}if(Ac){Ac(Ad)}})};var F=function(i,Ac,Ab,z){Aa(Ac,function(){if(z){AK(Ac)}else{AY("reports")}})};var V=function(Ae,Af,Ad){var i=[],z=Ad.getListModel().getColumns();for(rowNo in Af){if(!Object.hasOwnProperty.call(Af,rowNo)){continue}var Ah=Af[rowNo];var Aj=Ad.getDataRecord(parseInt(rowNo));var Ab={};for(var Ai in Ah){var Ac=parseInt(Ai);if(Ac in z){var Ag=Ah[Ai];if(Ag!=null&&typeof (Ag)!="string"){Ag=Ag instanceof Date?Ag.format("yyyy-MM-dd HH:mm:ss"):Ag.toString()}Ab[z[Ac].columnId]=Ag}}Ab[p.keyFieldId]=Aj[p.keyFieldId];i.push(Ab)}AQ.storeRecords(AU,i,function(){H.widelist.update()})};this.saveReportDescriptor=function(z,i){Aa(z,i);return this};var H={listanddetail:null,filterlist:null,reports:null,widelist:null,calendar:null,calendarweek:null,editlayout:null,reporteditor:null,reportrunner:null};var v=function(){AY("editlayout");H.editlayout.doEdit(AD)};var f=function(z,i){sf.ui.Util.hideModal();H.widelist.destroyDOM();H.widelist=L(i)};var AZ=null;var S=function(i){if(!AZ){AZ=new sf.uix.ColumnChooser({fields:p.fields.map(function(Ab){return{value:Ab.fieldId,label:Ab.label}})}).renderTo($(document.body));AZ.bind("select",f);AZ.bind("cancel",sf.ui.Util.hideModal)}var z=H.widelist.getListModel().getColumns().map(function(Ab){return{value:Ab.fieldId,label:Ab.label}});AZ.updateSelectedFields(z);sf.ui.Util.showModal(AZ)};var AG=function(){var Ae=[];if(p.keyFieldId!=p.displayFieldId){Ae.push(p.displayFieldId)}for(var Ab=0,Ad=p.fields.size();Ab<Ad&&Ae.length<X;Ab++){var Ac=p.fields.get(Ab);var z=Ac.fieldId;if(z!=p.keyFieldId&&z!=p.displayFieldId&&Ac.fieldType!="text"&&z!="created"&&z!="created_by"&&z!="modified"&&z!="modified_by"){Ae.push(z)}}return Ae};var L=function(Ag){var z=[];for(var Ac=0,Af=Ag.length;Ac<Af;Ac++){var Ad=p.getFieldWithId(Ag[Ac]);z.push(sf.data.TypeInfo.defaultColWidthPx(Ad.fieldType))}var Ab={listModel:new sf.data.SimpleListModel(p,Ag,AQ),defaultFilter:O,recordsPerPage:sf.uix.FullObjectView.ITEMS_PER_PAGE,columnWidthsPx:z,tableClassName:"sf-fov-widelist",tools:[{label:"Set columns",tooltip:"Choose the fields to show as columns in this list",action:S}],domElementId:W+"-widelist"};var Ae=p.disallowEdit?new sf.ui.Table(Ab):new sf.ui.EditableTable(Ab);Ae.captionString=function(){return AM};Ae.toolbar=function(){return null};Ae.renderTo(AC).show().bind("save",V).update();return Ae};var T=function(Ag){var Ah=null;switch(Ag){case"filterlist":Ah=new sf.ui.FilterList({domElementId:W+"-filterlist",dataService:AQ,metadata:p});Ah.renderTo(AC).update(AE);Ah.bind("change",function(Aj,i){AE(i)});break;case"editlayout":Ah=new sf.ui.SimpleLayoutEditor({metadata:p,detailLayout:Y}).renderTo(AC).bind("cancel",function(){AY("listanddetail")}).bind("save",J);break;case"reports":Ah=new sf.uix.ReportList({domElementId:W+"-reports",objectName:AU,dataService:AQ,fov:this}).renderTo(AC);break;case"calendar":case"calendarweek":var Af=[p.displayFieldId];for(var Ae=0,Ab=p.fields.size();Ae<Ab;Ae++){var Ac=p.fields.get(Ae);var Ai=Ac.fieldType;if(Ai=="date"||Ai=="datetime"||Ai=="picklist"||Ai=="duration"||Ai=="number"||Ai=="currency"){Af.push(Ac.fieldId)}}var z=new sf.data.SimpleListModel(p,Af,AQ);var Ad={domElementId:W+"-"+Ag,listModel:z,labelColumnId:p.displayFieldId,showFieldChooser:true};Ah=Ag=="calendar"?new sf.ui.MonthView(Ad):new sf.ui.WeekView(Ad);Ah.renderTo(AC).show();break;case"widelist":Ah=L(AG());break;case"listanddetail":if(a==null){c()}Ah=a;a.show();break;case"reporteditor":Ah=new sf.uix.ReportEditor({objectName:AU,domElementId:W+"-editrpt",fov:AH}).renderTo(AC);Ah.bind("submit",F).bind("cancel",function(){AY("reports")});break;case"reportrunner":Ah=new sf.uix.ReportRunner(this,AU,AQ,W+"-runrpt").renderTo(AC);break}H[Ag]=Ah;return Ah}.createDelegate(this);this.editReport=function(Ab,z){var i=AY("reporteditor");if(z){Ab.name="Clone of "+Ab.name}i.editReport(Ab);$(".sf-page-caption",C).html(z?"Clone report":i.captionString());return this};var AK=function(i){var z=AY("reportrunner");z.runReport(i);$(".sf-page-caption",C).html(z.captionString())};this.runReport=function(i){AK(i);return this};var AY=function(i){for(var z in H){var Ab=H[z];if(i==z){if(!Ab){Ab=T(i);H[i]=Ab}else{Ab.show()}$(".sf-page-caption",C).html(Ab.captionString());var Ad=Ab.toolbar();if(Ad){if(!Ad.getRootElement()){Ad.renderTo($(".sf-fov-tools-box",C))}Ad.show()}}else{if(Ab){Ab.hide();var Ad=Ab.toolbar();if(Ad){Ad.hide()}}}}$(".sf-fov-contentarea > *",C).each(function(){$(this).css("display",this.id.endsWith("-"+i)?"block":"none")});var Ac=i=="listanddetail"||i=="calendar"||i=="widelist";$("#"+W+" .sf-fov-datatools").css("visibility",Ac?"visible":"hidden");$("#"+W+" .sf-fov-searchtools").css("display",Ac?"block":"none");if(!!p.disallowAdd){$("#"+W+" .sf-fov-add").css("display",i=="listanddetail"?"block":"none")}if(!!p.disallowDelete){$("#"+W+" .sf-fov-del").css("display",i=="listanddetail"?"block":"none")}s=i;return H[i]};this.showReportsList=function(){AY("reports").showListPanel();return this};this.showRecordList=function(){AY("listanddetail");return this};this.showCalendarPanel=function(){AY("calendar");return this};this.showWideList=function(){AY("widelist");return this};this.showPageComponent=function(i){AY(i);return this};var AE=function(Ae){if(!Ae){Ae=H.filterlist.getFilterRecords()}var Ac=Ae.map(function(Af){return{value:Af.filter_id,text:Af.name}});if(Ac.length>0){Ac[0].className="sf-fov-firstfilter"}var z=[{value:q,text:"(None)"},{value:AT,text:"(Unnamed filter)"},{value:AI,text:"New filter..."}].concat(Ac);var Ab=$(".sf-fov-filterselect",C);var Ad=Ab.val();sf.ui.Util.fillSelector(Ab[0],z);var i=Ad&&Ad.length>1&&Ae.indexOfKey("filter_id",Ad)>=0?Ad:q;Ab.val(i)};var r=function(){var z=a.getSelectedRowIndex();if(z<0){sf.ui.Util.reportError("Please select a record in the list at left.");return }var i=U(z);if(!sf.ui.Util.askForConfirmation("Delete the selected record?")){return }if(sf.App.configParameter("isDemoVersion")){sf.ui.Util.reportError("Cannot delete records in the demo version.");return }AQ.deleteRecords(p.name,[{fieldId:p.keyFieldId,op:"eq",value:i}],function(){AW(false);a.update()})};var Z=function(){if(!sf.ui.Util.askForConfirmation("WARNING: All records in all the pages will be deleted and cannot be recovered.\nDependent records will NOT be deleted.\nProceed?")){return }if(sf.App.configParameter("isDemoVersion")){sf.ui.Util.reportError("Cannot delete records in the demo version.");return }var z=a&&a.currentFilter();var i=[{fieldId:p.keyFieldId,op:"ge",value:"0"}];AQ.deleteRecords(p.name,z||i,function(){AW(false);a.update()})};var AA=[];for(var o=0;o<(x.listTools&&x.listTools.length||0);o++){var AS=x.listTools[o];if(o<AA.length){var R=AA[o];for(var t in AS){if(Object.hasOwnProperty.call(AS,t)){R[t]=AS[t]}}}else{AA.push(AS)}}var b=function(i,z){if(i&&i.length){z.setSelectedRowIndex(0);D("junk",0)}};var c=function(){a=new sf.ui.Table({listModel:new sf.data.SimpleListModel(p,AD.listFieldIds,AQ),defaultFilter:O,enableRowHoverHighlight:true,enableRowSelection:true,recordsPerPage:sf.uix.FullObjectView.ITEMS_PER_PAGE,domElementId:W+"-list",tools:AA}).renderTo($(".sf-fov-list",C));setTimeout(function(){a.update(b)},100);a.getKeyForRecord=function(i){var z=this.getDataRecord(i);return z?z[p.keyFieldId]:null};a.captionString=function(){return p.pluralLabel};a.toolbar=function(){return null};a.bind("selectRow",D)};this.renderTo=function(z){z=typeof (z)=="string"?$("#"+z):z;z.append(AX.process({id:W,caption:AM,label:p.label,textUnderCaption:AD.textUnderCaption}));var i="#"+W;C=$(i);AC=$(i+" .sf-fov-contentarea");AR=$("#"+W+"-fov-detailpanel");AF=$(i+" .sf-fov-captionbar");c();H.listanddetail=a;T("filterlist");this.setupUI();this.notifyListeners("render",this);return this};this.detailArea=function(){return AR};var G=function(){$(".sf-fov-contentarea > *",C).hide()};var u=function(){var z=$("#"+AL);if(z.length<=0){G();AC.append(sf.ui.TemplateStore.get("import-from-csv.html").process({id:AL}));function i(){sf.App.importer.reset();AY("listanddetail");a.update()}sf.App.importer=new sf.uix.ExistingTableImporter({dataService:AQ,typeName:AU,domElementId:AL});sf.App.importer.bind("importFinished",i).bind("importCanceled",i)}AY("import-existing");$(".sf-page-caption",C).html("Import data")}.createDelegate(this);var AB=function(){if(!M){var z=p.fields.map(function(Ab){return{label:Ab.label,fieldId:Ab.fieldId}});var i=new sf.uix.ExporterPanel({fields:z,domElementId:W+"-exporter"}).renderTo(document.body).hide();M=new sf.ui.ModalDialog();i.bind("cancel",function(){M.hide()}).bind("export",AN)}M.show($("#"+W+"-exporter"))};var AN=function(z,i){setTimeout(function(){M.hide()},300);var Ab=i.map(function(Ac){return{fieldId:Ac,columnLabel:p.getFieldWithId(Ac).label}});return AQ.getUrlContent("/get/data/"+AU+".csv",{neededFields:Ab,filter:a&&a.currentFilter()})};var I=null;var e=function(i,Ab,z){I.hide();switch(Ab){case"filters":AY("filterlist");break;case"import":u();break;case"export":AB();break;case"editLayout":v();break;default:z.action();break}};var h=function(){H.filterlist.update(AE);switch(s){case"calendar":H.calendar.update();break;case"widelist":H.widelist.update();break;default:AY("listanddetail");case"listanddetail":a.update();AW(false);break}};this.showAddForm=function(){AO();return P};var AW=function(i){$("#"+W+"-fov-rightside").css("visibility",i?"visible":"hidden")};this.setupUI=function(){var z={objectName:p.label,allowAdd:!p.disallowAdd,allowDelete:!p.disallowDelete};$(".sf-fov-toolbar",C).append(sf.ui.TemplateStore.get("fov-toolbar.html").process(z));$(".sf-fov-refresh",C).click(h);if(!!p.disallowAdd){$(".sf-fov-add",C).hide()}else{$(".sf-fov-add",C).click(AO)}if(!!p.disallowDelete){$(".sf-fov-del",C).hide()}else{$(".sf-fov-del",C).click(r)}I=new sf.ui.PopupMenu({boxWidthPx:90,items:[{id:"filters",label:"Filters",tooltip:"Manage filters"},{id:"import",label:"Import",tooltip:"Import comma- or tab-separated data"},{id:"export",label:"Export",tooltip:"Export data in comma-separated format"},{id:"editLayout",label:"Edit layout",tooltip:"Edit the layout of this screen"},{id:"bulkDelete",label:"Delete all...",tooltip:"Delete all the records selected by the current filter",action:Z}]}).setTrigger($(".sf-fov-tools-menu-trigger",C)).bind("select",e);var i=p.fields.map(function(Ad){var Ac=Ad.fieldType;return !Ad.systemGenerated&&(Ac=="string"||Ac=="phone"||Ac=="emailAddress"||Ac=="url")?Ad.fieldId:null});var Ab=$(".sf-fov-filterselect",C);AV=new sf.ui.FinderWidget({metadata:p,extendedSearchPanel:$(".sf-fov-contentarea .sf-find-extended-fieldsbox",C),searchFieldIds:i}).renderTo($(".sf-fov-finder",C)).bind("doFind",function(Ac,Ad){Ab.val(!Ad||!Ad.length?q:AT);if(a.isShown()){AW(false);a.update(null,Ad)}else{if(H.calendar&&H.calendar.isShown()){H.calendar.filterBy(Ad)}else{if(H.widelist&&H.widelist.isShown()){H.widelist.update(null,Ad)}}}}).bind("filterSaved",function(Ac,Af){var Ae=H.filterlist;var Ad=Ae.appendFilterLocal(Af).getFilterRecords();AE(Ad);Ab.val(Af.filter_id)});Ab.change(function(){var Ad=this.options[this.selectedIndex];var Ac=Ad.value;if(Ac==AI){AV.showExtSearchBox();return }var Ae=(Ac.length>1)?H.filterlist.getFilterRecordByKey(Ac).condition:[];if(a.isShown()){AW(false);a.update(null,Ae)}else{if(H.calendar&&H.calendar.isShown()){H.calendar.filterBy(Ae)}else{if(H.widelist&&H.widelist.isShown()){H.widelist.update(null,Ae)}}}})};this.getRootElement=function(){return C};var g=null;this.addChildPanel=function(i){if(g==null){g=$(".sf-fov-childpanel",C)}i.renderTo(g);return i};this.getForm=function(){if(!P){P=this.createAddForm();this.notifyListeners("initializeForm",P,this)}return P};this.getList=function(){return a};this.getRecordView=function(){return A};this.allowSaving=function(i){return true}};sf.extend(sf.uix.FullObjectView,sf.ui.Widget);sf.uix.FullObjectView.computeDetailLayout=function(F,D){var C=function(G){return G&&D.getFieldWithId(G)!=null};var E=[];if(F.detailLayout){for(var B=F.detailLayout.panels.length-1;B>=0;B--){E=E.concat(F.detailLayout.panels[B].fieldIds)}E=E.filter(C)}else{if(F.detailFieldIds){E=F.detailFieldIds.filter(C)}else{E=D.fields.map(function(G){return G.fieldId})}}var A={fieldIds:E,layout:F.detailLayout||{panels:[{fieldIds:E}]}};return A};sf.uix.FullObjectView.ITEMS_PER_PAGE=20;sf.uix.HomePage=function(B){var F="ap-home-content";var C=sf.ui.TemplateStore.get("home-tab").process({domElementId:F,userProfile:B});sf.uix.HomePage.superclass.constructor.call(this,C);var E=null;var H=function(){sf.App.accessAppWithId(this.getAttribute("for_app"))};var A=new sf.core.Template('        <div style="vertical-align: bottom; margin: 5px 0;">          <h3 style="display: inline;">My apps</h3>          <span>(Own: ${ownCount}, shared: ${sharedCount}, Total: ${ownCount+sharedCount})</span>          <span class="ap-home-totaldiskuse">Total disk usage: ${formatDiskSpace (totalSpace)}</span>        </div>        <table cellspacing="0" summary="">          <thead><tr><th>Application</th><th>Created</th><th>Owner</th><th>Last accessed</th><th>Disk space</th><tr></thead>          <%            var session = sf.App.getSession();            for (var i = 0, n = apps && apps.length || 0; i < n; i++) { var app = apps[i]; var rowClass = i % 2 == 0 ? "sf-evenrow" : "sf-oddrow"; %>            <tbody class="ap-home-app ${rowClass}<% if (app.owner_id && app.owner_id[0] == session.userId) {%> ap-app-editable<% } %>">              <tr>                <td class="ap-home-appname">                  <span class="ap-applist-invoke sf-pseudolink" for_app="${app.user_app_id}" title="Click to access this app">${app.name}</span>                </td>                <td class="ap-home-appcreated">${sf.data.TypeInfo.toHTML ("datetime", app.created)}</td>                <td class="ap-home-appowner"> ${sf.data.TypeInfo.toHTML ("reference",app.owner_id)}</td>                <td class="ap-home-lastaccess">${sf.data.TypeInfo.toHTML ("datetime",app.last_accessed)}</td>                <td class="ap-home-disk_space_bytes">${formatDiskSpace (app.disk_space_bytes)}</td>              </tr>              <tr><td colspan="5" class="ap-home-appdesc">${app.description}</td></tr>            </tbody>          <% } %>        </table>    ');var D=sf.App.adminDataService();this.bind("render",function(I,J){var K=new sf.uix.MyAccountForm().renderTo($("#ap-home-useracct"));K.setTrigger($("#ap-edit-myacct"));K.getPositionToShow=function(){return{left:0}}});var G=null;D.getRecords("UserApp/myApps",{neededFields:[{fieldId:"disk_space_bytes"}]},function(N){G=N.records,nOwn=0,userId=sf.App.getSession().userId;var J=0;for(var L=0;L<G.length;L++){if(G[L].owner_id[0]==userId){nOwn++;J+=G[L].disk_space_bytes}}var I=this.getRootElement();var K=function(O){return O==null?"":(sf.data.TypeInfo.toString("number",Math.round(O/1000)/1000)+" M")};var M={apps:N.records,ownCount:nOwn,sharedCount:G.length-nOwn,totalSpace:J,formatDiskSpace:K};$(".ap-home-apps-list",I)[0].innerHTML=A.process(M);E=$(".sf-applist-appinvoker",I);$(".ap-applist-invoke",I).click(H)}.createDelegate(this))};sf.extend(sf.uix.HomePage,sf.ui.SimpleWidget);sf.uix.ObjectsView=function(S){var A=sf.data.ObjectRegistry;var J=S&&S.domElementId||sf.allocateId();var E=function(W){var T=this.getList();var Y=T.getSelectedRowIndex();if(Y<0){sf.ui.Util.reportError("Please select a table in the list below.",W);return }var V=T.getKeyForRecord(Y);var U=sf.data.ObjectRegistry.get(V);if(!U){sf.ui.Util.reportError("Cannot find table '"+V+"'");return }if(U.isFixedStructure){sf.ui.Util.reportError("Sorry, this is a built-in table and cannot be destroyed.",W);return }if(!sf.ui.Util.askForConfirmation("WARNING: This table will be destroyed, along with all its data records, filters, reports and layouts. Once destroyed, it cannot be recovered.\nProceed?")){return }var X=this.getRecordView();A.deleteRecords("sys.object_descriptor",[{fieldId:"name",op:"eq",value:V}],function(){sf.App.reloadThisApp("setup/tables")})}.createDelegate(this);var I=J+"-import-new";var L=this;var H=function(T){if(T){sf.App.reloadThisApp("setup/tables")}else{$("#"+I).hide();sf.App.importNew.reset();sf.App.navigateTo("setup/tables");$(".sf-fov-contentarea",L.getRootElement()).show()}};var Q=function(){sf.App.rebuildMenubar();sf.App.navigateTo("setup/tables");L.getList().update()};var P=function(){if(!sf.data.ObjectRegistry.canCreateNewObject()){return }var T=$(".sf-fov-contentarea",L.getRootElement());T.hide();var U=$("#"+I);if(!U.length){U=$(sf.ui.TemplateStore.get("new-from-csv.html").process({id:I}));T.parent().append(U);sf.App.importNew=new sf.uix.NewTableImporter({dataService:sf.App.getDataService(),domElementId:I});sf.App.importNew.bind("importFinished",function(){H(true)}).bind("importCanceled",function(){H(false)})}else{U.show()}U.show()};sf.uix.ObjectsView.superclass.constructor.call(this,{domElementId:J,caption:"Manage tables",formCaption:"Create a new table",dataService:A,objectName:"sys.object_descriptor",defaultFilter:[{fieldId:"name",op:"does not start with",value:"builtin."}],layout:{listFieldIds:["label","pluralLabel","displayFieldId"],searchFieldIds:["label"],detailFieldIds:["label","pluralLabel","description","keyFieldId","displayFieldId","created","modified"],formFieldIds:["label","pluralLabel","description","created","modified"]}});var K=null;var N=function(T,U){K=sf.data.ObjectRegistry.get(U.name)};this.bind("renderRecordView",N);var G=null;var M=null,D=null;var C=function(U,T){A.storeRecords("sys.field_descriptor",[U],function(){G.update();if(M){M.hide()}if(D){D.hide()}sf.ui.Util.informationAlert("Changes will be visible after you log in next.")});return false};var O=function(T){var V=K;if(V.isFixedStructure){sf.ui.Util.reportError("This table cannot be modified.");return }var U=V.label;var W=V.name;if(T){if(!D){D=new sf.ui.MetadataForm({domElementId:"sf-md-editfield"}).renderTo($(document.body)).bind("cancel",function(){D.hide()});D.handleSubmit=C}if(T.fieldType=="picklist"){sf.data.ObjectRegistry.getPicklist(W,T.fieldId,function(X){T.choicesList=X;D.update(T).showModal()})}else{D.showField("choicesList",false).update(T).showModal()}D.setCaption("Edit field of "+U).setTableName(W)}else{if(!M){M=new sf.ui.MetadataForm({domElementId:"sf-md-addfield"}).renderTo($(document.body)).bind("cancel",function(){M.hide()});M.handleSubmit=C}M.showField("choicesList",false).reset().setTableName(W);M.editor("fieldType").setValue("string");M.setCaption("Add field to "+U).showModal()}};var F=function(){var X=K;if(X.isFixedStructure){sf.ui.Util.reportError("This table cannot be modified.");return }var V=G.getSelectedRowIndex();if(V<0){sf.ui.Util.reportError("Please select a field to delete.",$(".sf-list-tools",G.getRootElement()));return }var T=G.getKeyForRecord(V);var U=sf.data.ObjectRegistry.get(X.name).getFieldWithId(T);if(!U){return }if(U.systemGenerated){sf.ui.Util.reportError("Sorry, this is a system field which cannot be deleted.");return }if(U.fieldId==X.displayFieldId){sf.ui.Util.reportError("This field cannot be deleted because it is the table's display field.");return }if(!sf.ui.Util.askForConfirmation("WARNING: This field will be destroyed, along with all its contents in all data records.\nPlease make sure to remove it from:\n  - All layouts\n  - All filters\n  - All reports\nProceed?")){return }var W=[{fieldId:"objectName",op:"eq",value:K.name},{fieldId:"fieldId",op:"eq",value:T}];A.deleteRecords("sys.field_descriptor",W,function(){G.update();sf.App.invalidatePage(K.name)})};this.createAddForm=function(){var T=new sf.uix.NewTableForm().renderTo($(document.body));T.bind("submit",Q);return T};var B=function(){if(!sf.data.ObjectRegistry.canCreateNewObject()){return }L.showAddForm()};this.setupUI=function(){var V=this.getRootElement();$(".sf-fov-searchtools",V).hide();if(!sf.App.configParameter("disallowTableCreation")){new sf.ui.ToolBar({tools:[{label:"New",className:"sf-md-new",action:B,tooltip:"Create a new table"},{label:"From CSV",className:"sf-md-importnew",action:P,tooltip:"Create a new table from comma- or tab-separated data"},{label:"Destroy",className:"sf-md-destroy",action:E,tooltip:"Destroy the selected table"}]}).renderTo($(".sf-fov-tools-box",V));var U=function(){T.hide();P()};var T=new sf.ui.PopupMenu({boxWidthPx:120,items:[{label:"Create from CSV",tooltip:"Create a new table from comma- or tab-separated data"}]}).setTrigger($(".sf-fov-tools-menu-trigger",this.getRootElement())).bind("select",U)}var W=null;if(!sf.App.configParameter("disallowTableFieldCreation")){W=[{label:"Add",className:"sf-btn-add",tooltip:"Add a new field",action:function(){O(null)}},{label:"Delete",className:"sf-btn-del",tooltip:"Delete the selected field",action:F}]}G=new sf.ui.Table({listModel:new sf.data.SimpleListModel(sf.data.fieldMetadata,["label","shortLabel","fieldType","disallowEmpty","systemGenerated"],A),domElementId:"sf-mdv-fieldslist",caption:"Fields",recordsPerPage:50,enableRowSelection:true,columnWidthsPx:[250,160,100,60,60],tools:W});G.formatCellContent=function(b,Y,X,Z){var a=sf.data.fieldMetadata.getFieldWithId(Z.columnId).toHTML(b[Z.columnId]);switch(Y){case 0:a=String.format('<span title="Click to edit" class="sf-pseudolink sf-md-field">{0}</span>',a);break;case 2:a=sf.data.TypeInfo.label(a);break}return a};G.getKeyForRecord=function(X){var Y=this.getDataRecord(X);return Y?Y.fieldId:null};G.bind("redraw",R);this.addChildPanel(G);G.hide()};var R=function(){$("#sf-mdv-fieldslist .sf-md-field").click(function(){var T=G.getCell(this.parentNode);var U=G.getKeyForRecord(T.row);O(K.getFieldWithId(U))})};this.bind("renderRecordView",function(U,W,T,V){G.show().update(null,[{fieldId:"objectName",op:"eq",value:W.name}]);T.bind("hide",function(){G.hide()})});this.showNewTableImporter=function(){P();return this};this.showComponent=function(T){switch(T){case"newTableImport":P();break}return this}};sf.extend(sf.uix.ObjectsView,sf.uix.FullObjectView);sf.uix.NewTableImporter=function(g){sf.uix.NewTableImporter.superclass.constructor.call(this,g);var O=100;var G=g.dataService;var R=g&&g.domElementId;if(!R){sf.core.reportError("NewImporter: No root element id given.");return }var b=$("#"+R);var e=false;var h=new sf.core.Template('<select class="sf-import-fldtyp-${index}">          <% for (var i = 0; i < types.length; i++) { %>          <option value="${types[i].value}"<% if (types[i].value == inferredType) { %>selected<% } %>>${types[i].text}</option>          <% } %>          <% if (refObjs && refObjs.length) { %>            <optgroup label="Reference to">              <% for (var i = 0; i < refObjs.length; i++) { %>                <option value="ref:${refObjs[i].name}"> &raquo; ${refObjs[i].label}</option>              <% } %>            </optgroup>          <% } %>        </select>',"selectTemplate");var T=new sf.core.Template('<table cellspacing="0" class="sf-import-step2">          <thead>            <tr><th nowrap>Import this field:</th><% for (var i = 0; i < header.length; i++) { %>              <th><input type="checkbox" checked class="sf-import-field" value="${i}" title="Check this box to include this field\'s data in the import."/></th>            <% } %></tr>            <tr><th align="right">Field label:</th>            <% for (var i = 0; i < header.length; i++) { %>              <th><input type="text" id="${id}-colname-${i}" size="15" value="${header[i]}" for_column="${i}" /></th>            <% } %>            </tr>            <tr><th align="right">Type:</th><% for (var i = 0; i < header.length; i++) { %><th>${typeSelect[i]}</th><% } %></tr>          </thead>          <tbody>            <% for (var i = 0; i < data.length; i++) { %>              <tr>                <td>${i+1}</td><% for (var j = 0; j < header.length; j++) { %>                <td id="${id}-cell_${i}_${j}">${typeof(data[i][j]) != "undefined" ? sf.util.truncatedForm(data[i][j],32) : ""}</td>                <% } %>              </tr>            <% } %>          </tbody>        </table>',"step2Template");var E=new sf.core.Template('New table name: ${tableName}<br/>        Total records: ${recordCount}, rejects: ${rejectCount}<br/>        Fields:        <table cellspacing="0" class="sf-import-new-step3-table">          <tr><th width="40">Col #</th><th>Label</th><th>Type</th></tr>          <% for (var i = 0; i < fields.length; i++) { %>            <tr><td>${fields[i].colNo}</td><td>${fields[i].label}</td><td>${fields[i].fieldTypeLabel}</td></tr>          <% } %>        </table>        <div class="sf-import-step3-errors-wrap">Rejected records:<br/><textarea class="sf-import-step3-errors"></textarea></div>        ',"step3Template");var Y=null;var F=null;var K=null;var V=null;var d=null;var H=new sf.ui.ProgressBar().renderTo($(".sf-import-step2-progress",b));var P=function(){this.notifyListeners("importCanceled")}.createDelegate(this);$(".sf-import-cancel",b).click(P);var N=new sf.util.ImportValidator(G);var X=[];var J={},f=0;var U=new sf.core.Template('      <ul><% for (var i = 0; i < cells.length; i++) { var c = cells[i]; %>      <li row="${c.row}" col="${c.col}" class="sf-pseudolink">Row ${parseInt(c.row)+1}, column ${parseInt(c.col)+1}</li><% } %></ul>    ');var B=$(".sf-import-step2-errors-wrap",b);if(jQuery.browser.mozilla){$(".sf-import-datasourcespec",b)[0].style.display="block"}var I=null;$("input[name=sf-import-datasrc]",b).click(function(){I=this.value;var l=[".sf-import-datasrc-pastedata",".sf-import-datasrc-file"];for(var m=0;m<l.length;m++){var o=$(l[m],b);o[0].style.display=l[m].endsWith(this.value)?(o.is("div")?"block":"inline"):"none"}});this.showStep=function(l){$(".sf-import-ribbon-ul li",b).removeClass("sf-import-ribbon-li-selected");var i=$("#"+R+" ."+l);i.addClass("sf-import-ribbon-li-selected");$(".sf-import-step",b).hide();$("."+i.attr("forStep"),b).show();switch(l){case"sf-import-2":J={};f=0;H.reset().show();B.hide();break}};this.doStep1=function(){var m=$(".sf-import-new-tablename",b);m.removeClass("sf-invalid");F=m.val().trim();if(!F||F.length<=0){m.addClass("sf-invalid");S("Please provide a name for your table.");return }Y=sf.util.makeIdentifier(F);if(sf.data.ObjectRegistry.get(Y)){m.addClass("sf-invalid");S("There is already a table with this name. Please choose a different name.");return }var o=document.getElementById(R+"-import-datafile");if(I=="file"&&!o.files[0]){S("Please provide a valid CSV data file.");return }var i=I=="file"?o.files[0].getAsBinary():$(".sf-import-wizard-step1 textarea",b).val().trim();if(!i||i.length<=0){S(I=="file"?"Please provide a valid CSV data file.":"Please provide the CSV data in the box below.");return }V={separator:($(".sf-import-fldsep-group input[type=radio][checked]",b).val()=="tab"?"\t":","),dateFormat:$(".sf-import-datefmt-group input[type=radio][checked]",b).val(),firstLineIsData:false};K=sf.data.parseCSV(i,V);var p=K.inferredTypes.map(function(q,r){return sf.uix.NewTableForm.getFieldTypeSelectorHTML("sf-import-fldtyp-"+r,null,q.fieldType,true,true)});var l=T.process({header:K.header||[],data:K.data,typeSelect:p,id:R});$(".sf-import-wizard-step2-tablewrap",b)[0].innerHTML=l;this.showStep("sf-import-2")};function S(i){$(".sf-import-error-message",b).show().html(i);setTimeout(function(){$(".sf-import-error-message",b).fadeOut("slow")},3500)}function C(){return d.map(function(o,i){var m=o.fieldType.startsWith("builtin:")?o.fieldType.substring(8):String.format("{0}__{1}__{2}",Y,sf.util.makeIdentifier(o.label),i).toLowerCase();var l={fieldId:m,label:o.label,colNo:o.colNo,fieldTypeLabel:o.fieldTypeLabel};if(o.choicesList){l.choicesList=o.choicesList}if(m=="uuid"){l.disallowEmpty=true;l.disallowEdit=true}sf.uix.NewTableImporter.setFieldType(l,o.fieldType);return l})}sf.ui.Util.makeDraggable(B,$("h4",B));$("button.sf-panelclose",B).click(function(){B.hide()});var c=function(l){var p=l.target;var o=p.getAttribute("row"),m=p.getAttribute("col");if(o&&m){var i=$(String.format("#{0}-cell_{1}_{2}",R,o,m));if(i){i[0].scrollIntoView();i.addClass("sf-import-errorcell-highlight");setTimeout(function(){i.removeClass("sf-import-errorcell-highlight")},500)}}};var D=function(i){return i.map(function(l){return'"'+l+'"'}).join(",")};var W=function(i){return"r"+i};var A=function(){J={};for(var l=0;l<X.length;l++){var p=X[l];var m=p.row;var o=W(m);if(o in J){J[o][0]+=String.format(", Column {0} ({1})",p.col,K.header[p.col])}else{f++;J[o]=[String.format("Row {0}: Column {1} ({2})",m,p.col,K.header[p.col])].concat(K.data[m])}}};var Z=function(){if(X.length>0){var l=['"Invalid columns",'+D(K.header)];for(var m in J){l.push(D(J[m]))}$(".sf-import-step3-errors",b).val(l.join("\n")+"\n");$(".sf-import-step3-errors-wrap",b).show()}else{$(".sf-import-step3-errors-wrap",b).hide()}};var M=null;this.doStep2=function(){d=[];var m=0;var AB=true;$(".sf-import-step2 th input",b).removeClass("sf-invalid");var z=$(".sf-import-field:checked",b);var t={};for(var AC=0;AC<z.length;AC++){var s=z[AC].value;var y=$("#"+R+"-colname-"+s);var w=y.val().trim();if(!w){y.addClass("sf-invalid");AB=false}if(w.length>O){y.addClass("sf-invalid");AB=false;sf.ui.Util.reportError(String.format("Field name too long (must be under {0} chars): {1}",O,w),y)}if(!w.match(/^[a-z0-9_ \(\)\-\+\~\!@\/\&\.\'\#\?\$]+$/i)){y.addClass("sf-invalid");AB=false;sf.ui.Util.reportError("Field names may not contain special characters.",y)}var AD=w.toLowerCase();if(t[AD]!=null){y.addClass("sf-invalid");$("#"+R+"-colname-"+t[AD]).addClass("sf-invalid");AB=false;sf.ui.Util.reportError("There is more than one field with this name.",y)}t[AD]=AC;var u=$(".sf-import-fldtyp-"+s,b)[0];var o=u.options[u.selectedIndex];var q=o.value;var r=o.text;d.push({colNo:s,label:w,fieldType:q,fieldTypeLabel:r});if(q=="uuid"){m++}}if(!AB){S("Please provide valid names for all chosen fields.");return }if(!d||d.length<=0){S("Please choose at least one field to import.");return }if(m>1){S(String.format("There can be only one Record UID column. You have specified {0}.",m));return }if(m==1){for(var AC=0,x=K.data.length;AC<x;AC++){K.data[AC].entity_name=Y}}var v=$(".sf-import-step2-erropts",b).val()=="ignore";var AA=K.data.length*d.length,p=0,AE=0;M=new Array(K.data.length);var l=function(AL,AG,AF){p++;var AK=p*100/AA;H.update(AK,String.format("Validated {0}%",Math.round(AK)));if(AF==undefined){var AJ=[R,"-cell_",AL,"_",AG].join("");var AI=$(document.getElementById(AJ));X.push({row:AL,col:AG,cell:AI});AE++}else{if(!M[AL]){M[AL]=new Array(d.length)}M[AL][AG]=AF&&AF.toString()||""}var i=$(".sf-import-next",b);if(p==1){i.attr("disabled","disabled")}if(p>=AA){i.attr("disabled","");if(AE<=0||v){d=C();A();var AH={recordCount:K.data.length,rejectCount:f,fields:d,tableName:Y};$(".sf-import-step3-detail",b)[0].innerHTML=E.process(AH);this.showStep("sf-import-3");if(AE>0){Z()}}else{$(".sf-import-step2-errors",b)[0].innerHTML=U.process({cells:X});B.show();$(".sf-import-step2-errors ul",b).click(c)}}}.createDelegate(this);X=[];if(K.data&&K.data.length){H.show().start();N.run(K,d,true,V.dateFormat=="dd/MM/yyyy",l)}else{S("No data to import!")}};var a=function(){var i=$(".sf-import-step3-import",b).removeAttr("disabled").html("Done.");e=true;L.stop("Done");sf.App.setProgressBar(null)};var L=new sf.ui.ProgressBar().renderTo($(".sf-import-progressbar-wrap",b)).hide();L.bind("finish",a);var Q=function(){if(e){this.notifyListeners("importFinished");e=false;sf.App.setProgressBar(null);return }if(f>=K.data.length){sf.ui.Util.reportError("Nothing to import: All records rejected.");return }if(sf.App.isProgressBarBusy()){sf.ui.Util.reportError("System progress bar unavailable: Perhaps another import is in progress?");return }sf.App.setProgressBar(L);L.reset().show().start();$(".sf-import-cancel",b).attr("disabled","disabled");$(".sf-import-step3-back",b).attr("disabled","disabled");$(".sf-import-step3-import",b).attr("disabled","disabled").html("Importing...");var l=[];for(var o=0;o<K.data.length;o++){if(!(W(o) in J)){var p={};for(var m=0;m<d.length;m++){p[d[m].fieldId]=M[o][d[m].colNo]}l.push(p)}}for(var m=0;m<d.length;m++){delete d[m].colNo;delete d[m].fieldTypeLabel}sf.data.ObjectRegistry.createObject({name:Y,label:F,pluralLabel:F+"s",displayFieldId:d[0].fieldId},d,function(){sf.App.reloadLayouts();G.storeRecords(Y,l,a)})}.createDelegate(this);this.reset=function(){$(".sf-import-wizard-step1 textarea",b).val("");$(".sf-import-wizard-step1 .sf-import-new-tablename",b).val("");$(".sf-import-cancel",b).removeAttr("disabled");$(".sf-import-step2-errors",b)[0].innerHTML="";$(".sf-import-step3-import",b).removeAttr("disabled").html("Import");L.reset().hide();this.showStep("sf-import-1");J={};f=0;document.getElementById(R+"-import-datafile").value=""};$(".sf-import-step3-import",b).click(Q);this.showStep("sf-import-1");$(".sf-import-new-tablename",b).focus()};sf.uix.NewTableImporter.setFieldType=function(A,C){var B=A;if(C.startsWith("builtin:")){switch(C){case"builtin:uuid":case"builtin:created_by":case"builtin:modified_by":B.fieldType="string";break;case"builtin:created":case"builtin:modified":B.fieldType="datetime";break}}else{if(C.startsWith("ref:")){B.fieldType="reference";B.refersToObject=C.substring(4)}else{B.fieldType=C}}};sf.extend(sf.uix.NewTableImporter,sf.core.Observable);sf.uix.ExistingTableImporter=function(h){sf.uix.ExistingTableImporter.superclass.constructor.call(this,h);var O=h.domElementId;var E=h.dataService;var S=h.typeName;var W=E&&E.getMetadata(S);if(!W){sf.core.reportError("No metadata provided for import.");return }if(!O){sf.core.reportError("No root element id given.");return }var b=$("#"+O);var e=false;var i=function(m){$(".sf-import-ribbon-ul li",b).removeClass("sf-import-ribbon-li-selected");var l=$("."+m,b);l.addClass("sf-import-ribbon-li-selected");$(".sf-import-step",b).hide();$("."+l.attr("forStep"),b).show();if(m=="sf-import-2"){F.reset().hide()}};var f=new sf.core.Template('<% for (var i = 0, n = fields.size(); i < n; i++) { var fld = fields.get(i); %>          <option value="${fld.fieldId}">${fld.label}</option>          <% } %>');var T=new sf.core.Template('<table cellspacing="0" class="sf-import-step2">          <thead>            <% if (headers && headers.length) { %>              <tr><th></th><% for (var i = 0; i < headers.length; i++) { %><th>${headers[i]}</th><% } %></tr>            <% } %>            <tr>              <th nowrap>Import to field:</th>              <% for (var i = 0; i < colCount; i++) { %>                <th>                  <select id="${id}-step2-selectcol-${i}" >                    <option value="">(Do not import)</option>${options}                  </select>                </th>              <% } %>            </tr>          </thead>          <tbody>            <% for (var i = 0; i < data.length; i++) { %>              <tr>                <td>#${i+1}</td>                <% for (var j = 0; j < colCount; j++) { %>                  <td id="${id}-cell_${i}_${j}">${typeof (data[i][j]) != "undefined" ? sf.util.truncatedForm (data[i][j], 32) : ""}</td>                <% } %>              </tr>            <% } %>          </tbody>        </table>');var D=new sf.core.Template('Record count: ${recordCount}<br/>        Fields:        <table cellspacing="0" class="sf-import-new-step3-table">          <tr><th>Col #</th><th>Label</th><th>Import to field</th></tr>          <% for (var i = 0; i < fields.length; i++) { %>            <tr><td>${fields[i].colNo}</td><td>${fields[i].header}</td><td>${fields[i].targetFieldLabel}</td></tr>          <% } %>        </table>        <div class="sf-import-step3-errors-wrap">Rejected records:<br/><textarea class="sf-import-step3-errors"></textarea></div>');var I=null;var V=null;var d=null;var Y=0;var F=new sf.ui.ProgressBar().renderTo($(".sf-import-step2-progress",b));var M=function(){this.notifyListeners("importCanceled")}.createDelegate(this);function Q(m){var l=$(".sf-import-error-message",b);l.show().html(m);setTimeout(function(){l.fadeOut("slow")},3500)}$(".sf-import-cancel",b).click(M);var G=null;if(jQuery.browser.mozilla){$(".sf-import-datasourcespec",b).css("display","block")}$("input[name=sf-import-datasrc]",b).click(function(){G=this.value;var l=[".sf-import-datasrc-pastedata",".sf-import-datasrc-file"];for(var m=0;m<l.length;m++){var o=$(l[m],b);o.css("display",l[m].endsWith(this.value)?(o.is("div")?"block":"inline"):"none")}});var R=function(){var r=document.getElementById(O+"-import-datafile");if(G=="file"&&!r.files[0]){Q("Please provide a valid CSV data file.");return }var l=G=="file"?r.files[0].getAsBinary():$(".sf-import-wizard-step1 textarea",b).val().trim();if(!l||l.length<=0){Q(G=="file"?"Please provide a valid CSV data file.":"Please provide the CSV data in the box below.");return }V={separator:($(".sf-import-fldsep-group input[type=radio][checked]",b).val()=="tab"?"\t":","),dateFormat:$(".sf-import-datefmt-group input[type=radio][checked]",b).val(),firstLineIsData:false};I=sf.data.parseCSV(l,V);var s=f.process({fields:W.fields});for(var p=0;p<I.data.length;p++){Y=Math.max(I.data[p].length,Y)}var o=T.process({options:s,headers:I.header,colCount:Y,data:I.data,id:O});$(".sf-import-wizard-step2-tablewrap",b)[0].innerHTML=o;for(var p=0,q=I.header&&I.header.length||0;p<q;p++){var m=W.fields.find(I.header[p],function(u,t){return u.label.toLowerCase()==t.toLowerCase()});if(m){$(String.format("#{0}-step2-selectcol-{1}",O,p)).val(m.fieldId)}}i("sf-import-2")}.createDelegate(this);var L=new sf.util.ImportValidator(E);var X=[];var U=new sf.core.Template('      <ul><% for (var i = 0; i < cells.length; i++) { var c = cells[i]; %>      <li row="${c.row}" col="${c.col}" class="sf-pseudolink">Row ${parseInt(c.row)+1}, column ${parseInt(c.col)+1}</li><% } %></ul>    ');var B=$(".sf-import-step2-errors-wrap",b);sf.ui.Util.makeDraggable(B,$("h4",B));$("button.sf-panelclose",B).click(function(){B.hide()});var c=function(m){var q=m.target;var p=q.getAttribute("row"),o=q.getAttribute("col");if(p&&o){var l=$(String.format("#{0}-cell_{1}_{2}",O,p,o));if(l){l[0].scrollIntoView();l.addClass("sf-import-errorcell-highlight");setTimeout(function(){l.removeClass("sf-import-errorcell-highlight")},500)}}};var C=function(l){return l.map(function(m){return'"'+m+'"'}).join(",")};var H={},g=0;var A=function(){H={};for(var l=0;l<X.length;l++){var p=X[l];var m=p.row;var o="r"+m;if(o in H){H[o][0]+=String.format(", Column {0} ({1})",p.col,I.header[p.col])}else{g++;H[o]=[String.format("Row {0}: Column {1} ({2})",m,p.col,I.header[p.col])].concat(I.data[m])}}};var Z=function(){if(X.length>0){var l=['"Invalid columns",'+C(I.header)];for(var m in H){l.push(C(H[m]))}$(".sf-import-step3-errors",b).val(l.join("\n")+"\n");$(".sf-import-step3-errors-wrap",b).show()}else{$(".sf-import-step3-errors-wrap",b).hide()}};var K=null;var P=function(){var u=0;var y=true;$(".sf-import-step2 tbody td",b).removeClass("sf-invalid");d=[];for(var s=0;s<Y;s++){var v=$(String.format("#{0}-step2-selectcol-{1}",O,s)).val();if(v==""){continue}var o=W.getFieldWithId(v);var t=o.fieldType;if(t=="reference"){t="ref:"+o.refersToObject}var q=d.indexOf(v,function(AA,z){return AA.fieldId==z});if(q>=0){Q(String.format("Field '{0}' chosen more than once, at columns {1} and {2}",v,d[q].colNo,s));return }if(t=="uuid"){u++}d.push({colNo:s,header:I.header?I.header[s]:null,targetFieldLabel:o.label,fieldId:o.fieldId,choicesList:o.choicesList,fieldType:o.fieldType})}if(!d||d.length<=0){Q("Please choose at least one field to import.");return }if(u>1){Q(String.format("There can be only one Record UID column. You have specified {0}.",u));return }if(u==1){for(var s=0,m=I.data.length;s<m;s++){I.data[s].entity_name=W.name}}var r=$(".sf-import-step2-erropts",b).val()=="ignore";var p=I.data.length*d.length,l=0,x=0;K=new Array(I.data.length);var w=function(AE,AA,z){l++;var AD=l*100/p;F.update(AD,String.format("Validated {0}%",Math.round(AD)));if(z==undefined){var AC=[O,"-cell_",AE,"_",AA].join("");var AB=$(document.getElementById(AC));var AB=$(document.getElementById(AC));X.push({row:AE,col:AA,cell:AB});x++}else{if(!K[AE]){K[AE]=new Array(d.length)}K[AE][AA]=z&&z.toString()||""}if(l>=p){if(x<=0||r){var AF=D.process({recordCount:I.data.length,fields:d,tableName:W.name});$(".sf-import-step3-detail",b)[0].innerHTML=AF;i("sf-import-3");if(x>0){Z()}}else{$(".sf-import-step2-errors",b)[0].innerHTML=U.process({cells:X});B.show();$(".sf-import-step2-errors ul",b).click(c)}}}.createDelegate(this);X=[];F.reset().show().start();L.run(I,d,false,V.dateFormat=="dd/MM/yyyy",w)}.createDelegate(this);var a=function(){var l=$(".sf-import-step3-import",b).removeAttr("disabled").html("Done.");e=true;J.stop("Done");sf.App.setProgressBar(null)};var J=new sf.ui.ProgressBar().renderTo($(".sf-import-progressbar-wrap",b));J.bind("finish",a);var N=function(){if(e){this.notifyListeners("importFinished");e=false;sf.App.setProgressBar(null);return }if(g>=I.data.length){sf.ui.Util.reportError("Nothing to import: All records rejected.");return }if(sf.App.isProgressBarBusy()){sf.ui.Util.reportError("System progress bar unavailable: Maybe some other component is using it?");return }sf.App.setProgressBar(J);J.reset().show().start();$(".sf-import-step3-cancel",b).attr("disabled","disabled");$(".sf-import-step3-back",b).attr("disabled","disabled");$(".sf-import-step3-import",b).attr("disabled","disabled").html("Importing...");var m=[];var p=I.data.length;for(var q=0;q<p;q++){if(!(String(q) in H)){var l={};for(var o=0;o<d.length;o++){l[d[o].fieldId]=K[q][d[o].colNo]}m.push(l)}}E.storeRecords(S,m,a)}.createDelegate(this);this.reset=function(){$(".sf-import-step3-import",b).removeAttr("disabled").html("Import");$(".sf-import-wizard-step1 textarea",b).val("");J.reset().hide();$(".sf-import-step2-errors",b)[0].innerHTML="";i("sf-import-1")};$(".sf-import-dostep1",b).click(R);$(".sf-import-dostep2",b).click(P);$(".sf-import-step3-import",b).click(N);$(".sf-import-backto1",b).click(function(){i("sf-import-1")});$(".sf-import-backto2",b).click(function(){i("sf-import-2")});i("sf-import-1")};sf.extend(sf.uix.ExistingTableImporter,sf.core.Observable);sf.uix.ExporterPanel=function(A){sf.uix.ExporterPanel.superclass.constructor.call(this,A);var I=A.fields;var F=A.domElementId||sf.allocateId();var B=null;var G=new sf.core.Template('        <div class="sf-exporter ap-modal" id="${id}">          <h3 class="ap-modal-captionbar">Export selected records</h3>          <div class="ap-modal-content">            Choose the fields to include.            <span class="sf-exporter-all"><input type="checkbox" id="${id}-select-all" class="sf-exporter-allbox"/> <label for="${id}-select-all">All fields</label></span>            <div class="sf-exporter-fields">              <% for (var i = 0; i < fields.length; i++) { var field = fields[i]; %>                <div class="sf-exporter-field"><input type="checkbox" id="${id}-${i}" value="${field.fieldId}"/><label for="${id}-${i}">${field.label}</label></div>              <% } %>            </div>          </div>          <div class="sf-exporter-btns">            <button class="sf-exporter-ok">Export</button>            <button class="sf-exporter-cncl">Cancel</button>          </div>        </div>',"exporter");var E=null;var C=function(){var J=[];$(".sf-exporter-fields input[type=checkbox]:checked",B).each(function(){J.push(this.value)});if(J.length>0){this.notifyListeners("export",J,this)}else{sf.ui.Util.reportError("Please choose at least one export field.",$("h3",B))}}.createDelegate(this);var D=function(){this.notifyListeners("cancel",this)}.createDelegate(this);var H=function(){for(var J=0;J<E.length;J++){E[J].checked=this.checked}};this.getRootElement=function(){return B};this.renderTo=function(J){J=J.jquery?J:$(J);if(!J.length){sf.core.reportError("ui.ExporterPanel.renderTo: No valid container provided.");return this}B=$(G.process({fields:I,id:F}));J.append(B);$(".sf-exporter-ok",B).click(C);$(".sf-exporter-cncl",B).click(D);$(".sf-exporter-allbox",B).click(H);E=$(".sf-exporter-fields input[type=checkbox]",B);return this}};sf.extend(sf.uix.ExporterPanel,sf.ui.Widget);sf.uix.FieldSelector=function(C){var G=jQuery.extend(C||{},{labelRenderer:H,displayRenderer:A,className:"ap-fieldsel"});sf.uix.FieldSelector.superclass.constructor.call(this,G);var B=null;var E=sf.allocateId();var F={min:"Lowest",max:"Highest",avg:"Average",sum:"Sum",count:"Count"};var D=new sf.core.Template('        <% var nAgfns = opt.agfns && opt.agfns.length || 0; %>        <div  class="ap-fieldsel-option" id="ap-fieldsel-option-${baseId}" <% if (nAgfns == 1) { %>agfn="${opt.agfns[0].value}"<% } %> >          <% if (nAgfns > 1) { %>            <table cellspacing="0" cellpadding="0" width="100%">              <tr valign="top">                <td class="ap-fieldsel-opt-col1">${opt.text}</td>                <td class="ap-fieldsel-triggerelt" title="Click to show calculation functions"></td>              </tr>            </table>            <div class="ap-fieldsel-opt-agfns" <% if (opt.value == selectedValue) { %>style="display: block;"<% } %> >              <% for (var i = 0; i < nAgfns; i++) { %>                <div agfn="${opt.agfns[i].value}">                  <input type="radio" class="ap-radiobtn" name="ap-fieldsel-opt-agfns-${opt.value}" value="${opt.agfns[i].value}" <% if (opt.agfns[i].value == selectedAgfn) { %>checked<% } %>/>                  <span>${opt.agfns[i].text}</span>                </div>              <% } %>            </div>            <div style="clear: both;"></div>          <% } else { %>            ${opt.text}          <% } %>        </div>',"fieldSelectorLabel");var L=this;function H(N){if(N.groupText){return N.groupText}if(N.value=="+"){return"<i>"+N.text+"</i>"}if(N.notSelectable){return N.text}var P=B&&B.optionValue;var O=(N.value==P&&B&&B.agfn)?B.agfn.value:"value";var M=E+"-"+N.value.replace(/\./g,"_");return D.process({opt:N,baseId:M,selectedValue:P,selectedAgfn:O})}function A(N){if(!N){return""}if(N.value=="+"){return("<i>"+N.text+"</i>")}var M=N.text;if(B&&B.agfn&&N.value==B.optionValue){if(B.agfn.value=="count"){var O=sf.data.ObjectRegistry.get(N.tableName).label;return O+": # Records"}return N.text+(B.agfn.value=="value"?"":(": "+B.agfn.text))}return N.text}function I(M,N){M.each(function(){this.checked=this.value==N})}function K(P,N){if(B){if(P==B.optionValue&&(!N||N.value==(B&&B.agfn&&B.agfn.value))){return }var O=$("#ap-fieldsel-option-"+E+"-"+B.optionValue.replace(/\./g,"_")+" .ap-fieldsel-opt-agfns");I($("div .ap-radiobtn",O),"value");O.hide()}if(!P){_selectionPros=null;return }var M=$("#ap-fieldsel-option-"+E+"-"+P.replace(/\./g,"_")+" .ap-fieldsel-opt-agfns");M.show();I($("div .ap-radiobtn",M),N&&N.value||"value");B={optionValue:P,agfn:N}}function J(N,O){var M=F[N];if(O=="date"||O=="datetime"){M=M=="Lowest"?"Oldest":(M=="Highest"?"Newest":M)}return M}sf.override(L,"_optionClicked",function(O,U){var R=$(U.target);var W=$(".ap-fieldsel-option",O);var T=O.getAttribute("optvalue");var V=$(".ap-fieldsel-opt-agfns",O);var P=null;var N=L.getOptionForValue(T);var Q=N&&N.fieldType;if(V.length>0){if(!R.is(".ap-fieldsel-opt-agfns input[type=radio],.ap-fieldsel-opt-agfns span")){$(".ap-fieldsel-opt-agfns",L.getRootElement()).hide();V.show();return false}var S=R.parent();var M=S.attr("agfn");P={value:M,text:J(M,Q)}}else{var M=$(".ap-fieldsel-option",O).attr("agfn");if(M){P={value:M,text:J(M,Q)}}}K(T,P);return arguments.callee.super_.apply(this,arguments)});sf.override(L,"update",function(M,O){var N=null;if(O){N=sf.ui.FilterEditor.getFieldSpecString(O.fieldId,O.tableName,O.joinChain);B={optionValue:N};if(O.aggrFn){B.agfn={value:O.aggrFn,text:J(O.aggrFn,O.fieldType)}}}arguments.callee.super_.call(this,M,N);return this});sf.override(L,"getSelectedOption",function(){var M=arguments.callee.super_.apply(this,arguments);if(M){if(B&&B.agfn){M.aggrFn=B.agfn.value}M.fieldSpecStr=sf.ui.FilterEditor.getFieldSpecString(M.fieldId,M.tableName,M.joinChain,M.aggrFn)}return M});sf.override(L,"setSelectedValue",function(N){var M=arguments.callee.super_.apply(this,arguments);if(!N){B=null}else{}});this.getAgFnForSelectedValue=function(){return B&&B.agfn}};sf.extend(sf.uix.FieldSelector,sf.ui.ItemSelector);sf.uix.FovChildTabGroup=function(A,T,O,H){var Y=A;var J=A.getRecordView();var F=T;var S=O;var Q=H||sf.allocateId();var M=null,B=null;var E=function(g){var h=J?J.shownRecord():null;var i=h&&h[S.keyFieldId]||null;var f=[{fieldId:g.fieldId,op:"eq",value:i}];g.listTable.update(null,f)};var P=function(i){var l=J?J.shownRecord():null;var f=l&&l[i.fieldId]||null;if(f&&f.length>1){f=f[0]}var g=i.recordView.shownFieldIds().map(function(m){return m?{fieldId:m}:null});var h=[{fieldId:i.metadata.keyFieldId,op:"eq",value:f}];F.getRecords(i.metadata.name,{neededFields:g,filter:h},function(m){i.recordView.update(m.records&&m.records[0])})};var W=function(h,t,f){var i=f.tabIndex;var m=sf.App.getPageForObject(B[i].objectName);var o=m.showAddForm();var s=J?J.shownRecord():null;var r=s&&s[S.keyFieldId]||null;var l=B[i].fieldId;var u=S.displayFieldId;var g=s[u];var q={};q[l]=[r,g];o.update(q);var p=function(){B[i].listTable.update();o.unbind("saveComplete",p)};o.bind("saveComplete",p)};var a=[];var C=S.fields.map(function(i){if(i.fieldType=="reference"){var h=Q+"--tab--"+i.fieldId;var f=i.label;var l=sf.data.ObjectRegistry.get(i.refersToObject);var g={id:h,label:f,fieldId:i.fieldId,refersToObject:i.refersToObject,metadata:l,action:P};return g}return null});var R=[];var K=sf.data.ObjectRegistry.objectNames();for(var V=0;V<K.length;V++){var e=sf.data.ObjectRegistry.get(K[V]);for(var U=0,d=e.fields.size();U<d;U++){var D=e.fields.get(U);if(D.refersToObject==S.name&&sf.App.defaultLayout[D.objectName]){var I=sf.data.ObjectRegistry.get(D.objectName).pluralLabel+": "+D.label;var X={id:Q+"--tab--"+D.fieldId+"-"+D.objectName,label:I,objectName:D.objectName,fieldId:D.fieldId,action:E};R.push(X)}}}if(R.length+C.length>0){B=R.concat(C).slice(0,5);var G={tabs:B};M=new sf.ui.TabGroup(G);Y.addChildPanel(M);for(var V=0,c=B.length;V<c;V++){var X=B[V];var Z=M.getContentElementFor(X.id);if(X.refersToObject){var L=X.refersToObject;var b=sf.data.ObjectRegistry.get(L);X.recordView=new sf.ui.RecordView({metadata:b,layout:sf.uix.FullObjectView.computeDetailLayout(sf.App.defaultLayout[L],b).layout,caption:""}).renderTo(Z);a.push(X.fieldId)}else{var L=X.objectName;var b=sf.data.ObjectRegistry.get(L);var N=null;if(!b.disallowAdd){N=[{className:"sf-btn-add",label:"Add",tooltip:"Add a "+b.label+" to this "+S.label,action:W,tabIndex:V}]}X.listTable=new sf.ui.Table({listModel:new sf.data.SimpleListModel(b,sf.App.defaultLayout[L].listFieldIds,F),enableRowHoverHighlight:true,tools:N,recordsPerPage:5}).renderTo(Z)}}}this.update=function(){if(M&&B){if(M.getSelectedTabId()==null){M.selectTab(B[0].id)}M.update()}return this};this.shownReferenceFieldIds=function(){return a}};sf.uix.FeedbackForm=function(){var C='<form class="sf-feedback ap-modal" action="#">        <h3 class="ap-modal-captionbar">Send feedback to the Apsona team</h3>        <div class="ap-modal-content">          <div style="padding: 10px 0;">            We take your feedback very seriously, and we make every effort to improve our product and satisfy our customers.          </div>          <table>            <tr valign="top">              <td>Subject</td>              <td nowrap>                <input type="radio" id="sf-feedback-1" name="sf-feedback-type" value="Feature request" checked />                <label for="sf-feedback-1">Feature request</label>                <input type="radio" id="sf-feedback-0" name="sf-feedback-type" value="Bug report"/>                <label for="sf-feedback-0">Bug report</label>                <input type="radio" id="sf-feedback-2" name="sf-feedback-type" value="Other"/>                <label for="sf-feedback-2">Other</label>              </td>            </tr>            <tr valign="top">              <td>Message</td>              <td><textarea rows="7" cols="60" name="sf-feedback-message"></textarea></td>            </tr>            <tr>              <td colspan="2" align="center">                <input type="submit" value="Send" class="sf-form-button"/>                <input type="button" value="Cancel" class="sf-form-button sf-form-button-cancel"/>              </td>            </tr>          </table>        </div>      </form>';sf.uix.FeedbackForm.superclass.constructor.call(this,{fieldsMap:{"sf-feedback-type":"","sf-feedback-message":"Please provide a message."},formHTML:C,cancelButtonSelector:".sf-form-button-cancel"});var A=function(){alert("Thank you for your feedback.")};this.bind("submit",function(F,E){var D=sf.App.adminDataService();D.invoke("/ext/sendfeedback.js",{subject:E["sf-feedback-type"],message:E["sf-feedback-message"]},A)});var B=this;this.bind("show",function(){$("textarea",B.getRootElement()).val("")})};sf.extend(sf.uix.FeedbackForm,sf.ui.SimpleForm);sf.uix.MyAccountForm=function(B){var C=B||sf.allocateId();var E=String.format('        <form id="ap-edit-my-account" class="ap-modal">          <h3 class="ap-modal-captionbar">Edit your profile</h3>          <div class="ap-modal-content">            <table cellspacing="0" class="ap-editacct-items">              <tr><td class="ap-item-label">Name</td><td  class="ap-item-value"><input type="text" name="ap-editacct-name" /></td></tr>              <tr><td class="ap-item-label">Email</td><td class="ap-item-value"><input type="text" readonly name="ap-editacct-email" value=""/></td></tr>              <tr><td class="ap-item-label">Password</td><td class="ap-item-value"><input type="password" name="ap-editacct-password" /></td></tr>              <tr><td class="ap-item-label">New password</td><td class="ap-item-value"><input type="password" name="ap-editacct-new-password" /></td></tr>              <tr><td class="ap-item-label">Retype new password</td><td class="ap-item-value"><input type="password" name="ap-editacct-new-password2" /></td></tr>            </table>          </div>          <div style="text-align: center;">            <input type="submit" class="sf-form-button" value="Save" />            <input type="button" class="sf-form-button sf-form-button-cancel" id="{0}-cancel" value="Cancel" />          </div>        </form>',C);var F={"ap-editacct-name":"Please provide a valid name","ap-editacct-password":"Please provide a valid password","ap-editacct-new-password":"Please provide a valid new password","ap-editacct-new-password2":"Please provide a valid new password verification"};var A={formHTML:E,fieldsMap:F,cancelButtonSelector:"#"+C+"-cancel"};sf.uix.MyAccountForm.superclass.constructor.call(this,A);var D=function(){this.hide();sf.ui.Util.informationAlert("Changes will take effect when you log in next.")}.createDelegate(this);sf.override(this,"okToSubmit",function(K){var G=arguments.callee.super_.apply(this,arguments);if(!G){return G}if(G["ap-editacct-new-password"]!=G["ap-editacct-new-password2"]){sf.ui.Util.reportError("New passwords don't match, please try again.",$("input[name=ap-editacct-new-password2]"));return false}if(sf.App.configParameter("isDemoVersion")){sf.ui.Util.reportError("Cannot set passwords in the demo version.");return false}var J=sf.App.getUserProfile();var I={neededFields:[{fieldId:"user_id"}],filter:[{fieldId:"email_address",op:"eq",value:J.emailAddress},{fieldId:"password",op:"eq",value:G["ap-editacct-password"]}]};var H=sf.App.adminDataService();H.getRecords("User",I,function(L){if(L.records&&L.records.length>=1){var M={user_id:L.records[0].user_id,personal_name:G["ap-editacct-name"],password:G["ap-editacct-new-password"]};H.storeRecords("User",[M],D)}else{sf.ui.Util.reportError("Invalid password, please try again.",$("ap-editacct-password"))}});return false});this.onRender=function(G){var H=sf.App.getUserProfile();this.update({"ap-editacct-name":H.name,"ap-editacct-email":H.emailAddress,"ap-editacct-new-password":"","ap-editacct-new-password2":""});return this}};sf.extend(sf.uix.MyAccountForm,sf.ui.SimpleForm);sf.uix.NewTableForm=function(){sf.uix.NewTableForm.superclass.constructor.call(this);var G=null,D=null;var H=0;var A=[{fieldId:"created",label:"x-Created date",fieldType:"datetime",disallowEmpty:false},{fieldId:"created_by",label:"x-Created by",fieldType:"string",disallowEmpty:false},{fieldId:"modified",label:"x-Modified date",fieldType:"datetime",disallowEmpty:false},{fieldId:"modified_by",label:"x-Modified by",fieldType:"string",disallowEmpty:false},{fieldId:"uuid",label:"x-Record UID",fieldType:"string",disallowEmpty:true}];var M='        <form class="sf-newtableform">         <div class="sf-form-caption"><h3>Create new table</h3></div>         <table class="sf-newtableform-table" cellspacing="0" cellpadding="0">           <tr><td width="80">Name</td><td><input type="text" size="30" class="sf-tbl-name" /></td></tr>           <tr valign="top"><td style="padding-bottom: 20px;">Plural name</td><td><input type="text" size="30" class="sf-tbl-name-plural" /></td></tr>           <tr><td>Fields</td></tr>           <tr>             <td colspan="2" class="sf-newtableform-fields-wrap">               <table class="sf-newtableform-fields">                 <thead>                   <tr><th width="20"></th><th>Name</th><th>Data type</th><th>Required?</th></tr>                 </thead>                 <tbody></tbody>                 <tbody>                   <tr><td colspan="3" style="text-align: right;"><input type="button" class="sf-newtable-addfield sf-pseudolink" value="Add field"/></td></tr>                 </tbody>                 <tbody>                   <tr><td></td><td colspan="3" style="text-align: left;">Built-in fields:</td></tr>                 </tbody>               </table>             </td>           </tr>           <tr>             <td>Display field:</td>             <td>               <select class="sf-newform-displayfieldsel">                 <option value="">Choose...</option>               </select>             </td>           </tr>         </table>         <div class="sf-form-buttons" align="center">           <input type="submit" class="sf-form-button" value="Save"/>           <input type="button" class="sf-form-button sf-form-button-cancel" value="Cancel" />         </div>        </form>';var E=new sf.core.Template('        <tr>          <td></td>          <td><input type="text" size="30" value="${label}" readonly /></td>          <td><select class="sf-newtableform-fieldtype" disabled><option value="${fieldId}">${label}</option></select></td>          <td class="sf-checkboxcell"><input type="checkbox" value="1" <% if (disallowEmpty) { %>checked<% } %>  disabled/></td>        </tr>    ');function B(N){var R=$("tr",D);N.options.length=0;N.options[0]=new Option("Choose...","");var Q=L();if(!Q){sf.ui.Util.reportError("Please provide valid field names.",D);return }for(var P=0;P<(Q.fields?Q.fields.length:0);P++){var O=Q.fields[P];N.options[N.options.length]=new Option(O.label,O.fieldId)}N.options[N.options.length]=new Option("x-Record UID","uuid")}function I(){var N=$("button.sf-delete-btn-small",G).index(this);var O=$("tr",D);var P=O[N];P.parentNode.removeChild(P)}var K=sf.uix.NewTableForm.getFieldTypeSelectorHTML("sf-newtableform-fieldtype",null,null,null,true);function C(R,O,N){var P=String.format('            <tr>              <td><button class="sf-delete-btn-small sf-image-btn" title="Remove this field"/></td>              <td><input type="text" size="30" value="{0}" /></td>              <td>{2}</td>              <td class="sf-checkboxcell"><input type="checkbox" value="1" {1} /></td>            </tr>',R||"",N?"checked":"",K);var Q=$(P);D.append(Q);var S=$("select",Q);S.val(O||"string");$("button.sf-delete-btn-small",Q).click(I);$("input[type=text]",Q).focus();return Q}function J(N){if(N.length){value=N.val();if(value&&value!=""){N.removeClass("sf-invalid")}else{N.addClass("sf-invalid");value=null}}return value}var L=function(){var P=$(".sf-tbl-name",G);var a=J(P);var T=J($(".sf-tbl-name-plural",G));if(!a||!T){sf.ui.Util.reportError("Please provide a valid table name.",P);return false}var X=sf.util.makeIdentifier(a);if(sf.data.ObjectRegistry.get(X)){sf.ui.Util.reportError("There is already a table with this name. Please choose a different name.");return false}var Z=$("tr",D);var V=true,Q=[];for(var O=0;O<Z.length;O++){var U=$(Z[O]);var N=$("input[type=text]",U);if(N.length){var Y=J(N);if(Y!=null){var S=String.format("{0}__{1}__{2}",X,sf.util.makeIdentifier(Y),O).toLowerCase();var W=$("select",U).val();var R={fieldId:S,label:Y,fieldType:W,disallowEmpty:$("input[type=checkbox]",U)[0].checked};if(W.startsWith("ref:")){R.fieldType="reference";R.refersToObject=W.substring(4)}else{if(W=="picklist"){R.choicesList=[]}}Q.push(R)}else{V=false}}}return V?{name:X,label:a,pluralLabel:T,fields:Q}:null};var F=function(){var N=L();if(!N){sf.ui.Util.reportError("Please provide valid field names.",D);return false}sf.data.ObjectRegistry.createObject({name:N.name,label:N.label,pluralLabel:N.pluralLabel,displayFieldId:$(".sf-newform-displayfieldsel",G).val()||"uuid"},N.fields,function(){this.notifyListeners("submit",this);sf.App.reloadLayouts()}.createDelegate(this));sf.ui.Util.hideModal();return false}.createDelegate(this);this.getRootElement=function(){return G};this.reset=function(){if(D&&D.length){var N=D[0];var P=N.childNodes;for(var O=P.length-1;O>=0;O--){N.removeChild(P[O])}C();$("input[type=text]",G).removeClass("sf-invalid")}$(".sf-tbl-name-plural",G).val("");$(".sf-tbl-name",G).val("").focus();return this};this.showModal=function(){sf.ui.Util.showModal(this);this.notifyListeners("show",this);return this};this.renderTo=function(N){if(!N){sf.core.reportError("NewTableForm: Null container?");return }if(!N.jquery){N=$(N)}G=$(M);N.prepend(G);var O=$(".sf-newtableform-fields tbody:last",G);for(var P=0;P<A.length;P++){O.append(E.process(A[P]))}D=$(".sf-newtableform-fields tbody:first",G);$(".sf-newtable-addfield",G).click(function(){C()});$(".sf-form-button-cancel",G).click(function(R){sf.ui.Util.hideModal();this.notifyListeners("cancel",R,this)}.createDelegate(this));C();$(".sf-tbl-name",G).focus();var Q=$(".sf-tbl-name-plural",G);$(".sf-tbl-name",G).blur(function(){var R=this.value.trim();if(R!=""&&!Q.val()){Q.val(R+"s")}});$(".sf-newform-displayfieldsel",G).focus(function(){B(this)});G[0].onsubmit=F;return this}};sf.uix.NewTableForm.getFieldTypeOptionGroups=function(G,E){var B=[{name:"Dates/times",fieldTypes:["date","datetime","duration","timeofday"]},{name:"Numbers",fieldTypes:["currency","number","integer"]},{name:"General",fieldTypes:["emailAddress","phone","picklist","multipick","string","text","zipCode","boolean"]},{name:"URLs",fieldTypes:["imageUrl","url"]}];for(var F=0;F<B.length;F++){var A=B[F];A.fieldTypes=A.fieldTypes.map(function(H){return{value:H,text:sf.data.TypeInfo.label(H)}})}if(E){var D=sf.data.ObjectRegistry;var C=D.objectNames().map(function(H){return{value:"ref:"+H,text:"&#8594; "+D.get(H).label}}).sortByKey("text");B.splice(3,0,{name:"Reference to",fieldTypes:C})}if(G){B.push({name:"Built-in fields",fieldTypes:[{value:"builtin:uuid",text:"x-Record UID"},{value:"builtin:created",text:"x-Created date"},{value:"builtin:created_by",text:"x-Creator"},{value:"builtin:modified",text:"x-Modified date"},{value:"builtin:modified_by",text:"x-Modified by"}]})}return B};sf.uix.NewTableForm.getFieldTypeSelectorHTML=function(B,D,G,F,C){var E=new sf.core.Template('<select <% if (selectorClassName) { %> class="${selectorClassName}"<% } if (selectorId) { %> id="${selectorId}"<% } %> >          <% for (var i = 0; i < groups.length; i++) { %>            <optgroup label="${groups[i].name}">              <% var types = groups[i].fieldTypes; for (var j = 0; j < types.length; j++) { var typ = types[j]; %>                <option value="${typ.value}"<% if (typ.value == selectedType) { %>selected<% } %>>${typ.text}</option>              <% } %>            </optgroup>          <% } %>        </select>',"selectTemplate");var A=sf.uix.NewTableForm.getFieldTypeOptionGroups(F,C);return E.process({selectorClassName:B,selectorId:D,selectedType:G,groups:A})};sf.extend(sf.uix.NewTableForm,sf.ui.Widget);sf.uix.RecordViewLayoutEditor=function(U){var G=function(Z){var a={panels:[]};for(var Y=0,b=Z.panels&&Z.panels.length||0;Y<b;Y++){var X=Z.panels[Y];var W={fieldIds:[].concat(X.fieldIds)};if(X.heading){W.heading=X.heading}a.panels.push(W)}return a};var E=U.caption;var D=G(U.layout);var N=U.fieldsMap;var J=U.domElementId||sf.allocateId();var K='        <div class="sf-rv-editlayout">          <button class="sf-editlayout-newsection">Add section</button>          <div class="sf-rv-editorpanel"></div>          <div class="sf-layoutedit-palette-wrap">            <h4>Unused fields</h4>            <div class="sf-layoutedit-palette sf-rv-sectionwrap"></div>            <div class="sf-clearer"></div>          </div>        </div>';var I=new sf.core.Template('        <% for (var i = 0; i < fieldIds.length; i++) {             var fieldId = fieldIds[i];        %>          <div class="sf-rv-item" field_id="${fieldId}">${fields[fieldId].label}</div>        <% } %>    ');var C=null;var Q=null,H=null;var T=null;var L=null;var R=[];function P(a){var Z=a.getAttribute("field_id");if(Z){var Y=$(a).parents(".sf-rv-sectionwrap");if(Y){a=Y[0]}}var X=$(".sf-rv-sectionwrap",T);var W=X.index(a);return(W<0)?null:(W<D.panels.length?D.panels[W].fieldIds:R)}function M(Y,X){var W=$(".sf-rv-sectionhdr",T).index(X);if(W>=0){D.panels[W+1].heading=Y;X.innerHTML=Y}}function A(){if(sf.ui.Util.askForConfirmation("This section and all its fields will be removed.\nProceed?")){var Y=$(".sf-panelclose",T).index(this);if(Y>=0){var W=D.panels.splice(Y+1,1);for(var X=0;X<W[0].fieldIds.length;X++){R.push(W[0].fieldIds[X])}setTimeout(S,50)}}}var O=sf.ui.TemplateStore.get("sf-rv.html");function S(){$(".sf-layoutedit-palette",T)[0].innerHTML=I.process({fieldIds:R,fields:N});var W={id:J+"-rv",caption:E,layout:D,fields:N,getFieldHTML:function(){return""}};C.innerHTML=O.process(W);if(!Q){Q=new sf.ui.DragDropProxy(".sf-rv-editlayout .sf-rv-item",".sf-rv-editlayout .sf-rv-item,.sf-layoutedit-palette,.sf-rv-sectionwrap",B)}else{Q.reEnable()}var X=$(".sf-rv-sectionhdr",T);X.click(function(){L.doEdit(this,M)});X.css({position:"relative",display:"inline-block"}).after('<span class="sf-panelclose" title="Remove this section and all its fields"/></span>');if(X.length>1){X.after('<span class="sf-paneldrag" title="Drag to rearrange sections"></span>')}$(".sf-panelclose",T).click(A);if(!H){H=new sf.ui.DragDropProxy(".sf-rv-editlayout .sf-paneldrag",".sf-layoutedit-palette,.sf-rv-sectionwrap",F);H.getTextInProxy=function(Y){var Z=$(Y).prev();return Z[0].innerHTML}}else{H.reEnable()}}function F(Z,X){var W=$(".sf-paneldrag",T).index(Z)+1;var Y=$(".sf-rv-sectionwrap",T).index(X);if(Y>0&&W>0&&Y!=W){D.panels=D.panels.moveItem(W,Y);S()}}function B(b,Y){var a=b.getAttribute("field_id");if(!a){return }var X=P(b);var Z=P(Y);if(!X||!Z){return }X.splice(X.indexOf(a),1);var W=Y.getAttribute("field_id");if(W){var c=Z.indexOf(W);Z.splice(c,0,a)}else{Z.push(a)}S()}function V(){D.panels.push({heading:"Type a section title...",fieldIds:[]});S();C.scrollTop=C.scrollHeight;var W=$(".sf-rv-sectionhdr",T);L.doEdit(W[W.length-1],M);L.selectAll()}this.getLayout=function(){return D};this.setLayout=function(W){D=G(W);S()};this.renderTo=function(X){var W=X.jquery?X:$(X);if(!W.length){sf.core.reportError("uix.RecordViewLayoutEditor: No container.");return }T=$(K);W.append(T);C=$(".sf-rv-editorpanel",T)[0];L=new sf.ui.InPlaceStringEditor();for(var Y in N){for(var Z=0;Z<D.panels.length;Z++){if(D.panels[Z].fieldIds.indexOf(Y)>=0){isUsed=true;break}}if(Z>=D.panels.length){R.push(Y)}}S();$("button.sf-editlayout-newsection",T).click(V)}};sf.uix.ReportEditor=function(config){sf.uix.ReportEditor.superclass.constructor.call(this,config);var _baseObjectName=config.objectName;var _domElementId=config.domElementId||sf.allocateId();var _fullObjectView=config.fov;var DEFAULT_MAX_RECORDS=1000;var DEFAULT_COL_WIDTH_PX=120;var CALCULATED_VALUE_INDICATOR="*";var _propertiesForm=null;var _rootJqEl=null;var _htmlString=String.format('        <div id="{0}-reporteditor" class="sf-editrpt">          <form class="sf-editrpt-form" id="{0}-form">            <div class="sf-clearer"></div>            <table cellspacing="0" cellpadding="0" summary="" >              <tr>                <td class="sf-item-label">Report name:</td><td id="{0}-form-name" class="sf-editrpt-name-cell"></td>                <td class="sf-item-label" style="padding-left: 20px;">Description:</td><td rowspan="2" id="{0}-form-description" class="sf-editrpt-desc-cell"></td>              </tr>              <tr><td class="sf-item-label">Record range:</td><td nowrap><span id="{0}-form-fromRec"></span> to <span id="{0}-form-toRec"></span></td></tr>            </table>          </form>          <div class="sf-editrpt-tabgroup"></div>        </div>    ',_domElementId);var _layoutHtmlString=new sf.core.Template('        <div id="${id}" class="sf-erl">          <div class="sf-erl-blurb">Choose the columns for your report. Drag and drop column headers to rearrange them.</div>          <div style="margin: 20px 0 20px 0;clear:left; white-space: nowrap;">Add column: <span id="${id}-addcol"></span></div>          <table id="${id}-table" class="sf-erl-table sf-list-table" cellspacing="0" cellpadding="0" summary="">            <thead>              <tr class="sf-list-header"></tr>            </thead>            <tbody>              <tr></tr>              <tr></tr>              <tr></tr>              <tr></tr>              <tr></tr>            </tbody>          </table>        </div>').process({id:_domElementId});var _fieldAtrsFormHTML=new sf.core.Template('        <form class="sf-erl-form" id="${id}-erl-form">          <div class="sf-erl-formcontent">            <table cellspacing="0" summary="">              <tbody class="sf-editrpt-fldprops-body0">                <tr><td class="sf-form-label">Table:</td><td id="${id}-erl-form-tableLabel"></td></tr>                <tr><td class="sf-form-label">Field:</td><td id="${id}-erl-form-fieldLabel"></td></tr>                <tr><td class="sf-form-label">Column label:</td><td id="${id}-erl-form-columnLabel"></td></tr>              </tbody>              <tbody class="sf-editrpt-fldprops-body1">                <tr valign="top"><td class="sf-form-label">Calculation:</td><td id="${id}-erl-form-calcExpr"></td></tr>                <tr valign="top"><td class="sf-form-label">Result type:</td><td id="${id}-erl-form-dataType"></td></tr>              </tbody>              <tr>                <td class="sf-form-buttons" align="center" colspan="4">                  <input type="submit" class="sf-form-button" value="Ok" />                  <input type="button" class="sf-form-button sf-form-button-cancel"  value="Cancel" />                </td>              </tr>            </table>          </div>        </form>    ').process({id:_domElementId});var _sortOrderTabHTML=String.format('        Choose the default sort order for the fields.        <table>          <tr>          <tr>            <td>First by</td>            <td><select class="sf-editrpt-sort sf-editrpt-sort-0"></select></td>            <td nowrap>              <input type="radio" name="sf-editrpt-sort-0-{0}" id="sf-editrpt-sort-0-{0}-asc" value="asc" />              <label for="sf-editrpt-sort-0-{0}-asc">Ascending</label>              <input type="radio" name="sf-editrpt-sort-0-{0}" id="sf-editrpt-sort-0-{0}-desc" value="desc" />              <label for="sf-editrpt-sort-0-{0}-desc">Descending</label>            </td>          </tr>            <td>Then by</td>            <td><select class="sf-editrpt-sort sf-editrpt-sort-1"></select></td>            <td nowrap>              <input type="radio" name="sf-editrpt-sort-1-{0}" id="sf-editrpt-sort-1-{0}-asc" value="asc" />              <label for="sf-editrpt-sort-1-{0}-asc">Ascending</label>              <input type="radio" name="sf-editrpt-sort-1-{0}" id="sf-editrpt-sort-1-{0}-desc" value="desc" />              <label for="sf-editrpt-sort-1-{0}-desc">Descending</label>            </td>          </tr>          <tr>            <td>And then by</td>            <td><select class="sf-editrpt-sort sf-editrpt-sort-2"></select></td>            <td nowrap>              <input type="radio" name="sf-editrpt-sort-2-{0}" id="sf-editrpt-sort-2-{0}-asc" value="asc" />              <label for="sf-editrpt-sort-2-{0}-asc">Ascending</label>              <input type="radio" name="sf-editrpt-sort-2-{0}" id="sf-editrpt-sort-2-{0}-desc" value="desc" />              <label for="sf-editrpt-sort-2-{0}-desc">Descending</label>            </td>          </tr>        </table>    ',_domElementId);var metadata=sf.data.ObjectRegistry.get(_baseObjectName);if(!metadata){sf.core.reportError("ReportEditor: No metadata for "+_baseObjectName);return }var fieldChoices=[{value:CALCULATED_VALUE_INDICATOR,text:"(Calculated value)",fieldId:CALCULATED_VALUE_INDICATOR,className:"sf-editrpt-calcchoice"}].concat(sf.ui.FilterEditor.getSelectorChoices(_baseObjectName));var _ddProxy=null,_colResizeProxy=null,_captionTextSpec="#"+_domElementId+" .sf-list-captiontext";var _reportDesc=null;var _rptAtrsForm=null,_filterEditor=null,_tabSet=null;var calcFieldTypeEditor=new sf.ui.PicklistEditor({fieldId:"dataType",selectHTML:sf.uix.NewTableForm.getFieldTypeSelectorHTML(null,null,"string")});var formFields=[{fieldId:"columnLabel",label:"Column label",fieldType:"string"},{fieldId:"calcExpr",label:"Calculation",fieldType:"text"},{fieldId:"dataType",label:"Result type",fieldType:"picklist",disallowEmpty:true,editor:calcFieldTypeEditor}];var _handleDeleteClick=function(){var deleterElements=$(".sf-erl-hdr-delete",_rootJqEl);var colIndex=deleterElements.index(this);if(_reportDesc.outputs[colIndex]){if(!sf.ui.Util.askForConfirmation(String.format("Column '{0}' will be removed. Proceed?",_reportDesc.outputs[colIndex].columnLabel))){return }_reportDesc.outputs.splice(colIndex,1)}var thElts=$("tr.sf-list-header th",_rootJqEl);var nodeToRemove=thElts[colIndex];nodeToRemove.parentNode.removeChild(nodeToRemove);var rows=$(".sf-erl-table tbody tr",_rootJqEl);for(var i=0;i<rows.length;i++){var cells=$("td",$(rows[i]));rows[i].removeChild(cells[colIndex])}};function dropCallback(dragSource,dropTarget){var captionTextElts=$(_captionTextSpec);var srcIndex=captionTextElts.index(dragSource);var dstIndex=captionTextElts.index(dropTarget);if(srcIndex<0||dstIndex<0||srcIndex==dstIndex){return }_reportDesc.outputs=_reportDesc.outputs.moveItem(srcIndex,dstIndex);_reportDesc.tabularLayout.widthPx=_reportDesc.tabularLayout.widthPx.moveItem(srcIndex,dstIndex);var thElts=$(".sf-erl-hdr",_rootJqEl);for(var i=0;i<Math.min(captionTextElts.length,_reportDesc.outputs.length);i++){captionTextElts[i].innerHTML=_reportDesc.outputs[i].columnLabel;thElts[i].style.width=_reportDesc.tabularLayout.widthPx[i]+"px"}}function resizeCallback(gripElement,x,y){var ndx=$(".sf-list-hdr-resize-grip",_rootJqEl).index(gripElement);if(ndx>=0){var thElts=$(".sf-erl-hdr",_rootJqEl);if(thElts.length>=ndx+1){var elt=$(thElts[ndx]);var newWidthPx=Math.max(20,x-elt.offset().left);elt.width(newWidthPx+"px");if(!_reportDesc.tabularLayout){_reportDesc.tabularLayout={widthPx:[]}}_reportDesc.tabularLayout.widthPx[ndx]=newWidthPx}}}var _rebindEvents=function(){$("#"+_domElementId+" .sf-erl-hdr-delete").unbind("click",_handleDeleteClick).bind("click",_handleDeleteClick);if(_reportDesc.outputs&&_reportDesc.outputs.length>=2){if(!_ddProxy){_ddProxy=new sf.ui.DragDropProxy(_captionTextSpec,_captionTextSpec,dropCallback)}else{_ddProxy.reEnable()}if(!_colResizeProxy){_colResizeProxy=new sf.ui.ColumnResizeProxy(".sf-list-hdr-resize-grip","#"+_domElementId+"-table",resizeCallback)}else{_colResizeProxy.reEnable()}}};var headerHTML='    <th id="{0}" class="sf-list-colcaption sf-erl-hdr" style="width: {2};">      <div class="sf-erl-hdr-inner">        <div class="sf-list-captiontext">{1}</div>        <a class="sf-list-hdr-resize-grip"></a>        <span class="sf-erl-hdr-tools">          <a title="Edit properties"    class="sf-erl-hdr-menu"></a>          <a title="Delete this column" class="sf-erl-hdr-delete"></a>        </span>      </div>    </th>';var _addColumn=function(columnDesc,widthPx){var hdr=$("#"+_domElementId+"-table .sf-list-header"),cols=$("th",hdr),nCols=cols.length;var newHdrId=_domElementId+"-layout-hdr-"+nCols;hdr.append(String.format(headerHTML,newHdrId,columnDesc.columnLabel,widthPx+"px"));_reportDesc.tabularLayout.widthPx[nCols]=widthPx;_reportDesc.outputs[nCols]=columnDesc;_propertiesForm.setTrigger($(".sf-erl-hdr-menu",_rootJqEl));var rows=$("#"+_domElementId+"-table tbody tr");for(var i=0;i<rows.length;i++){$(rows[i]).append("<td></td>")}_rebindEvents()};var _captionString="",_pristineReportDesc={};this.editReport=function(reportDesc){_captionString=reportDesc?"Edit report":"Create new report";$(".sf-editrpt-form-run",_rootJqEl).css("display",reportDesc?"inline":"none");_reportDesc=reportDesc||{outputs:[],tabularLayout:{widthPx:[]}};_pristineReportDesc={};jQuery.extend(true,_pristineReportDesc,_reportDesc);_tabSet.selectTab("layout");$(".sf-editrpt-form-run",this.toolbar().getRootElement()).css("display",reportDesc?"inline":"none");$("#"+_domElementId+" .sf-list-header").html("");var rows=$("#"+_domElementId+"-table tbody tr");for(var i=0;i<rows.length;i++){$(rows[i]).html("")}_filterEditor.setCondition(_reportDesc.filterTerms||[]);if(!reportDesc){$("#"+_domElementId+"-caption").html("Create new report")}else{$("#"+_domElementId+"-caption").html("Edit report");for(var i=0;i<_reportDesc.outputs.length;i++){var opt=_reportDesc.outputs[i];if(!opt.fieldSpecStr){opt.fieldSpecStr=sf.ui.FilterEditor.getFieldSpecString(opt.fieldId,opt.tableName,opt.joinChain,opt.aggrFn)}_addColumn(opt,_reportDesc.tabularLayout.widthPx[i])}}_setSortSelectors();_rptAtrsForm.update({fromRec:_reportDesc.recordRange&&_reportDesc.recordRange.from||1,toRec:_reportDesc.recordRange&&_reportDesc.recordRange.to||DEFAULT_MAX_RECORDS,name:_reportDesc.name||"",description:_reportDesc.description||""});return this};var _validateCalcExpr=function(expr){try{var $r={};eval(expr)}catch(e){return"Error in expression: "+e.message}var re=new RegExp("\\$r\\['([^']+)'\\]","g");var start=0,nIter=0;do{re.lastIndex=start;var matches=re.exec(expr);if(!matches||!matches.length){return null}var ndx=_reportDesc.outputs.indexOfKey("columnLabel",matches[1]);if(ndx<0){return String.format("There is no column named '{0}' in this report.",matches[1])}if(_reportDesc.outputs[ndx].calcExpr){return String.format("Using calculated field '{0}' in calculation: Not supported.",matches[1])}start+=matches[0].length;nIter++}while(nIter<=100);sf.core.reportError("uix.reportEditor: too many parse iterations for calc validation.\nPlease notify bugs@apsona.com");return null};var _sortSelectors=null,_sortTab=null,self=this;function _rptAtrsFormSubmit(dataPkt,submitEvent){var nameEditor=this.editor("name").clearErrorState();if(!dataPkt.name){nameEditor.setErrorState("Please provide a name for your report.");return false}var nOutputs=_reportDesc.outputs.length;if(nOutputs<=0){_tabSet.selectTab("layout");sf.ui.Util.reportError("Please choose at least one output column.",$(".sf-tablist",_rootJqEl));return false}var incompleteMsg=null;for(var i=0;i<nOutputs;i++){var output=_reportDesc.outputs[i];if(!output.columnLabel){incompleteMsg="Please choose labels for all columns.";break}else{for(var index=0;index<nOutputs;index++){if(index!=i&&_reportDesc.outputs[index].columnLabel==output.columnLabel){incompleteMsg=String.format("Please choose different labels for each column. (Columns {0} and {1} have the same label.)",index+1,i+1);break}}if(incompleteMsg){break}}}if(incompleteMsg){_tabSet.selectTab("layout");sf.ui.Util.reportError(incompleteMsg,$(".sf-tablist",_rootJqEl));return false}var filterTerms=_filterEditor.validate();if(!filterTerms){return false}_reportDesc.name=dataPkt.name;_reportDesc.description=dataPkt.description;_reportDesc.recordRange={from:this.editor("fromRec").value(),to:this.editor("toRec").value()};_reportDesc.filterTerms=filterTerms;_reportDesc.sort=[];for(var i=0;i<_sortSelectors.length;i++){var selector=_sortSelectors[i];var radioSpec=String.format("input[name=sf-editrpt-sort-{0}-{1}]:checked",i,_domElementId);var sortFieldId=$(selector).val();if(sortFieldId){var ndx=_reportDesc.outputs.indexOfKey("fieldSpecStr",sortFieldId);if(ndx<0){_tabSet.selectTab("sort");sf.ui.Util.reportError("Can't find sort field "+selector.options[selector.selectedIndex].text+": Please choose a valid field.");return false}_reportDesc.sort[i]={fieldIndex:ndx,direction:$(radioSpec,_sortTab).val()=="asc"?1:-1}}}self.notifyListeners("submit",_reportDesc,submitEvent,_rptAtrsForm.saveAndRun);return false}function _setSortSelectors(){var orderMap={asc:1,desc:-1};var options=_reportDesc.outputs.map(function(item){return item.fieldSpecStr==CALCULATED_VALUE_INDICATOR?null:{value:item.fieldSpecStr,fieldId:item.fieldId,text:item.columnLabel}});options=[{value:"",text:"Choose..."}].concat(options);var sortOrder=_reportDesc.sort||[];for(var i=0;i<_sortSelectors.length;i++){var selValue=sortOrder[i]?_reportDesc.outputs[sortOrder[i].fieldIndex].fieldSpecStr:null;sf.ui.Util.fillSelector(_sortSelectors[i],options,selValue);if(sortOrder[i]){for(var k in orderMap){var radioBtn=document.getElementById(String.format("sf-editrpt-sort-{0}-{1}-{2}",i,_domElementId,k));if(radioBtn){radioBtn.checked=(orderMap[k]==sortOrder[i].direction&&k==radioBtn.value)}}}}}this.renderTo=function(container){var containerElement=typeof (container)=="string"?$("#"+container):container;_rootJqEl=$(_htmlString);containerElement.append(_rootJqEl);var rptFormFields=[{fieldId:"name",label:"Report name",fieldType:"string"},{fieldId:"description",label:"Description",fieldType:"text"},{fieldId:"fromRec",label:"First rec #",fieldType:"number"},{fieldId:"toRec",label:"Last rec #",fieldType:"number"}];_rptAtrsForm=sf.ui.Form.createFromDOM(_domElementId+"-form",rptFormFields);_rptAtrsForm.editor("name").focus();this.bind("show",function(){_rptAtrsForm.saveAndRun=false});_rptAtrsForm.handleSubmit=_rptAtrsFormSubmit;$(".sf-editrpt-form-cancel",_rootJqEl).click(function(){self.notifyListeners("cancel",self)});_tabSet=new sf.ui.TabGroup({tabs:[{id:"layout",label:"Table data"},{id:"filter",label:"Filter terms"},{id:"sort",label:"Sort order"}]}).renderTo($(".sf-editrpt-tabgroup",_rootJqEl));_tabSet.getContentElementFor("layout")[0].innerHTML=_layoutHtmlString;var addColSelector=new sf.uix.FieldSelector().renderTo($("#"+_domElementId+"-addcol"));addColSelector.update(fieldChoices);addColSelector.bind("change",function(){var opt=this.getSelectedOption();if(opt.value){var colSpec=sf.util.copyOf(opt,["fieldId","tableName","joinChain"]);var agFn=addColSelector.getAgFnForSelectedValue();colSpec.columnLabel=opt.text+(agFn?(": "+agFn.text):"");if(agFn){colSpec.aggrFn=agFn.value}colSpec.fieldSpecStr=opt.value;_addColumn(colSpec,DEFAULT_COL_WIDTH_PX);setTimeout(function(){addColSelector.setSelectedValue("")},500)}});var feParams={caption:"Specify filter terms",metadata:sf.data.ObjectRegistry.get(_baseObjectName)};_filterEditor=new sf.ui.FilterEditor(feParams).renderTo(_tabSet.getContentElementFor("filter"));_filterEditor.reportError=function(invalidCell){_tabSet.selectTab("filter");sf.ui.Util.reportError("Please provide valid filter terms.",invalidCell);return this};_sortTab=_tabSet.getContentElementFor("sort");_sortTab[0].innerHTML=_sortOrderTabHTML;_sortSelectors=$(".sf-editrpt-sort",_sortTab);_tabSet.bind("tabSelect",function(eventName,tabId){if(tabId=="sort"){_setSortSelectors()}});var formId=_domElementId+"-erl-form";if(!document.getElementById(formId)){$(document.body).append(_fieldAtrsFormHTML)}_propertiesForm=sf.ui.Form.createFromDOM(formId,formFields);_propertiesForm.handleCancel=function(){this.hide()};_propertiesForm.handleSubmit=function(pkt){if(!pkt.columnLabel){sf.ui.Util.reportError("Please provide a label for the column.",$("#"+_domElementId+"-erl-form-columnLabel"));return false}var currentTrigger=this.getCurrentTrigger();var menuElements=$(".sf-erl-hdr-menu",_rootJqEl);var colNdx=menuElements.index(currentTrigger);var pos=_reportDesc.outputs&&_reportDesc.outputs.indexOfKey("columnLabel",pkt.columnLabel)||-1;if(pos>=0&&pos!=colNdx){sf.ui.Util.reportError("There is already a column with this label. Please provide a different label.",$("#"+_domElementId+"-erl-form-columnLabel"));return false}_reportDesc.outputs[colNdx].columnLabel=pkt.columnLabel;var outputFieldId=_reportDesc.outputs[colNdx].fieldId;if(outputFieldId==CALCULATED_VALUE_INDICATOR){if(!pkt.calcExpr){sf.ui.Util.reportError("Please provide a calculation formula.",$("#"+_domElementId+"-erl-form-calcExpr"));return false}var msg=_validateCalcExpr(pkt.calcExpr);if(msg){sf.ui.Util.reportError(msg,$("#"+_domElementId+"-erl-form-calcExpr"));return false}sf.util.copyProperties(pkt,_reportDesc.outputs[colNdx],["calcExpr","dataType"])}var captionElt=$(_captionTextSpec)[colNdx];captionElt.innerHTML=pkt.columnLabel;$(captionElt.parentNode).css("width",$(captionElt).width()+45+"px");this.hide();return false};var _showExprBox=function(shown){$(".sf-editrpt-fldprops-body1",_propertiesForm.getRootElement()).css("display",shown?"table-row-group":"none")};_propertiesForm.setTrigger($(".sf-erl-hdr-menu",_rootJqEl)).bind("show",function(){var currentTrigger=_propertiesForm.getCurrentTrigger();var menuElements=$(".sf-erl-hdr-menu",_rootJqEl);var colNdx=menuElements.index(currentTrigger);var outputField=_reportDesc.outputs&&_reportDesc.outputs[colNdx];var tblLabel="",fldLabel="";if(outputField.fieldSpecStr==CALCULATED_VALUE_INDICATOR){fldLabel="Calculated value"}else{var tblName=outputField.tableName||(outputField.joinChain&&outputField.joinChain.tableName)||_baseObjectName;var tbl=sf.data.ObjectRegistry.get(tblName);if(tbl){tblLabel=tbl.label;var fld=tbl.getFieldWithId(outputField.fieldId);if(fld){fldLabel=fld.label;if(outputField.aggrFn){fldLabel=outputField.aggrFn+" ("+fldLabel+")"}}}}$("#"+_domElementId+"-erl-form-tableLabel").html(tblLabel);$("#"+_domElementId+"-erl-form-fieldLabel").html(fldLabel);if(outputField&&outputField.columnLabel){_propertiesForm.editor("columnLabel").setValue(outputField.columnLabel);var values=outputField.calcExpr?{columnLabel:outputField.columnLabel,calcExpr:outputField.calcExpr,dataType:outputField.dataType,fieldId:CALCULATED_VALUE_INDICATOR}:{columnLabel:outputField.columnLabel,calcExpr:"",fieldId:outputField.fieldSpecStr};_propertiesForm.update(values)}else{_propertiesForm.reset()}_propertiesForm.editor("columnLabel").focus();var fldId=_reportDesc.outputs[colNdx].fieldId;_showExprBox(outputField.fieldSpecStr==CALCULATED_VALUE_INDICATOR)});this.notifyListeners("render",this);return this};this.getRootElement=function(){return _rootJqEl};this.captionString=function(){return _captionString};var _toolbar=null;function _save(target,evt){_rptAtrsForm.simulateSubmit(evt)}function _saveNRun(target,evt){_rptAtrsForm.saveAndRun=true;_rptAtrsForm.simulateSubmit(evt)}function _run(){_fullObjectView.runReport(_pristineReportDesc)}function _cancel(){self.notifyListeners("cancel",self)}this.toolbar=function(){if(!_toolbar){_toolbar=new sf.ui.ToolBar({tools:[{className:"sf-editrpt-form-save",label:"Save",tooltip:"Save changes and return to the report list",action:_save},{className:"sf-editrpt-form-savenrun",label:"Save & run",tooltip:"Save changes and run this report",action:_saveNRun},{className:"sf-editrpt-form-run",label:"Run",tooltip:"Run this report without saving changes",action:_run},{className:"sf-editrpt-form-cancel",label:"Cancel",tooltip:"Return to the report list without saving changes",action:_cancel}]})}return _toolbar}};sf.extend(sf.uix.ReportEditor,sf.ui.Widget);sf.uix.ReportList=function(D){sf.uix.ReportList.superclass.constructor.call(this,D);var M=D.objectName;var P=D.domElementId||sf.allocateId();var N=D.dataService;var J=D.fov;var E=null,I=null,L=null,G=null,O=null;var F=[];var C=new sf.core.Template('<div id="${id}" class="sf-reports">           <div class="sf-reportlist">             <div class="sf-reports-listwrap"></div>           </div>        </div>');var H=new sf.core.Template('<% var  n = dataRecords ? dataRecords.length : 0;           if (n <= 0) {         %><div class="sf-reportlist-noreports">No reports available. Click the "New" button above to create one.</div>         <% } else { %>          <table class="sf-reportlist-table">            <% for (var i = 0; i < n; i++) {               var rec = dataRecords[i];               var tooltip = rec.reportDesc.outputs.map (function(item) { return item.columnLabel;}).join(", "); %>              <% if (i % 3 == 0) { %><tr valign="top"><% } %>              <td class="sf-reportlist-itemcell">                  <span class="sf-reportlist-name">${rec.name}</span>                  <% if (rec.description) { %><span class="sf-reportlist-description">${rec.description}</span><% } %>                  Created: <span class="sf-reportlist-created">${rec.created && rec.created.format("MM/dd/yyyy hh:mm a") || ""}</span>                  <span class="sf-reportlist-itemtooltip">Outputs: ${tooltip}<br/></span>              </td>              <% if (i % 3 == 2) { %></tr><% } %>            <% } %>          </table>         <% } %>');var A=function(R,V){var T=G.getCurrentTrigger();var S=$(".sf-reportlist-name",E).index(T);var U=F[S].reportDesc;switch(V){case"edit":U.reportId=F[S].report_id;J.editReport(U);break;case"clone":var W=sf.util.copyOf(U);delete W.reportId;J.editReport(W,true);break;case"run":U.reportId=F[S].report_id;J.runReport(U);break;case"delete":if(sf.ui.Util.askForConfirmation("This report will be deleted. Proceed?")){if(sf.App.configParameter("isDemoVersion")){sf.ui.Util.reportError("Cannot delete reports in the demo version.");break}N.deleteRecords("builtin.report",[{fieldId:"report_id",op:"eq",value:F[S].report_id}],function(){this.update()}.createDelegate(this))}break}G.hide()}.createDelegate(this);var Q=function(){$("#"+P+" .sf-reports-listwrap")[0].innerHTML=H.process({id:P,dataRecords:F});G.setTrigger($(".sf-reportlist-name",E)).bind("select",A);$(".sf-reportlist-itemcell",E).addHoverClass("sf-reportlist-item-over").showTooltip(function(R){return $(".sf-reportlist-itemtooltip",$(R)).html()})}.createDelegate(this);this.renderTo=function(R){R=typeof (R)=="string"?$("#"+R):R;R.append(C.process({id:P,dataRecords:F}));E=$("#"+P);I=$(".sf-reportlist",E);this.update();G=new sf.ui.PopupMenu({items:[{id:"edit",label:"Edit",tooltip:"Edit this report"},{id:"run",label:"Run",tooltip:"Run this report"},{id:"clone",label:"Clone",tooltip:"Clone this report"},{label:"---"},{id:"delete",label:"Delete",tooltip:"Delete this report"}]});this.notifyListeners("render",this);return this};this.getRootElement=function(){return E};var B=function(R,T){var S={neededFields:[{fieldId:"report_id"},{fieldId:"name"},{fieldId:"description"},{fieldId:"report_descriptor"},{fieldId:"created"}],filter:[{fieldId:"entity_name",op:"eq",value:M}],sort:[{fieldIndex:1,direction:1}]};N.getRecords("builtin.report",S,function(V){if(V&&V.error){sf.ui.Util.reportError("Can't get report list: "+V.error);return }F=V?V.records:[];for(var U=F.length-1;U>=0;U--){try{F[U].reportDesc=sf.doEval(F[U].report_descriptor)}catch(W){}}Q();if(T){T(R)}})};this.update=function(R){B(this,R)};this.bind("show",function(){B()});this.getDataRecord=function(R){var S=F?F.length:0;return R>=0&&R<S?F[R]:null};this.getRecordCount=function(){return F?F.length:0};this.getKeyForRecord=function(R){var S=this.getDataRecord(R);return S?S.report_id:null};this.showListPanel=function(){if(O){O.hide()}if(L){L.hide()}if(I){I.show()}return this};this.captionString=function(){return"Available reports"};var K=null;this.toolbar=function(){if(!K){K=new sf.ui.ToolBar({tools:[{label:"New",className:"sf-report-new",action:function(){J.editReport(null)},tooltip:"Create a new report"},{label:"Refresh",className:"sf-reports-refresh",action:function(){B()},tooltip:"Refresh the list of reports from the server"}]})}return K}};sf.extend(sf.uix.ReportList,sf.ui.Widget);sf.uix.ReportLayoutEditor=function(A){var H=A||{};sf.uix.ReportLayoutEditor.superclass.constructor.call(this,H);var B=null;var I=H.domElementId||sf.allocateId();var E=String.format('  <div class="sf-layout-chooser">    <ul class="sf-layout-chooser-list">      <li class="sf-layout-level1-li">        <input type="radio" name="sf-layout-type" value="rowgrp" id="{0}-type-rowgrp" />        <label for="{0}-type-rowgrp">Grouping</label>        <div class="sf-layout-level1">          Group the records based on          <ul class="sf-layout-chooser-list">            <li>              <input type="radio" name="sf-layout-rowgrp" value="value" id="{0}-rowgrp-value" checked />              <label for="{0}-rowgrp-value">Field</label>              <select class="sf-layout-rowgrp-field sf-layout-allfields"></select>            </li>            <li class="sf-layout-rowgrp-daterow">              <input type="radio" name="sf-layout-rowgrp" value="datevalue" id="{0}-rowgrp-datevalue" />              <label for="{0}-rowgrp-datevalue">Field</label>              <select class="sf-layout-rowgrp-datefield sf-layout-datefields"></select>              in groups by              <select class="sf-layout-rowgrp-dateinterval">                <option value="year">Year</option>                <option value="month">Month</option>                <option value="week">Week</option>                <option value="date">Day</option>                <option value="dayofweek">Day of week</option>              </select>            </li>            <li class="sf-layout-rowgrp-numberrow">              <input type="radio" name="sf-layout-rowgrp" value="numbervalue" id="{0}-rowgrp-by-number" />              <label for="{0}-rowgrp-by-number">Field</label>              <select class="sf-layout-rowgrp-numberfield sf-layout-numberfields"></select>              in groups of              <select style="text-align: right;" class="sf-layout-rowgrp-numberinterval">                <option value="5">5</option>                <option value="10">10</option>                <option value="50">50</option>                <option value="100">100</option>                <option value="500">500</option>                <option value="1000">1,000</option>                <option value="5000">5,000</option>                <option value="10000">10,000</option>                <option value="50000">50,000</option>                <option value="100000">100,000</option>              </select>            </li>          </ul>          In each group, show          <ul class="sf-layout-chooser-list">            <li>              <input type="radio" name="sf-layout-rowgrp-cell" value="all" id="{0}-1d-value-rec-all" checked />              <label for="{0}-1d-value-rec-all">All records in the group</label>            </li>            <li>              <input type="radio" name="sf-layout-rowgrp-cell" value="count" id="{0}-1d-value-rec-count" checked />              <label for="{0}-1d-value-rec-count">Number of records in the group</label>            </li>            <li>              <input type="radio" name="sf-layout-rowgrp-cell" value="field" id="{0}-1d-value-field" />              <label for="{0}-1d-value-field">Field </label>              <select class="sf-layout-rowgrp-cell-field sf-layout-allfields-out"></select>              of the records in the group            </li>            <li class="sf-layout-rowgrp-numberrow">              <input type="radio" name="sf-layout-rowgrp-cell" value="bar" id="{0}-1d-value-bar" />              <label for="{0}-1d-value-bar">Field</label>              <select class="sf-layout-rowgrp-cell-bar-field sf-layout-numberfields-agg"></select>              as horizontal bar chart            </li>            <li class="sf-layout-rowgrp-numberrow">              <input type="radio" name="sf-layout-rowgrp-cell" value="vbar" id="{0}-1d-value-vbar" />              <label for="{0}-1d-value-vbar">Field</label>              <select class="sf-layout-rowgrp-cell-vbar-field sf-layout-numberfields-agg"></select>              as vertical bar chart            </li>            <li class="sf-layout-rowgrp-numberrow">              <input type="radio" name="sf-layout-rowgrp-cell" value="pie" id="{0}-1d-value-pie" />              <label for="{0}-1d-value-pie">Field</label>              <select class="sf-layout-rowgrp-cell-pie-field sf-layout-numberfields-agg"></select>              as pie chart            </li>          </ul>        </div>      </li>      <li class="sf-layout-level1-li">        <input type="radio" name="sf-layout-type" value="matrix" id="{0}-type-matrix" />        <label for="{0}-type-matrix">Matrix (rows and columns)</label>        <div class="sf-layout-level1">          Rows grouped by          <ul class="sf-layout-chooser-list">            <li>              <input type="radio" checked name="sf-layout-matrix-rowgrp" value="value" id="{0}-matrix-rowgrp-value" />              <label for="{0}-matrix-rowgrp-value">Field</label>              <select class="sf-layout-matrix-rowgrp-field sf-layout-allfields"></select>            </li>            <li class="sf-layout-rowgrp-daterow">              <input type="radio" name="sf-layout-matrix-rowgrp" value="datevalue" id="{0}-matrix-rowgrp-datevalue" />              <label for="{0}-matrix-rowgrp-datevalue">Field</label>              <select class="sf-layout-matrix-rowgrp-datefield sf-layout-datefields"></select>              in groups by              <select class="sf-layout-matrix-rowgrp-dateinterval">                <option value="year">Year</option>                <option value="month">Month</option>                <option value="week">Week</option>                <option value="date">Day</option>                <option value="dayofweek">Day of week</option>              </select>            </li>            <li class="sf-layout-rowgrp-numberrow">              <input type="radio" name="sf-layout-matrix-rowgrp" value="numbervalue" id="{0}-matrix-rowgrp-by-number" />              <label for="{0}-matrix-rowgrp-by-number">Field</label>              <select class="sf-layout-matrix-rowgrp-numberfield sf-layout-numberfields"></select>              in groups of              <select style="text-align: right;" class="sf-layout-matrix-rowgrp-numberinterval">                <option value="5">5</option>                <option value="10">10</option>                <option value="50">50</option>                <option value="100">100</option>                <option value="500">500</option>                <option value="1000">1,000</option>                <option value="5000">5,000</option>                <option value="10000">10,000</option>                <option value="50000">50,000</option>                <option value="100000">100,000</option>              </select>            </li>          </ul>          Columns grouped by          <ul class="sf-layout-chooser-list">            <li>              <input type="radio" checked name="sf-layout-matrix-colgrp" value="value" id="{0}-matrix-colgrp-value" />              <label for="{0}-matrix-colgrp-value">Field</label>              <select class="sf-layout-matrix-colgrp-field sf-layout-allfields"></select>            </li>            <li class="sf-layout-rowgrp-daterow">              <input type="radio" name="sf-layout-matrix-colgrp" value="datevalue" id="{0}-matrix-colgrp-datevalue" />              <label for="{0}-matrix-colgrp-datevalue">Field</label>              <select class="sf-layout-matrix-colgrp-datefield sf-layout-datefields"></select>              in groups of              <select class="sf-layout-matrix-colgrp-dateinterval">                <option value="year">Year</option>                <option value="month">Month</option>                <option value="week">Week</option>                <option value="date">Day</option>                <option value="dayofweek">Day of week</option>              </select>            </li>            <li class="sf-layout-rowgrp-numberrow">              <input type="radio" name="sf-layout-matrix-colgrp" value="numbervalue" id="{0}-matrix-colgrp-by-number" />              <label for="{0}-matrix-colgrp-by-number">Field</label>              <select class="sf-layout-matrix-colgrp-numberfield sf-layout-numberfields"></select>              in groups of              <select style="text-align: right;" class="sf-layout-matrix-colgrp-numberinterval">                <option value="5">5</option>                <option value="10">10</option>                <option value="50">50</option>                <option value="100">100</option>                <option value="500">500</option>                <option value="1000">1,000</option>                <option value="5000">5,000</option>                <option value="10000">10,000</option>                <option value="50000">50,000</option>                <option value="100000">100,000</option>              </select>            </li>          </ul>          In each cell, show          <ul class="sf-layout-chooser-list">            <li>              <input type="radio" checked name="sf-layout-matrix-cell" value="field" id="{0}-matrix-value-field" />              <label for="{0}-matrix-value-field">Field</label>              <select class="sf-layout-matrix-cell-field sf-layout-allfields-out"></select>              of the records in the cell            </li>            <li>              <input type="radio" name="sf-layout-matrix-cell" value="count" id="{0}-matrix-value-rec-count" />              <label for="{0}-matrix-value-rec-count">Numerical count of records in the group</label>            </li>          </ul>        </div>      </li>      <li class="sf-layout-level1-li sf-layout-rowgrp-daterow">        <input type="radio" name="sf-layout-type" value="calendar" id="{0}-type-calendar" />        <label for="{0}-type-calendar">Calendar view</label>        <div class="sf-layout-level1">          <ul class="sf-layout-chooser-list">            <li>Use value of <select class="sf-layout-calendar-field sf-layout-datefields"></select> as calendar field</li>            <li>Use value of <select class="sf-layout-calendar-labelfield sf-layout-allfields"></select> as label field</li>            <li>View as              <input type="radio" name="calendar-view" id="{0}-calendar-view-month-grid" value="month-grid" checked />              <label for="{0}-calendar-view-month-grid">month grid</label>              <input type="radio" name="calendar-view" id="{0}-calendar-view-month-vert" value="month-vert" />              <label for="{0}-calendar-view-month-vert">vertically stacked</label>            </li>          </ul>        </div>      </li>      <li class="sf-layout-level1-li sf-layout-rowgrp-numberrow">        <input type="radio" name="sf-layout-type" value="barchart" id="{0}-type-barchart" />        <label for="{0}-type-barchart">Horizontal bar chart</label>        <div class="sf-layout-level1">          <ul class="sf-layout-chooser-list">            <li>              Use value of <select class="sf-layout-barchart-rowlabel sf-layout-allfields"></select> as bar label            </li>            <li>              Use value of <select class="sf-layout-barchart-value sf-layout-numberfields"></select> as bar value            </li>          </ul>        </div>      </li>      <li class="sf-layout-level1-li sf-layout-rowgrp-numberrow">        <input type="radio" name="sf-layout-type" value="vbarchart" id="{0}-type-vbarchart" />        <label for="{0}-type-vbarchart">Vertical bar chart</label>        <div class="sf-layout-level1">          <ul class="sf-layout-chooser-list">            <li>              Use value of <select class="sf-layout-vbarchart-rowlabel sf-layout-allfields"></select> as bar label            </li>            <li>              Use value of <select class="sf-layout-vbarchart-value sf-layout-numberfields"></select> as bar value            </li>          </ul>        </div>      </li>      <li class="sf-layout-level1-li sf-layout-rowgrp-numberrow">        <input type="radio" name="sf-layout-type" value="piechart" id="{0}-type-piechart" />        <label for="{0}-type-piechart">Pie chart</label>        <div class="sf-layout-level1">          <ul class="sf-layout-chooser-list">            <li>              Use value of <select class="sf-layout-piechart-rowlabel sf-layout-allfields"></select> as pie label            </li>            <li>              Use value of <select class="sf-layout-piechart-value sf-layout-numberfields"></select> as pie value            </li>          </ul>        </div>      </li>    </ul>    <input type="checkbox" class="sf-layout-chooser-default" id="{0}-default" value="1" checked />    <label for="{0}-default">Set as default for this report</label><br/>    <div class="sf-layout-chooser-btns">      <button class="sf-layout-chooser-btn-ok">Ok</button> <button class="sf-layout-chooser-btn-cancel">Cancel</button>    </div>  </div>    ',I);var F=[{valueSuffix:".sum",textSuffix:": sum"},{valueSuffix:".avg",textSuffix:": average"},{valueSuffix:".min",textSuffix:": smallest"},{valueSuffix:".max",textSuffix:": largest"}];var G=[{valueSuffix:".min",textSuffix:": oldest"},{valueSuffix:".max",textSuffix:": newest"},{valueSuffix:".count",textSuffix:": count"}];var C=function(S){var J=[],L=[],Q=[],R=[],N=[];for(var O=0,K=S?S.length:0;O<K;O++){var P=S[O];switch(P.dataType){case"number":case"integer":case"currency":Q.push({value:P.columnId,text:P.label});for(var M=0;M<F.length;M++){R.push({value:P.columnId+F[M].valueSuffix,text:P.label+F[M].textSuffix});N.push({value:P.columnId+F[M].valueSuffix,text:P.label+F[M].textSuffix})}break;case"date":case"datetime":L.push({value:P.columnId,text:P.label});for(var M=0;M<G.length;M++){R.push({value:P.columnId+G[M].valueSuffix,text:P.label+G[M].textSuffix})}N.push({value:P.columnId+".count",text:P.label+": count"});break;default:R.push({value:P.columnId+".count",text:P.label+": count"});N.push({value:P.columnId+".count",text:P.label+": count"});break}J.push({value:P.columnId,text:P.label});R.push({value:P.columnId,text:P.label})}var T=function(V,U){return V.text<U.text?-1:(V.text==U.text?0:1)};J.sort(T);R.sort(T);N.sort(T);Q.sort(T);L.sort(T);$("select.sf-layout-allfields",B).each(function(){sf.ui.Util.fillSelector(this,J,null,true)});$("select.sf-layout-numberfields",B).each(function(){sf.ui.Util.fillSelector(this,Q,null,true)});$("select.sf-layout-datefields",B).each(function(){sf.ui.Util.fillSelector(this,L,null,true)});$("select.sf-layout-allfields-out",B).each(function(){sf.ui.Util.fillSelector(this,R,null,true)});$("select.sf-layout-numberfields-agg",B).each(function(){sf.ui.Util.fillSelector(this,N,null,true)});$(".sf-layout-rowgrp-numberrow",B).css("display",N.length>0?"block":"none");$(".sf-layout-rowgrp-daterow",B).css("display",L.length>0?"block":"none")};var D=function(L){$("div.sf-layout-level1",B).hide();$("select",B).val("");var N=$("input[type=radio][value="+L.type+"]",B).parent();$("div.sf-layout-level1",N).show();$("input[type=radio][name=sf-layout-type]",B).each(function(){this.checked=this.value==L.type});var M=function(O,P,S){var R="field";if(P.visual=="bar"){var Q=P.fieldId;if(["sum","avg","count","min","max"].indexOf(P.content)>=0){Q+="."+P.content}$("."+S+"-cell-bar-field",O).val(Q);R="bar"}else{if(P.visual=="vbar"){var Q=P.fieldId;if(["sum","avg","count","min","max"].indexOf(P.content)>=0){Q+="."+P.content}$("."+S+"-cell-vbar-field",O).val(Q);R="vbar"}else{if(P.visual=="pie"){var Q=P.fieldId;if(["sum","avg","count","min","max"].indexOf(P.content)>=0){Q+="."+P.content}$("."+S+"-cell-pie-field",O).val(Q);R="pie"}else{if(P.content=="all"){R="all"}else{if(P.fieldId){var Q=P.fieldId;if(["sum","avg","count","min","max"].indexOf(P.content)>=0){Q+="."+P.content}$("."+S+"-cell-field",O).val(Q)}else{if(P.content=="count"){R="count"}}}}}}$("input[name="+S+"-cell]",O).each(function(){this.checked=this.value==R})};var K=function(O,P,Q){if(P.dateInterval){$("."+Q+"-datefield",O).val(P.fieldId);$("."+Q+"-dateinterval",O).val(P.dateInterval);$("input[name="+Q+"]",O).each(function(){this.checked=this.value=="datevalue"})}else{if(P.numInterval){$("."+Q+"-numberfield",O).val(P.fieldId);$("."+Q+"-numberinterval",O).val(P.numInterval);$("input[name="+Q+"]",O).each(function(){this.checked=this.value=="numbervalue"})}else{$("."+Q+"-field",O).val(P.fieldId);$("input[name="+Q+"]",O).each(function(){this.checked=this.value=="value"})}}};switch(L.type){case"calendar":$(".sf-layout-calendar-field",N).val(L.dateFieldId);$(".sf-layout-calendar-labelfield",N).val(L.labelFieldId);var J=String.format("input[type=radio][name=calendar-view]",I);$(J,N).each(function(){this.checked=this.value==L.calendarViewType});break;case"rowgrp":if(L.group){K(N,L.group,"sf-layout-rowgrp")}if(L.cell){M(N,L.cell,"sf-layout-rowgrp")}break;case"matrix":if(L.rowGroup){K(N,L.rowGroup,"sf-layout-matrix-rowgrp")}if(L.colGroup){K(N,L.colGroup,"sf-layout-matrix-colgrp")}if(L.cell){M(N,L.cell,"sf-layout-matrix")}break;case"barchart":$(".sf-layout-barchart-rowlabel",N).val(L.rowLabel.fieldId);$(".sf-layout-barchart-value",N).val(L.barValue.fieldId);break;case"vbarchart":$(".sf-layout-vbarchart-rowlabel",N).val(L.rowLabel.fieldId);$(".sf-layout-vbarchart-value",N).val(L.barValue.fieldId);break;case"piechart":$(".sf-layout-piechart-rowlabel",N).val(L.pieLabel.fieldId);$(".sf-layout-piechart-value",N).val(L.pieValue.fieldId);break}};this.setLayout=function(J){D(J);return this};this.setFields=function(J){C(J);return this};this.getLayout=function(){var M=function(S){var U={},R=null;var T=$("input[name="+S+"]:checked",B)[0].value;switch(T){case"field":R=$("."+S+"-field",B);U.fieldId=R.val();if(!U.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}var V=U.fieldId.split(".");if(V.length>1){U.fieldId=V[0];U.content=V[1]}else{U.content="value"}break;case"all":case"count":U.content=T;break;case"bar":U.visual="bar";R=$("."+S+"-bar-field",B);U.fieldId=R.val();if(!U.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}var V=U.fieldId.split(".");if(V.length>1){U.fieldId=V[0];U.content=V[1]}else{U.content="value"}break;case"vbar":U.visual="vbar";R=$("."+S+"-vbar-field",B);U.fieldId=R.val();if(!U.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}var V=U.fieldId.split(".");if(V.length>1){U.fieldId=V[0];U.content=V[1]}else{U.content="value"}break;case"pie":U.visual="pie";R=$("."+S+"-pie-field",B);U.fieldId=R.val();if(!U.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}var V=U.fieldId.split(".");if(V.length>1){U.fieldId=V[0];U.content=V[1]}else{U.content="value"}break}return U};var L=function(S){var V={},R=null;var U=$("input[name="+S+"]:checked",B);if(!U){return null}var T=U[0].value;switch(T){case"value":R=$("."+S+"-field",B);V.fieldId=R.val();if(!V.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}break;case"datevalue":R=$("."+S+"-datefield",B);V.fieldId=R.val();if(!V.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}V.dateInterval=$("."+S+"-dateinterval",B).val();break;case"numbervalue":R=$("."+S+"-numberfield",B);V.fieldId=R.val();if(!V.fieldId){sf.ui.Util.reportError("Please choose a field.",R);return null}V.numInterval=$("."+S+"-numberinterval",B).val();break}return V};var J=null;var N={type:$("input[name=sf-layout-type]:checked",B)[0].value};switch(N.type){case"calendar":J=$(".sf-layout-calendar-field",B);N.dateFieldId=J.val();if(!N.dateFieldId){sf.ui.Util.reportError("Please choose a field.",J);return null}J=$(".sf-layout-calendar-labelfield",B);N.labelFieldId=J.val();if(!N.labelFieldId){sf.ui.Util.reportError("Please choose a label field.",J);return null}N.calendarViewType=$("input[name=calendar-view]:checked",B)[0].value;break;case"barchart":J=$(".sf-layout-barchart-rowlabel",B);var Q=J.val();if(!Q){sf.ui.Util.reportError("Please choose a field for the row label.",J);return null}J=$(".sf-layout-barchart-value",B);var O=J.val();if(!O){sf.ui.Util.reportError("Please choose a field for the bar value.",J);return null}N.rowLabel={fieldId:Q};N.barValue={fieldId:O};break;case"vbarchart":J=$(".sf-layout-vbarchart-rowlabel",B);var Q=J.val();if(!Q){sf.ui.Util.reportError("Please choose a field for the row label.",J);return null}J=$(".sf-layout-vbarchart-value",B);var O=J.val();if(!O){sf.ui.Util.reportError("Please choose a field for the bar value.",J);return null}N.rowLabel={fieldId:Q};N.barValue={fieldId:O};break;case"piechart":J=$(".sf-layout-piechart-rowlabel",B);var P=J.val();if(!P){sf.ui.Util.reportError("Please choose a field for the pie label.",J);return null}J=$(".sf-layout-piechart-value",B);var K=J.val();if(!K){sf.ui.Util.reportError("Please choose a field for the bar value.",J);return null}N.pieLabel={fieldId:P};N.pieValue={fieldId:K};break;case"rowgrp":N.group=L("sf-layout-rowgrp");if(!N.group){return null}N.cell=M("sf-layout-rowgrp-cell");if(!N.cell){return null}break;case"matrix":N.rowGroup=L("sf-layout-matrix-rowgrp");if(!N.rowGroup){return null}N.colGroup=L("sf-layout-matrix-colgrp");if(!N.colGroup){return null}N.cell=M("sf-layout-matrix-cell");if(!N.cell){return null}break}return N};this.renderTo=function(J){J=typeof (J)=="string"?$("#"+J):J;if(!J||J.length<=0){sf.core.reportError("ui.ReportLayoutEditor: renderTo: Cannot find container to render into.");return }B=$(E);J.append(B);var K=this;$(".sf-layout-chooser-btn-ok",B).click(function(){var L=K.getLayout();if(L){if($(".sf-layout-chooser-default",B)[0].checked){L.isDefaultRendering=true}K.notifyListeners("change",L,K)}});$(".sf-layout-chooser-btn-cancel",B).click(function(){K.hide()});$(".sf-layout-level1-li > input[type=radio]",B).click(function(){$("div.sf-layout-level1",B).slideUp("slow");$("div.sf-layout-level1",$(this).parent()).slideToggle(300)});$("select",B).click(function(){var L=$(this).siblings("input[type=radio]");if(L.length==1){var N=L[0].name;var M=L[0].value;$("input[type=radio][name="+N+"]",B).each(function(){this.checked=this.value==M})}});return this};this.getRootElement=function(){return B}};sf.extend(sf.uix.ReportLayoutEditor,sf.ui.Widget);sf.uix.runReport=function(D,H,M,O,J,A){var C=sf.util.copyOf(O);var B=J&&J.jquery?J:jQuery(J);function G(P){var Q=new Date(),V=null,W,T;if(P.dateInterval){switch(P.dateInterval){case"year":W=new Date(2006,0,1);T=5;V=new sf.data.YearIntervalList(W.getFullYear(),T);break;case"month":var U=Q.getMonth()-6,S=Q.getFullYear();if(U<0){U+=12;S--}W=new Date(S,U,1);T=12;V=new sf.data.MonthIntervalList(W.getFullYear(),W.getMonth(),T);break;case"week":W=new Date(Q.getTime()-3*7*Date.MILLISECONDS_PER_DAY).closestPreviousWeekday(0);T=6;V=new sf.data.WeekIntervalList(W,T);break;case"date":W=new Date(Q.getTime()-Date.MILLISECONDS_PER_DAY*7);T=15;V=new sf.data.DateIntervalList(W,T);break;case"dayofweek":V=new sf.data.DayOfWeekIntervalList(W,T);break}}else{if(P.numInterval){var R=parseInt(P.numInterval);W=0;T=10;V=new sf.data.NumberIntervalList(W,R,T)}}return V}function E(U,T){var R=null,S=null;for(var P=0,V=U&&U.length||0;P<V;P++){var Q=U[P][T];if(Q&&(S==null||Q.getTime()>S.getTime())){S=Q}if(Q&&(R==null||Q.getTime()<R.getTime())){R=Q}}return R?{minDate:R,maxDate:S}:null}var N={year:function(S,Q){var T=2007,R=5;var P=E(S,Q);if(P){T=P.minDate.getFullYear();R=P.maxDate.getFullYear()-T+1}return new sf.data.YearIntervalList(T,R)},month:function(V,R){var W=null,T=12;var P=E(V,R);if(P){W=P.minDate;T=(P.maxDate.getFullYear()-P.minDate.getFullYear()-1)*12+(12-P.minDate.getMonth())+(1+P.maxDate.getMonth())}else{var Q=new Date();var U=Q.getMonth()-6,S=Q.getFullYear();if(U<0){U+=12;S--}W=new Date(S,U,1);T=12}return new sf.data.MonthIntervalList(W.getFullYear(),W.getMonth(),T)},week:function(T,R){var U=null,S=12;var P=E(T,R);if(P){U=P.minDate.closestPreviousWeekday(0);S=Math.ceil((P.maxDate.getTime()-U.getTime())/(Date.MILLISECONDS_PER_DAY*7))}else{var Q=new Date();U=new Date(Q.getTime()-3*7*Date.MILLISECONDS_PER_DAY).closestPreviousWeekday(0);S=6}return new sf.data.WeekIntervalList(U,S)},date:function(T,R){var U=null,S=12;var P=E(T,R);if(P){U=P.minDate;S=Math.ceil((P.maxDate.getTime()-U.getTime())/Date.MILLISECONDS_PER_DAY)}else{var Q=new Date();U=new Date(Q.getTime()-Date.MILLISECONDS_PER_DAY*7);S=15}return new sf.data.DateIntervalList(U,S)},dayofweek:function(Q,P){return new sf.data.DayOfWeekIntervalList()}};function I(){return null}function L(Q){var P=Q.fieldId;if(Q.dateInterval){return N[Q.dateInterval]||I}if(Q.numInterval){return function(){var R=parseInt(Q.numInterval);start=0;count=10;return new sf.data.NumberIntervalList(start,R,count)}}return I}function K(S,Q,R){var P=null;S[0].innerHTML="";var U=Q&&Q.type||"rawdata";switch(U){case"rawdata":P=new sf.ui.Table({listModel:R,recordsPerPage:10000,showTotalsRow:true,recordCountTemplateString:"${recordCount} records",columnWidthsPx:D.tabularLayout.widthPx}).renderTo(S).update().show();break;case"calendar":P=Q.calendarViewType=="month-vert"?new sf.ui.MonthViewVertical({dateColumnId:Q.dateFieldId,labelColumnId:Q.labelFieldId,listModel:R}):new sf.ui.MonthView({dateColumnId:Q.dateFieldId,labelColumnId:Q.labelFieldId,listModel:R});var T=new Date();P.renderTo(S).update(T.getMonth(),T.getFullYear()).show();break;case"barchart":P=new sf.ui.BarChart({listModel:R,barLabelFieldId:Q.rowLabel.fieldId,barValueFieldId:Q.barValue.fieldId}).renderTo(S).show().update();break;case"vbarchart":P=new sf.ui.VerticalBarChart({listModel:R,barLabelFieldId:Q.rowLabel.fieldId,barValueFieldId:Q.barValue.fieldId}).renderTo(S).show().update();break;case"piechart":P=new sf.ui.PieChart({listModel:R,labelFieldId:Q.pieLabel.fieldId,valueFieldId:Q.pieValue.fieldId}).renderTo(S).show().update();break;case"rowgrp":if(!R.getColumnWithId(Q.group.fieldId)){S[0].innerHTML='<span style="color: red;">Invalid report: Cannot find grouping field id '+Q.group.fieldId+". Perhaps it was removed from the report.</span>";break}var V=new sf.data.GroupingListModel(R,Q.group.fieldId,L(Q.group),Q.cell.content,Q.cell.fieldId);if(Q.cell.visual=="bar"){P=new sf.ui.BarChart({listModel:V,barLabelFieldId:V.groupColumnId(),barValueFieldId:V.aggregationColumnId()}).renderTo(S).show().update()}else{if(Q.cell.visual=="vbar"){P=new sf.ui.VerticalBarChart({listModel:V,barLabelFieldId:V.groupColumnId(),barValueFieldId:V.aggregationColumnId()}).renderTo(S).show().update()}else{if(Q.cell.visual=="pie"){P=new sf.ui.PieChart({listModel:V,labelFieldId:V.groupColumnId(),valueFieldId:V.aggregationColumnId()}).renderTo(S).show().update()}else{P=new sf.ui.Table({listModel:V,recordsPerPage:10000}).renderTo(S);P.show().update()}}}break;case"matrix":P=new sf.ui.MatrixRendering({listModel:R,rowGroupId:Q.rowGroup.fieldId,colGroupId:Q.colGroup.fieldId,rowIntervalsBuilder:L(Q.rowGroup),colIntervalsBuilder:L(Q.colGroup),cellSpec:Q.cell}).renderTo(S).show().update();break}}var F=A||new sf.uix.ReportListModel(D,H,M);K(B,C,F);return F};sf.uix.ReportRunner=function(L,H,M,C){sf.uix.ReportRunner.superclass.constructor.call(this);var J=C||sf.allocateId();var B=String.format('<div class="sf-report-run" id="{0}-reportrunner"></div>',J);var T=null,G=null,K=null;var P=null;var R=null;var I='<span class="sf-report-norendering">No visualization has been set. Please choose one from the "Visualize" menu above.</span>';var F='<form id="sf-export-form" method="post" action="/util/echo" target="_blank">        <input type="hidden" name="_param" value="data"/><input id="sf-export-form-data" type="hidden" name="data" value="" />        <input type="hidden" name="_mimeType" value="text/csv" /><input id="sf-export-form-filename" type="hidden" name="_fileName" value="" />        </form>';this.renderTo=function(U){U=typeof (U)=="string"?$("#"+U):U;if(!U||U.length<=0){sf.core.reportError("ReportRunner: renderTo: Cannot find container to render into.");return }P=$(B);U.append(P);R=new sf.ui.TabGroup({tabs:[{id:"raw",label:"Tabular data"},{id:"rendered",label:"Visualization"}]}).renderTo(P).show();R.getContentElementFor("rendered")[0].innerHTML=I;return this};this.runReport=function(Y,W){var X=R.getContentElementFor("raw");if(T&&T.reportId!=Y.reportId){X[0].innerHTML=""}T=Y;var V=null;var Z=W&&W.type||Y.defaultRendering&&Y.defaultRendering.type||"rawdata";var U=Z=="rawdata"?"raw":"rendered";var a=R.getContentElementFor(U);R.selectTab(U);R.getContentElementFor("rendered")[0].innerHTML=I;G=null;if(!W){W=Y.defaultRendering;if(W&&W.type!="rawdata"){G=sf.uix.runReport(Y,H,M,null,X)}}G=sf.uix.runReport(Y,H,M,W,a,G);K=W;return this};this.getRootElement=function(){return P};var A=function(W){var a=W.records;var Z=G.getColumns();var Y="";for(var X=0;X<Z.length;X++){Y+=(X==0?"":",")+'"'+Z[X].label+'"'}Y+="\r\n";for(var X=0;X<a.length;X++){var U=a[X];for(var V=0;V<Z.length;V++){var b=sf.data.TypeInfo.toString(Z[V].dataType,U[Z[V].columnId]);Y+=(V==0?"":",")+'"'+b.replaceAll('"','""')+'"'}Y+="\r\n"}var c=document.getElementById("sf-export-form");if(!c){c=$(F);$(document.body).append(c);c=c[0]}document.getElementById("sf-export-form-filename").value=T.name.replaceAll(" ","_")+".csv";document.getElementById("sf-export-form-data").value=Y;c.submit()};var D=function(){G.getRecords(null,A)};this.captionString=function(){return T&&T.name||"Run report"};var O=null,S=null;var E=function(V,U){if(U.isDefaultRendering){delete U.isDefaultRendering;T.defaultRendering=U;L.saveReportDescriptor(T,function(){})}O.hide();this.runReport(T,U)}.createDelegate(this);var Q='<iframe src="'+sf.App.baseURL()+'/svc/svc.html?rpt={0}"         marginheight="0" marginwidth="0" style="border: 1px solid #bbb;" width="400" height="300" frameborder="no">/iframe>';var N=function(){O=new sf.uix.ReportLayoutEditor().renderTo($(document.body)).hide();O.getRootElement().addClass("sf-runrpt-layoutchooser");var Z=S.getRootElement();O.setTrigger($(".sf-runrpt-layout",Z));O.bind("show",function(){O.setFields(G.getColumns());O.setLayout(K||T&&T.defaultRendering||{type:"rowgrp"})});sf.override(O,"getPositionToShow",function(a){var b=arguments.callee.super_.apply(this,arguments);b.top-=2;return b});O.bind("change",E);var Y=String.format('            <div class="sf-runrpt-publish sf-small-popup-form">              <input type="checkbox" id="{0}-checkbox" value="1" /> <label for="{0}-checkbox">Allow public access</label><br/>              <div class="sf-runrpt-publish-url">Public access HTML: <span class="sf-icon-help">&nbsp;                <span>To publish this report on your web page, copy the code in the box below                and paste it into the HTML code for the page.</span></span>                <textarea></textarea>              </div>              <div class="sf-runrpt-publish-buttons"><button class="sf-icon-btn sf-btn-ok">Ok</button><button class="sf-icon-btn sf-btn-cncl">Cancel</button></div>            </div>',J+"-publish");var X=new sf.ui.SimpleWidget(Y).renderTo($(document.body)).hide();var W=X.getRootElement();var U=$("textarea",W)[0];var V=$("input[type=checkbox]",W);$(".sf-btn-cncl",W).click(function(){X.hide()});$(".sf-btn-ok",W).click(function(){T.allowPublic=V[0].checked?true:false;L.saveReportDescriptor(T,function(){X.hide()})});V.click(function(){U.disabled=this.checked?"":"disabled"});X.bind("show",function(){U.value=String.format(Q,T.reportId);U.disabled=T.allowPublic?"":"disabled";V[0].checked=T.allowPublic?true:false});X.setTrigger($(".sf-runrptbtn-publish",Z))};this.toolbar=function(){if(!S){S=new sf.ui.ToolBar({tools:[{className:"sf-runrpt-layout",label:"Visualize",tooltip:"Change the visualization for this report",hasMenu:true},{className:"sf-runrptbtn-edit",label:"Edit",tooltip:"Edit this report",action:function(){L.editReport(T)}},{className:"sf-runrptbtn-export",label:"Export",tooltip:"Export to Excel/CSV",action:D},{className:"sf-runrptbtn-publish",label:"Publish",tooltip:"Publish in a web page"},{className:"sf-runrptbtn-print",label:"Print",tooltip:"Print",action:function(){alert("Not yet implemented.")}}]});S.bind("render",N)}return S}};sf.extend(sf.uix.ReportRunner,sf.ui.Widget);sf.uix.ReportListModel=function(reportDesc,objectName,dataService){sf.uix.ReportListModel.superclass.constructor.apply(this,arguments);var Calculator=function(exprString){this.exec=function(aRecord){var $r=aRecord;var __result=null;try{eval("__result = ("+exprString+")")}catch(e){__result=null}return __result}};var _listCols=[],_neededFields=[],_calcFields=[];for(var i=0,n=reportDesc.outputs.length;i<n;i++){var item=reportDesc.outputs[i];var fldType="string";var colId="rptcol_"+i;if(item.calcExpr){var itm=sf.util.copyOf(item);itm.columnId=colId;_calcFields.push(itm);itm.calculator=new Calculator(item.calcExpr);fldType=itm.dataType}else{_neededFields.push(item);if(item.aggrFn=="count"){fldType="integer"}else{var objName=objectName;var metadata=dataService.getMetadata(objName);if(item.joinChain){if(item.joinChain.tableName){metadata=dataService.getMetadata(item.joinChain.tableName)}else{if(item.joinChain.thisSide){var thisSideField=metadata.getFieldWithId(item.joinChain.thisSide);if(!thisSideField){sf.ui.Util.reportError(String.format("Cannot find field '{0}' in table '{1}'",item.joinChain.thisSide,metadata.label));return }if(!thisSideField.refersToObject){sf.ui.Util.reportError(String.format("Field '{0}' in table '{1}' is not a reference??",item.joinChain.thisSide,metadata.label));return }metadata=dataService.getMetadata(thisSideField.refersToObject)}}}var fld=metadata?metadata.getFieldWithId(item.fieldId):null;if(fld){fldType=fld.fieldType}else{var error=metadata?String.format("Can't find field {0} in metadata for {1}",item.fieldId,metadata.label):String.format("Can't find metadata for field {0}({1})",item.fieldId,item.columnLabel);sf.core.reportError(error)}}}_listCols.push({columnId:colId,label:item.columnLabel,dataType:fldType})}this.getColumns=function(){return _listCols};var _data=null;this.getRecords=function(parameters,callback){var getRecsCallback=function(data){var nRecs=data&&data.records?data.records.length:0,nFields=_listCols.length;var newRecs=[];for(var i=0;i<nRecs;i++){var rec=data.records[i];var newRec={},calcRec={};var fIndex=0;for(var j=0;j<nFields;j++){var fld=_listCols[j];if(!fld.calcExpr){var v=sf.data.Field.fromString(rec[fIndex],fld.dataType);newRec[fld.columnId]=v;calcRec[fld.label]=v;fIndex++}}if(_calcFields.length>0){for(var j=_calcFields.length-1;j>=0;j--){var fld=_calcFields[j];newRec[fld.columnId]=fld.calculator.exec(calcRec)}}newRecs[i]=newRec}data.records=newRecs;callback(data);_data=data};if(_data){callback(_data)}else{var params={neededFields:_neededFields,filter:reportDesc.filterTerms,sort:reportDesc.sort||parameters&&parameters.sort};var from=0,count=0;if(reportDesc.recordRange){from=reportDesc.recordRange.from;count=reportDesc.recordRange.to-reportDesc.recordRange.from+1;if(!isNaN(count)&&count>0){params.recordCount=count}params.firstRecord=from-1}dataService.getRecords(objectName,params,getRecsCallback,true)}return this}};sf.extend(sf.uix.ReportListModel,sf.data.ListModel);sf.uix.sfdcConnection=function(){var R=4;var B=new sf.core.Template('        <div class="sf-page-caption-bar"><h2 class="sf-page-caption">Sync with salesforce.com</h2><div class="sf-clearer"></div></div>        <div class="sf-sfdc-menu">          <ul class="sf-sfdc-menu-ul">            <li class="sf-sfdc-menu-li sf-sfdc-menu-li-selected" panelId="sf-sfdc-panel-session">Session setup</li>            <li class="sf-sfdc-menu-li" panelId="sf-sfdc-panel-objects">Linked objects</li>            <li class="sf-sfdc-menu-li" panelId="sf-sfdc-panel-data">Data records</li>          </ul>        </div>        <div class="sf-sfdc-actions">          <div class="sf-sfdc-action-panel" id="sf-sfdc-panel-session">            <form class="sf-sfdc-login" id="sf-sfdc-loginform">              <h4 class="sf-small-caption">Login to salesforce.com</h4>              <div class="sf-form-item">                <div class="sf-form-label">Email address:</div>                <div class="sf-form-cell"><input type="text" id="sf-sfdcloginform-email" size="30" maxlength="100" /></div>              </div>              <div class="sf-form-item">                <div class="sf-form-label">Password:</div>                <div class="sf-form-cell"><input type="password" id="sf-sfdcloginform-password" size="30" maxlength="100" /></div>              </div>              <div class="sf-form-item">                <div class="sf-form-label">Security token:</div>                <div class="sf-form-cell"><input type="password" id="sf-sfdcloginform-sectoken" size="30" maxlength="100" /></div>              </div>              <button type="submit" style="margin-top: 10px;">Login</button>              <div style="margin: 10px;">We do not store your salesforce.com login/password on our servers.</div>            </form>            <div class="sf-rv sf-sfdc-sessioninfo" id="sf-sfdc-sessioninfo"></div>          </div>          <div class="sf-sfdc-action-panel" id="sf-sfdc-panel-objects">            <span class="sf-pseudolink sf-sfdc-refresh-objects" title="Connect to salesforce.com and download available table info">Refresh</span>            <h4 class="sf-small-caption" style="float: left;">Tables linked to salesforce.com</h4>            <div class="sf-clearer"></div>            <div class="sf-sfdc-objectslist"></div>          </div>          <div class="sf-sfdc-action-panel" id="sf-sfdc-panel-availables">            <h4 class="sf-small-caption">Select salesforce.com objects</h4>            You may select up to 10 salesforce.com objects to link to tables.            <div class="sf-sfdc-availables-wrap"></div>            <div class="sf-sfdc-chosen-tables"></div>            Click Next to download the details of your selected objects from salesforce.com, and set up the linked tables.            <div style="margin-top: 15px; text-align: center;"><button class="sf-sfdc-getfields">Next &raquo;</button></div>          </div>          <div class="sf-sfdc-action-panel" id="sf-sfdc-panel-data">            <h4 class="sf-small-caption">Download data records</h4>            Choose the linked tables into which you wish to download data from your salesforce.com account.            <div class="sf-sfdc-data-wrap"></div>            <div class="sf-sfdc-download-data-status"></div>            <button class="sf-sfdc-download-data">Download</button>          </div>        </div>',"sfdcConnection");var P=new sf.core.Template('        <button class="sf-btn sf-sfdc-logout" title="Log out of salesforce">Log out</button>        <h4 class="sf-small-caption">Logged in to salesforce.com</h4>        <div class="sf-rv-item"><div class="sf-rv-label">User name:</div><div class="sf-rv-cell">${userInfo.userFullName}</div></div>        <div class="sf-rv-item"><div class="sf-rv-label">Email address:</div><div class="sf-rv-cell">${userInfo.userEmail}</div></div>        <div class="sf-rv-item"><div class="sf-rv-label">Organization:</div><div class="sf-rv-cell">${userInfo.organizationName}</div></div>        <div class="sf-rv-item"><div class="sf-rv-label">Time zone:</div><div class="sf-rv-cell">${userInfo.userTimeZone}</div></div>        <div class="sf-rv-item"><div class="sf-rv-label">Login time:</div><div class="sf-rv-cell">${loginAt}</div></div>        <div class="sf-clearer"></div>    ');var E=new sf.core.Template('        <% if (tables && tables.length) { %>        <table class="sf-sfdc-tables" cellspacing="0"><tr>          <% if (showCheckboxes) { %><th width="20"></th><% } %>          <th>Name</th><th>Record count</th><th>Last sync date</th></tr><% for (var i = 0; i < tables.length; i++) { %>          <tr><% var checkboxId = "sf-sfdc-tblckbox-" + tables[i].name; %>            <% if (showCheckboxes) { %><td><input type="checkbox" class="sf-ckbox" id="${checkboxId}" value="${tables[i].name}" /></th><% } %>            <td class="sf-sfdc-objlist-label"><label for="${checkboxId}">${tables[i].label}</label></td>            <td class="sf-sfdc-objlist-nrecs sf-sfdc-objlist-nrecs-${tables[i].name}" align="right">${tables[i].recordCount}</td>            <td class="sf-sfdc-objlist-lastsync">${tables[i].lastSyncDate}</td>          </tr>          <% } %>        </table>        <% } else { %>          <div style="margin: 20px;">You have no tables linked to salesforce.com.           You must <span style="float: none;" class="sf-pseudolink sf-sfdc-refresh-objects" title="Connect to salesforce.com and download available table info">download table info</span> before you can link them.</div>        <% } %>    ');var C=new sf.core.Template('          <ul class="sf-sfdc-available-objects">            <% for (var i = 0; i < tables.length; i++) { %>              <li class="sf-sfdc-available-object">                <% if (tables[i].isMapped) { %>                  <span class="sf-sfdc-existingtable">${tables[i].name}</span>                <% } else { %>                  <input type="checkbox" class="sf-ckbox" id="sf-sfdc-avail-${i}" value="${tables[i].name}" />                  <label for="sf-sfdc-avail-${i}">${tables[i].name}</label>                <% } %>              </li>            <% } %>          </ul>    ');sf.uix.sfdcConnection.superclass.constructor.call(this,{template:B});var A=function(Y,X,Z){if(H){X.sfdcSessionId=H.sessionId;X.sfdcServerUrl=H.serverUrl}sf.App.invokeDataService("/ext/sfdc/"+Y,X,Z)};var G=function(){var X=$("#sf-sfdcloginform-email");var Y=X.val();var c=$("#sf-sfdcloginform-password");var a=c.val();var Z=$("#sf-sfdcloginform-sectoken");var b=Z.val();if(!Y){sf.ui.Util.reportError("Please provide your email address.",X);return false}if(!a){sf.ui.Util.reportError("Please provide your password.",c);return false}if(!b){sf.ui.Util.reportError("Please provide your security token.",c);return false}A("login.js",{userName:Y,password:a+b},T);return false};var J=function(){var X=$("#sf-sfdc-panel-session");$(".sf-sfdc-login",X).show();$(".sf-sfdc-sessioninfo",X).hide()};var V=null;var H=null;var T=function(Y){var Z=I("sf-sfdc-panel-session");$(".sf-sfdc-login",Z).hide();var X=$(".sf-sfdc-sessioninfo",Z).show();if(Y.error){X.html(Y.error)}else{X.html(P.process(Y));H=Y;$(".sf-sfdc-logout",X).click(J)}};var F=function(Y){$(".sf-sfdc-menu-li",V).removeClass("sf-sfdc-menu-li-selected");Y.addClass("sf-sfdc-menu-li-selected");var X=Y.attr("panelId");I(X);if(X=="sf-sfdc-panel-data"){$(".sf-sfdc-download-data-status",V).html("")}};var I=function(X){$(".sf-sfdc-action-panel",V).hide();return $("#"+X).show()};var D="sfdc";var W=[];var O=function(){this.checked?$(this.parentNode).addClass("sf-sfdc-selected-object"):$(this.parentNode).removeClass("sf-sfdc-selected-object");W=jQuery.map($(".sf-sfdc-available-objects .sf-ckbox:checked",V),function(Y){return Y.value});var X=W.length<=0?"No selected objects":String.format("{0} selected object(s): {1}",W.length,W.join(", "));$(".sf-sfdc-chosen-tables",V).html(X)};var Q=function(a){var X=I("sf-sfdc-panel-availables");var Y=L();var Z=a.objectNames.map(function(c){var b=Y.find(c,function(e,d){return e.name==d})!=null;return{name:c,isMapped:b}});$(".sf-sfdc-availables-wrap",X).html(C.process({tables:Z}));$(".sf-sfdc-chosen-tables",V).html("");$(".sf-sfdc-available-objects .sf-ckbox",X).click(O)};var N=function(){if(!H){sf.ui.Util.reportError("Please log in to salesforce.com via the 'Session setup' tab.");return }W=[];A("getObjectNames.js",{},Q)};var U=function(X){$(".sf-sfdc-objectslist",V).html("New tables:<br/>"+E.process({tables:X.objects,showCheckboxes:false}));I("sf-sfdc-panel-objects");sf.ui.Util.informationAlert("New tables will be available when you log in next.")};var S=function(){if(!H){sf.ui.Util.reportError("Please log in to salesforce.com via the 'Session setup' tab.");return }var X=W.length;if(X<=0){sf.ui.Util.reportError("Please select at least one salesforce.com object.",$(".sf-sfdc-getfields",V));return }if(X>R){sf.ui.Util.reportError(String.format("Please select at most {0} salesforce.com objects.",R),$(".sf-sfdc-getfields",V));return }A("syncMetadata.js",{objectNames:W},U)};var M=function(X){if(!H){sf.ui.Util.reportError("Please log in to salesforce.com via the 'Session setup' tab.");return }var a=jQuery.map($("#sf-sfdc-panel-data .sf-ckbox:checked",V),function(d){return d.value});var b=a.length;if(b<=0){sf.ui.Util.reportError("Please select at least one linked table above.",$(X.target));return }var Z=$(".sf-sfdc-download-data",V);Z.attr("disabled","disabled");var c=$(".sf-sfdc-download-data-status",V).show();c.html("");var Y=a.map(function(e,d){return function(){c.append(String.format("Downloading {0} records...",e));A("syncData.js",{objectName:e},function(f){c.append(" done.<br/>");$(".sf-sfdc-objlist-nrecs-"+e,V).html(parseInt(f.recordCount).formatWithCommas());if(d<b-1){(Y[d+1])()}else{Z.attr("disabled","")}})}});(Y[0])()};var L=function(){var X=sf.data.ObjectRegistry.objectNames();return X.map(function(Z){var Y=sf.data.ObjectRegistry.get(Z);return Y.dataSource&&Y.dataSource.name==D?Y:null})};var K=function(){V=this.getRootElement();I("sf-sfdc-panel-session");var Y=$("#sf-sfdc-loginform");Y[0].onsubmit=G;$(".sf-sfdc-menu-ul",V).click(function(Z){var a=$(Z.target);if(a.hasClass("sf-sfdc-menu-li")){F(a)}});var X=L();$(".sf-sfdc-objectslist",V).html(E.process({tables:X,showCheckboxes:false}));$(".sf-sfdc-data-wrap",V).html(E.process({tables:X,showCheckboxes:true}));$(".sf-sfdc-refresh-objects",V).click(N);$(".sf-sfdc-getfields",V).click(S);$(".sf-sfdc-download-data",V).click(M)}.createDelegate(this);this.bind("render",function(){K()})};sf.extend(sf.uix.sfdcConnection,sf.ui.HTMLFragment);sf.uix.ZenCartConnection=function(D){var I=D&&D.dataService||sf.App.getDataService();var N=new sf.core.Template('        <div class="sf-page-caption-bar"><h2 class="sf-page-caption">${cartTypeLabel} connector</h2><div class="sf-clearer"></div></div>        <div class="sf-zencart-action-panel" id="sf-zencart-panel-session">          <p>Use this screen to log in to your ${cartTypeLabel} administration system, choose the data records to retrieve and store into Apsona.<br/>          Your ${cartTypeLabel} system must support the <a href="http://apsona.com/pages/ec/downloads.html" target="_blank">Apsona add-on</a> for this to work.          </p>          <form class="sf-zencart-login" id="sf-zencart-loginform">            <div class="sf-form-item">              <div class="sf-form-label">${cartTypeLabel} Admin URL:</div>              <div class="sf-form-cell">                <span id="sf-zencart-loginform-url"></span>                <span class="sf-form-helpcell">                  (e.g., http://my-co.com/shopcart/admin, <i>excluding</i> the <code>login.php</code>)                </span>              </div>            </div>            <div class="sf-form-item">              <div class="sf-form-label">Admin username:</div>              <div class="sf-form-cell" id="sf-zencart-loginform-admin_name"></div>            </div>            <div class="sf-form-item">              <div class="sf-form-label">Admin password:</div>              <div class="sf-form-cell" id="sf-zencart-loginform-admin_pass"></div>            </div>            <div class="sf-form-item">              <div class="sf-form-label">Records to retrieve:</div>              <div class="sf-form-cell">                <% for (var i = 0; i < tables.length; i++) { %>                <span class="sf-zencart-tblitem">                  <input type="checkbox" value="${tables[i].name}" id="sf-zencart-tbl-${tables[i].name}" checked="true" class="sf-zencart-tbl-ckbox"/>                  <label for="sf-zencart-tbl-${tables[i].name}">${tables[i].label}</label>                </span>                <% } %>              </div>            </div>            <div class="sf-form-item">              <div class="sf-form-label">Changed since:</div>              <div class="sf-form-cell" id="sf-zencart-loginform-date_since"></div>            </div>            <div class="sf-form-item">              <div class="sf-form-label"></div>              <div class="sf-form-cell"><input type="submit" style="margin-top: 10px;" id="sf-zencart-submit" value="Go" /></div>            </div>            <div class="sf-clearer"></div>            <p style="margin: 10px;">Apsona will not store your ${cartTypeLabel} login/password on its servers.</p>          </form>        </div>        <div class="sf-zencart-status"><div class="sf-zencart-status-done"></div></div>',"zencartConnection");var A=sf.App.configParameter("shoppingCartTypeLabel")||"Zen Cart";sf.uix.ZenCartConnection.superclass.constructor.call(this,{template:N,dataModel:{cartTypeLabel:A,tables:[{name:"Customer",label:"Customers"},{name:"Order",label:"Orders"},{name:"Product",label:"Products"}]},domElementId:"sf-zencart-wrap"});var O=this,F=null,J=null;var C=null,M=false,H=null,K=null,L=null;function B(P){if(!P){$("#sf-zencart-submit",F).attr("disabled","");if(!M){H.showFinalStatus();sf.ui.Util.informationAlert("Please re-login to access the updated data.")}}else{if(P.failure){if(K){H.update(K,L,"fail")}H.showFinalStatus(String.format('<span style="color: red;">{0}</span>',P.failure));$("#sf-zencart-submit",F).attr("disabled","");M=true}else{if(P.message){var Q=P.message.split(" ");L=Q[0];if(Q[0]=="download"){K=P.tableName}if(Q[0]=="download"||Q[0]=="parse"){H.update(K,Q[0],Q[1])}else{if(P.message!="completed"){var R=P.message+(P.amountPercent?(" ("+P.amountPercent+"%)"):"");H.update(K,"store",R)}}}}}}function E(U,R,P){var T=[];$(".sf-zencart-tbl-ckbox").each(function(){if(this.checked){T.push(this.value)}});var Q=U.url;if(!Q.endsWith("/admin")){if(!sf.ui.Util.askForConfirmation("The "+A+" Admin URL does not end with /admin. Are you sure this is ok?")){return }}var S={admin_name:U.admin_name,admin_pass:U.admin_pass,url:U.url,tableNames:T};if(U.date_since){S.date_since=U.date_since.format("MM/dd/yyyy")}$("#sf-zencart-submit",F).attr("disabled","true");if(H==null){H=new sf.uix.CartConnectorStatus().renderTo(".sf-zencart-status",F)}else{H.reset()}H.show();M=false;I.invokeServiceIncremental("/ext/zencart/get.html",S,B)}function G(){F=O.getRootElement();var P=[{fieldId:"url",label:"Admin URL",disallowEmpty:true},{fieldId:"admin_name",label:"Admin user name",disallowEmpty:true},{fieldId:"admin_pass",label:"Admin password",disallowEmpty:true,isPassword:true},{fieldId:"date_since",label:"Changed since date",fieldType:"date",helpText:"If you specify a date here, only the records created or changed since that date will be retrieved from your ZenCart."}];J=sf.ui.Form.createFromDOM("sf-zencart-loginform",P);J.handleSubmit=E;C=$(".sf-zencart-status-done",F)}this.bind("render",function(){G()});this.bind("show",function(){if(J){J.reset();C[0].innerHTML="";if(H){H.hide()}}})};sf.extend(sf.uix.ZenCartConnection,sf.ui.HTMLFragment);sf.uix.CartConnectorStatus=function(B){sf.uix.CartConnectorStatus.superclass.constructor.call(this,B);var D=sf.allocateId();var A=String.format('      <div id="{0}">        <h3 style="float: left;">Retrieval Status</h3><div style="float: right; display: none;" class="sf-zencart-status-working">Working...</div>        <table style="width: 400px; border: 1px solid #ccc;clear:left;" cellspacing="0">          <thead>            <tr><th style="width: 150px; text-align: left;">Table name</th><th style="width: 70px;">Download</th><th style="width: 70px;">Extract</th><th style="width: 120px;">Store</th></tr>          </thead>          <tbody></tbody>        </table>        <div id="{0}_finalstatus" style="display: none;padding: 10px 5px;"></div>      </div>',D);var E=new sf.core.Template('      <% for (var i = 0; i < tables.length; i++) { %>        <tr id="${id}-${tables[i]}"><td>${tables[i]}</td><td align="center"></td><td align="center"></td><td></td></tr>      <% } %>    ');var C=null;this.renderTo=function(F){if(!F||!F.jquery){F=$(F)}C=$(A);F.append(C);return this};this.reset=function(){$("table tbody",C)[0].innerHTML="";$(".sf-zencart-status-working",C).hide();$("#"+D+"_finalstatus").hide();return this};this.update=function(G,K,H){$(".sf-zencart-status-working",C).show();if(!$("#"+D+"-"+G).length){$("table tbody",C).append(E.process({tables:[G],id:D}))}var I=K=="download"?1:(K=="parse"?2:3);var L=$("td",$("#"+D+"-"+G))[I];if(!L){return }if(I==1||I==2){var F=H=="start"?"indicator.white.gif":(H=="fail"?"red-x-15x15.png":"green_check_15x15.gif");var J=$("img",$(L)).attr("src");if(J!=F){L.innerHTML=String.format('<img src="/img/{0}" />',F)}}else{L.innerHTML=H}};this.showFinalStatus=function(F){var G=$("#"+D+"_finalstatus");G.show().html(F||"Done.");if(F){G.addClass("ap-error")}else{G.removeClass("ap-error")}$(".sf-zencart-status-working",C).hide()};this.getRootElement=function(){return C}};sf.extend(sf.uix.CartConnectorStatus,sf.ui.Widget);sf.util.ImportValidator=function(D){function C(G){sf.core.Observable.call(this);var I=null;var H=sf.data.ObjectRegistry.get(G);if(!H){sf.core.reportError("ImportValidator.keyLookup: Can't find metadata for table "+G);return null}var F=H.keyFieldId;var J=function(K){I=(K.records||[]).map(function(L){return L[F]});this.notifyListeners("ready",this)}.createDelegate(this);this.isReady=function(){return I!=null};this.contains=function(K){return I.indexOf(K)>=0};D.getRecords(G,{neededFields:[{fieldId:F}],sort:[{fieldIndex:0}]},J)}var B={};var E={};var A=function(F,J,I,L){if(F.startsWith("ref:")){var H=F.substring(4);var K=B[H];if(!K){K=new C(H);B[H]=K}return function(M,N){if(K.isReady()){N(K.contains(M)?M:undefined)}else{K.bind("ready",function(){N(K.contains(M)?M:undefined)})}}}switch(F){case"uuid":case"builtin:uuid":return function(M,N){if(E[M]){N(null)}else{E[M]=1;N(M)}};case"picklist":return function(N,Q){if(!I){var O=J?J.find(N,function(S,R){return S.text.toLowerCase()==R.toLowerCase()}):null;Q(O&&O.value||undefined)}else{if(N&&N.length>0){var M=null;if(!J.length){M="1"}var P=J.indexOf(N,function(S,R){return S.text.toLowerCase()==R.toLowerCase()});if(P<0){M=(1+J.length).toString();J.push({value:M,text:N})}else{M=(1+P).toString()}Q(M)}else{Q("")}}};case"date":case"datetime":case"builtin:created":case"builtin:modified":return function(M,O){if(!M){return M}var N=Date.parseDate(M,L);O(N?N.format("yyyy-MM-dd HH:mm:ss.0"):undefined)};default:var G=sf.data.TypeInfo.converter(F=="builtin:created_by"||F=="builtin:modified_by"?"string":F);if(!G){sf.core.reportError("Can't find converter for field type "+F);return null}return function(M,N){N(G(M))}}};this.run=function(J,L,M,K,N){E={};var F=function(Q,P,R){return function(S){R(Q,P,S)}};var O=function(P){var S=J.data.length;if(P<S){for(var R=P;R<Math.min(S,P+10);R++){for(var Q=0;Q<L.length;Q++){var T=L[Q].colNo;var U=J.data[R][T];if(L[Q].fieldType=="string"){N(R,T,U||"")}else{if(U&&U.length>0){L[Q].validate(U,F(R,T,N))}else{N(R,T,"")}}}}setTimeout(function(){O(P+10)},50)}};for(var I=0,G=L.length;I<G;I++){var H=L[I];if(H.fieldType=="picklist"&&!H.choicesList){H.choicesList=[]}H.validate=A(H.fieldType,H.choicesList,M,K)}O(0)}};