<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Blair Robot Project Blog &#187; JS</title>
	<atom:link href="http://robot.mbhs.edu/wordpress/tag/js/feed/" rel="self" type="application/rss+xml" />
	<link>http://robot.mbhs.edu/wordpress</link>
	<description></description>
	<lastBuildDate>Thu, 04 Mar 2010 16:10:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Fading In/Out with Javascript Without Scriptaculous</title>
		<link>http://robot.mbhs.edu/wordpress/2009/fading-inout-with-javascript-without-scriptaculous/</link>
		<comments>http://robot.mbhs.edu/wordpress/2009/fading-inout-with-javascript-without-scriptaculous/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 23:53:03 +0000</pubDate>
		<dc:creator>Scott</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Website Development]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[DOM]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://robot.mbhs.edu/wordpress/?p=308</guid>
		<description><![CDATA[For a new version of the robotics team history page at /history, I was creating a pure-javascript (for reasons I will not enumerate here), cross-browser (for reasons I need not enumerate here) application to display information about the team in a certain year when that year was clicked.  Most of the code was relatively [...]]]></description>
			<content:encoded><![CDATA[<p>For a new version of the robotics team history page at <a href="http://robot.mbhs.edu/history">/history</a>, I was creating a pure-javascript (for reasons I will not enumerate here), cross-browser (for reasons I need not enumerate here) application to display information about the team in a certain year when that year was clicked.  Most of the code was relatively simple (the cross-browser part remains to be done), since I just had to get the information from the document structure and then re-output it, with some of it hidden and modified in an appropriate fashion.</p>
<p>The most difficult part was blessing my application with fades.  When I clicked on a year, I wanted to see a short (~1 second) transition in which the current year faded out, and when it was gone, the next year faded in.  I chose not to use scriptaculous, which is built on prototype, because the combination is well over 200KB and would dwarf my 15-20KB application.  Scriptaculous was overkill (an in my opinion, is overkill for almost anything).  As usual, the complete code is displayed at the bottom.</p>
<span id="more-308"></span>
<p>The key was the <code>style.opacity</code> element of HTML elements in Javascript.  This does exactly what it should do &#8211; set <code>element.style.opacity</code> to be 1.0 for 100% opacity, set it to be 0.0 for a transparent element.  Anything else is, according to my science teacher, &#8216;translucent&#8217;.  Now the only things remaining are getting the elements to be on top of each other (with absolute positioning, this is pretty easy), and making the fades gradual using <code>setTimeout</code>.</p>
<p>The <code>setTimeout()</code> is actually pretty tricky.  The problem is that a function like this:</p>
<div class="geshi no javascript"><ol><li class="li1"><div class="de1"><span class="kw2">function</span> doFadeIn<span class="br0">&#40;</span>element,increment,timeout<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> current=element.<span class="me1">style</span>.<span class="me1">opacity</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>current==<span class="kw2">null</span> <span class="sy0">||</span> current==<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> current=<span class="nu0">0.0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>current<span class="sy0">&lt;</span><span class="nu0">1.0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">opacity</span>=parseFloat<span class="br0">&#40;</span>increment<span class="br0">&#41;</span>+parseFloat<span class="br0">&#40;</span>current<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">display</span>=<span class="st0">&quot;block&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="st0">&quot;doFadeIn(element,&quot;</span>+increment+<span class="st0">&quot;,&quot;</span>+timeout+<span class="st0">&quot;)&quot;</span>,timeout<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">opacity</span>=<span class="nu0">1.0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol></div>
<p>Will totally screw up, since &#8216;element&#8217; is not of global scope.  So, you need to make a global variable <code>_in_element</code> that will store the element during the transition.</p>
<p>And now the code.  I don&#8217;t vouch that this actually works on any browser except Firefox (I know, for example, that it does not work on Internet Explorer).  You&#8217;ll note that I did something very ugly &#8211; I set the &#8217;showElement&#8217; to delay its action for 500 milliseconds.  This was a cheap hack, and should have been done in the &#8216;displayYear&#8217; function.</p>
<p><b>Cross-browser update:</b> it now works on everything except Internet Explorer.  Apparently IE uses the &#8216;filter&#8217; CSS property instead of &#8216;opacity&#8217;.</p>
<div class="geshi javascript"><ol><li class="li1"><div class="de1"><span class="kw2">var</span> _element;</div></li>
<li class="li1"><div class="de1"><span class="kw2">var</span> _out_element;</div></li>
<li class="li1"><div class="de1"><span class="kw2">var</span> _in_element;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> hideElement<span class="br0">&#40;</span>element,effect<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>effect==<span class="kw2">null</span><span class="br0">&#41;</span> effect=<span class="kw2">true</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>element<span class="sy0">!</span>=<span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>effect <span class="sy0">&amp;&amp;</span> element.<span class="me1">style</span>.<span class="me1">display</span><span class="sy0">!</span>=<span class="st0">&quot;none&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">display</span>=<span class="st0">&quot;block&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">position</span>=<span class="st0">&quot;absolute&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">opacity</span>=<span class="nu0">1.0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doFadeOut<span class="br0">&#40;</span>element<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">display</span>=<span class="st0">&quot;none&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> showElement<span class="br0">&#40;</span>element,effect<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>effect==<span class="kw2">null</span><span class="br0">&#41;</span> effect=<span class="kw2">true</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>element<span class="sy0">!</span>=<span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">postition</span>=<span class="st0">&quot;absolute&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>effect<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; _element=element;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="st0">&quot;doFadeIn(_element)&quot;</span>,<span class="nu0">500</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">display</span>=<span class="st0">&quot;block&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> doFadeIn<span class="br0">&#40;</span>element,increment,timeout<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _in_element=element;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>increment==<span class="kw2">null</span><span class="br0">&#41;</span> increment=<span class="nu0">0.05</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>timeout==<span class="kw2">null</span><span class="br0">&#41;</span> timeout=<span class="nu0">15</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> current=element.<span class="me1">style</span>.<span class="me1">opacity</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>current==<span class="kw2">null</span> <span class="sy0">||</span> current==<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> current=<span class="nu0">0.0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>current<span class="sy0">&lt;</span><span class="nu0">1.0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">opacity</span>=parseFloat<span class="br0">&#40;</span>increment<span class="br0">&#41;</span>+parseFloat<span class="br0">&#40;</span>current<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">display</span>=<span class="st0">&quot;block&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="st0">&quot;doFadeIn(_in_element,&quot;</span>+increment+<span class="st0">&quot;,&quot;</span>+timeout+<span class="st0">&quot;)&quot;</span>,timeout<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">opacity</span>=<span class="nu0">1.0</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> doFadeOut<span class="br0">&#40;</span>element,increment,timeout<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; _out_element=element;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>increment==<span class="kw2">null</span><span class="br0">&#41;</span> increment=<span class="nu0">0.05</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>timeout==<span class="kw2">null</span><span class="br0">&#41;</span> timeout=<span class="nu0">25</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> current=element.<span class="me1">style</span>.<span class="me1">opacity</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>current==<span class="kw2">null</span> <span class="sy0">||</span> current==<span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> current=<span class="st0">&quot;1.0&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>current<span class="sy0">&gt;</span><span class="st0">&quot;0.0&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">opacity</span>=current-increment;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; setTimeout<span class="br0">&#40;</span><span class="st0">&quot;doFadeOut(_out_element,&quot;</span>+increment+<span class="st0">&quot;,&quot;</span>+timeout+<span class="st0">&quot;)&quot;</span>,timeout<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; element.<span class="me1">style</span>.<span class="me1">display</span>=<span class="st0">&quot;none&quot;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">var</span> AIDA=<span class="kw2">new</span> <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//some stuff here</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span>.<span class="me1">displayYear</span>=<span class="kw2">function</span><span class="br0">&#40;</span>yr,effect<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span><span class="br0">&#40;</span><span class="kw2">var</span> i=minyear;i<span class="sy0">&lt;</span>=maxyear;i++<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>years<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">!</span>=<span class="kw2">null</span> <span class="sy0">&amp;&amp;</span> i<span class="sy0">!</span>=yr<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; hideElement<span class="br0">&#40;</span>document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;AIDA-year-&quot;</span>+i<span class="br0">&#41;</span>,effect<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span><span class="br0">&#40;</span>document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;AIDA-year-&quot;</span>+yr<span class="br0">&#41;</span>.<span class="me1">style</span>.<span class="me1">display</span><span class="sy0">!</span>=<span class="st0">&quot;none&quot;</span> <span class="sy0">||</span> <span class="sy0">!</span>effect<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; showElement<span class="br0">&#40;</span>document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&quot;AIDA-year-&quot;</span>+yr<span class="br0">&#41;</span>,effect<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li></ol></div>]]></content:encoded>
			<wfw:commentRss>http://robot.mbhs.edu/wordpress/2009/fading-inout-with-javascript-without-scriptaculous/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Minifying CSS and JS</title>
		<link>http://robot.mbhs.edu/wordpress/2009/minifying-css-and-js/</link>
		<comments>http://robot.mbhs.edu/wordpress/2009/minifying-css-and-js/#comments</comments>
		<pubDate>Wed, 27 May 2009 16:29:55 +0000</pubDate>
		<dc:creator>Scott</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Website Development]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Coding]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[JS]]></category>
		<category><![CDATA[minify]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[Scriptaculous]]></category>

		<guid isPermaLink="false">http://robot.mbhs.edu/wordpress/?p=121</guid>
		<description><![CDATA[Many web developers want to make use of large, flashy Javascript libraries that allow fancy effects. (Most such libraries also come with large CSS files).  Team 449&#8217;s website uses Prototype (an AJAX library) and Scriptaculous (a JS effects library built on top of prototype).  While many or most viewers of the website may [...]]]></description>
			<content:encoded><![CDATA[<p>Many web developers want to make use of large, flashy Javascript libraries that allow fancy effects. (Most such libraries also come with large CSS files).  Team 449&#8217;s website uses Prototype (an AJAX library) and Scriptaculous (a JS effects library built on top of prototype).  While many or most viewers of the website may enjoy the experience, others, who have slower connections or are farther away or have the bad luck to view the website during peak viewing time, get frustrated with the long load time.</p>
<p>The solution to this is twofold.  First, install gzipping on the server &#8211; I&#8217;ll discuss this in a later entry.  Second, use a minification program, such as <a href="http://developer.yahoo.com/yui/compressor/" title="JS and CSS minification program provided by Yahoo">the one Yahoo provides</a>.  These programs take the JS or CSS files and remove unnecessary whitespace and comments to decrease the file size.  The end result &#8211; the load time is often cut in half or better.</p>
<p>Yahoo&#8217;s compressor must be called from the command line and told to actually compress the file.  Naturally, most people will want to automate this process, so that they don&#8217;t have to remember to call the compressor everytime they install a new version of scriptaculous or prototype, or make a change.</p>
<p>One possibility is to set up a serving script that first calls the compressor and then serves the page.  This can be done in the htaccess like so:</p>
<pre>
Options +FollowSymlinks
RewriteEngine on

RewriteRule ^js/(.*)$ jserve.php/$1 [L]
RewriteRule ^style/(.*)$ cserve.php/$1 [L]
</pre>
<p>This is grossly inefficient.  For a medium or high-traffic website, it will completely kill your server.  The better solution (and the one we used at the Blair Robot Project) is to have the compressor be called in your crontab, and then have the serving script serve the minified file.  The crontab entry would then look like:</p>
<pre>
*/30 * * * * /var/www/robot/scripts/manage-roboweb.sh
</pre>
<p>The above entry runs <code>manage-roboweb.sh</code> every 30 minutes.  In <code>manage-roboweb.sh</code>, we have a call to a c minification program that automatically finds every file in a specified directory (in this case <code>/var/www/robot/js</code>) that has a specified extension, and processes that file with a call to YUI (the Yahoo compression application).</p>
<p>This can be improved by having the serving script first check to see if the minified file is up-to-date, by checking the last modified times of each.  You can also have the managing script do the same, so that the files are only re-minified if they were modified.  I&#8217;ve placed the code we used for both serving scripts below.</p>
<p>
<b><code>cserve.php</code></b></p>
<div class="geshi no php"><ol><li class="li1"><div class="de1"><span class="kw2">function</span> minify_version<span class="br0">&#40;</span><span class="re1">$fn</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re1">$min_fn</span> <span class="sy0">=</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&quot;.css&quot;</span><span class="sy0">,</span> <span class="st0">&quot;.min.css&quot;</span><span class="sy0">,</span> <span class="re1">$fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re1">$min_stat</span> <span class="sy0">=</span> <span class="kw3">stat</span><span class="br0">&#40;</span><span class="re1">$min_fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re1">$norm_stat</span> <span class="sy0">=</span> <span class="kw3">stat</span><span class="br0">&#40;</span><span class="re1">$fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">return</span> <span class="re1">$min_stat</span> <span class="sy0">&amp;&amp;</span> <span class="re1">$min_stat</span><span class="br0">&#91;</span><span class="st0">&#39;mtime&#39;</span><span class="br0">&#93;</span> <span class="sy0">&gt;=</span> <span class="re1">$norm_stat</span><span class="br0">&#91;</span><span class="st0">&#39;mtime&#39;</span><span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ? <span class="re1">$min_fn</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="sy0">:</span> <span class="re1">$fn</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">substr_count</span><span class="br0">&#40;</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_ACCEPT_ENCODING&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st0">&#39;gzip&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="st0">&quot;ob_gzhandler&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$offset</span><span class="sy0">=</span><span class="nu0">1000</span><span class="sy0">*</span><span class="nu0">3600</span><span class="sy0">*</span><span class="nu0">48</span><span class="sy0">;</span><span class="co1">//48 hour cache</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Expires: &quot;</span><span class="sy0">.</span><span class="kw3">gmdate</span><span class="br0">&#40;</span><span class="st0">&quot;D, d M Y H:i:s&quot;</span><span class="sy0">,</span><span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="re1">$offset</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot; GMT&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: max-age=$offset, must-revalidate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$gmdate_mod</span> <span class="sy0">=</span> <span class="kw3">gmdate</span><span class="br0">&#40;</span><span class="st0">&#39;D, d M Y H:i:s&#39;</span><span class="sy0">,</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39; GMT&#39;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Last-Modified: $gmdate_mod&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Pragma: public&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: text/css&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$url</span><span class="sy0">=</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;REQUEST_URI&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$fn</span><span class="sy0">=</span>minify_version<span class="br0">&#40;</span><span class="st0">&quot;/var/www/robot/style/&quot;</span> <span class="sy0">.</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&quot;/style/&quot;</span><span class="sy0">,</span><span class="st0">&quot;&quot;</span><span class="sy0">,</span><span class="re1">$url</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$file</span><span class="sy0">=</span><span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="re1">$fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">echo</span> <span class="re1">$file</span><span class="sy0">;</span></div></li></ol></div>
<p><b><code>jserve.php</code></b></p>
<div class="geshi no php"><ol><li class="li1"><div class="de1"><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">substr_count</span><span class="br0">&#40;</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&#39;HTTP_ACCEPT_ENCODING&#39;</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="st0">&#39;gzip&#39;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp;<span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="st0">&quot;ob_gzhandler&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw3">ob_start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">function</span> minify_version<span class="br0">&#40;</span><span class="re1">$fn</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re1">$min_fn</span> <span class="sy0">=</span> <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&quot;.js&quot;</span><span class="sy0">,</span> <span class="st0">&quot;.min.js&quot;</span><span class="sy0">,</span> <span class="re1">$fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re1">$min_stat</span> <span class="sy0">=</span> <span class="kw3">stat</span><span class="br0">&#40;</span><span class="re1">$min_fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="re1">$norm_stat</span> <span class="sy0">=</span> <span class="kw3">stat</span><span class="br0">&#40;</span><span class="re1">$fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">return</span> <span class="re1">$min_stat</span> <span class="sy0">&amp;&amp;</span> <span class="re1">$min_stat</span><span class="br0">&#91;</span><span class="st0">&#39;mtime&#39;</span><span class="br0">&#93;</span> <span class="sy0">&gt;=</span> <span class="re1">$norm_stat</span><span class="br0">&#91;</span><span class="st0">&#39;mtime&#39;</span><span class="br0">&#93;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ? <span class="re1">$min_fn</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="sy0">:</span> <span class="re1">$fn</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$offset</span><span class="sy0">=</span><span class="nu0">1000</span><span class="sy0">*</span><span class="nu0">3600</span><span class="sy0">*</span><span class="nu0">48</span><span class="sy0">;</span><span class="co1">//48 hour cache</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Expires: &quot;</span><span class="sy0">.</span><span class="kw3">gmdate</span><span class="br0">&#40;</span><span class="st0">&quot;D, d M Y H:i:s&quot;</span><span class="sy0">,</span><span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="re1">$offset</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot; GMT&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: max-age=$offset, must-revalidate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$gmdate_mod</span> <span class="sy0">=</span> <span class="kw3">gmdate</span><span class="br0">&#40;</span><span class="st0">&#39;D, d M Y H:i:s&#39;</span><span class="sy0">,</span> <span class="kw3">time</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">.</span> <span class="st0">&#39; GMT&#39;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Last-Modified: $gmdate_mod&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Pragma: public&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: text/javascript&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="re1">$url</span><span class="sy0">=</span><span class="re1">$_SERVER</span><span class="br0">&#91;</span><span class="st0">&quot;REQUEST_URI&quot;</span><span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re1">$fn</span> <span class="sy0">=</span> minify_version<span class="br0">&#40;</span><span class="st0">&quot;/var/www/robot/js/&quot;</span> <span class="sy0">.</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">str_replace</span><span class="br0">&#40;</span><span class="st0">&quot;/js/&quot;</span><span class="sy0">,</span> <span class="st0">&quot;&quot;</span><span class="sy0">,</span> <span class="re1">$url</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re1">$contents</span><span class="sy0">=</span><span class="kw3">file_get_contents</span><span class="br0">&#40;</span><span class="re1">$fn</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw3">echo</span> <span class="re1">$contents</span><span class="sy0">;</span></div></li></ol></div>
]]></content:encoded>
			<wfw:commentRss>http://robot.mbhs.edu/wordpress/2009/minifying-css-and-js/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
