diff --git a/yslow.js b/yslow.js deleted file mode 100644 index 370357503..000000000 --- a/yslow.js +++ /dev/null @@ -1,5 +0,0 @@ -/** - * Copyright (c) 2012, Yahoo! Inc. All rights reserved. - * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms. - */ -var i,arg,page,urlCount,viewport,webpage=require("webpage"),args=phantom.args,len=args.length,urls=[],yslowArgs={info:"all",format:"json",ruleset:"ydefault",beacon:false,ua:false,viewport:false,headers:false,console:0,threshold:80},unaryArgs={help:false,version:false,dict:false,verbose:false},argsAlias={i:"info",f:"format",r:"ruleset",h:"help",V:"version",d:"dict",u:"ua",vp:"viewport",c:"console",b:"beacon",v:"verbose",t:"threshold",ch:"headers"};for(i=0;i specify the information to display/log (basic|grade|stats|comps|all) [all]"," -f, --format specify the output results format (json|xml|plain|tap|junit) [json]"," -r, --ruleset specify the YSlow performance ruleset to be used (ydefault|yslow1|yblog) [ydefault]"," -b, --beacon specify an URL to log the results"," -d, --dict include dictionary of results fields"," -v, --verbose output beacon response information"," -t, --threshold for test formats, the threshold to test scores ([0-100]|[A-F]|{JSON}) [80]",' e.g.: -t B or -t 75 or -t \'{"overall": "B", "ycdn": "F", "yexpires": 85}\'',' -u, --ua "" specify the user agent string sent to server when the page requests resources'," -vp, --viewport specify page viewport size WxY, where W = width and H = height [400x300]",' -ch, --headers specify custom request headers, e.g.: -ch \'{"Cookie": "foo=bar"}\''," -c, --console output page console messages (0: none, 1: message, 2: message + line + source) [0]",""," Examples:",""," phantomjs "+phantom.scriptName+" http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -f xml www.yahoo.com www.cnn.com www.nytimes.com"," phantomjs "+phantom.scriptName+' -info all --format plain --ua "MSIE 9.0" http://yslow.org'," phantomjs "+phantom.scriptName+" -i basic --rulseset yslow1 -d http://yslow.org"," phantomjs "+phantom.scriptName+" -i grade -b http://www.showslow.com/beacon/yslow/ -v yslow.org"," phantomjs --load-plugins=yes "+phantom.scriptName+" -vp 800x600 http://www.yahoo.com"," phantomjs "+phantom.scriptName+" -i grade -f tap -t 85 http://yslow.org",""].join("\n"));phantom.exit()}yslowArgs.dict=unaryArgs.dict;yslowArgs.verbose=unaryArgs.verbose;urls.forEach(function(a){var c=webpage.create();c.resources={};c.settings.webSecurityEnabled=false;c.onResourceRequested=function(d){c.resources[d.url]={request:d}};c.onResourceReceived=function(d){var e,f=c.resources[d.url].response;if(!f){c.resources[d.url].response=d}else{for(e in d){if(d.hasOwnProperty(e)){f[e]=d[e]}}}};yslowArgs.console=parseInt(yslowArgs.console,10)||0;if(yslowArgs.console){if(yslowArgs.console===1){c.onConsoleMessage=function(d){console.log(d)}}else{c.onConsoleMessage=function(f,d,e){console.log(JSON.stringify({message:f,lineNumber:d,source:e},null,4))}}}if(yslowArgs.ua){c.settings.userAgent=yslowArgs.ua}if(yslowArgs.viewport){viewport=yslowArgs.viewport.toLowerCase();c.viewportSize={width:parseInt(viewport.slice(0,viewport.indexOf("x")),10)||c.viewportSize.width,height:parseInt(viewport.slice(viewport.indexOf("x")+1),10)||c.viewportSize.height}}if(yslowArgs.headers){try{c.customHeaders=JSON.parse(yslowArgs.headers)}catch(b){console.log("Invalid custom headers: "+b)}}c.startTime=new Date();c.open(a,function(k){var f,j,m,n,l,d,h,e=c.startTime,g=c.resources;if(k!=="success"){console.log("FAIL to load "+d)}else{l=new Date()-e;for(d in g){if(g.hasOwnProperty(d)){h=g[d].response;if(h){h.time=new Date(h.time)-e}}}f=function(){if(typeof YSLOW==="undefined"){YSLOW={}}YSLOW.DEBUG=true;YSLOW.registerRule=function(o){YSLOW.controller.addRule(o)};YSLOW.registerRuleset=function(o){YSLOW.controller.addRuleset(o)};YSLOW.registerRenderer=function(o){YSLOW.controller.addRenderer(o)};YSLOW.registerTool=function(o){YSLOW.Tools.addCustomTool(o)};YSLOW.addEventListener=function(p,q,o){YSLOW.util.event.addListener(p,q,o)};YSLOW.removeEventListener=function(o,p){return YSLOW.util.event.removeListener(o,p)};YSLOW.Error=function(o,p){this.name=o;this.message=p};YSLOW.Error.prototype={toString:function(){return this.name+"\n"+this.message}};YSLOW.version="3.1.1";YSLOW.ComponentSet=function(o,p){this.root_node=o;this.components=[];this.outstanding_net_request=0;this.component_info=[];this.onloadTimestamp=p;this.nextID=1;this.notified_fetch_done=false};YSLOW.ComponentSet.prototype={clear:function(){this.components=[];this.component_info=[];this.cleared=true;if(this.outstanding_net_request>0){YSLOW.util.dump("YSLOW.ComponentSet.Clearing component set before all net requests finish.")}},addComponent:function(s,t,q,v){var p,u,r;if(!s){if(!this.empty_url){this.empty_url=[]}this.empty_url[t]=(this.empty_url[t]||0)+1}if(s&&t){if(!YSLOW.ComponentSet.isValidProtocol(s)||!YSLOW.ComponentSet.isValidURL(s)){return p}s=YSLOW.util.makeAbsoluteUrl(s,q);s=YSLOW.util.escapeHtml(s);u=typeof this.component_info[s]!=="undefined";r=t==="doc";if(!u||r){this.component_info[s]={state:"NONE",count:u?this.component_info[s].count:0};p=new YSLOW.Component(s,t,this,v);if(p){p.id=this.nextID+=1;this.components[this.components.length]=p;if(!this.doc_comp&&r){this.doc_comp=p}if(this.component_info[s].state==="NONE"){this.component_info[s].state="REQUESTED";this.outstanding_net_request+=1}}else{this.component_info[s].state="ERROR";YSLOW.util.event.fire("componentFetchError")}}this.component_info[s].count+=1}return p},addComponentNoDuplicate:function(p,q,o){if(p&&q){p=YSLOW.util.escapeHtml(p);p=YSLOW.util.makeAbsoluteUrl(p,o);if(this.component_info[p]===undefined){return this.addComponent(p,q,o)}}},getComponentsByType:function(B,y,r){var u,s,z,q,C,w,p,v=this.components,A=this.component_info,o=[],x={};if(typeof y==="undefined"){y=!(YSLOW.util.Preference.getPref("excludeAfterOnload",true))}if(typeof r==="undefined"){r=!(YSLOW.util.Preference.getPref("excludeBeaconsFromLint",true))}if(typeof B==="string"){x[B]=1}else{for(u=0,z=B.length;u0){u=r.substr(0,p);for(q=0;q0){u.expires=new Date(p);if(u.expires.toString()==="Invalid Date"){u.expires=u.getMaxAge()}}else{u.expires=u.getMaxAge()}if(u.type==="image"&&!q){if(typeof Image!==z){s=new Image()}else{s=document.createElement("img")}if(u.body.length){w="data:"+u.headers["content-type"]+";base64,"+YSLOW.util.base64Encode(u.body);x=1}else{w=u.url}s.onerror=function(){s.onerror=r;if(x){s.src=u.url}};s.onload=function(){s.onload=r;if(s&&s.width&&s.height){if(u.object_prop){u.object_prop.actual_width=s.width;u.object_prop.actual_height=s.height}else{u.object_prop={width:s.width,height:s.height,actual_width:s.width,actual_height:s.height}}if(s.width<2&&s.height<2){u.is_beacon=true}}};s.src=w}};YSLOW.Component.prototype.hasOldModifiedDate=function(){var o=Number(new Date()),p=this.headers["last-modified"];if(typeof p!=="undefined"){return((o-Number(new Date(p)))>(24*60*60*1000))}return false};YSLOW.Component.prototype.hasFarFutureExpiresOrMaxAge=function(){var r,p=Number(new Date()),q=YSLOW.util.Preference.getPref("minFutureExpiresSeconds",2*24*60*60),o=q*1000;if(typeof this.expires==="object"){r=Number(this.expires);if((r-p)>o){return true}}return false};YSLOW.Component.prototype.getEtag=function(){return this.headers.etag||""};YSLOW.Component.prototype.getMaxAge=function(){var p,q,o,r=this.headers["cache-control"];if(r){p=r.indexOf("max-age");if(p>-1){q=parseInt(r.substring(p+8),10);if(q>0){o=YSLOW.util.maxAgeToDate(q)}}}return o};YSLOW.Component.prototype.getSetCookieSize=function(){var q,o,p=0;if(this.headers&&this.headers["set-cookie"]){q=this.headers["set-cookie"].split("\n");if(q.length>0){for(o=0;o0){q=this.cookie.split("\n");if(q.length>0){for(o=0;op.parent.onloadTimestamp;p.populateProperties(false,true);p.get_info_state="DONE";p.parent.onComponentGetInfoStateChange({comp:p,state:"DONE"})};if(r.request&&r.response){q(r.request,r.response)}};YSLOW.controller={rules:{},rulesets:{},onloadTimestamp:null,renderers:{},default_ruleset_id:"ydefault",run_pending:0,init:function(){var p,o,r,q;YSLOW.util.event.addListener("onload",function(s){this.onloadTimestamp=s.time;YSLOW.util.setTimer(function(){YSLOW.controller.run_pending_event()})},this);YSLOW.util.event.addListener("onUnload",function(s){this.run_pending=0;this.onloadTimestamp=null},this);p=YSLOW.util.Preference.getPrefList("customRuleset.",undefined);if(p&&p.length>0){for(o=0;o0){r=JSON.parse(q,null);r.custom=true;this.addRuleset(r)}}}this.default_ruleset_id=YSLOW.util.Preference.getPref("defaultRuleset","ydefault");this.loadRulePreference()},run:function(r,s,p){var t,o,q=r.document;if(!q||!q.location||q.location.href.indexOf("about:")===0||"undefined"===typeof q.location.hostname){if(!p){o="Please enter a valid website address before running YSlow.";YSLOW.ysview.openDialog(YSLOW.ysview.panel_doc,389,150,o,"","Ok")}return}if(!s.PAGE.loaded){this.run_pending={win:r,yscontext:s};return}YSLOW.util.event.fire("peelStart",undefined);t=YSLOW.peeler.peel(q,this.onloadTimestamp);s.component_set=t;YSLOW.util.event.fire("peelComplete",{component_set:t});t.notifyPeelDone()},run_pending_event:function(){if(this.run_pending){this.run(this.run_pending.win,this.run_pending.yscontext,false);this.run_pending=0}},lint:function(F,q,o){var r,v,D,u,w,x,E,C=[],A=[],B=0,z=0,s=this,t=s.rulesets,y=s.default_ruleset_id;if(o){C=t[o]}else{if(y&&t[y]){C=t[y]}else{for(D in t){if(t.hasOwnProperty(D)&&t[D]){C=t[D];break}}}}v=C.rules;for(D in v){if(v.hasOwnProperty(D)&&v[D]&&this.rules.hasOwnProperty(D)){try{r=this.rules[D];u=YSLOW.util.merge(r.config,v[D]);w=r.lint(F,q.component_set,u);x=(C.weights?C.weights[D]:undefined);if(x!==undefined){x=parseInt(x,10)}if(x===undefined||x<0||x>100){if(t.ydefault.weights[D]){x=t.ydefault.weights[D]}else{x=5}}w.weight=x;if(w.score!==undefined){if(typeof w.score!=="number"){E=parseInt(w.score,10);if(!isNaN(E)){w.score=E}}if(typeof w.score==="number"){z+=w.weight;if(!YSLOW.util.Preference.getPref("allowNegativeScore",false)){if(w.score<0){w.score=0}if(typeof w.score!=="number"){w.score=-1}}if(w.score!==0){B+=w.score*(typeof w.weight!=="undefined"?w.weight:1)}}}w.name=r.name;w.category=r.category;w.rule_id=D;A[A.length]=w}catch(p){YSLOW.util.dump("YSLOW.controller.lint: "+D,p);YSLOW.util.event.fire("lintError",{rule:D,message:p})}}}q.PAGE.overallScore=B/(z>0?z:1);q.result_set=new YSLOW.ResultSet(A,q.PAGE.overallScore,C);q.result_set.url=q.component_set.doc_comp.url;YSLOW.util.event.fire("lintResultReady",{yslowContext:q});return q.result_set},runTool:function(B,y,p){var E,u,A,t,w,o,z,q,D,C,v,x=YSLOW.Tools.getTool(B);try{if(typeof x==="object"){E=x.run(y.document,y.component_set,p);if(x.print_output){u="";if(typeof E==="object"){u=E.html}else{if(typeof E==="string"){u=E}}A=YSLOW.util.getNewDoc();v=A.body||A.documentElement;v.innerHTML=u;t=A.getElementsByTagName("head")[0];if(typeof E.css==="undefined"){o="chrome://yslow/content/yslow/tool.css";z=new XMLHttpRequest();z.open("GET",o,false);z.send(null);w=z.responseText}else{w=E.css}if(typeof w==="string"){q=A.createElement("style");q.setAttribute("type","text/css");q.appendChild(A.createTextNode(w));t.appendChild(q)}if(typeof E.js!=="undefined"){D=A.createElement("script");D.setAttribute("type","text/javascript");D.appendChild(A.createTextNode(E.js));t.appendChild(D)}if(typeof E.plot_component!=="undefined"&&E.plot_component===true){YSLOW.renderer.plotComponents(A,y)}}}else{C=B+" is not a tool.";YSLOW.util.dump(C);YSLOW.util.event.fire("toolError",{tool_id:B,message:C})}}catch(r){YSLOW.util.dump("YSLOW.controller.runTool: "+B,r);YSLOW.util.event.fire("toolError",{tool_id:B,message:r})}},render:function(s,o,r){var q=this.renderers[s],p="";if(q.supports[o]!==undefined&&q.supports[o]===1){switch(o){case"components":p=q.componentsView(r.comps,r.total_size);break;case"reportcard":p=q.reportcardView(r.result_set);break;case"stats":p=q.statsView(r.stats);break;case"tools":p=q.toolsView(r.tools);break;case"rulesetEdit":p=q.rulesetEditView(r.rulesets);break}}return p},getRenderer:function(o){return this.renderers[o]},addRule:function(q){var o,p,r=["id","name","config","info","lint"];if(YSLOW.doc.rules&&YSLOW.doc.rules[q.id]){p=YSLOW.doc.rules[q.id];if(p.name){q.name=p.name}if(p.info){q.info=p.info}}for(o=0;o0&&p){p.config.howfar=o}}};YSLOW.util={merge:function(q,p){var r,s={};for(r in q){if(q.hasOwnProperty(r)){s[r]=q[r]}}for(r in p){if(p.hasOwnProperty(r)){s[r]=p[r]}}return s},dump:function(){var o;if(!YSLOW.DEBUG){return}o=Array.prototype.slice.apply(arguments);o=o&&o.length===1?o[0]:o;try{if(typeof Firebug!=="undefined"&&Firebug.Console&&Firebug.Console.log){Firebug.Console.log(o)}else{if(typeof Components!=="undefined"&&Components.classes&&Components.interfaces){Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService).logStringMessage(JSON.stringify(o,null,2))}}}catch(q){try{console.log(o)}catch(p){}}},filter:function(r,s,p){var q,o=p?[]:{};for(q in r){if(r.hasOwnProperty(q)&&s(q,r[q])){o[p?o.length:q]=r[q]}}return o},expires_month:{Jan:1,Feb:2,Mar:3,Apr:4,May:5,Jun:6,Jul:7,Aug:8,Sep:9,Oct:10,Nov:11,Dec:12},prettyExpiresDate:function(o){var p;if(Object.prototype.toString.call(o)==="[object Date]"&&o.toString()!=="Invalid Date"&&!isNaN(o)){p=o.getMonth()+1;return o.getFullYear()+"/"+p+"/"+o.getDate()}else{if(!o){return"no expires"}}return"invalid date object"},maxAgeToDate:function(p){var o=new Date();o=o.getTime()+parseInt(p,10)*1000;return new Date(o)},plural:function(q,r){var p,o=q,s={are:["are","is"],s:["s",""],"do":["do","does"],num:[r,r]};for(p in s){if(s.hasOwnProperty(p)){o=o.replace(new RegExp("%"+p+"%","gm"),(r===1)?s[p][1]:s[p][0])}}return o},countExpressions:function(q){var o=0,p;p=q.indexOf("expression(");while(p!==-1){o+=1;p=q.indexOf("expression(",p+1)}return o},countAlphaImageLoaderFilter:function(t){var r,s,q,u,p=0,v=0,o={};r=t.indexOf("filter:");while(r!==-1){q=false;if(r>0&&t.charAt(r-1)==="_"){q=true}s=t.indexOf(";",r+7);if(s!==-1){u=t.substring(r+7,s);if(u.indexOf("AlphaImageLoader")!==-1){if(q){v+=1}else{p+=1}}}r=t.indexOf("filter:",r+1)}if(v>0){o.hackFilter=v}if(p>0){o.filter=p}return o},getHostname:function(p){var o=p.split("/")[2];return(o&&o.split(":")[0])||""},getUniqueDomains:function(u,s){var r,p,t,o={},q=[];for(r=0,p=u.length;r0.2){return false}return true},isETagGood:function(o){var q=/^[0-9a-f]+:[0-9a-f]+$/,p=/^[0-9a-f]+\-[0-9a-f]+\-[0-9a-f]+$/;if(!o){return true}o=o.replace(/^["']|["'][\s\S]*$/g,"");return !(p.test(o)||q.test(o))},getComponentType:function(o){var p="unknown";if(o&&typeof o==="string"){if(o==="text/html"||o==="text/plain"){p="doc"}else{if(o==="text/css"){p="css"}else{if(/javascript/.test(o)){p="js"}else{if(/flash/.test(o)){p="flash"}else{if(/image/.test(o)){p="image"}else{if(/font/.test(o)){p="font"}}}}}}}return p},base64Encode:function(t){var s,r,q,v,p="",u=0,o=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","0","1","2","3","4","5","6","7","8","9","+","/"];for(s=0;s>2];p+=o[((r&3)<<4)|((q&240)>>4)];if(u>0){p+="="}else{p+=o[((q&15)<<2)|((v&192)>>6)]}if(u>1){p+="="}else{p+=o[(v&63)]}}return p},getXHR:function(){var o=0,r=null,p=["MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"];if(typeof XMLHttpRequest==="function"){return new XMLHttpRequest()}for(o=0;o/g,">")},escapeQuotes:function(p,o){if(o==="single"){return p.replace(/\'/g,"\\'")}if(o==="double"){return p.replace(/\"/g,'\\"')}return p.replace(/\'/g,"\\'").replace(/\"/g,'\\"')},formatHeaderName:(function(){var o={"content-md5":"Content-MD5",dnt:"DNT",etag:"ETag",p3p:"P3P",te:"TE","www-authenticate":"WWW-Authenticate","x-att-deviceid":"X-ATT-DeviceId","x-cdn":"X-CDN","x-ua-compatible":"X-UA-Compatible","x-xss-protection":"X-XSS-Protection"};return function(q){var p=q.toLowerCase();if(o.hasOwnProperty(p)){return o[p]}else{return p.replace(/(^|-)([a-z])/g,function(r,s,t){return s+t.toUpperCase()})}}}()),mod:function(o,p){return Math.round(o-(Math.floor(o/p)*p))},briefUrl:function(q,o){var p,r,s,t;o=o||100;if(q===undefined){return""}p=q.indexOf("//");if(-1!==p){r=q.indexOf("?");if(-1!==r){q=q.substring(0,r)+"?..."}if(q.length>o){s=q.indexOf("/",p+2);t=q.lastIndexOf("/");if(-1!==s&&-1!==t&&s!==t){q=q.substring(0,s+1)+"..."+q.substring(t)}else{q=q.substring(0,o+1)+"..."}}}return q},prettyAnchor:function(w,p,r,q,u,o,x){var s,v="",t="",y=0;if(typeof p==="undefined"){p=w}if(typeof r==="undefined"){r=""}else{r=' class="'+r+'"'}if(typeof u==="undefined"){u=100}if(typeof o==="undefined"){o=1}x=(x)?' rel="'+x+'"':"";p=YSLOW.util.escapeHtml(p);w=YSLOW.util.escapeHtml(w);s=YSLOW.util.escapeQuotes(p,"double");if(q){w=YSLOW.util.briefUrl(w,u);v=' title="'+s+'"'}while(0"+w.substring(0,u);w=w.substring(u);y+=1;if(y>=o){if(0";break}else{t+=" "}}return t},kbSize:function(o){var p=o%(o>100?100:10);o-=p;return parseFloat(o/1000)+(0===(o%1000)?".0":"")+"K"},prettyTypes:{image:"Image",doc:"HTML/Text",cssimage:"CSS Image",css:"Stylesheet File",js:"JavaScript File",flash:"Flash Object",iframe:"IFrame",xhr:"XMLHttpRequest",redirect:"Redirect",favicon:"Favicon",unknown:"Unknown"},prettyType:function(o){return YSLOW.util.prettyTypes[o]},prettyScore:function(p){var o="F";if(!parseInt(p,10)&&p!==0){return p}if(p===-1){return"N/A"}if(p>=90){o="A"}else{if(p>=80){o="B"}else{if(p>=70){o="C"}else{if(p>=60){o="D"}else{if(p>=50){o="E"}}}}}return o},getResults:function(u,Q){var M,J,H,s,r,F,R,E,D,v,t,p,U,O,G,q,C,B,w,y,L,I,z,x=/ "):"")}}return{score:H,message:x,components:p}}});YSLOW.registerRule({id:"yexpires",url:"http://developer.yahoo.com/performance/rules.html#expires",category:["server"],config:{points:11,howfar:172800,types:["css","js","image","cssimage","flash","favicon"]},lint:function(w,y,p){var v,r,x,q,u,s=parseInt(p.howfar,10)*1000,t=[],o=y.getComponentsByType(p.types);for(r=0,u=o.length;rv+s){continue}}t.push(o[r])}q=100-t.length*parseInt(p.points,10);return{score:q,message:(t.length>0)?YSLOW.util.plural("There %are% %num% static component%s%",t.length)+" without a far-future expiration date.":"",components:t}}});YSLOW.registerRule({id:"ycompress",url:"http://developer.yahoo.com/performance/rules.html#gzip",category:["server"],config:{min_filesize:500,types:["doc","iframe","xhr","js","css"],points:11},lint:function(v,w,p){var r,u,q,s,t=[],o=w.getComponentsByType(p.types);for(r=0,u=o.length;r0)?YSLOW.util.plural("There %are% %num% plain text component%s%",t.length)+" that should be sent compressed":"",components:t}}});YSLOW.registerRule({id:"ycsstop",url:"http://developer.yahoo.com/performance/rules.html#css_top",category:["css"],config:{points:10},lint:function(v,w,p){var r,u,q,s,o=w.getComponentsByType("css"),t=[];for(r=0,u=o.length;r0){q-=1+t.length*parseInt(p.points,10)}return{score:q,message:(t.length>0)?YSLOW.util.plural("There %are% %num% stylesheet%s%",t.length)+" found in the body of the document":"",components:t}}});YSLOW.registerRule({id:"yjsbottom",url:"http://developer.yahoo.com/performance/rules.html#js_bottom",category:["javascript"],config:{points:5},lint:function(v,w,p){var r,u,s,q,t=[],o=w.getComponentsByType("js");for(r=0,u=o.length;r0)?YSLOW.util.plural("There %are% %num% JavaScript script%s%",t.length)+" found in the head of the document":"",components:t}}});YSLOW.registerRule({id:"yexpressions",url:"http://developer.yahoo.com/performance/rules.html#css_expressions",category:["css"],config:{points:2},lint:function(w,z,p){var r,u,y,s,x=(z.inline&&z.inline.styles)||[],o=z.getComponentsByType("css"),t=[],q=100,v=0;for(r=0,u=o.length;r0){s.yexpressions=YSLOW.util.plural("%num% expression%s%",y);v+=y;t.push(s)}}for(r=0,u=x.length;r0){t.push("inline <style> tag #"+(r+1)+" ("+YSLOW.util.plural("%num% expression%s%",y)+")");v+=y}}if(v>0){q=90-v*p.points}return{score:q,message:v>0?"There is a total of "+YSLOW.util.plural("%num% expression%s%",v):"",components:t}}});YSLOW.registerRule({id:"yexternal",url:"http://developer.yahoo.com/performance/rules.html#external",category:["javascript","css"],config:{},lint:function(t,v,p){var r,s=v.inline,q=(s&&s.styles)||[],o=(s&&s.scripts)||[],u=[];if(q.length){r=YSLOW.util.plural("There is a total of %num% inline css",q.length);u.push(r)}if(o.length){r=YSLOW.util.plural("There is a total of %num% inline script%s%",o.length);u.push(r)}return{score:"n/a",message:"Only consider this if your property is a common user home page.",components:u}}});YSLOW.registerRule({id:"ydns",url:"http://developer.yahoo.com/performance/rules.html#dns_lookups",category:["content"],config:{max_domains:4,points:5},lint:function(w,y,o){var r,t,q,s=YSLOW.util,u=s.kbSize,v=s.plural,p=100,x=s.summaryByDomain(y.components,["size","size_compressed"],true);if(x.length>o.max_domains){p-=(x.length-o.max_domains)*o.points}if(x.length){for(r=0,t=x.length;r0?" ("+u(q.sum_size_compressed)+" GZip)":"")}}return{score:p,message:(x.length>o.max_domains)?v("The components are split over more than %num% domain%s%",o.max_domains):"",components:x}}});YSLOW.registerRule({id:"yminify",url:"http://developer.yahoo.com/performance/rules.html#minify",category:["javascript","css"],config:{points:10,types:["js","css"]},lint:function(y,A,p){var s,v,q,x,t,w=A.inline,z=(w&&w.styles)||[],r=(w&&w.scripts)||[],o=A.getComponentsByType(p.types),u=[];for(s=0,v=o.length;s0)?YSLOW.util.plural("There %are% %num% component%s% that can be minified",u.length):"",components:u}}});YSLOW.registerRule({id:"yredirects",url:"http://developer.yahoo.com/performance/rules.html#redirects",category:["content"],config:{points:10},lint:function(w,x,p){var s,v,t,q,u=[],r=YSLOW.util.briefUrl,o=x.getComponentsByType("redirect");for(s=0,v=o.length;s0)?YSLOW.util.plural("There %are% %num% redirect%s%",o.length):"",components:u}}});YSLOW.registerRule({id:"ydupes",url:"http://developer.yahoo.com/performance/rules.html#js_dupes",category:["javascript","css"],config:{points:5,types:["js","css"]},lint:function(w,x,q){var t,o,r,v,s={},u=[],p=x.getComponentsByType(q.types);for(t=0,v=p.length;t1){u.push(p[s[t].compindex])}}r=100-u.length*parseInt(q.points,10);return{score:r,message:(u.length>0)?YSLOW.util.plural("There %are% %num% duplicate component%s%",u.length):"",components:u}}});YSLOW.registerRule({id:"yetags",url:"http://developer.yahoo.com/performance/rules.html#etags",category:["server"],config:{points:11,types:["flash","js","css","cssimage","image","favicon"]},lint:function(w,x,p){var r,u,q,s,v,t=[],o=x.getComponentsByType(p.types);for(r=0,u=o.length;r0)?YSLOW.util.plural("There %are% %num% component%s% with misconfigured ETags",t.length):"",components:t}}});YSLOW.registerRule({id:"yxhr",url:"http://developer.yahoo.com/performance/rules.html#cacheajax",category:["content"],config:{points:5,min_cache_time:3600},lint:function(w,y,p){var s,x,v,q,u,r=parseInt(p.min_cache_time,10)*1000,t=[],o=y.getComponentsByType("xhr");for(s=0;sv+r){continue}}t.push(o[s])}q=100-t.length*parseInt(p.points,10);return{score:q,message:(t.length>0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %are% not cacheable",t.length):"",components:t}}});YSLOW.registerRule({id:"yxhrmethod",url:"http://developer.yahoo.com/performance/rules.html#ajax_get",category:["server"],config:{points:5},lint:function(q,u,o){var p,r,t=[],s=u.getComponentsByType("xhr");for(p=0;p0)?YSLOW.util.plural("There %are% %num% XHR component%s% that %do% not use GET HTTP method",t.length):"",components:t}}});YSLOW.registerRule({id:"ymindom",url:"http://developer.yahoo.com/performance/rules.html#min_dom",category:["content"],config:{range:250,points:10,maxdom:900},lint:function(q,s,p){var o=s.domElementsCount,r=100;if(o>p.maxdom){r=99-Math.ceil((o-parseInt(p.maxdom,10))/parseInt(p.range,10))*parseInt(p.points,10)}return{score:r,message:(o>p.maxdom)?YSLOW.util.plural("There %are% %num% DOM element%s% on the page",o):"",components:[]}}});YSLOW.registerRule({id:"yno404",url:"http://developer.yahoo.com/performance/rules.html#no404",category:["content"],config:{points:5,types:["css","js","image","cssimage","flash","xhr","favicon"]},lint:function(v,w,p){var r,u,s,q,t=[],o=w.getComponentsByType(p.types);for(r=0,u=o.length;r0)?YSLOW.util.plural("There %are% %num% request%s% that %are% 404 Not Found",t.length):"",components:t}}});YSLOW.registerRule({id:"ymincookie",url:"http://developer.yahoo.com/performance/rules.html#cookie_size",category:["cookie"],config:{points:10,max_cookie_size:1000},lint:function(s,v,p){var u,r=v.cookies,o=(r&&r.length)||0,q="",t=100;if(o>p.max_cookie_size){u=Math.floor(o/p.max_cookie_size);t-=1+u*parseInt(p.points,10);q=YSLOW.util.plural("There %are% %num% byte%s% of cookies on this page",o)}return{score:t,message:q,components:[]}}});YSLOW.registerRule({id:"ycookiefree",url:"http://developer.yahoo.com/performance/rules.html#cookie_free",category:["cookie"],config:{points:5,types:["js","css","image","cssimage","flash","favicon"]},lint:function(y,z,r){var t,x,s,v,o,w=[],q=YSLOW.util.getHostname,u=q(z.doc_comp.url),p=z.getComponentsByType(r.types);for(t=0,x=p.length;t0)?YSLOW.util.plural("There %are% %num% component%s% that %are% not cookie-free",w.length):"",components:w}}});YSLOW.registerRule({id:"ynofilter",url:"http://developer.yahoo.com/performance/rules.html#no_filters",category:["css"],config:{points:5,halfpoints:2},lint:function(z,C,q){var s,w,r,t,y,v,B,A=(C.inline&&C.inline.styles)||[],p=C.getComponentsByType("css"),u=[],o=0,x=0;for(s=0,w=p.length;s0){p[s].yfilters=YSLOW.util.plural("%num% filter%s%",v);u.push(p[s])}}for(s=0,w=A.length;s0){u.push("inline <style> tag #"+(s+1)+" ("+YSLOW.util.plural("%num% filter%s%",v)+")")}}r=100-(o*q.points+x*q.halfpoints);return{score:r,message:(o+x)>0?"There is a total of "+YSLOW.util.plural("%num% filter%s%",o+x):"",components:u}}});YSLOW.registerRule({id:"yimgnoscale",url:"http://developer.yahoo.com/performance/rules.html#no_scale",category:["images"],config:{points:5},lint:function(q,v,o){var p,u,r,t=[],s=v.getComponentsByType("image");for(p=0;p0)?YSLOW.util.plural("There %are% %num% image%s% that %are% scaled down",t.length):"",components:t}}});YSLOW.registerRule({id:"yfavicon",url:"http://developer.yahoo.com/performance/rules.html#favicon",category:["images"],config:{points:5,size:2000,min_cache_time:3600},lint:function(w,y,p){var v,x,u,r,q,t=[],s=parseInt(p.min_cache_time,10)*1000,o=y.getComponentsByType("favicon");if(o.length){u=o[0];if(parseInt(u.status,10)===404){t.push("Favicon was not found")}if(u.size>p.size){t.push(YSLOW.util.plural("Favicon is more than %num% bytes",p.size))}x=u.expires;if(typeof x==="object"&&typeof x.getTime==="function"){v=new Date().getTime();q=x.getTime()>=v+s}if(!q){t.push("Favicon is not cacheable")}}r=100-t.length*parseInt(p.points,10);return{score:r,message:(t.length>0)?t.join("\n"):"",components:[]}}});YSLOW.registerRule({id:"yemptysrc",url:"http://developer.yahoo.com/performance/rules.html#emptysrc",category:["server"],config:{points:100},lint:function(v,y,p){var u,q,t,w=y.empty_url,s=[],r=[],o="",x=parseInt(p.points,10);q=100;if(w){for(u in w){if(w.hasOwnProperty(u)){t=w[u];q-=t*x;r.push(t+" "+u)}}o=r.join(", ")+YSLOW.util.plural(" component%s% with empty link were found.",r.length)}return{score:q,message:o,components:s}}});YSLOW.registerRuleset({id:"ydefault",name:"YSlow(V2)",rules:{ynumreq:{},ycdn:{},yemptysrc:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{},yredirects:{},ydupes:{},yetags:{},yxhr:{},yxhrmethod:{},ymindom:{},yno404:{},ymincookie:{},ycookiefree:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,ycdn:6,yemptysrc:30,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2,yxhr:4,yxhrmethod:3,ymindom:3,yno404:4,ymincookie:3,ycookiefree:3,ynofilter:4,yimgnoscale:3,yfavicon:2}});YSLOW.registerRuleset({id:"yslow1",name:"Classic(V1)",rules:{ynumreq:{},ycdn:{},yexpires:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},yexternal:{},ydns:{},yminify:{types:["js"],check_inline:false},yredirects:{},ydupes:{types:["js"]},yetags:{}},weights:{ynumreq:8,ycdn:6,yexpires:10,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,yexternal:4,ydns:3,yminify:4,yredirects:4,ydupes:4,yetags:2}});YSLOW.registerRuleset({id:"yblog",name:"Small Site or Blog",rules:{ynumreq:{},yemptysrc:{},ycompress:{},ycsstop:{},yjsbottom:{},yexpressions:{},ydns:{},yminify:{},yredirects:{},ydupes:{},ymindom:{},yno404:{},ynofilter:{},yimgnoscale:{},yfavicon:{}},weights:{ynumreq:8,yemptysrc:30,ycompress:8,ycsstop:4,yjsbottom:4,yexpressions:3,ydns:3,yminify:4,yredirects:4,ydupes:4,ymindom:3,yno404:4,ynofilter:4,yimgnoscale:3,yfavicon:2}});YSLOW.ResultSet=function(q,p,o){this.ruleset_applied=o;this.overall_score=p;this.results=q};YSLOW.ResultSet.prototype={getResults:function(){return this.results},getRulesetApplied:function(){return this.ruleset_applied},getOverallScore:function(){return this.overall_score}};YSLOW.view=function(p,u){var s,r,t,o,q;this.panel_doc=p.document;this.buttonViews={};this.curButtonId="";this.panelNode=p.panelNode;this.loadCSS(this.panel_doc);s=this.panel_doc.createElement("div");s.id="toolbarDiv";s.innerHTML=this.getToolbarSource();s.style.display="block";r=this.panel_doc.createElement("div");r.style.display="block";t='

text

';o=this.panel_doc.createElement("div");o.id="dialogDiv";o.innerHTML=t;o.style.display="none";this.modaldlg=o;this.tooltip=new YSLOW.view.Tooltip(this.panel_doc,p.panelNode);q=this.panel_doc.createElement("div");q.id="copyrightDiv";q.innerHTML=YSLOW.doc.copyright;this.copyright=q;if(p.panelNode){p.panelNode.id="yslowDiv";p.panelNode.appendChild(o);p.panelNode.appendChild(s);p.panelNode.appendChild(r);p.panelNode.appendChild(q)}this.viewNode=r;this.viewNode.id="viewDiv";this.viewNode.className="yui-skin-sam";this.yscontext=u;YSLOW.util.addEventListener(this.panelNode,"click",function(C){var w,z,v,D,A,B=p.document.ysview.getElementByTagNameAndId(p.panelNode,"div","toolbarDiv");if(B){z=p.document.ysview.getElementByTagNameAndId(B,"li","helpLink");if(z){v=z.offsetLeft;D=z.offsetTop;A=z.offsetParent;while(A){v+=A.offsetLeft;D+=A.offsetTop;A=A.offsetParent}if(C.clientX>=v&&C.clientY>=D&&C.clientX"+v.name+"

"+v.info,w.target)}}}});YSLOW.util.addEventListener(this.panelNode,"mouseout",function(v){p.document.ysview.tooltip.hide()});YSLOW.util.addEventListener(this.panel_doc.defaultView||this.panel_doc.parentWindow,"resize",function(w){var v=p.document.ysview.modaldlg;if(v&&v.style.display==="block"){v.style.display="none"}})};YSLOW.view.prototype={setDocument:function(o){this.panel_doc=o},loadCSS:function(){},addButtonView:function(o,q){var p=this.getButtonView(o);if(!p){p=this.panel_doc.createElement("div");p.style.display="none";this.viewNode.appendChild(p);this.buttonViews[o]=p}p.innerHTML=q;this.showButtonView(o)},clearAllButtonView:function(){var p=this.buttonViews,q=this.viewNode,o=function(r){if(p.hasOwnProperty(r)){q.removeChild(p[r]);delete p[r]}};o("ysPerfButton");o("ysCompsButton");o("ysStatsButton")},showButtonView:function(p){var o,q=this.getButtonView(p);if(!q){YSLOW.util.dump("ERROR: YSLOW.view.showButtonView: Couldn't find ButtonView '"+p+"'.");return}for(o in this.buttonViews){if(this.buttonViews.hasOwnProperty(o)&&o!==p){this.buttonViews[o].style.display="none"}}if(p==="ysPerfButton"){if(this.copyright){this.copyright.style.display="none"}}else{if(this.curButtonId==="ysPerfButton"){if(this.copyright){this.copyright.style.display="block"}}}q.style.display="block";this.curButtonId=p},getButtonView:function(o){return(this.buttonViews.hasOwnProperty(o)?this.buttonViews[o]:undefined)},setButtonView:function(o,q){var p=this.getButtonView(o);if(!p){YSLOW.util.dump("ERROR: YSLOW.view.setButtonView: Couldn't find ButtonView '"+o+"'.");return}p.innerHTML=q;this.showButtonView(o)},setSplashView:function(p,q,r){var u,t="Grade your web pages with YSlow",v="YSlow gives you:",s="
  • Grade based on the performance (you can define your own rules)
  • Summary of the Components in the page
  • Chart with statistics
  • Tools including Smush.It and JSLint
  • ",o="Learn more about YSlow and YDN";if(YSLOW.doc.splash){if(YSLOW.doc.splash.title){t=YSLOW.doc.splash.title}if(YSLOW.doc.splash.content){if(YSLOW.doc.splash.content.header){v=YSLOW.doc.splash.content.header}if(YSLOW.doc.splash.content.text){s=YSLOW.doc.splash.content.text}}if(YSLOW.doc.splash.more_info){o=YSLOW.doc.splash.more_info}}if(typeof r!=="undefined"){YSLOW.hideToolsInfo=r}else{r=YSLOW.hideToolsInfo}if(r){s=s.replace(/
  • Tools[^<]+<\/li>/,"")}u='

    '+t+'

    '+v+'

      '+s+"
    ";if(typeof p!=="undefined"){YSLOW.hideAutoRun=p}else{p=YSLOW.hideAutoRun}if(!p){u+=''}u+='
    ";this.addButtonView("panel_about",u)},genProgressView:function(){var o='

    Finding components in the page:

    Getting component information:

    start...
    ';this.setButtonView("panel_about",o)},updateProgressView:function(o,t){var s,v,w,u,x,p,q,r,y="";if(this.curButtonId==="panel_about"){x=this.getButtonView(this.curButtonId);if(o==="peel"){s=this.getElementByTagNameAndId(x,"div","peelprogress");v=this.getElementByTagNameAndId(x,"div","progbar");w=this.getElementByTagNameAndId(x,"div","progtext");y=t.message;u=(t.current_step*100)/t.total_step}else{if(o==="fetch"){s=this.getElementByTagNameAndId(x,"div","fetchprogress");v=this.getElementByTagNameAndId(x,"div","progbar2");w=this.getElementByTagNameAndId(x,"div","progtext2");y=t.last_component_url;u=(t.current*100)/t.total}else{if(o==="message"){w=this.getElementByTagNameAndId(x,"div","progtext2");if(w){w.innerHTML=t}return}else{return}}}}if(s&&v&&w){p=s.clientWidth;if(u<0){u=0}if(u>100){u=100}u=100-u;q=(p*u)/100;if(q>p){q=p}r=p-parseInt(q,10);v.style.width=parseInt(q,10)+"px";v.style.left=parseInt(r,10)+"px";w.innerHTML=y}},updateStatusBar:function(v){var x,q,y,r,o,p=YSLOW,s=p.util,u=p.view,w=s.Preference,t=this.yscontext;if(!t.PAGE.statusbar){t.PAGE.statusbar=true;if(!t.PAGE.overallScore){p.controller.lint(v,t)}if(!t.PAGE.totalSize){t.collectStats()}x=s.kbSize(t.PAGE.totalSize);q=s.prettyScore(t.PAGE.overallScore);u.setStatusBar(q,"yslow_status_grade");u.setStatusBar(x,"yslow_status_size");if(w.getPref("optinBeacon",false)){r=w.getPref("beaconInfo","basic"),o=w.getPref("beaconUrl","http://rtblab.pclick.yahoo.com/images/ysb.gif");y=s.getResults(t,r);s.sendBeacon(y,r,o)}}},getRulesetListSource:function(o){var s,q,r="",p=YSLOW.controller.getDefaultRulesetId();for(s in o){if(o[s]){r+='"}}return r},updateRulesetList:function(){var s,u,q,r=this.panel_doc.getElementsByTagName("select"),o=YSLOW.controller.getRegisteredRuleset(),p=this.getRulesetListSource(o),t=function(v){this.ownerDocument.ysview.onChangeRuleset(v)};for(s=0;sRulesets ";r+='';r+='";r+='";r+="";return r},show:function(p){var q="html",o="";p=p||this.yscontext.defaultview;if(this.yscontext.component_set===null){YSLOW.controller.run(window.top.content,this.yscontext,false);this.yscontext.defaultview=p}else{if(this.getButtonView(p)){this.showButtonView(p)}else{if("ysCompsButton"===p){o+=this.yscontext.genComponents(q);this.addButtonView("ysCompsButton",o)}else{if("ysStatsButton"===p){o+=this.yscontext.genStats(q);this.addButtonView("ysStatsButton",o);YSLOW.renderer.plotComponents(this.getButtonView("ysStatsButton"),this.yscontext)}else{if("ysToolButton"===p){o+=this.yscontext.genToolsView(q);this.addButtonView("ysToolButton",o)}else{o+=this.yscontext.genPerformance(q);this.addButtonView("ysPerfButton",o)}}}}this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateStatusBar(this.yscontext.document);this.updateToolbarSelection()}},updateToolbarSelection:function(){var o,p,q;switch(this.curButtonId){case"ysCompsButton":case"ysPerfButton":case"ysStatsButton":case"ysToolButton":o=this.getElementByTagNameAndId(this.panelNode,"li",this.curButtonId);if(o){if(o.className.indexOf("selected")!==-1){return}else{o.className+=" selected";if(o.previousSibling){o.previousSibling.className+=" off"}}}break;default:break}p=this.getElementByTagNameAndId(this.panelNode,"ul","toolbarLinks");q=p.firstChild;while(q){if(q.id!==this.curButtonId&&q.className.indexOf("selected")!==-1){this.unselect(q);if(q.previousSibling){YSLOW.view.removeClassName(q.previousSibling,"off")}}q=q.nextSibling}},showPerformance:function(){this.show("ysPerfButton")},showStats:function(){this.show("ysStatsButton")},showComponents:function(){this.show("ysCompsButton")},showTools:function(){this.show("ysToolButton")},showRuleSettings:function(){var o=this.yscontext.genRulesetEditView("html");this.addButtonView("ysRuleEditButton",o);this.panelNode.scrollTop=0;this.panelNode.scrollLeft=0;this.updateToolbarSelection()},runTest:function(){YSLOW.controller.run(window.top.content,this.yscontext,false)},setAutorun:function(o){YSLOW.util.Preference.setPref("extensions.yslow.autorun",o)},setAntiIframe:function(o){YSLOW.antiIframe=o},addCDN:function(x){var r,p,t=this,v=document,y=t.yscontext,z=YSLOW.util.Preference,u=z.getPref("cdnHostnames",""),o=t.panel_doc,q=o.getElementById("tab-label-list"),w=q.getElementsByTagName("li"),s=w.length;if(u){u=u.replace(/\s+/g,"").split(",");u.push(x);u=u.join()}else{u=x}z.setPref("extensions.yslow.cdnHostnames",u);for(r=0;r-1){p=q.id;break}}YSLOW.controller.lint(y.document,y);t.addButtonView("ysPerfButton",y.genPerformance("html"));YSLOW.view.restoreStatusBar(y);t.updateToolbarSelection();q=o.getElementById(p);t.onclickTabLabel({currentTarget:q},true)},onChangeRuleset:function(r){var s,p,t,u,o=YSLOW.util.getCurrentTarget(r),q=o.options[o.selectedIndex];YSLOW.controller.setDefaultRuleset(q.value);s=o.ownerDocument;p="Do you want to run the selected ruleset now?";t="Run Test";u=function(w){var v;s.ysview.closeDialog(s);if(s.yslowContext.component_set===null){YSLOW.controller.run(s.yslowContext.document.defaultView||s.yslowContext.document.parentWindow,s.yslowContext,false)}else{YSLOW.controller.lint(s.yslowContext.document,s.yslowContext)}v=s.yslowContext.genPerformance("html");s.ysview.addButtonView("ysPerfButton",v);s.ysview.panelNode.scrollTop=0;s.ysview.panelNode.scrollLeft=0;YSLOW.view.restoreStatusBar(s.yslowContext);s.ysview.updateToolbarSelection()};this.openDialog(s,389,150,p,undefined,t,u)},onclickTabLabel:function(o,u){var q,p,r,w,y,x,t,z=YSLOW.util.getCurrentTarget(o),v=z.parentNode,s=v.nextSibling;if(z.className.indexOf("selected")!==-1||z.id.indexOf("label")===-1){return false}if(v){q=v.firstChild;while(q){if(this.unselect(q)){p=q.id.substring(5);break}q=q.nextSibling}z.className+=" selected";r=z.id.substring(5);q=s.firstChild;while(q){t=q.id.substring(3);if(!w&&p&&t===p){if(q.className.indexOf("yui-hidden")===-1){q.className+=" yui-hidden"}w=true}if(!y&&r&&t===r){YSLOW.view.removeClassName(q,"yui-hidden");y=true;x=q}if((w||!p)&&(y||!r)){break}q=q.nextSibling}if(u===true&&y===true&&x){this.positionResultTab(x,s,z)}}return false},positionResultTab:function(p,o,u){var s,w,x,t=5,v=this.panel_doc,r=v.defaultView||v.parentWindow,q=r.offsetHeight?r.offsetHeight:r.innerHeight,z=u.offsetTop+p.offsetHeight;o.style.height=z+"px";p.style.position="absolute";p.style.left=u.offsetLeft+u.offsetWidth+"px";p.style.top=u.offsetTop+"px";s=p.offsetTop;w=p.offsetParent;while(w!==null){s+=w.offsetTop;w=w.offsetParent}if(sthis.panelNode.scrollTop+q){if(ss-this.panelNode.scrollTop){x=s-this.panelNode.scrollTop}this.panelNode.scrollTop+=x}}},onclickResult:function(o){YSLOW.util.preventDefault(o);return this.onclickTabLabel(o,true)},unselect:function(o){return YSLOW.view.removeClassName(o,"selected")},filterResult:function(x,o){var t,s,p,u,q,v,r,w=this.getButtonView("ysPerfButton");if(o==="all"){s=true}if(w){t=this.getElementByTagNameAndId(w,"ul","tab-label-list")}if(t){p=t.firstChild;r=t.nextSibling;q=r.firstChild;while(p){YSLOW.view.removeClassName(p,"first");if(s||p.className.indexOf(o)!==-1){p.style.display="block";if(u===undefined){u=q;v=p;YSLOW.view.removeClassName(q,"yui-hidden");p.className+=" first";if(p.className.indexOf("selected")===-1){p.className+=" selected"}p=p.nextSibling;q=q.nextSibling;continue}}else{p.style.display="none"}if(q.className.indexOf("yui-hidden")===-1){q.className+=" yui-hidden"}this.unselect(p);p=p.nextSibling;q=q.nextSibling}if(u){this.positionResultTab(u,r,v)}}},updateFilterSelection:function(q){var o,p=YSLOW.util.getCurrentTarget(q);YSLOW.util.preventDefault(q);if(p.className.indexOf("selected")!==-1){return}p.className+=" selected";o=p.parentNode.firstChild;while(o){if(o!==p&&this.unselect(o)){break}o=o.nextSibling}this.filterResult(p.ownerDocument,p.id)},onclickToolbarMenu:function(o){var s,q=YSLOW.util.getCurrentTarget(o),r=q.parentNode,p=r.parentNode;if(r.className.indexOf("selected")!==-1){return}r.className+=" selected";if(r.previousSibling){r.previousSibling.className+=" off"}if(p){s=p.firstChild;while(s){if(s!==r&&this.unselect(s)){if(s.previousSibling){YSLOW.view.removeClassName(s.previousSibling,"off")}break}s=s.nextSibling}}},expandCollapseComponentType:function(s,p){var q,r=YSLOW.controller.getRenderer("html"),o=this.getButtonView("ysCompsButton");if(o){q=this.getElementByTagNameAndId(o,"table","components-table");r.expandCollapseComponentType(s,q,p)}},expandAll:function(r){var p,q=YSLOW.controller.getRenderer("html"),o=this.getButtonView("ysCompsButton");if(o){p=this.getElementByTagNameAndId(o,"table","components-table");q.expandAllComponentType(r,p)}},regenComponentsTable:function(t,s,p){var q,r=YSLOW.controller.getRenderer("html"),o=this.getButtonView("ysCompsButton");if(o){q=this.getElementByTagNameAndId(o,"table","components-table");r.regenComponentsTable(t,q,s,p,this.yscontext.component_set)}},showComponentHeaders:function(q){var p,r,o=this.getButtonView("ysCompsButton");if(o){p=this.getElementByTagNameAndId(o,"tr",q);if(p){r=p.firstChild;if(p.style.display==="none"){p.style.display="table-row"}else{p.style.display="none"}}}},openLink:function(o){YSLOW.util.openLink(o)},openPopup:function(q,p,s,o,r){window.open(q,p||"_blank","width="+(s||626)+",height="+(o||436)+","+(r||"toolbar=0,status=1,location=1,resizable=1"))},runTool:function(o,p){YSLOW.controller.runTool(o,this.yscontext,p)},onclickRuleset:function(t){var q,p,o,s,u=YSLOW.util.getCurrentTarget(t),r=u.className.indexOf("ruleset-");YSLOW.util.preventDefault(t);if(r!==-1){p=u.className.indexOf(" ",r+8);if(p!==-1){q=u.className.substring(r+8,p)}else{q=u.className.substring(r+8)}o=this.getButtonView("ysRuleEditButton");if(o){s=this.getElementByTagNameAndId(o,"form","edit-form");YSLOW.renderer.initRulesetEditForm(u.ownerDocument,s,YSLOW.controller.getRuleset(q))}}return this.onclickTabLabel(t,false)},openSaveAsDialog:function(q,p){var o='',r="Save",s=function(z){var w,u,t,x,v,y=YSLOW.util.getCurrentTarget(z).ownerDocument;if(y.ysview.modaldlg){w=y.ysview.getElementByTagNameAndId(y.ysview.modaldlg,"input","saveas-name")}if(w){if(YSLOW.controller.checkRulesetName(w.value)===true){u=o+'
    '+w.value+" ruleset already exists.
    ";y.ysview.closeDialog(y);y.ysview.openDialog(y,389,150,u,"",r,s)}else{t=y.ysview.getButtonView("ysRuleEditButton");if(t){x=y.ysview.getElementByTagNameAndId(t,"form",p);v=y.createElement("input");v.type="hidden";v.name="saveas-name";v.value=w.value;x.appendChild(v);x.submit()}y.ysview.closeDialog(y)}}};this.openDialog(q,389,150,o,undefined,r,s)},openPrintableDialog:function(r){var q="Please run YSlow first before using Printable View.",p="Check which information you want to view or print
    ",o='
    ',s="Ok",t=function(w){var u,v=YSLOW.util.getCurrentTarget(w).ownerDocument,y=v.getElementsByName("print-type"),x={};for(u=0;u0){for(o=0;o0){if(H[C].className==="dialog-box"){E=H[C]}else{if(H[C].className==="dialog-text"){x=H[C]}else{if(H[C].className==="dialog-more-text"){w=H[C]}}}}}if(F&&E&&x&&w){x.innerHTML=(v?v:"");w.innerHTML=(u?u:"");p=F.getElementsByTagName("input");for(B=0;B0)?q:225)+"px";E.style.top=((y&&y>0)?y:80)+"px";F.style.left=this.panelNode.scrollLeft+"px";F.style.top=this.panelNode.scrollTop+"px";F.style.display="block";if(p.length>0){p[0].focus()}}},closeDialog:function(p){var o=this.modaldlg;o.style.display="none"},saveRuleset:function(s,p){var q,r=YSLOW.controller.getRenderer("html"),o=this.getButtonView("ysRuleEditButton");if(o){q=this.getElementByTagNameAndId(o,"form",p);r.saveRuleset(s,q)}},deleteRuleset:function(s,p){var q,r=YSLOW.controller.getRenderer("html"),o=this.getButtonView("ysRuleEditButton");if(o){q=this.getElementByTagNameAndId(o,"form",p);r.deleteRuleset(s,q)}},shareRuleset:function(t,r){var o,v,s,w,u,p=YSLOW.controller.getRenderer("html"),q=this.getButtonView("ysRuleEditButton");if(q){o=this.getElementByTagNameAndId(q,"form",r);v=p.getEditFormRulesetId(o);s=YSLOW.controller.getRuleset(v);if(s){w=YSLOW.Exporter.exportRuleset(s);if(w){u="";this.openDialog(t,389,150,u,"","Ok")}}}},createRuleset:function(q,p){var o,r,t=q.parentNode,s=t.parentNode,u=s.firstChild;while(u){this.unselect(u);u=u.nextSibling}o=this.getButtonView("ysRuleEditButton");if(o){r=this.getElementByTagNameAndId(o,"form",p);YSLOW.renderer.initRulesetEditForm(this.panel_doc,r)}},showHideHelp:function(){var o,p=this.getElementByTagNameAndId(this.panelNode,"div","toolbarDiv");if(p){o=this.getElementByTagNameAndId(p,"div","helpDiv")}if(o){if(o.style.visibility==="visible"){o.style.visibility="hidden"}else{o.style.visibility="visible"}}},smushIt:function(p,o){YSLOW.util.smushIt(o,function(u){var s,r,t,v,q="";if(u.error){q+="
    "+u.error+"
    "}else{t=YSLOW.util.getSmushUrl();v=YSLOW.util.makeAbsoluteUrl(u.dest,t);q+="
    Original size: "+u.src_size+" bytes
    Result size: "+u.dest_size+" bytes
    % Savings: "+u.percent+"%
    "}s='
    Image: '+YSLOW.util.briefUrl(o,250)+"
    ";r=q;p.ysview.openDialog(p,389,150,s,r,"Ok")})},checkAllRules:function(t,q,p){var r,o,s,u;if(typeof p!=="boolean"){return}o=this.getButtonView("ysRuleEditButton");if(o){s=this.getElementByTagNameAndId(o,"form",q);u=s.elements;for(r=0;rB||F>o){this.tooltip.style.display="none";return}D=u.offsetParent;while(D!==null){z+=D.offsetLeft;w+=D.offsetTop;D=D.offsetParent}z+=u.offsetLeft;w+=u.offsetTop;if(zC.ysview.panelNode.scrollTop+o)){this.tooltip.style.display="none";return}r=z+u.offsetWidth/2;q=w+u.offsetHeight/2;if(z+u.offsetWidth+A+s=C.ysview.panelNode.scrollTop)&&(w-A+F+A<=C.ysview.panelNode.scrollTop+o)){w=w-A;p="right top"}else{w+=u.offsetHeight-F;p="right bottom"}}else{if(w-F-A>=C.ysview.panelNode.scrollTop){w-=F+A;p="top"}else{w+=u.offsetHeight+A;p="bottom"}v=Math.floor(r-s/2);if((v>=C.ysview.panelNode.scrollLeft)&&(v+s<=C.ysview.panelNode.scrollLeft+B)){z=v}else{if(v0&&o&&o.length>0){r=q.className.split(" ");for(p=0;p0){w[o]=u[o]}A+=u[o]}}return{total_size:A,num_requests:p,count_obj:t,size_obj:u,canvas_data:w}},collectStats:function(){var o=this.computeStats();if(o!==undefined){this.PAGE.totalSize=o.total_size;this.PAGE.totalRequests=o.num_requests;this.PAGE.totalObjCount=o.count_obj;this.PAGE.totalObjSize=o.size_obj;this.PAGE.canvas_data.empty=o.canvas_data}o=this.computeStats(true);if(o){this.PAGE.totalSizePrimed=o.total_size;this.PAGE.totalRequestsPrimed=o.num_requests;this.PAGE.totalObjCountPrimed=o.count_obj;this.PAGE.totalObjSizePrimed=o.size_obj;this.PAGE.canvas_data.primed=o.canvas_data}},genPerformance:function(p,o){if(this.result_set===null){if(!o){o=this.document}YSLOW.controller.lint(o,this)}return YSLOW.controller.render(p,"reportcard",{result_set:this.result_set})},genStats:function(p){var o={};if(!this.PAGE.totalSize){this.collectStats()}o.PAGE=this.PAGE;return YSLOW.controller.render(p,"stats",{stats:o})},genComponents:function(o){if(!this.PAGE.totalSize){this.collectStats()}return YSLOW.controller.render(o,"components",{comps:this.component_set.components,total_size:this.PAGE.totalSize})},genToolsView:function(p){var o=YSLOW.Tools.getAllTools();return YSLOW.controller.render(p,"tools",{tools:o})},genRulesetEditView:function(o){return YSLOW.controller.render(o,"rulesetEdit",{rulesets:YSLOW.controller.getRegisteredRuleset()})}};YSLOW.renderer={sortBy:"type",sortDesc:false,bPrintable:false,colors:{doc:"#8963df",redirect:"#FC8C8C",iframe:"#FFDFDF",xhr:"#89631f",flash:"#8D4F5B",js:"#9fd0e8",css:"#aba5eb",cssimage:"#677ab8",image:"#d375cd",favicon:"#a26c00",unknown:"#888888"},reset:function(){this.sortBy="type";this.sortDesc=false},genStats:function(w,x){var t,u,q,p,z,v,o,s,r="",y=0;if(!w.PAGE){return""}if(x){t=w.PAGE.totalObjCountPrimed;u=w.PAGE.totalObjSizePrimed;q=w.PAGE.totalRequestsPrimed;y=w.PAGE.totalSizePrimed}else{t=w.PAGE.totalObjCount;u=w.PAGE.totalObjSize;q=w.PAGE.totalRequests;y=w.PAGE.totalSize}p=YSLOW.peeler.types;z=(x)?"primed":"empty";for(v=0;v
     
    '+t[o]+''+YSLOW.util.prettyType(o)+''+YSLOW.util.kbSize(u[o])+""}}s='
    HTTP Requests - '+q+'
    Total Weight - '+YSLOW.util.kbSize(y)+'
    '+r+"
    ";return s},plotComponents:function(o,p){if(typeof o!=="object"){return}this.plotOne(o,p.PAGE.canvas_data.empty,p.PAGE.totalSize,"comp-canvas-empty");this.plotOne(o,p.PAGE.canvas_data.primed,p.PAGE.totalSizePrimed,"comp-canvas-primed")},plotOne:function(y,r,x,w){var q,s,A,p,v,o,u,B,t,z=y.getElementsByTagName("canvas");for(s=0;s'+YSLOW.util.escapeHtml(o.headers[q])+""}}if(o.req_headers){p+='Request Headers';for(q in o.req_headers){if(o.req_headers.hasOwnProperty(q)&&o.req_headers[q]){p+=''+YSLOW.util.escapeHtml(YSLOW.util.formatHeaderName(q))+'

    '+YSLOW.util.escapeHtml(o.req_headers[q])+"

    "}}}p+="";return p},genComponentRow:function(u,t,p,s){var q,y,r,o,x,w,v;if(typeof p!=="string"){p=""}if(t.status>=400&&t.status<500){p+=" compError"}if(t.after_onload===true){p+=" afteronload"}q="compHeaders"+t.id;y='";for(r in u){if(u.hasOwnProperty(r)){o=r;x="";if(r==="type"){x+=t[r];if(t.is_beacon){x+=" †"}if(t.after_onload){x+=" *"}}else{if(r==="size"){x+=YSLOW.util.kbSize(t.size)}else{if(r==="url"){if(t.status>=400&&t.status<500){y+=''+t[r]+" (status: "+t.status+")";continue}else{x+=YSLOW.util.prettyAnchor(t[r],t[r],undefined,!YSLOW.renderer.bPrintable,100,1,t.type)}}else{if(r==="gzip"&&(t.compressed==="gzip"||t.compressed==="deflate")){x+=(t.size_compressed!==undefined?YSLOW.util.kbSize(t.size_compressed):"uncertain")}else{if(r==="set-cookie"){w=t.getSetCookieSize();x+=w>0?w:""}else{if(r==="cookie"){v=t.getReceivedCookieSize();x+=v>0?v:""}else{if(r==="etag"){x+=t.getEtag()}else{if(r==="expires"){x+=YSLOW.util.prettyExpiresDate(t.expires)}else{if(r==="headers"){if(YSLOW.renderer.bPrintable){continue}if(t.raw_headers&&t.raw_headers.length>0){x+="'}}else{if(r==="action"){if(YSLOW.renderer.bPrintable){continue}if(t.type==="cssimage"||t.type==="image"){if(t.response_type===undefined||t.response_type==="image"){x+="smush.it"}}}else{if(t[r]!==undefined){x+=t[r]}}}}}}}}}}}y+=''+x+""}}y+="";if(t.raw_headers&&t.raw_headers.length>0){y+=''+this.getComponentHeadersTable(t)+""}return y},componentSortCallback:function(o,w){var p,r,s,u="",t="",v=YSLOW.renderer.sortBy,q=YSLOW.renderer.sortDesc;switch(v){case"type":u=o.type;t=w.type;break;case"size":u=o.size?Number(o.size):0;t=w.size?Number(w.size):0;break;case"gzip":u=o.size_compressed?Number(o.size_compressed):0;t=w.size_compressed?Number(w.size_compressed):0;break;case"set-cookie":u=o.getSetCookieSize();t=w.getSetCookieSize();break;case"cookie":u=o.getReceivedCookieSize();t=w.getReceivedCookieSize();break;case"headers":break;case"url":u=o.url;t=w.url;break;case"respTime":u=o.respTime?Number(o.respTime):0;t=w.respTime?Number(w.respTime):0;break;case"etag":u=o.getEtag();t=w.getEtag();break;case"action":if(o.type==="cssimage"||o.type==="image"){u="smush.it"}if(w.type==="cssimage"||w.type==="image"){t="smush.it"}break;case"expires":u=o.expires||0;t=w.expires||0;break}if(u===t){if(o.id>w.id){return(q)?-1:1}if(o.idt){return(q)?-1:1}if(u',t='
    ',r='
    ';for(o in y){if(y.hasOwnProperty(o)&&y[o]){w=y[o];q='
    ";if(x.rules[o]!==undefined){z+=1}if(x.weights!==undefined&&x.weights[o]!==undefined){u+=''}p=(s%3);switch(p){case 0:v+=q;break;case 1:t+=q;break;case 2:r+=q;break}s+=1}}v+="
    ";t+="
    ";r+="";return'

    '+x.name+' Ruleset (includes '+parseInt(z,10)+" of "+parseInt(s,10)+' rules)

    '+v+""+t+""+r+'
    '+u+"
    "},genRulesetEditForm:function(o){var p="";p+='
    '+YSLOW.renderer.genRulesCheckbox(o)+'
    ';return p},initRulesetEditForm:function(G,p,B){var A,D,C,z,E,I,u,H,t,w,o,s,y,q=p.elements,r="",x=[],v=0,F=0;for(D=0;D'}v+=1}}o.innerHTML="(includes "+parseInt(v,10)+" of "+parseInt(F,10)+" rules)";I.innerHTML='';u.innerHTML='';H.innerHTML=B.name}else{I.innerHTML="";u.innerHTML="";H.innerHTML="New";o.innerHTML=""}t.innerHTML=r}};YSLOW.registerRenderer({id:"html",supports:{components:1,reportcard:1,stats:1,tools:1,rulesetEdit:1},genComponentsTable:function(p,A,t){var y,w,z,x,s={type:"TYPE",size:"SIZE
    (KB)",gzip:"GZIP
    (KB)","set-cookie":"COOKIE RECEIVED
    (bytes)",cookie:"COOKIE SENT
    (bytes)",headers:"HEADERS",url:"URL",expires:"EXPIRES
    (Y/M/D)",respTime:"RESPONSE
    TIME (ms)",etag:"ETAG",action:"ACTION"},v=false,r="",u="",o=0,q=0;if(A!==undefined&&s[A]===undefined){return""}if(YSLOW.renderer.bPrintable){A=YSLOW.renderer.sortBy;t=YSLOW.renderer.sortDesc}else{if(A===undefined||A==="type"){A="type";v=true}}p=YSLOW.renderer.sortComponents(p,A,t);r+='';for(y in s){if(s.hasOwnProperty(y)&&s[y]){if(YSLOW.renderer.bPrintable&&(y==="action"||y==="components"||y==="headers")){continue}r+="'+(A===y?(t?"↓":"↑"):"")+" "+s[y]+""}}}r+="";for(w=0;w";r+=u;u="";o=0;q=0;z=x.type}}u+=YSLOW.renderer.genComponentRow(s,x,(o%2===0?"even":"odd"),v);o+=1;q+=x.size}else{r+=YSLOW.renderer.genComponentRow(s,x,(w%2===0?"even":"odd"),false)}}if(u.length>0){r+='";r+=u}r+="
    '+z+" ("+o+')'+YSLOW.util.kbSize(q)+"
    '+z+" ("+o+')'+YSLOW.util.kbSize(q)+"
    ";return r},componentsView:function(u,p){var r,q=this.genComponentsTable(u,YSLOW.renderer.sortBy,false),s="in type column indicates the component is loaded after window onload event.",o="denotes 1x1 pixels image that may be image beacon",t="Components";if(YSLOW.doc){if(YSLOW.doc.components_legend){if(YSLOW.doc.components_legend.beacon){s=YSLOW.doc.components_legend.beacon}if(YSLOW.doc.components_legend.after_onload){o=YSLOW.doc.components_legend.after_onload}}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.components){t=YSLOW.doc.view_names.components}}r='
    '+t+'The page has a total of '+u.length+' components and a total weight of '+YSLOW.util.kbSize(p)+' bytes
    '+q+'
    * '+s+"
    † "+o+"
    ";return r},reportcardPrintableView:function(r,p,u){var s,q,w,o,v,t='
    ";for(s=0;s"}}t+="
    Overall Grade: '+p+" (Ruleset applied: "+u.name+")
    '+o+'

    '+w.name+'

    '+w.message+"
    ";if(w.components&&w.components.length>0){t+='
      ';for(q=0;q"+w.components[q]+""}else{if(w.components[q].url!==undefined){t+="
    • "+YSLOW.util.briefUrl(w.components[q].url,60)+"
    • "}}}t+="

    "}t+="

    ";return t},getFilterCode:function(v,s,q,o){var u,p,t,w,z,A,r,y=s.length,x=[];for(p in v){if(v.hasOwnProperty(p)&&v[p]){x.push(p)}}x.sort();u='
    • ALL ('+y+')
    • FILTER BY:
    • ';for(t=0,w=x.length;t'+x[t].toUpperCase()+" ("+v[x[t]]+")"}z="http://yslow.org/scoremeter/?url="+encodeURIComponent(o)+"&grade="+q;for(t=0;t=0&&r<100){z+="&"+A.rule_id.toLowerCase()+"="+r}}z=encodeURIComponent(encodeURIComponent(z));o=encodeURIComponent(encodeURIComponent(o.slice(0,60)+(o.length>60?"...":"")));u+='";u+='";u+="
    ";return u},reportcardView:function(q){var u,F,D,C,v,p,t,J,z,G,I,H,o,s,w='
    ',E=q.getRulesetApplied(),y=q.getResults(),r=q.url,K="Grade",B="",A="",x={};if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.grade){K=YSLOW.doc.view_names.grade}}u=YSLOW.util.prettyScore(q.getOverallScore());if(YSLOW.renderer.bPrintable){return this.reportcardPrintableView(y,u,E)}w+='
    '+K+'
    '+u+'
    Overall performance score '+Math.round(q.getOverallScore())+'Ruleset applied: '+E.name+'URL: '+YSLOW.util.briefUrl(r,100)+"
    ";for(F=0;F0){J+=" "}J+=v.category[C];if(x[v.category[C]]===undefined){x[v.category[C]]=0}x[v.category[C]]+=1}}if(J.length>0){B+=' class="'+J+'"'}B+=' onclick="javascript:document.ysview.onclickResult(event)">
    '+p+''+v.name+"
  • ";A+='
    ")}A+='">

    Grade '+p+" on "+v.name+"

    "+v.message+"
    ";if(v.components&&v.components.length>0){A+='

      ';for(D=0;D"+H+""}else{if(H.url!==undefined){A+="
    • ";o=v.rule_id.toLowerCase();if(v.rule_id.match("expires")){A+="("+YSLOW.util.prettyExpiresDate(H.expires)+") "}A+=YSLOW.util.prettyAnchor(H.url,H.url,undefined,true,120,undefined,H.type)+"
    • "}}}A+="

    "}A+="

    ";s=YSLOW.controller.getRule(v.rule_id);if(s){A+='

    '+(s.info||"** To be added **")+"

    ";if(s.url!==undefined){A+='

    »Read More

    "}}A+="
    "}}w+='
    '+this.getFilterCode(x,y,u,r)+'
      '+B+'
    '+A+'
    '+YSLOW.doc.copyright+"
    ";return w},statsView:function(p){var o="",q="Stats";if(YSLOW.doc){if(YSLOW.doc.view_names&&YSLOW.doc.view_names.stats){q=YSLOW.doc.view_names.stats}}o+='
    '+q+'The page has a total of '+p.PAGE.totalRequests+' HTTP requests and a total weight of '+YSLOW.util.kbSize(p.PAGE.totalSize)+" bytes with empty cache
    ";o+='
    WEIGHT GRAPHS
    ';o+='
    Empty Cache
    '+YSLOW.renderer.genStats(p,false)+"
    ";o+='
    Primed Cache
    '+YSLOW.renderer.genStats(p,true)+"
    ";o+="
    ";return o},toolsView:function(s){var r,q,p,o="",u="Tools",t="Click the Launch Tool link next to the tool you want to run to start the tool.";if(YSLOW.doc){if(YSLOW.doc.tools_desc){t=YSLOW.doc.tools_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.tools){u=YSLOW.doc.view_names.tools}}for(r=0;r"}o+="
    "+p.name+"-"+(p.short_desc||"Short text here explaining what are the main benefits of running this App")+"
    ";q='
    '+u+""+t+'
    '+o+"
    ";return q},rulesetEditView:function(B){var q,z,s,r,u='
    ',A,x,w=0,p=false,o,t,y="Rule Settings",v="Choose which ruleset better fit your specific needs. You can Save As an existing rule, based on an existing ruleset.";if(YSLOW.doc){if(YSLOW.doc.rulesettings_desc){v=YSLOW.doc.rulesettings_desc}if(YSLOW.doc.view_names&&YSLOW.doc.view_names.rulesetedit){y=YSLOW.doc.view_names.rulesetedit}}t=YSLOW.controller.getDefaultRulesetId();A='
    • STANDARD SETS
    • ';for(q in B){if(B.hasOwnProperty(q)&&B[q]){z=B[q];s="tab"+w;if(!p&&z.custom===true){A+='
    • CUSTOM SETS
    • ';p=true}A+='
    • '+z.name+"
    • ";w+=1}}A+='
    ';x='
    '+YSLOW.renderer.genRulesetEditForm(o)+"
    ";u+=A+x;r='
    '+y+""+v+"
    "+u+"
    ";return r},rulesetEditUpdateTab:function(G,o,A,p,y){var q,z,D,s,x,E,B,v,r,w,F,C,t,u=o.parentNode.parentNode.parentNode;if(u&&u.id==="settingsDiv"&&A.custom===true){q=u.firstChild;z=q.nextSibling;if(p<1){D=q.firstChild;while(D){s=D.className.indexOf("ruleset-");if(s!==-1){x=D.className.substring(s+8);s=x.indexOf(" ");if(s!==-1){x=x.substring(0,s)}if(A.id===x){s=D.id.indexOf("label");if(s!==-1){E=D.id.substring(s+5);if(D.className.indexOf("selected")!==-1){B={};B.currentTarget=F;G.ysview.onclickRuleset(B)}if(D.previousSibling&&D.previousSibling.id==="custom-set-title"&&D.nextSibling&&D.nextSibling.id==="create-ruleset"){v=D.previousSibling}q.removeChild(D);if(v){q.removeChild(v)}}break}else{F=D}}D=D.nextSibling}}else{D=q.lastChild;while(D){w=D.id.indexOf("label");if(w!==-1){r=D.id.substring(w+5);break}D=D.previousSibling}r=Number(r)+1;D=G.createElement("li");D.className="ruleset-"+A.id;D.id="label"+r;D.onclick=function(H){G.ysview.onclickRuleset(H)};D.innerHTML=''+A.name+"";q.insertBefore(D,q.lastChild);C=q.firstChild;while(C){if(C.id&&C.id==="custom-set-title"){v=C;break}C=C.nextSibling}if(!v){v=G.createElement("li");v.className="new-section header";v.id="custom-set-title";v.innerHTML="CUSTOM SETS";q.insertBefore(v,D)}if(y){t={};t.currentTarget=D;G.ysview.onclickRuleset(t)}}}},hasClassName:function(r,o){var p,q=r.split(" ");if(q){for(p=0;p";q+=""+s[r].type+"";q+=""+s[r].size+"";if(s[r].compressed===false){q+=""}else{q+=""+(s[r].size_compressed!==undefined?parseInt(s[r].size_compressed,10):"uncertain")+""}o=s[r].getSetCookieSize();if(o>0){q+=""+parseInt(o,10)+""}o=s[r].getReceivedCookieSize();if(o>0){q+=""+parseInt(o,10)+""}q+=""+encodeURI(s[r].url)+"";q+=""+s[r].expires+"";q+=""+s[r].respTime+"";q+=""+s[r].getEtag()+"";q+=""}q+="";return q},reportcardView:function(u){var r,p,w,s=u.getOverallScore(),q=YSLOW.util.prettyScore(s),v=u.getRulesetApplied(),t=u.getResults(),o='';o+='';for(r=0;r';o+=""+w.message+"";if(t.components&&t.components.length>0){o+="";for(p=0;p"+w.components[p]+""}else{if(w.components[p].url!==undefined){o+=""+w.components[p].url+""}}}o+=""}o+=""}o+="";return o},statsView:function(r){var q,u,p,t='',s='',o=YSLOW.peeler.types;for(q=0;q'}if((r.PAGE.totalObjCount[u])!==undefined){s+=''}}t+="";s+="";p=''+t+s+"";return p}});YSLOW.peeler={types:["doc","js","css","iframe","flash","cssimage","image","favicon","xhr","redirect","font"],NODETYPE:{ELEMENT:1,DOCUMENT:9},CSSRULE:{IMPORT_RULE:3,FONT_FACE_RULE:5},peel:function(o,p){},findDocuments:function(p){var w,z,s,x,t,u,o,A,y,q={};YSLOW.util.event.fire("peelProgress",{total_step:7,current_step:1,message:"Finding documents"});if(!p){return}if(!YSLOW.util.Preference.getPref("extensions.yslow.getFramesComponents",true)){q[p.URL]={document:p,type:"doc"};return q}x="doc";if(p.nodeType===this.NODETYPE.DOCUMENT){z=p;s=p.URL}else{if(p.nodeType===this.NODETYPE.ELEMENT&&p.nodeName.toLowerCase()==="frame"){z=p.contentDocument;s=p.src}else{if(p.nodeType===this.NODETYPE.ELEMENT&&p.nodeName.toLowerCase()==="iframe"){z=p.contentDocument;s=p.src;x="iframe";try{y=p.contentWindow;y=y&&y.parent;y=y&&y.document;y=y||p.ownerDocument;if(y&&y.URL===s){s=!p.getAttribute("src")?"":"about:blank"}}catch(r){YSLOW.util.dump(r)}}else{return q}}}q[s]={document:z,type:x};try{w=z.getElementsByTagName("iframe");for(t=0,u=w.length;t0){for(q=0;q0){for(q=0;q