function pinger(n,t,i,r,u,f,e,o,s,h){this.name=n,this.shortname=t,this.datahistorysize=i,this.ipaddr=r,this.bytes=u,this.ttl=f,this.resolvehostnames=e,this.timeout=o,this.enabled=s,this.color=0,this.colorstr="",this.errBack=null,this.inflight=!1,this.max=0,this.min=0,this.avg=0,this.avgtotal=0,this.servername=h,this.data=[],this.sent=0,this.dropped=0,this.latest=0,this.bad=0,this.ok=0,this.good=0,this.NextPing=function(){this.data.length>=this.datahistorysize&&(this.data=this.data.slice(Math.abs(this.datahistorysize-this.data.length)+1));var t=document.getElementById("plugin0"),n=this;t.ping&&(this.inflight=!0,t.ping(this.ipaddr,this.bytes,this.ttl,this.resolvehostnames,this.timeout,function(t,i,r){n.inflight=!1,n.sent++,t==-2?(n.dropped++,n.data.push(null),n.latest=null,n.bad++):t==-1?n.errBack&&n.errBack(r):(n.data.push(t),n.latest=t,t>n.max&&(n.max=t),t<n.min&&(n.min=t),n.avgtotal+=t,t<=100?n.good++:t>100&&t<=300?n.ok++:n.bad++),n.avg=n.avgtotal/(n.sent-n.dropped)}))}}function graphicalPingRunner(n,t,i,r,u){function f(n,t,i){var e=[],o,u,h,r;if(me.visiblepoints<600)for(o=t-n.length,r=0;r<n.length;r++)e.push([o+r,n[r]]),o+r>=me.plot.getOptions().xaxes[0].min&&o+r<=me.plot.getOptions().xaxes[0].max&&me.pingers[i].enabled&&me.currentmax<n[r]&&(me.currentmax=n[r]);else{var s=me.totalpoints/me.visiblepoints,o=t-n.length,f=me.visiblepoints-Math.floor(n.length/s);for(n.length%s==0&&f++,u=-1,h=0,r=0;r<n.length;r++)h++,n[r]>u&&(u=n[r]),h>=s&&(e.push([f,u]),f>=me.plot.getOptions().xaxes[0].min&&f<=me.plot.getOptions().xaxes[0].max&&me.pingers[i].enabled&&me.currentmax<u&&(me.currentmax=u),u=-1,f++,h=0);n.length%s!=0&&(e.push([f,u]),f>=me.plot.getOptions().xaxes[0].min&&f<=me.plot.getOptions().xaxes[0].max&&me.pingers[i].enabled&&me.currentmax<u&&(me.currentmax=u))}return e}this.id=n,this.plot=null,this.totalpoints=t,this.visiblepoints=t,this.freq=i,this.stopped=!1,this.pingers=r,this.callback=u,this.ticksize=60/ping_interval,this.unitadjustment=1,this.yaxisstatus=!1,this.unitlabel="m",this.currentmax=1,me=this,this.starttime=new Date,this.enablePinger=function(n){me.pingers[n].enabled=!0,me.redraw()},this.disablePinger=function(n){me.pingers[n].enabled=!1,me.redraw()},this.getSeries=function(){s=[],me.currentmax=1;for(var n=0;n<r.length;n++)r[n].enabled?s.push({label:r[n].name,color:r[n].color,data:f(r[n].data,this.visiblepoints+1,n)}):s.push({label:r[n].name,color:r[n].color,data:[0,-1]});return s},this.wrapFormat=function(n){return"<span style='font-weight: bold;font-family:Arial;font-size:13px;'>"+n+"</span>"},this.formatY=function(n){return me.yaxisstatus?me.wrapFormat(String(Math.floor(n*100)/100)+"ms"):""},this.formatX=function(n){var i,r;if(n==me.visiblepoints)return me.wrapFormat("Latest");if(i=Math.abs(n-me.visiblepoints)/me.ticksize*me.unitadjustment,me.totalpoints==1800){if(i>=60){if(r="-"+Math.floor(i/60)+"h",i%60!=0&&i%60%3==0)switch(i%60){case 15:r="-"+Math.floor(i/60)+".25h";break;case 30:r="-"+Math.floor(i/60)+".5h";break;case 45:r="-"+Math.floor(i/60)+".75h"}else i%60!=0&&(r="");return me.wrapFormat(r)}return me.wrapFormat("-"+i+me.unitlabel)}return me.totalpoints<86400||me.totalpoints==86400&&i%3==0?me.wrapFormat("-"+i+me.unitlabel):""},this.start=function(){var u,i,t;for(this.stopped=!1,this.plot=$.plot(n,this.getSeries(),{series:{shadowSize:0,lines:{show:!0,lineWidth:2},points:{show:!1}},yaxis:{min:-.005,max:500.005,tickFormatter:this.formatY,color:"#000",tickColor:"#B3B3B3",zoomRange:null,panRange:[0,500]},xaxis:{min:0,max:me.visiblepoints,tickSize:this.ticksize,tickFormatter:this.formatX,color:"#000",tickColor:"#B3B3B3",zoomRange:null,panRange:[-3300/ping_interval,300/ping_interval]},legend:{show:!1,labelBoxBorderColor:"#fff",backgroundColor:"#000",position:"nw"},grid:{backgroundColor:"#fff",borderWidth:2,borderColor:"#B3B3B3",color:"#fff"},zoom:{interactive:!1},pan:{interactive:!0}}),u=$("#placeholder"),u.bind("plotpan",function(){me.redraw()}),i=this.plot.getData(),t=0;t<i.length;++t)r[t].colorstr=i[t].color;this.update()},this.stop=function(){this.stopped=!0},this.setX=function(n){me.totalpoints=n/ping_interval,me.visiblepoints=me.totalpoints<600?me.totalpoints:600,me.plot.getOptions().xaxes[0].max=me.visiblepoints,me.plot.getOptions().xaxes[0].min=0,n==3600?(me.plot.getOptions().xaxes[0].tickSize=100/ping_interval,me.plot.getOptions().xaxes[0].panRange=[-13800,me.visiblepoints],me.ticksize=100/ping_interval,me.unitadjustment=10/ping_interval,me.unitlabel="m"):n==300?(me.plot.getOptions().xaxes[0].tickSize=60/ping_interval,me.plot.getOptions().xaxes[0].panRange=[-3300/ping_interval,300/ping_interval],me.ticksize=60/ping_interval,me.unitadjustment=1,me.unitlabel="m"):n==86400&&(me.plot.getOptions().xaxes[0].tickSize=25,me.plot.getOptions().xaxes[0].panRange=[0,600],me.ticksize=25,me.unitadjustment=1,me.unitlabel="h"),me.redraw()},this.redraw=function(){if(me.plot.setData(me.getSeries()),me.pingers[0].data.length>1){for(var n=Math.ceil(me.currentmax*1.1);n%5!=0;)n++;me.plot.getOptions().yaxes[0].min=0,me.plot.getOptions().yaxes[0].max=n+.005,me.plot.getOptions().yaxes[0].tickSize=n/5,me.plot.getOptions().yaxes[0].panRange=[0,n],me.yaxisstatus||($("#popup").hide(),$("#statslabel").html("").append('<b>Statistics</b> <span style="font-family:Arial;">(since '+me.starttime.toLocaleTimeString()+" on "+me.starttime.toLocaleDateString()+")</span>"),$("#statcontainer").fadeIn(),$("#latency_label").show(),me.yaxisstatus=!0)}me.plot.setupGrid(),me.plot.draw()},this.update=function(){me.redraw(),r[0].data.length>=r[0].datahistorysize&&(me.starttime=new Date(me.starttime.getTime()+me.freq));for(var n=0;n<me.pingers.length;n++)me.pingers[n].NextPing();me.callback&&me.callback(r),me.stopped||setTimeout(function(){me.update()},me.freq)}}var lastsavetime=null,pageerror=!1,ping_interval=2;$("#plugin0").ready(function(){$("#count").html("Initializing, please wait...");var t=document.getElementById("plugin0"),n=!0;t.valid?t.ping&&t.hostNameToIp||(pageerror=!0,msg='<img src="'+warningImg+"\" /> <br> The BBE Plugin was detected, but you need to <a target='_blank' href ='"+vpnlink+"'>upgrade</a> to the latest version to use this tool. Please install the update and restart your browser.",$("#main").fadeTo("fast",.35,function(){$("#popup").html(msg).show()}),$("#latency_label").hide(),n=!1):(pageerror=!0,msg='<img src="'+warningImg+"\" /> <br> In order to use this tool, you must <a target='_blank' class='blue_link' href ='"+vpnlink+"'>install</a> the BBE Plugin. Please install the plugin and restart your browser.",$("#main").fadeTo("fast",.35,function(){$("#popup").html(msg)}),$("#latency_label").hide(),n=!1),$(document).ready(function(){function e(n){f||(pageerror=!0,n='<img src="'+exImg+'" /><br>Sorry, an unexpected error was encountered. The Connection Quality Monitor will now stop. Please try to refresh the page.\n\nError: "'+n+'"',$("#popup").html(n).show(),$("#latency_label").hide(),$("#main").fadeTo("slow",.35),t&&(t.stopped=!0),f=!0)}function r(n){var t="";return n!=null&&(t=n.toString()),t.indexOf(",")>-1?'"'+t+'"':t}function l(n,i,u){for(var e,o,f=0;f<i;f++){for(e=r(new Date(t.starttime.getTime()+(n+f)*ping_interval*1e3).toTimeString())+",",o=0;o<pingers.length;o++)e+=r(pingers[o].data[n+f])+",";u.WriteLine(e.substring(0,e.length-1))}}function h(n,i){var u,f;if(u=n+50<pingers[0].data.length?50:pingers[0].data.length-n,l(n,u,i),$("#count").html("").append("Saving... "+Math.round((n+u)/pingers[0].data.length*100)+"%"),n+u==pingers[0].data.length){i.WriteLine("Done"),f=r("Data collection was started at "+t.starttime.toLocaleDateString()+" "+t.starttime.toLocaleTimeString()),i.WriteLine(f);try{i.Close()}catch(e){}setTimeout(function(){lastsavetime=new Date,alert("File saved succesfully."),$("#popup").hide()},30)}else setTimeout(function(){h(n+u,i)},0)}var i=document.getElementById("plugin0"),u=!0,c=function(n){var r,e,i,f;if(u)for(u=!1,$("#stats").html(""),i=0;i<n.length;i++)r=n[i].enabled?'<div class="statdisplay" id="statdisplay_'+i+'">':'<div class="statdisplay disabled_stat" id="statdisplay_'+i+'">',r+='<div class="stat_header" id="header_'+i+"\"><input type='checkbox' checked='checked' id='checkbox_"+i+"' style='padding:2px;margin:0px;'/> <b style=\"color:"+n[i].colorstr+';">'+n[i].name+' @</b><br><span style="padding-left:15px;color:'+n[i].colorstr+';">'+n[i].ipaddr+"</span></div>",r+='<p class="stattext"><b style="font-family:\'Arial Black\',Arial;margin-bottom:0px;">Latency Distribution:</b> </p><center><div  id="rainbow_'+i+'">',r+='<table cellspacing="0" style="padding-top:0px;margin-top:-10px;padding-top:3px;width:115px;height:11px;margin-bottom:10px;">',r+="<tr>",r+='<td id="rainbow_green_'+i+'" class="greengraph graphcell" style="width:100%;"></td>',r+='<td id="rainbow_yellow_'+i+'" class="yellowgraph graphcell" style="width:0%;" ></td>',r+='<td id="rainbow_red_'+i+'" class="redgraph graphcell" style="width:0%;" ></td>',r+="</tr>",r+="</table></div></center>         <div id='dist_details_"+i+'\'>hi</div><div class="more_details"><hr/>',r+='<span class="stattext" id="sent_'+i+'"><b style="font-family:\'Arial Black\',Arial;">Packets Sent</b>: <span id="vsent_'+i+'">'+n[i].sent+"</span></span><br>",r+='<span class="stattext" id="dropped_'+i+'"><b style="font-family:\'Arial Black\',Arial;">Dropped</b>: <span id="vdropped_'+i+'">'+n[i].dropped+" [0%]</span></span><br>",r+='<span class="stattext" id="minmax_'+i+'"><b style="font-family:\'Arial Black\',Arial;">Min/Max</b>: <span id="vminmax_'+i+'">'+n[i].min+" / "+n[i].max+"</span></span><br>",r+='<span class="stattext" id="avg_'+i+'"><b style="font-family:\'Arial Black\',Arial;">Average</b>: <span id="vavg_'+i+'">'+n[i].avg+"ms</span></span></div></div>",$("#stats").append(r),e=function(n){$("#rainbow_"+n).hoverIntent(function(){$("#popup_"+n).fadeIn("medium")},function(){$("#popup_"+n).fadeOut()})},e(i),function(i){$("#header_"+i).click(function(){n[i].enabled?($("#rainbow_"+i).show(),e(i),t.disablePinger(i),$("#checkbox_"+i).removeAttr("checked")):($("#rainbow_"+i).show(),e(i),t.enablePinger(i),document.getElementById("checkbox_"+i).checked=!0)})}(i);for(i=0;i<n.length;i++){var o=Math.floor(n[i].good/n[i].sent*1e4)/100,s=Math.floor(n[i].ok/n[i].sent*1e4)/100,h=Math.floor(n[i].bad/n[i].sent*1e4)/100;isNaN(o)&&(o=0),isNaN(s)&&(s=0),isNaN(h)&&(h=0),f=Math.floor(n[i].dropped/n[i].sent*1e4)/100,isNaN(f)&&(f=0),$("#vsent_"+i).html(n[i].sent),$("#vdropped_"+i).html(n[i].dropped+" ["+f+"%]"),f>5?$("#dropped_"+i).css("background-color","rgba(255, 0, 0, 0.72)"):$("#dropped_"+i).css("background-color",""),$("#rainbow_green_"+i).css("width",o+"%"),$("#rainbow_yellow_"+i).css("width",s+"%"),$("#rainbow_red_"+i).css("width",h+"%"),$("#dist_details_"+i).html("<span  style='padding-left:5px;color:green;font-weight:bold;'><= 100ms</span>: "+o+"%<br><span style='padding-left:5px;color:rgb(255,127,39);font-weight:bold;'>100 - 300ms</span>: "+s+"%<br><span style='padding-left:5px;color:red;font-weight:bold;'>> 300ms</span>: "+h+"%"),$("#vminmax_"+i).html(n[i].min+"ms / "+n[i].max+"ms"),$("#vavg_"+i).html(Math.round(n[i].avg*100)/100+"ms")}},t,f=!1,o,s;i.ping||(i.ping=function(n,t,i,r,u,f){f(0,"0.0.0.0","")}),o=pingDestinations[0].ipaddr,i.ping(o,55,1,!1,1e3,function(r,u,f){var s,h,o;for(u==""&&(pageerror=!0,f=="IcmpSendEcho returned error 5"?(f="To use this tool, please add this site to your Internet Explorer <b>Trusted Sites</b> list <a target='_blank' href ='"+trustedSiteLink+"'>(instructions)</a> and try again. <Br><img src=\""+warningImg+'" />',$("#main").fadeTo("fast",.35,function(){$("#warning").html(f).show()}),$("#latency_label").hide(),$("#popup").hide(),n=!1):(n=!1,e("Unexpected Error - "+f+". If using Internet Explorer, please verify that this site is in your Internet Explorer <b>Trusted Sites</b> list <a target='_blank' href ='"+trustedSiteLink+"'>(instructions)</a>."))),pingers=[new pinger("YOUR ROUTER","Your Router",86401,u,1400,123,!1,1e3,!0,"Your Router")],o=0;o<pingDestinations.length;o++)pingers.push(new pinger(pingDestinations[o].label,pingDestinations[o].fullLabel,86401,pingDestinations[o].ipaddr,1400,123,!1,1e3,pingDestinations[o].enabledByDefault,pingDestinations[o].name));for(i.hostNameToIp&&(s=i.hostNameToIp("google.com"),s!=""&&(h=pingers.slice(1),pingers=pingers.slice(0,1),pingers.push(new pinger("GOOGLE.COM","google.com",86401,s,1400,123,!1,1e3,!0,"google.com")),pingers=pingers.concat(h))),o=0;o<pingers.length;o++){pingers[o].errBack=e;switch(o){case 0:pingers[o].color=0;break;case 1:pingers[o].color=2;break;case 2:pingers[o].color=3;break;case 3:pingers[o].color="rgb(0,185,228)";break;case 4:pingers[o].color=1;break;case 5:pingers[o].color=3;break;case 6:pingers[o].color=64;break;case 7:pingers[o].color="rgb(64,128,128)"}}t=new graphicalPingRunner("#placeholder",300/ping_interval,ping_interval*1e3,pingers,c),n?t.start():t.stopped=!0}),s=function(){var n,i;if(t){t.stopped=!0;for(n=!1,i=0;i<pingers.length;i++)n=n||pingers[i].inflight;n}},$(window).unload(function(){s()}),window.onbeforeunload=function(){var n=new Date(new Date-6e4);if(!pageerror&&(lastsavetime==null||lastsavetime!=null&&lastsavetime<n))return'If you leave this page, all your connection quality data will be lost. If you have been experiencing slowness, you would need to send this data (save it to a file under "save to file" option) to Bloomberg Technical support and enter an SDSK with more details. This connection quality data will help technical support to rule out network as a probable cause of slowness.'},$("#saveas_button").click(function(){$("#count").html("").append("Saving... ");var n=document.getElementById("popup");i.saveas(function(n){$("#popup").show(function(){for(var i="time,",t=0;t<pingers.length;t++)i+=pingers[t].name+"("+pingers[t].ipaddr+"),";n.WriteLine(i),h(0,n)})},function(){alert("Error opening the selected file, possibly because the file is locked by another program or the Connection Health tool does not have permission to write to the selected folder. Please try again with another file name or location.")})}),$("#interval_24").click(function(){t.setX(86400),$(".interval_button").removeClass("interval_button_active"),$(this).toggleClass("interval_button_active")}),$("#interval_1h").click(function(){t.setX(3600),$(".interval_button").removeClass("interval_button_active"),$(this).toggleClass("interval_button_active")}),$("#interval_5m").click(function(){t.setX(300),$(".interval_button").removeClass("interval_button_active"),$(this).toggleClass("interval_button_active")})})}),$("#more_details_open").click(function(){$(".more_details").slideToggle(),$(this).html().indexOf("More")>=0?$(this).html("Fewer Details ▾"):$(this).html("More Details ▶")})