var FunctionMonitor={version:"2.1",can_trace:1,functions:[],function_index:[],stack_len:20,hold_max:1,clearMetrics:function(){var F=FunctionMonitor.function_index.length,E=0,D;for(;E<F;){D=FunctionMonitor.functions[FunctionMonitor.function_index[E++]];D.metrics.length=0;D.stackCount=0}},getAllMetrics:function(){var F=FunctionMonitor.function_index.length,E=0,D=[];for(;E<F;){D.push(FunctionMonitor.getMetrics(FunctionMonitor.function_index[E++]))}return D.join("\n")},getMetrics:function(R){var P=FunctionMonitor.functions[R],N=[],Q=0,M,L,O,J,K;if(typeof (P)=="object"){N.push(R+":");O=P.metrics;J=O.length;var K="   ";for(;Q<J;Q++){M=O[Q];L=-1;if(M&&M.stop&&M.start){L=M.stop-M.start}N.push(K+"#"+Q+" time="+L);if(M.valOffset>0){N.push(K+K+"process: "+M.valOffset)}if(M.route!=null&&M.route!="null"){N.push(K+K+"trace = "+M.route)}}}else{N.push(R+" is not a registered function.")}return N.join("\n")},getWindowName:function(F){var D="window",E;if(F&&F!=window){E=F;if(E.name){D=E.name}else{D="frame"}}return D},getIsRegistered:function(K,N,J){var L=window,H=FunctionMonitor.getWindowName(N),M="",I;if(H!="window"){M=H+"-"}if(J){M+=J+"--"}I="dispatch-"+M+K;return(typeof FunctionMonitor.functions[I]=="object"?1:0)},unregisterAll:function(){var E=FunctionMonitor.function_index.length,D,F;for(D=E-1;D>=0;D--){F=FunctionMonitor.functions[FunctionMonitor.function_index[D]];if(!F){continue}if(F.proto){FunctionMonitor.unregister(F.name,F.window,F.proto)}else{FunctionMonitor.unregister(F.name,F.window)}}return E},unregister:function(P,O,Q){var U=window,M=FunctionMonitor.getWindowName(O),V="",S,W,N,X,T,R=0;if(O&&O!=window){U=O}if(M!="window"){V=M+"-"}if(Q){V+=Q+"--"}S="dispatch-"+V+P;W=FunctionMonitor.functions[S];if(!W){alert(S+" is not a monitored function");return }N=W.index;FunctionMonitor.function_index[N]=null;if(!Q&&P.indexOf(".")>-1){T=FunctionMonitor.getObject(P.substring(0,P.lastIndexOf(".")),U);if(T){R=1;T[P.substring(P.lastIndexOf(".")+1,P.length)]=W.fp}}else{if(Q&&Q.indexOf(".")>-1){T=FunctionMonitor.getObject(Q,U);if(T&&T.prototype){R=1;T.prototype[P]=W.fp}}}if(!R){if(!Q){if(U[P]){U[P]=W.fp}else{alert(P+" does not exist")}}else{if(U[Q].prototype[P]){U[Q].prototype[P]=W.fp}else{alert(Q+"."+P+" does not exist.")}}}if(!FunctionMonitor[S]){alert(S+" does not have a monitor definition.");return }X=FunctionMonitor[S];if(U.onload==X){U.onload=W.fp}FunctionMonitor[S]=null;FunctionMonitor._pack()},_pack:function(){var I=FunctionMonitor.functions,J=FunctionMonitor.function_index,H,L=0,K,G;FunctionMonitor.functions=[];FunctionMonitor.function_index=[];H=J.length;for(;L<H;L++){if(J[L]!=null){K=FunctionMonitor.function_index.length;FunctionMonitor.function_index[K]=J[L];G=I[J[L]];G.index=K;FunctionMonitor.functions[J[L]]=G}}},register:function(sFunctionName,windowRef,sClassRef){var oFrame=window,sFrameName=FunctionMonitor.getWindowName(windowRef),vFP,sRefer="",sFuncStore,iIndex=-1,oPtr;if(windowRef&&windowRef!=window){oFrame=windowRef}if(!sClassRef&&sFunctionName.indexOf(".")>-1){vFP=FunctionMonitor.getObject(sFunctionName,oFrame)}else{if(sClassRef&&sClassRef.indexOf(".")>-1){oPtr=FunctionMonitor.getObject(sClassRef,oFrame);if(oPtr&&oPtr.prototype){vFP=oPtr.prototype[sFunctionName]}}}if(!vFP){if(!sClassRef){vFP=oFrame[sFunctionName]}else{vFP=oFrame[sClassRef];if(vFP){if(vFP.prototype){vFP=vFP.prototype[sFunctionName]}else{vFP=vFP[sFunctionName]}}}}if(typeof vFP=="function"){if(sFrameName!="window"){sRefer=sFrameName+"-"}if(sClassRef){sRefer+=sClassRef+"--"}sFuncStore="dispatch-"+sRefer+sFunctionName;if(!FunctionMonitor.functions[sFuncStore]){iIndex=FunctionMonitor.function_index.length;FunctionMonitor.function_index[iIndex]=sFuncStore}else{iIndex=FunctionMonitor.functions[sFuncStore].index}FunctionMonitor.functions[sFuncStore]={name:sFunctionName,classRef:sClassRef,refName:sFrameName,ref:oFrame,fp:vFP,index:iIndex,metrics:[],stackCount:0};eval('FunctionMonitor["'+sFuncStore+'"]=function(){return FunctionMonitor.dispatch("'+sFuncStore+'",this,arguments);}');var bSet=0;if(!sClassRef&&sFunctionName.indexOf(".")>-1){oPtr=FunctionMonitor.getObject(sFunctionName.substring(0,sFunctionName.lastIndexOf(".")),oFrame);if(oPtr){bSet=1;oPtr[sFunctionName.substring(sFunctionName.lastIndexOf(".")+1,sFunctionName.length)]=FunctionMonitor[sFuncStore]}}else{if(sClassRef&&sClassRef.indexOf(".")>-1){oPtr=FunctionMonitor.getObject(sClassRef,oFrame);if(oPtr&&oPtr.prototype){bSet=1;oPtr.prototype[sFunctionName]=FunctionMonitor[sFuncStore]}}}if(!bSet){if(!sClassRef){oFrame[sFunctionName]=FunctionMonitor[sFuncStore]}else{if(oFrame[sClassRef].prototype){oFrame[sClassRef].prototype[sFunctionName]=FunctionMonitor[sFuncStore]}else{oFrame[sClassRef][sFunctionName]=FunctionMonitor[sFuncStore]}}}if(oFrame.onload==vFP){oFrame.onload=FunctionMonitor[sFuncStore]}}else{alert(sFunctionName+" is not a function")}},makeMetric:function(){return{start:null,stop:null,valOffset:-1,route:null,monStatus:-1,duration:-1,caller:null,parentName:null}},dispatch:function(Q,T,c){var R,S=FunctionMonitor.functions[Q],Y,X,f,Z,W,a,d,e,b,U,V;if(!S){if(!FunctionMonitor.alert_error){FunctionMonitor.alert_error=1;alert("Error: invalid function reference: "+Q)}return }Y=new Date();X=FunctionMonitor.makeMetric();f=null;Z=null;if(FunctionMonitor.dispatch.caller&&FunctionMonitor.dispatch.caller.caller){f=FunctionMonitor.dispatch.caller.caller}if(FunctionMonitor.can_trace){X.route=FunctionMonitor.traceRoute(f);if(X.route){X.route+="->"}X.route+=S.name+FunctionMonitor.printArguments(c)}W=S.ref;a=new Date();X.start=a.getTime();if(!S.classRef){R=S.fp.apply(f,c)}else{R=S.fp.apply(T,c)}X.monStatus=1;a=new Date();X.stop=a.getTime();d=Y.getTime();Y=new Date();X.valOffset=Y.getTime()-d-(X.stop-X.start);e;if(FunctionMonitor.stack_len>0){if(S.stackCount>=FunctionMonitor.stack_len){S.stackCount=0}e=S.stackCount;b=S.metrics[e];if(b){U=b.stop-b.start;V=X.stop-X.start;if(U>V){X=b}}S.stackCount++}else{e=S.metrics.length}S.metrics[e]=X;return R},printArguments:function(H){var L=0,I="(",J,G,K;for(;L<H.length;L++){if(L>0){I+=", "}J="";G=H[L];t=typeof G;K=0;switch(t){case"string":J='"';G=G.replace(/\r/gi,"\\r");G=G.replace(/\n/gi,"\\n");G=G.replace(/\t/gi,"\\t");G=G.replace(/\s+/gi," ");if(G.length>25){G=G.substring(0,17)+"... ("+G.length+")"}break;case"object":if(G instanceof Array){G="{array("+G.length+")}"}else{if(G instanceof Date){G="{date("+G.toString()+")}"}else{G="{obj}"}}K=0;break;case"function":G="{function}";K=0;break}I+=J+G+J+(K?" {as "+K+"}":"")}I+=")";return I},traceRoute:function(O){var K="",P=[],M=0,I,J,L,N;if(O!=null){while(O&&O!=null){I=FunctionMonitor.getFunctionName(O.toString());if(I==null){O=null;break}P.push(I+FunctionMonitor.printArguments(O.arguments));O=O.caller}K=P.reverse().join("->")}else{K="null"}return K},getFunctionName:function(C){var D=C.match(/function\s([A-Za-z0-9_]*)\(/gi);if(C==null){return C}if(D!=null&&D.length){C=D[0];C=C.replace(/^function\s+/,"");C=C.replace(/^\s*/,"");C=C.replace(/\s*$/,"");C=C.replace(/\($/,"");return C}else{return null}},getObject:function(I,P){var M,L=0,K,N=(P?P:window),J,O;J=N;if(typeof I=="string"){M=I.split(".");O=M.length;if(O==0){return 0}for(;L<O;){K=M[L++];if(typeof J[K]!="object"&&typeof J[K]!="function"){return 0}J=J[K]}}else{return 0}if(typeof J!="function"&&typeof J!="object"){return 0}return J}};