var FunctionMonitor={version:"2.1",can_trace:1,functions:[],function_index:[],stack_len:20,hold_max:1,clearMetrics:function(){var C=FunctionMonitor.function_index.length,A=0,B;for(;A<C;){B=FunctionMonitor.functions[FunctionMonitor.function_index[A++]];B.metrics.length=0;B.stackCount=0}},getAllMetrics:function(){var C=FunctionMonitor.function_index.length,A=0,B=[];for(;A<C;){B.push(FunctionMonitor.getMetrics(FunctionMonitor.function_index[A++]))}return B.join("\n")},getMetrics:function(F){var H=FunctionMonitor.functions[F],A=[],G=0,B,C,I,E,D;if(typeof (H)=="object"){A.push(F+":");I=H.metrics;E=I.length;var D="   ";for(;G<E;G++){B=I[G];C=-1;if(B&&B.stop&&B.start){C=B.stop-B.start}A.push(D+"#"+G+" time="+C);if(B.valOffset>0){A.push(D+D+"process: "+B.valOffset)}if(B.route!=null&&B.route!="null"){A.push(D+D+"trace = "+B.route)}}}else{A.push(F+" is not a registered function.")}return A.join("\n")},getWindowName:function(C){var B="window",A;if(C&&C!=window){A=C;if(A.name){B=A.name}else{B="frame"}}return B},getIsRegistered:function(D,A,E){var C=window,G=FunctionMonitor.getWindowName(A),B="",F;if(G!="window"){B=G+"-"}if(E){B+=E+"--"}F="dispatch-"+B+D;return(typeof FunctionMonitor.functions[F]=="object"?1:0)},unregisterAll:function(){var A=FunctionMonitor.function_index.length,B,C;for(B=A-1;B>=0;B--){C=FunctionMonitor.functions[FunctionMonitor.function_index[B]];if(!C){continue}if(C.proto){FunctionMonitor.unregister(C.name,C.window,C.proto)}else{FunctionMonitor.unregister(C.name,C.window)}}return A},unregister:function(E,F,D){var L=window,H=FunctionMonitor.getWindowName(F),K="",B,J,G,I,A,C=0;if(F&&F!=window){L=F}if(H!="window"){K=H+"-"}if(D){K+=D+"--"}B="dispatch-"+K+E;J=FunctionMonitor.functions[B];if(!J){alert(B+" is not a monitored function");return }G=J.index;FunctionMonitor.function_index[G]=null;if(!D&&E.indexOf(".")>-1){A=FunctionMonitor.getObject(E.substring(0,E.lastIndexOf(".")),L);if(A){C=1;A[E.substring(E.lastIndexOf(".")+1,E.length)]=J.fp}}else{if(D&&D.indexOf(".")>-1){A=FunctionMonitor.getObject(D,L);if(A&&A.prototype){C=1;A.prototype[E]=J.fp}}}if(!C){if(!D){if(L[E]){L[E]=J.fp}else{alert(E+" does not exist")}}else{if(L[D].prototype[E]){L[D].prototype[E]=J.fp}else{alert(D+"."+E+" does not exist.")}}}if(!FunctionMonitor[B]){alert(B+" does not have a monitor definition.");return }I=FunctionMonitor[B];if(L.onload==I){L.onload=J.fp}FunctionMonitor[B]=null;FunctionMonitor._pack()},_pack:function(){var C=FunctionMonitor.functions,B=FunctionMonitor.function_index,D,F=0,A,E;FunctionMonitor.functions=[];FunctionMonitor.function_index=[];D=B.length;for(;F<D;F++){if(B[F]!=null){A=FunctionMonitor.function_index.length;FunctionMonitor.function_index[A]=B[F];E=C[B[F]];E.index=A;FunctionMonitor.functions[B[F]]=E}}},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(D,A,H){var C,B=FunctionMonitor.functions[D],L,M,E,K,N,J,G,F,I,P,O;if(!B){if(!FunctionMonitor.alert_error){FunctionMonitor.alert_error=1;alert("Error: invalid function reference: "+D)}return }L=new Date();M=FunctionMonitor.makeMetric();E=null;K=null;if(FunctionMonitor.dispatch.caller&&FunctionMonitor.dispatch.caller.caller){E=FunctionMonitor.dispatch.caller.caller}if(FunctionMonitor.can_trace){M.route=FunctionMonitor.traceRoute(E);if(M.route){M.route+="->"}M.route+=B.name+FunctionMonitor.printArguments(H)}N=B.ref;J=new Date();M.start=J.getTime();if(!B.classRef){C=B.fp.apply(E,H)}else{C=B.fp.apply(A,H)}M.monStatus=1;J=new Date();M.stop=J.getTime();G=L.getTime();L=new Date();M.valOffset=L.getTime()-G-(M.stop-M.start);F;if(FunctionMonitor.stack_len>0){if(B.stackCount>=FunctionMonitor.stack_len){B.stackCount=0}F=B.stackCount;I=B.metrics[F];if(I){P=I.stop-I.start;O=M.stop-M.start;if(P>O){M=I}}B.stackCount++}else{F=B.metrics.length}B.metrics[F]=M;return C},printArguments:function(D){var F=0,C="(",B,E,A;for(;F<D.length;F++){if(F>0){C+=", "}B="";E=D[F];t=typeof E;A=0;switch(t){case"string":B='"';E=E.replace(/\r/gi,"\\r");E=E.replace(/\n/gi,"\\n");E=E.replace(/\t/gi,"\\t");E=E.replace(/\s+/gi," ");if(E.length>25){E=E.substring(0,17)+"... ("+E.length+")"}break;case"object":if(E instanceof Array){E="{array("+E.length+")}"}else{if(E instanceof Date){E="{date("+E.toString()+")}"}else{E="{obj}"}}A=0;break;case"function":E="{function}";A=0;break}C+=B+E+B+(A?" {as "+A+"}":"")}C+=")";return C},traceRoute:function(C){var G="",B=[],E=0,A,H,F,D;if(C!=null){while(C&&C!=null){A=FunctionMonitor.getFunctionName(C.toString());if(A==null){C=null;break}B.push(A+FunctionMonitor.printArguments(C.arguments));C=C.caller}G=B.reverse().join("->")}else{G="null"}return G},getFunctionName:function(A){var B=A.match(/function\s([A-Za-z0-9_]*)\(/gi);if(A==null){return A}if(B!=null&&B.length){A=B[0];A=A.replace(/^function\s+/,"");A=A.replace(/^\s*/,"");A=A.replace(/\s*$/,"");A=A.replace(/\($/,"");return A}else{return null}},getObject:function(A,B){var E,F=0,G,D=(B?B:window),H,C;H=D;if(typeof A=="string"){E=A.split(".");C=E.length;if(C==0){return 0}for(;F<C;){G=E[F++];if(typeof H[G]!="object"&&typeof H[G]!="function"){return 0}H=H[G]}}else{return 0}if(typeof H!="function"&&typeof H!="object"){return 0}return H}};