<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>路上，在行走...</title>
    <description></description>
    <link>http://ecchanger.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Rails命令大全</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/135080" style="color:red;">http://ecchanger.javaeye.com/blog/135080</a>&nbsp;
          发表时间: 2007年10月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><strong>1.1 创建一个Rails应用程序</strong><br />
$ rails app_name<br />
可选项:<br />
-d, database=xxx 指定安装一个数据库(mysql oracle postgresql sqlite2 sqlite3 ), 默认情况下是数据库<br />
-r, ruby-path= 指定Ruby的安装路径,如果没有指定，scripts使用env去找Ruby <br />
-f, freeze (冻结)freezes Rails在vendor/rails目录</font></p>
<p><font face="Arial"><strong>1.2 API Documentation</strong><br />
$ gem_server<br />
启动一个WEBrick服务器。这时候你可以通过Http://localhost:8808/ 打开浏览器去查看rails API文档</font></p>
<p><font face="Arial"><strong>1.3 Rake</strong><br />
rake db:fixtures:load <br />
&nbsp;&nbsp; # 载入fixtures到当前环境的数据库 <br />
&nbsp;&nbsp; # 载入指定的fixtures使用FIXTURES=x,y<br />
rake db:migrate <br />
# 迁移数据库通过在db/migrate目录下的脚本.可以指定版本号通过VERSION=x<br />
rake db:schema:dump <br />
# 创建一个db/schema.rb文件，通过AR能过够支持任何数据库去使用<br />
rake db:schema:load <br />
# 再入一个schema.rb文件进数据库<br />
rake db:sessions:clear <br />
# 清空sessions表<br />
rake db:sessions:create <br />
# 用CGI::Session::ActiveRecordStore创建一个sessions表为用户 <br />
rake db:structure:dump <br />
# 导出数据库结构为一个SQL文件<br />
rake db:test:clone <br />
# 重新创建一个测试数据库从当前环境数据库中<br />
rake db:test:clone_structure <br />
# 重新创建测试数据库从开发模式数据库<br />
rake db:test:prepare <br />
# 准备测试数据库并在入schema<br />
rake db:test:purge <br />
# 清空测试数据库<br />
rake doc:app <br />
# 创建HTML文件的API Documentation<br />
rake doc:clobber_app <br />
# 删除Documentation<br />
rake doc:clobber_plugins <br />
# 删除 plugin Documentation<br />
rake doc:clobber_rails <br />
# 删除Documentation<br />
rake doc:plugins <br />
# 产生Documation为所有安装的plugins<br />
rake doc:rails <br />
# 创建HTML文件的API Documentation<br />
rake doc:reapp <br />
# 强制重新创建HTML文件的API Documentation<br />
rake doc:rerails <br />
# 强制重新创建HTML文件的API Documentation<br />
rake log:clear <br />
# 清空目录log/下的所有日志文件<br />
rake rails:freeze:edge <br />
# Lock this application to latest Edge Rails. Lock a specific revision with REVISION=X<br />
rake rails:freeze:gems <br />
# Lock this application to the current gems (by unpacking them into vendor/rails)<br />
rake rails:unfreeze <br />
# Unlock this application from freeze of gems or edge and return to a fluid use of system gems<br />
rake rails:update <br />
# Update both scripts and public/javascripts from Rails<br />
rake rails:update:javascripts <br />
# Update your javascripts from your current rails install<br />
rake rails:update:scripts <br />
# Add new scripts to the application script/ directory<br />
rake stats <br />
# Report code statistics (KLOCs, etc) from the application<br />
rake test <br />
# Test all units and functionals<br />
rake test:functionals<br />
&nbsp;&nbsp; # Run tests for functionalsdb:test:prepare<br />
rake test:integration <br />
# Run tests for integrationdb:test:prepare<br />
rake test:plugins <br />
# Run tests for pluginsenvironment<br />
rake test:recent <br />
# Run tests for recentdb:test:prepare<br />
rake test:uncommitted <br />
# Run tests for uncommitteddb:test:prepare<br />
rake test:units <br />
# Run tests for unitsdb:test:prepare<br />
rake tmp:cache:clear <br />
# 清空tmp/cache目录下的所有文件<br />
rake tmp:clear <br />
# 清空session, cache, 和socket文件从tmp/目录<br />
rake tmp:create <br />
# 为sessions, cache, and sockets创建tmp/目录<br />
rake tmp:sessions:clear <br />
# 清空所有在tmp/sessions目录下的文件<br />
rake tmp:sockets:clear <br />
# 清空所有在tmp/sessions 目录下的ruby_sess.* 文件</font></p>
<p><font face="Arial"><strong>1.4 Scripts</strong><br />
script/about <br />
# 输出当前环境信息<br />
script/breakpointer <br />
# 启动断点server<br />
script/console <br />
# 启动交换式的Rails控制台<br />
script/destroy <br />
# 删除通过generators创建的文件<br />
script/generate <br />
# -&gt; generators<br />
script/plugin <br />
# -&gt; Plugins<br />
script/runner <br />
# 执行一个任务在rails上下文中<br />
script/server <br />
# 启动开发模式服务器http://localhost:3000<br />
//以下几个不知道怎么去使用<br />
script/performance/profiler <br />
script/performance/benchmarker <br />
script/process/reaper<br />
script/process/spawner</font></p>
<p><font face="Arial"><strong>1.5 Generators</strong><br />
ruby script/generate model ModelName<br />
ruby script/generate controller ListController show edit<br />
ruby script/generate scaffold ModelName ControllerName<br />
ruby script/generate migration AddNewTable<br />
ruby script/generate plugin PluginName<br />
ruby script/generate mailer Notification lost_password signup<br />
ruby script/generate web_service ServiceName api_one api_two<br />
ruby script/generate integration_test TestName<br />
ruby script/generate session_migration<br />
可选项:<br />
-p, --pretend Run but do not make any changes.<br />
-f, --force Overwrite files that already exist.<br />
-s, --skip Skip files that already exist.<br />
-q, --quiet Suppress normal output.<br />
-t, --backtrace Debugging: show backtrace on errors.<br />
-h, --help Show this help message.<br />
-c, --svn Modify files with subversion. (Note: svn must be in path) </font></p>
<p><font face="Arial"><strong>1.6 Plugins</strong><br />
script/plugin discover <br />
# discover plugin repositories<br />
script/plugin list <br />
# list all available plugins<br />
script/plugin install where <br />
# install the a <br />
</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/135080#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 24 Oct 2007 12:11:37 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/135080</link>
        <guid>http://ecchanger.javaeye.com/blog/135080</guid>
      </item>
      <item>
        <title>搞笑墓志铭</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/133974" style="color:red;">http://ecchanger.javaeye.com/blog/133974</a>&nbsp;
          发表时间: 2007年10月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">问：&quot;如果你死后，你的墓志铭打算写点啥？&quot;以下是一些牛人的暴笑回复：&nbsp; </font></p>
<p><font face="Arial">1、感谢政府为我解决了住房问题！ <br />
2、一居室，求合租，面议。 <br />
3、小事招魂，大事挖坟。 <br />
4、发布违规信息，永久封杀！ by GCD <br />
5、我觉得我还可以抢救一下！ <br />
6、老子是被活埋的！曰！ <br />
7、广告位招租 <br />
8、提供鞭尸服务，一次100！ <br />
9、初从文，三年不中；后习武，校场发一矢，中鼓吏，逐之出；遂学医，有所成。自撰一良方，服之，卒。 <br />
10、基因重组中，请稍候&hellip;&hellip;二十年 <br />
11、我生在中国，我葬在中国，祸不单行啊！ <br />
12、单挑冥王哈迪斯中，征求组队!(网游篇） <br />
13、牧师，帮我复活一下下，谢谢，坐标&times;&times;.&times;&times;（网游篇） <br />
14、当你看清这行字的时候：朋友，你踩到我了。 <br />
15、老子终于不用怕鬼了！ <br />
16、给爷笑一个，要不&hellip;&hellip;爷给你笑一个？ <br />
17、神农氏的墓志铭：我靠！这草有毒！！！！！ <br />
18、这是我挖的最后一个坑（警告挖坑者） <br />
19、摸骨算命 <br />
20、陪聊，提供夜间上门服务</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/133974#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Oct 2007 14:40:45 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/133974</link>
        <guid>http://ecchanger.javaeye.com/blog/133974</guid>
      </item>
      <item>
        <title>IDEA 7.0正式版注册机</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/133968" style="color:red;">http://ecchanger.javaeye.com/blog/133968</a>&nbsp;
          发表时间: 2007年10月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Idea 7.0正式版终于出来啦，不过注册算法也换啦，6.x的注册不能用啦，Idea的Fans可以试试这个啊～～
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/133968#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 21 Oct 2007 13:57:40 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/133968</link>
        <guid>http://ecchanger.javaeye.com/blog/133968</guid>
      </item>
      <item>
        <title>prototype.js解读</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/106750" style="color:red;">http://ecchanger.javaeye.com/blog/106750</a>&nbsp;
          发表时间: 2007年07月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">/* <br />
&nbsp;* 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 <br />
&nbsp;*/<br />
var Prototype = {<br />
&nbsp;&nbsp;&nbsp; Version: '1.5.0_rc0',<br />
&nbsp;&nbsp;&nbsp; ScriptFragment: '(?:&lt;script.*?&gt;)((\n|\r|.)*?)(?:&lt;\/script&gt;)',</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; emptyFunction: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp; K: function(x)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return x<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 创建一种类型，注意其属性 create 是一个方法，返回一个构造函数。 <br />
&nbsp;* 一般使用如下&nbsp; <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; var X = Class.create();&nbsp; 返回一个类型，类似于 java 的一个Class实例。 <br />
&nbsp;* 要使用 X 类型，需继续用 new X()来获取一个实例，如同 java 的 Class.newInstance()方法。 <br />
&nbsp;* <br />
&nbsp;* 返回的构造函数会执行名为 initialize 的方法， initialize 是 Ruby 对象的构造器方法名字。 <br />
&nbsp;* 此时initialize方法还没有定义，其后的代码中创建新类型时会建立相应的同名方法。 <br />
&nbsp;* <br />
&nbsp;* 如果一定要从java上去理解。你可以理解为用Class.create()创建一个继承java.lang.Class类的类。当然java不允许这样做，因为Class类是final的 <br />
&nbsp;* <br />
&nbsp;*/<br />
var Class = {<br />
&nbsp;&nbsp;&nbsp; create: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.initialize.apply(this, arguments);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 创建一个对象，从变量名来思考，本意也许是定义一个抽象类，以后创建新对象都 extend 它。 <br />
&nbsp;* 但从其后代码的应用来看， Abstract 更多是为了保持命名空间清晰的考虑。 <br />
&nbsp;* 也就是说，我们可以给 Abstract 这个对象实例添加新的对象定义。 <br />
&nbsp;* <br />
&nbsp;* 从java去理解，就是动态给一个对象创建内部类。 <br />
&nbsp;*/<br />
var Abstract = new Object();</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 获取参数对象的所有属性和方法，有点象多重继承。但是这种继承是动态获得的。 <br />
&nbsp;* 如： <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; var a = new ObjectA(), b = new ObjectB(); <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; var c = a.extend(b); <br />
&nbsp;* 此时 c 对象同时拥有 a 和 b 对象的属性和方法。但是与多重继承不同的是，c instanceof ObjectB 将返回false。 <br />
&nbsp;*/<br />
Object.extend = function(destination, source)<br />
{<br />
&nbsp;&nbsp;&nbsp; for (var property in source)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; destination[property] = source[property];<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; return destination;<br />
}</font></p>
<p><font face="Arial">Object.inspect = function(object)<br />
{<br />
&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (object == undefined) return 'undefined';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (object == null) return 'null';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return object.inspect ? object.inspect() : object.toString();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e instanceof RangeError) return '...';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw e;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 这个方法很有趣，它封装一个javascript函数对象，返回一个新函数对象，新函数对象的主体和原对象相同，但是bind()方法参数将被用作当前对象的对象。 <br />
&nbsp;* 也就是说新函数中的 this 引用被改变为参数提供的对象。 <br />
&nbsp;* 比如： <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;text&quot; id=&quot;aaa&quot; value=&quot;aaa&quot;&gt; <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; &lt;input type=&quot;text&quot; id=&quot;bbb&quot; value=&quot;bbb&quot;&gt; <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; ................. <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; &lt;script&gt; <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var aaa = document.getElementById(&quot;aaa&quot;); <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var bbb = document.getElementById(&quot;bbb&quot;); <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aaa.showValue = function() {alert(this.value);} <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; aaa.showValue2 = aaa.showValue.bind(bbb); <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; /script&gt; <br />
&nbsp;*&nbsp; 那么，调用aaa.showValue 将返回&quot;aaa&quot;, 但调用aaa.showValue2 将返回&quot;bbb&quot;。 <br />
&nbsp;* <br />
&nbsp;* apply 是ie5.5后才出现的新方法(Netscape好像很早就支持了)。 <br />
&nbsp;* 该方法更多的资料参考MSDN http://msdn.microsoft.com/library/en-us/script56/html/js56jsmthApply.asp <br />
&nbsp;* 还有一个 call 方法，应用起来和 apply 类似。可以一起研究下。 <br />
&nbsp;*/<br />
Function.prototype.bind = function()<br />
{<br />
&nbsp;&nbsp;&nbsp; var __method = this, args = $A(arguments), object = args.shift();<br />
&nbsp;&nbsp;&nbsp; return function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return __method.apply(object, args.concat($A(arguments)));<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 和bind一样，不过这个方法一般用做html控件对象的事件处理。所以要传递event对象 <br />
&nbsp;* 注意这时候，用到了 Function.call。它与 Function.apply 的不同好像仅仅是对参数形式的定义。 <br />
&nbsp;* 如同 java 两个过载的方法。 <br />
&nbsp;*/<br />
Function.prototype.bindAsEventListener = function(object)<br />
{<br />
&nbsp;&nbsp;&nbsp; var __method = this;<br />
&nbsp;&nbsp;&nbsp; return function(event)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return __method.call(object, event || window.event);<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 将整数形式RGB颜色值转换为HEX形式 <br />
&nbsp;*/<br />
Object.extend(Number.prototype, {<br />
&nbsp;&nbsp;&nbsp; toColorPart: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var digits = this.toString(16);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this &lt; 16) return '0' + digits;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return digits;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; succ: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this + 1;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; times: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $R(0, this, true).each(iterator);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />
&nbsp;&nbsp;&nbsp; }<br />
});</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 典型 Ruby 风格的函数，将参数中的方法逐个调用，返回第一个成功执行的方法的返回值 <br />
&nbsp;*/<br />
var Try = {<br />
&nbsp;&nbsp;&nbsp; these: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var returnValue;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; arguments.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var lambda = arguments[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnValue = lambda();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return returnValue;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/*--------------------------------------------------------------------------*/</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 一个设计精巧的定时执行器 <br />
&nbsp;* 首先由 Class.create() 创建一个 PeriodicalExecuter 类型， <br />
&nbsp;* 然后用对象直接量的语法形式设置原型。 <br />
&nbsp;* <br />
&nbsp;* 需要特别说明的是 rgisterCallback 方法，它调用上面定义的函数原型方法bind, 并传递自己为参数。 <br />
&nbsp;* 之所以这样做，是因为 setTimeout 默认总以 window 对象为当前对象，也就是说，如果 registerCallback 方法定义如下的话： <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; registerCallback: function() { <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setTimeout(this.onTimerEvent, this.frequency * 1000); <br />
&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp; } <br />
&nbsp;* 那么，this.onTimeoutEvent 方法执行失败，因为它无法访问 this.currentlyExecuting 属性。 <br />
&nbsp;* 而使用了bind以后，该方法才能正确的找到this，也就是PeriodicalExecuter的当前实例。 <br />
&nbsp;*/<br />
var PeriodicalExecuter = Class.create();<br />
PeriodicalExecuter.prototype = {<br />
&nbsp;&nbsp;&nbsp; initialize: function(callback, frequency)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.callback = callback;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.frequency = frequency;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.currentlyExecuting = false;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.registerCallback();<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; registerCallback: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; onTimerEvent: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!this.currentlyExecuting)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.currentlyExecuting = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.callback();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.currentlyExecuting = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
Object.extend(String.prototype, {<br />
&nbsp;&nbsp;&nbsp; gsub: function(pattern, replacement)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result = '', source = this, match;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replacement = arguments.callee.prepareReplacement(replacement);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (source.length &gt; 0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (match = source.match(pattern))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += source.slice(0, match.index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += (replacement(match) || '').toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; source = source.slice(match.index + match[0].length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result += source,source = '';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; sub: function(pattern, replacement, count)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; replacement = this.gsub.prepareReplacement(replacement);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; count = count === undefined ? 1 : count;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.gsub(pattern, function(match)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (--count &lt; 0) return match[0];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return replacement(match);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; scan: function(pattern, iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.gsub(pattern, iterator);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; truncate: function(length, truncation)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; length = length || 30;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; truncation = truncation === undefined ? '...' : truncation;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.length &gt; length ?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.slice(0, length - truncation.length) + truncation : this;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; strip: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.replace(/^\s+/, '').replace(/\s+$/, '');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; stripTags: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.replace(/&lt;\/?[^&gt;]+&gt;/gi, '');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; stripScripts: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; extractScripts: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var matchAll = new RegExp(Prototype.ScriptFragment, 'img');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var matchOne = new RegExp(Prototype.ScriptFragment, 'im');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (this.match(matchAll) || []).map(function(scriptTag)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (scriptTag.match(matchOne) || ['', ''])[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; evalScripts: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.extractScripts().map(function(script)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return eval(script)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; escapeHTML: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var div = document.createElement('div');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var text = document.createTextNode(this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div.appendChild(text);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return div.innerHTML;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; unescapeHTML: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var div = document.createElement('div');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; div.innerHTML = this.stripTags();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return div.childNodes[0] ? div.childNodes[0].nodeValue : '';<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; toQueryParams: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var pairs = this.match(/^\??(.*)$/)[1].split('&amp;');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pairs.inject({}, function(params, pairString)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var pair = pairString.split('=');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params[pair[0]] = pair[1];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return params;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; toArray: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.split('');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; camelize: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var oStringList = this.split('-');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oStringList.length == 1) return oStringList[0];</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var camelizedString = this.indexOf('-') == 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; : oStringList[0];</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 1, len = oStringList.length; i &lt; len; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var s = oStringList[i];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; camelizedString += s.charAt(0).toUpperCase() + s.substring(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return camelizedString;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; inspect: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &quot;'&quot; + this.replace(/\\/g, '\\\\').replace(/'/g, '\\\'') + &quot;'&quot;;<br />
&nbsp;&nbsp;&nbsp; }<br />
});</font></p>
<p><font face="Arial">String.prototype.gsub.prepareReplacement = function(replacement)<br />
{<br />
&nbsp;&nbsp;&nbsp; if (typeof replacement == 'function') return replacement;<br />
&nbsp;&nbsp;&nbsp; var template = new Template(replacement);<br />
&nbsp;&nbsp;&nbsp; return function(match)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return template.evaluate(match)<br />
&nbsp;&nbsp;&nbsp; };<br />
}</font></p>
<p><font face="Arial">String.prototype.parseQuery = String.prototype.toQueryParams;</font></p>
<p><font face="Arial">var Template = Class.create();<br />
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;<br />
Template.prototype = {<br />
&nbsp;&nbsp;&nbsp; initialize: function(template, pattern)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.template = template.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.pattern = pattern || Template.Pattern;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; evaluate: function(object)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.template.gsub(this.pattern, function(match)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var before = match[1];</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (before == '\\') return match[2];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return before + (object[match[3]] || '').toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">var $break = new Object();<br />
var $continue = new Object();</font></p>
<p><font face="Arial">var Enumerable = {<br />
&nbsp;&nbsp;&nbsp; each: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var index = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this._each(function(value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iterator(value, index++);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e != $continue) throw e;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (e != $break) throw e;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; all: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = result &amp;&amp; !!(iterator || Prototype.K)(value, index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!result) throw $break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; any: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result = !!(iterator || Prototype.K)(value, index))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw $break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; collect: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var results = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.push(iterator(value, index));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; detect: function (iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (iterator(value, index))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw $break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; findAll: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var results = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (iterator(value, index))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.push(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; grep: function(pattern, iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var results = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var stringValue = value.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (stringValue.match(pattern))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.push((iterator || Prototype.K)(value, index));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; include: function(object)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var found = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value == object)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found = true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw $break;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return found;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; inject: function(memo, iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memo = iterator(memo, value, index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return memo;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; invoke: function(method)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var args = $A(arguments).slice(1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.collect(function(value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value[method].apply(value, args);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; max: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = (iterator || Prototype.K)(value, index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result == undefined || value &gt;= result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; min: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = (iterator || Prototype.K)(value, index);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (result == undefined || value &lt; result)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; partition: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var trues = [], falses = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((iterator || Prototype.K)(value, index) ?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trues : falses).push(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return [trues, falses];<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; pluck: function(property)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var results = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.push(value[property]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; reject: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var results = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!iterator(value, index))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.push(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; sortBy: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.collect(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return {value: value, criteria: iterator(value, index)};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).sort(function(left, right)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var a = left.criteria, b = right.criteria;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return a &lt; b ? -1 : a &gt; b ? 1 : 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).pluck('value');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; toArray: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.collect(Prototype.K);<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp; zip: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var iterator = Prototype.K, args = $A(arguments);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (typeof args.last() == 'function')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iterator = args.pop();</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var collections = [this].concat(args).map($A);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.map(function(value, index)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return iterator(collections.pluck(index));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; inspect: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '#&lt;Enumerable:' + this.toArray().inspect() + '&gt;';<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">Object.extend(Enumerable, {<br />
&nbsp;&nbsp;&nbsp; map:&nbsp;&nbsp;&nbsp;&nbsp; Enumerable.collect,<br />
&nbsp;&nbsp;&nbsp; find:&nbsp;&nbsp;&nbsp; Enumerable.detect,<br />
&nbsp;&nbsp;&nbsp; select:&nbsp; Enumerable.findAll,<br />
&nbsp;&nbsp;&nbsp; member:&nbsp; Enumerable.include,<br />
&nbsp;&nbsp;&nbsp; entries: Enumerable.toArray<br />
});<br />
var $A = Array.from = function(iterable)<br />
{<br />
&nbsp;&nbsp;&nbsp; if (!iterable) return [];<br />
&nbsp;&nbsp;&nbsp; if (iterable.toArray)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return iterable.toArray();<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; else<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var results = [];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; iterable.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; results.push(iterable[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return results;<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">Object.extend(Array.prototype, Enumerable);</font></p>
<p><font face="Arial">if (!Array.prototype._reverse)<br />
&nbsp;&nbsp;&nbsp; Array.prototype._reverse = Array.prototype.reverse;</font></p>
<p><font face="Arial">Object.extend(Array.prototype, {<br />
&nbsp;&nbsp;&nbsp; _each: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; this.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iterator(this[i]);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; clear: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.length = 0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; first: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this[0];<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; last: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this[this.length - 1];<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; compact: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.select(function(value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value != undefined || value != null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; flatten: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.inject([], function(array, value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return array.concat(value &amp;&amp; value.constructor == Array ?<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value.flatten() : [value]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; without: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var values = $A(arguments);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.select(function(value)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return !values.include(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; indexOf: function(object)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; this.length; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this[i] == object) return i;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; reverse: function(inline)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (inline !== false ? this : this.toArray())._reverse();<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; inspect: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '[' + this.map(Object.inspect).join(', ') + ']';<br />
&nbsp;&nbsp;&nbsp; }<br />
});<br />
var Hash = {<br />
&nbsp;&nbsp;&nbsp; _each: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var key in this)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var value = this[key];</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (typeof value == 'function') continue;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var pair = [key, value];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pair.key = key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pair.value = value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iterator(pair);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; keys: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.pluck('key');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; values: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.pluck('value');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; merge: function(hash)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $H(hash).inject($H(this), function(mergedHash, pair)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mergedHash[pair.key] = pair.value;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mergedHash;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; toQueryString: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.map(function(pair)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pair.map(encodeURIComponent).join('=');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).join('&amp;');<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; inspect: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return '#&lt;Hash:{' + this.map(function(pair)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return pair.map(Object.inspect).join(': ');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).join(', ') + '}&gt;';<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">function $H(object)<br />
{<br />
&nbsp;&nbsp;&nbsp; var hash = Object.extend({}, object || {});<br />
&nbsp;&nbsp;&nbsp; Object.extend(hash, Enumerable);<br />
&nbsp;&nbsp;&nbsp; Object.extend(hash, Hash);<br />
&nbsp;&nbsp;&nbsp; return hash;<br />
}<br />
ObjectRange = Class.create();<br />
Object.extend(ObjectRange.prototype, Enumerable);<br />
Object.extend(ObjectRange.prototype, {<br />
&nbsp;&nbsp;&nbsp; initialize: function(start, end, exclusive)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.start = start;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.end = end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.exclusive = exclusive;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; _each: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var value = this.start;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iterator(value);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = value.succ();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } while (this.include(value));<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; include: function(value)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value &lt; this.start)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.exclusive)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value &lt; this.end;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value &lt;= this.end;<br />
&nbsp;&nbsp;&nbsp; }<br />
});</font></p>
<p><font face="Arial">var $R = function(start, end, exclusive)<br />
{<br />
&nbsp;&nbsp;&nbsp; return new ObjectRange(start, end, exclusive);<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 定义 Ajax 对象, 静态方法 getTransport 方法返回一个 XMLHttp 对象 <br />
&nbsp;*/<br />
var Ajax = {<br />
&nbsp;&nbsp;&nbsp; getTransport: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return Try.these(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new XMLHttpRequest()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ActiveXObject('Msxml2.XMLHTTP')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new ActiveXObject('Microsoft.XMLHTTP')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) || false;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; activeRequestCount: 0<br />
}</font></p>
<p><font face="Arial">Ajax.Responders = {<br />
&nbsp;&nbsp;&nbsp; responders: [],</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; _each: function(iterator)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.responders._each(iterator);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; register: function(responderToAdd)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!this.include(responderToAdd))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.responders.push(responderToAdd);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; unregister: function(responderToRemove)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.responders = this.responders.without(responderToRemove);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; dispatch: function(callback, request, transport, json)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.each(function(responder)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (responder[callback] &amp;&amp; typeof responder[callback] == 'function')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responder[callback].apply(responder, [request, transport, json]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
&nbsp;&nbsp;&nbsp; }<br />
};</font></p>
<p><font face="Arial">Object.extend(Ajax.Responders, Enumerable);</font></p>
<p><font face="Arial">Ajax.Responders.register({<br />
&nbsp;&nbsp;&nbsp; onCreate: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.activeRequestCount++;<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; onComplete: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.activeRequestCount--;<br />
&nbsp;&nbsp;&nbsp; }<br />
});</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 我以为此时的Ajax对象起到命名空间的作用。 <br />
&nbsp;* Ajax.Base 声明为一个基础对象类型 <br />
&nbsp;* 注意 Ajax.Base 并没有使用 Class.create() 的方式来创建，我想是因为作者并不希望 Ajax.Base 被库使用者实例化。 <br />
&nbsp;* 作者在其他对象类型的声明中，将会继承于它。 <br />
&nbsp;* 就好像 java 中的私有抽象类 <br />
&nbsp;*/<br />
Ajax.Base = function()<br />
{<br />
};<br />
Ajax.Base.prototype = {<br />
&nbsp;&nbsp;&nbsp; setOptions: function(options)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.options = {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'post',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asynchronous: true,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentType:&nbsp; 'application/x-www-form-urlencoded',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parameters:&nbsp;&nbsp; ''<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object.extend(this.options, options || {});<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; responseIsSuccess: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.transport.status == undefined<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || this.transport.status == 0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || (this.transport.status &gt;= 200 &amp;&amp; this.transport.status &lt; 300);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; responseIsFailure: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return !this.responseIsSuccess();<br />
&nbsp;&nbsp;&nbsp; }<br />
}</font></p>
<p><font face="Arial">/* <br />
&nbsp;* Ajax.Request 封装 XmlHttp <br />
&nbsp;*/<br />
Ajax.Request = Class.create();</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 定义四种事件(状态)， 参考http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp <br />
&nbsp;*/<br />
Ajax.Request.Events =<br />
['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];</font></p>
<p><font face="Arial">Ajax.Request.prototype = Object.extend(new Ajax.Base(), {<br />
&nbsp;&nbsp;&nbsp; initialize: function(url, options)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transport = Ajax.getTransport();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setOptions(options);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.request(url);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; request: function(url)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var parameters = this.options.parameters || '';<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parameters.length &gt; 0) parameters += '&amp;_=';</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.url = url;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.options.method == 'get' &amp;&amp; parameters.length &gt; 0)</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.url += (this.url.match(/\?/) ? '&amp;' : '?') + parameters;</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.Responders.dispatch('onCreate', this, this.transport);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 此处好像强制使用了异步方式，而不是依照 this.options.asynchronous 的值 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transport.open(this.options.method, this.url,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.options.asynchronous);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 这里提供了 XmlHttp 传输过程中每个步骤的回调函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.options.asynchronous)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transport.onreadystatechange = this.onStateChange.bind(this);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setTimeout((function()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.respondToReadyState(1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }).bind(this), 10);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setRequestHeaders();</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var body = this.options.postBody ? this.options.postBody : parameters;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transport.send(this.options.method == 'post' ? body : null);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dispatchException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; setRequestHeaders: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var requestHeaders =<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ['X-Requested-With', 'XMLHttpRequest',<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'X-Prototype-Version', Prototype.Version,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Accept', 'text/javascript, text/html, application/xml, text/xml, */*'];</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.options.method == 'post')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestHeaders.push('Content-type', this.options.contentType);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.transport.overrideMimeType)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestHeaders.push('Connection', 'close');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.options.requestHeaders)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; requestHeaders.push.apply(requestHeaders, this.options.requestHeaders);</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; requestHeaders.length; i += 2)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i + 1]);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; onStateChange: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var readyState = this.transport.readyState;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 如果不是 Loading 状态，就调用回调函数 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (readyState != 1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.respondToReadyState(this.transport.readyState);<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; header: function(name)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.transport.getResponseHeader(name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp; evalJSON: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return eval('(' + this.header('X-JSON') + ')');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp; evalResponse: function()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return eval(this.transport.responseText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dispatchException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; },</font></p>
<p><font face="Arial">/* <br />
&nbsp;* 回调函数定义在 this.options 属性中，比如: <br />
&nbsp;var option = { <br />
&nbsp;onLoaded : function(req) {...}; <br />
&nbsp;...... <br />
&nbsp;} <br />
&nbsp;new Ajax.Request(url, option); <br />
&nbsp;*/<br />
&nbsp;&nbsp;&nbsp; respondToReadyState: function(readyState)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var event = Ajax.Request.Events[readyState];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var transport = this.transport, json = this.evalJSON();</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (event == 'Complete')<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (this.options['on' + this.transport.status]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; || Prototype.emptyFunction)(transport, json);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dispatchException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((this.header('Content-type') || '').match(/^text\/javascript/i))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.evalResponse();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (this.options['on' + event] || Prototype.emptyFunction)(transport, json);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ajax.Responders.dispatch('on' + event, this, transport, json);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch (e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.dispatchException(e);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (event == 'Complete')<br /></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/106750#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Jul 2007 21:06:34 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/106750</link>
        <guid>http://ecchanger.javaeye.com/blog/106750</guid>
      </item>
      <item>
        <title>iframe自适应高度</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/106748" style="color:red;">http://ecchanger.javaeye.com/blog/106748</a>&nbsp;
          发表时间: 2007年07月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="cnt">
<p><font color="#ff0000">iframe,尤其是不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能，可是iframe的大小却不像层那样可以&ldquo;伸缩自如&rdquo;，所以带来了使用上的麻烦，给iframe 设置高度的时候多了也不好，少了更是不行，现在，让我来告诉大家一种iframe动态调整高度的方法，主要是以下JS函数：<br />
程序代码：<br />
</font><font color="#ff0000"></font></p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;SetWinHeight(obj) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;win&nbsp;=&nbsp;obj; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.getElementById) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(win&nbsp;&amp;&amp;&nbsp;!window.opera) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(win.contentDocument&nbsp;&amp;&amp;&nbsp;win.contentDocument.body.offsetHeight) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win.height&nbsp;=&nbsp;win.contentDocument.body.offsetHeight; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(win.Document&nbsp;&amp;&amp;&nbsp;win.Document.body.scrollHeight) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;win.height&nbsp;=&nbsp;win.Document.body.scrollHeight; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>最后，加入iframe,不能丢掉onload属性，当然了，id也必须也函数中的win匹配<br />
程序代码<br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;iframe&nbsp;width=</span><span class="string">&quot;778&quot;</span><span>&nbsp;align=</span><span class="string">&quot;center&quot;</span><span>&nbsp;height=</span><span class="string">&quot;200&quot;</span><span>&nbsp;id=</span><span class="string">&quot;win&quot;</span><span>&nbsp;name=</span><span class="string">&quot;win&quot;</span><span>&nbsp;onload=</span><span class="string">&quot;Javascript:SetWinHeight(this)&quot;</span><span>&nbsp;frameborder=</span><span class="string">&quot;0&quot;</span><span>&nbsp;scrolling=</span><span class="string">&quot;no&quot;</span><span>&gt;&lt;/iframe&gt; &nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><br />
另一种情况的iframe解决方案（超简单）<br />
重要提示：src=中你必须填写的网页地址，一定要和本页面在同一个站点上，否则，会抱错，说&ldquo;拒绝访问！&rdquo;(实际上这是因为Js的跨域问题导致拒绝访问的) <br />
之前自己也碰到过这个问题，为了得到答案去网上搜索，发现有不少人也遇到了这样的问题，现在就把解决方法共享一下 </p>
<p>1、建立一个bottom.js的文件，然后输入下面的代码（只有两行哦） <br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>parent.document.all(</span><span class="string">&quot;框架ID名&quot;</span><span>).style.height=document.body.scrollHeight;&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>parent.document.all(</span><span class="string">&quot;框架ID名&quot;</span><span>).style.width=document.body.scrollWidth;&nbsp; &nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这里的 框架ID名 就是Iframe的ID，比如： <br />
＜IFRAME id=&quot;框架ID名&quot; name=&quot;left&quot; frameBorder=0 scrolling=no src=&quot;XXX.asp&quot; width=&quot;100%&quot;＞＜/IFRAME＞ </p>
<p>2、给你网站里所有的被包含文件里面每个都加入 <br />
＜script language = &quot;JavaScript&quot; src = &quot;bottom.js&quot;/＞＜/script＞ <br />
3、OK，收工！ <br />
在WINXP、IE6下面测试通过。很简单吧！ </p>
<p>实现 iframe 的自适应高度<br />
实现 iframe 的自适应高度，能够随着页面的长度自动的适应以免除页面和 iframe 同时出现滚动条的现象。<br />
程序代码<br />
</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;script&nbsp;type=</span><span class="string">&quot;text/javascript&quot;</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//**&nbsp;iframe自动适应页面&nbsp;**// </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//输入你希望根据页面高度自动调整高度的iframe的名称的列表 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//用逗号把每个iframe的ID分隔.&nbsp;例如:&nbsp;[&quot;myframe1&quot;,&nbsp;&quot;myframe2&quot;]，可以只有一个窗体，则不用逗号。 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//定义iframe的ID </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;iframeids&nbsp;=&nbsp;[</span><span class="string">&quot;test&quot;</span><span>] &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//如果用户的浏览器不支持iframe是否将iframe隐藏&nbsp;yes&nbsp;表示隐藏，no表示不隐藏 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;iframehide&nbsp;=&nbsp;</span><span class="string">&quot;yes&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">function</span><span>&nbsp;dyniframesize() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;dyniframe&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Array() &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;iframeids.length;&nbsp;i++) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(document.getElementById) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//自动调整iframe高度 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dyniframe[dyniframe.length]&nbsp;=&nbsp;document.getElementById(iframeids); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(dyniframe&nbsp;&amp;&amp;&nbsp;!window.opera) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dyniframe.style.display&nbsp;=&nbsp;</span><span class="string">&quot;block&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(dyniframe.contentDocument &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&amp;&nbsp;dyniframe.contentDocument.body.offsetHeight)&nbsp;</span><span class="comment">//如果用户的浏览器是NetScape </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dyniframe.height&nbsp;=&nbsp;dyniframe.contentDocument.body.offsetHeight; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(dyniframe.Document&nbsp;&amp;&amp;&nbsp;dyniframe.Document.body.scrollHeight)&nbsp;</span><span class="comment">//如果用户的浏览器是IE </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dyniframe.height&nbsp;=&nbsp;dyniframe.Document.body.scrollHeight; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据设定的参数来处理不支持iframe的浏览器的显示问题 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;((document.all&nbsp;||&nbsp;document.getElementById)&nbsp;&amp;&amp;&nbsp;iframehide&nbsp;==&nbsp;</span><span class="string">&quot;no&quot;</span><span>) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;tempobj&nbsp;=&nbsp;document.all&nbsp;?&nbsp;document.all[iframeids]&nbsp;:&nbsp;document.getElementById(iframeids) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempobj.style.display&nbsp;=&nbsp;</span><span class="string">&quot;block&quot;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(window.addEventListener) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.addEventListener(</span><span class="string">&quot;load&quot;</span><span>,&nbsp;dyniframesize,&nbsp;</span><span class="keyword">false</span><span>) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;(window.attachEvent) &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.attachEvent(</span><span class="string">&quot;onload&quot;</span><span>,&nbsp;dyniframesize) &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">else</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.onload&nbsp;=&nbsp;dyniframesize &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/106748#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Jul 2007 20:35:00 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/106748</link>
        <guid>http://ecchanger.javaeye.com/blog/106748</guid>
      </item>
      <item>
        <title>笑话：抽烟</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/81147" style="color:red;">http://ecchanger.javaeye.com/blog/81147</a>&nbsp;
          发表时间: 2007年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一幼儿园的小破孩躲在厕所里吸烟，被老师抓到，老师问他为什么吸烟，他低下头，深沉的回答：祖国未统一，心情很郁闷！
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/81147#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 May 2007 20:51:39 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/81147</link>
        <guid>http://ecchanger.javaeye.com/blog/81147</guid>
      </item>
      <item>
        <title>公司里的非正式语言(绝对搞笑版) </title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/81146" style="color:red;">http://ecchanger.javaeye.com/blog/81146</a>&nbsp;
          发表时间: 2007年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          公司各部门：
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>今年以来，在部分领导的耳濡目染下，公司一些部门及员工在日常工作 中 &ldquo;非正式语言&rdquo;使用频繁，造成部分员工自尊心受到伤害，工作萎靡不振、效率低下。鉴于公司的这种现状，为认真贯彻执行《公民道德建设实施纲要》，加强思公语言为重点和突破口，从即日起当遇到下列情况时，请务必用正式语言替代非正式语言。要求各部门负责人主动带头，严格贯彻执行。 </p>
<p>&nbsp;</p>
<p>情况一、没有时间 </p>
<p>非正式：我他妈没空！ 正式：我真的很想帮你，可是我也好忙。 </p>
<p>&nbsp;</p>
<p>情况二、否定一项计划 </p>
<p>非正式：大粪！全是大粪！ 正式：我不确定这样是否能顺利实施。 </p>
<p>&nbsp;</p>
<p>情况三、拒绝提供帮助 </p>
<p>非正式：滚！ 正式：嗯，或许你可以问一下别人。 </p>
<p>&nbsp;</p>
<p>情况四、怀疑 </p>
<p>非正式：扯JB蛋！ 正式：真的？ </p>
<p>&nbsp;</p>
<p>情况五、对他人观点持异议 </p>
<p>非正式：你脑子里有屎啊！？ 正式：你可能不太了解这件事情。 </p>
<p>&nbsp;</p>
<p>情况六、同意他人观点 </p>
<p>非正式：此屁有理！ 正式：我非常赞同你的观点。 </p>
<p>&nbsp;</p>
<p>情况七、被要求加班 </p>
<p>非正式：你他妈要我干到几点？ 正式：也许我可以加班把它做完。 </p>
<p>&nbsp;</p>
<p>情况八、轻蔑 </p>
<p>非正式：狗屁！ 正式：这倒很有意思。 </p>
<p>&nbsp;</p>
<p>情况九、接受任务 </p>
<p>非正式：你他妈的怎么不早说？ 正式：我会试着把它加入到我的工作安排中。 </p>
<p>&nbsp;</p>
<p>情况十、拒绝任务 </p>
<p>非正式：关我鸟事！ 正式：对不起，我一开始就没参与这个项目。 </p>
<p>&nbsp;</p>
<p>特此通知！ </p>
<p>附：《公民道德建设实施纲要》 </p>
<p>环球软件有限公司（公章） </p>
<p>报：董事长、总经理、副总经理、总监、各CXO </p>
<p>送：公司各部门<br />
</p>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/81146#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 May 2007 20:48:12 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/81146</link>
        <guid>http://ecchanger.javaeye.com/blog/81146</guid>
      </item>
      <item>
        <title>最强的女大学生简历</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/81145" style="color:red;">http://ecchanger.javaeye.com/blog/81145</a>&nbsp;
          发表时间: 2007年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>本人大学毕业，身高一米七零；</div>
<div>虽非窈窕淑女，也属婷婷玉立；</div>
<div>在家熟读诗书，在外通情达理；</div>
<div>古今圣贤之士，均在脑中铭记；</div>
<div>课程较为繁重，专业自控原理；</div>
<div>喜欢精美建筑，辅修楼宇设计；</div>
<div>办公软件出色，英文通过四级；</div>
<div>学科涉及面广，捎带电子电力；</div>
<div>留心时尚精品，爱好民族乐器；</div>
<div>获得会计证明，算帐不成问题；</div>
<div>团队干部大会，通过先进评比；</div>
<div>年终德育排名，巾帼榜眼班里；</div>
<div>四年分数优秀，申请保研学习；</div>
<div>无奈名额有限，枉然良好成绩；</div>
<div>扩招政策不赖，公费数量太低；</div>
<div>失业家庭子女，哪有更多纸币？</div>
<div>离校找到差事，心中满生欢喜；</div>
<div>签订一纸协约，三月试用时期；</div>
<div>工作即将转正，爆炒鱿鱼虾米；</div>
<div>老板对此解释，更换新鲜空气；</div>
<div>从此四处奔走，各大招聘会议；</div>
<div>并非专业冷门，实则单位挑剔；</div>
<div>穆帅临危授命，木兰能披军衣；</div>
<div>如今现代社会，歧视半边天地！</div>
<div>邻居发小朋友，已成傍款小蜜；</div>
<div>从此养尊处优，衣服只穿O.N.L.Y.；</div>
<div>吾非贪享之辈，但也所思匪夷；</div>
<div>寒窗与之脸蛋，难以并论相提；</div>
<div>是我能力太差，还是别人嫌弃？</div>
<div>就像板凳队员，苦座无球可踢；</div>
<div>眼看光阴离去，时间耽误不起；</div>
<div>感叹本科文凭，无奈当今世纪</div>
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/81145#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 19 May 2007 20:47:13 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/81145</link>
        <guid>http://ecchanger.javaeye.com/blog/81145</guid>
      </item>
      <item>
        <title>ant中文教程</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/80401" style="color:red;">http://ecchanger.javaeye.com/blog/80401</a>&nbsp;
          发表时间: 2007年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong></strong>
<div class="pgcontent"><strong>1 Ant是什么？ <br />
</strong>Apache Ant 是一个基于 Java的生成工具。<br />
生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式（也有可能转换为可安装的产品映像形式）。随着应用程序的生成过程变得更加复杂，确保在每次生成期间都使用精确相同的生成步骤，同时实现尽可能多的自动化，以便及时产生一致的生成版本<br />
<strong>2 下载、安装Ant </strong><br />
安装Ant<br />
下载.zip文件，解压缩到c:\ant1.3(后面引用为%ANT_HOME%)<br />
<br />
<strong>2.1 在你运行Ant之前需要做一些配置工作。<br />
</strong>? 将bin目录加入PATH环境变量。 <br />
? 设定ANT_HOME环境变量，指向你安装Ant的目录。在一些OS上，Ant的脚本可以猜测ANT_HOME（Unix和Windos NT/2000）－但最好不要依赖这一特性。 <br />
? 可选地，设定JAVA_HOME环境变量（参考下面的高级小节），该变量应该指向你安装JDK的目录。<br />
注意：不要将Ant的ant.jar文件放到JDK/JRE的lib/ext目录下。Ant是个应用程序，而lib/ext目录是为JDK扩展使用的（如JCE，JSSE扩展）。而且通过扩展装入的类会有安全方面的限制。<br />
<strong>2.2 运行Ant </strong><br />
<br />
运行Ant非常简单，当你正确地安装Ant后，只要输入ant就可以了。<br />
<br />
? 没有指定任何参数时，Ant会在当前目录下查询build.xml文件。如果找到了就用该文件作为buildfile。如果你用 -find 选项。Ant就会在上级目录中寻找buildfile，直至到达文件系统的根。要想让Ant使用其他的buildfile，可以用参数 -buildfile file，这里file指定了你想使用的buildfile。<br />
<br />
? 可以指定执行一个或多个target。当省略target时，Ant使用标签&lt;project&gt;的default属性所指定的target。<br />
<br />
<br />
命令行选项总结：<br />
ant [options] [target [target2 [target3] ...]]<br />
Options:<br />
-help print this message<br />
-projecthelp print project help information<br />
-version print the version information and exit<br />
-quiet be extra quiet<br />
-verbose be extra verbose<br />
-debug print debugging information<br />
-emacs produce logging information without adornments<br />
-logfile file use given file for log output<br />
-logger classname the class that is to perform logging<br />
-listener classname add an instance of class as a project listener<br />
-buildfile file use specified buildfile<br />
-find file search for buildfile towards the root of the filesystem and use the first one found<br />
-Dproperty=value set property to value <br />
例子<br />
ant<br />
使用当前目录下的build.xml运行Ant，执行缺省的target。<br />
ant -buildfile test.xml<br />
使用当前目录下的test.xml运行Ant，执行缺省的target。<br />
ant -buildfile test.xml dist<br />
使用当前目录下的test.xml运行Ant，执行一个叫做dist的target。<br />
ant -buildfile test.xml -Dbuild=build/classes dist<br />
使用当前目录下的test.xml运行Ant，执行一个叫做dist的target，并设定build属性的值为build/classes。<br />
<br />
<strong>3 编写build.xml <br />
</strong><br />
Ant的buildfile是用XML写的。每个buildfile含有一个project。<br />
<br />
buildfile中每个task元素可以有一个id属性，可以用这个id值引用指定的任务。这个值必须是唯一的。（详情请参考下面的Task小节）<br />
<br />
<strong>3.1 Projects</strong><br />
<br />
project有下面的属性：<br />
Attribute Description Required<br />
name 项目名称. No<br />
default 当没有指定target时使用的缺省target Yes<br />
basedir 用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时，该属性被忽略。如果属性和basedir property都没有设定，就使用buildfile文件的父目录。 No<br />
项目的描述以一个顶级的&lt;description&gt;元素的形式出现（参看description小节）。<br />
<br />
一个项目可以定义一个或多个target。一个target是一系列你想要执行的。执行Ant时，你可以选择执行那个target。当没有给定target时，使用project的default属性所确定的target。<br />
<br />
<strong>3.2 Targets<br />
</strong><br />
一个target可以依赖于其他的target。例如，你可能会有一个target用于编译程序，一个target用于生成可执行文件。你在生成可执行文件之前必须先编译通过，所以生成可执行文件的target依赖于编译target。Ant会处理这种依赖关系。<br />
<br />
然而，应当注意到，Ant的depends属性只指定了target应该被执行的顺序－如果被依赖的target无法运行，这种depends对于指定了依赖关系的target就没有影响。<br />
<br />
Ant会依照depends属性中target出现的顺序（从左到右）依次执行每个target。然而，要记住的是只要某个target依赖于一个target，后者就会被先执行。<br />
&lt;target name=&quot;A&quot;/&gt;<br />
&lt;target name=&quot;B&quot; depends=&quot;A&quot;/&gt;<br />
&lt;target name=&quot;C&quot; depends=&quot;B&quot;/&gt;<br />
&lt;target name=&quot;D&quot; depends=&quot;C,B,A&quot;/&gt;<br />
假定我们要执行target D。从它的依赖属性来看，你可能认为先执行C，然后B，最后A被执行。错了，C依赖于B，B依赖于A，所以先执行A，然后B，然后C，最后D被执行。<br />
<br />
一个target只能被执行一次，即时有多个target依赖于它（看上面的例子）。<br />
<br />
如 果（或如果不）某些属性被设定，才执行某个target。这样，允许根据系统的状态（java version, OS, 命令行属性定义等等）来更好地控制build的过程。要想让一个target这样做，你就应该在target元素中，加入if（或unless）属性，带 上target因该有所判断的属性。例如：<br />
&lt;target name=&quot;build-module-A&quot; if=&quot;module-A-present&quot;/&gt;<br />
&lt;target name=&quot;build-own-fake-module-A&quot; unless=&quot;module-A-present&quot;/&gt;<br />
如果没有if或unless属性，target总会被执行。<br />
<br />
可选的description属性可用来提供关于target的一行描述，这些描述可由-projecthelp命令行选项输出。<br />
<br />
将你的tstamp task在一个所谓的初始化target是很好的做法，其他的target依赖这个初始化target。要确保初始化target是出现在其他target依赖表中的第一个target。在本手册中大多数的初始化target的名字是&quot;init&quot;。<br />
<br />
target有下面的属性：<br />
Attribute Description Required<br />
name target的名字 Yes<br />
depends 用逗号分隔的target的名字列表，也就是依赖表。 No<br />
if 执行target所需要设定的属性名。 No<br />
unless 执行target需要清除设定的属性名。 No<br />
description 关于target功能的简短描述。 No<br />
<br />
<strong>3.3 Tasks</strong><br />
<br />
一个task是一段可执行的代码。<br />
<br />
一个task可以有多个属性（如果你愿意的话，可以将其称之为变量）。属性只可能包含对property的引用。这些引用会在task执行前被解析。<br />
<br />
下面是Task的一般构造形式：<br />
&lt;name attribute1=&quot;value1&quot; attribute2=&quot;value2&quot; ... /&gt;<br />
这里name是task的名字，attributeN是属性名，valueN是属性值。<br />
<br />
有一套内置的（built-in）task，以及一些可选task，但你也可以编写自己的task。<br />
<br />
所有的task都有一个task名字属性。Ant用属性值来产生日志信息。<br />
<br />
可以给task赋一个id属性：<br />
&lt;taskname id=&quot;taskID&quot; ... /&gt;<br />
这里taskname是task的名字，而taskID是这个task的唯一标识符。通过这个标识符，你可以在脚本中引用相应的task。例如，在脚本中你可以这样：<br />
&lt;script ... &gt;<br />
task1.setFoo(&quot;bar&quot;);<br />
&lt;/script&gt;<br />
设定某个task实例的foo属性。在另一个task中（用java编写），你可以利用下面的语句存取相应的实例。<br />
project.getReference(&quot;task1&quot;).<br />
注意1：如果task1还没有运行，就不会被生效（例如：不设定属性），如果你在随后配置它，你所作的一切都会被覆盖。<br />
<br />
注意2：未来的Ant版本可能不会兼容这里所提的属性，因为很有可能根本没有task实例，只有proxies。<br />
<br />
<strong>3.4 Properties<br />
</strong><br />
一 个project可以有很多的properties。可以在buildfile中用property task来设定，或在Ant之外设定。一个property有一个名字和一个值。property可用于task的属性值。这是通过将属性名放在&quot;${&quot; 和&quot;}&quot;之间并放在属性值的位置来实现的。例如如果有一个property builddir的值是&quot;build&quot;，这个property就可用于属性值：${builddir}/classes。这个值就可被解析为 build/classes。<br />
<br />
内置属性<br />
<br />
如果你使用了&lt;property&gt; task 定义了所有的系统属性，Ant允许你使用这些属性。例如，${os.name}对应操作系统的名字。<br />
<br />
要想得到系统属性的列表可参考the Javadoc of System.getProperties。<br />
<br />
除了Java的系统属性，Ant还定义了一些自己的内置属性： <br />
basedir project基目录的绝对路径 (与&lt;project&gt;的basedir属性一样)。<br />
ant.file buildfile的绝对路径。<br />
ant.version Ant的版本。<br />
ant.project.name 当前执行的project的名字；由&lt;project&gt;的name属性设定.<br />
ant.java.version Ant检测到的JVM的版本； 目前的值有&quot;1.1&quot;, &quot;1.2&quot;, &quot;1.3&quot; and &quot;1.4&quot;.<br />
<br />
例子<br />
&lt;project name=&quot;MyProject&quot; default=&quot;dist&quot; basedir=&quot;.&quot;&gt; <br />
<br />
&lt;!-- set global properties for this build --&gt;<br />
&lt;property name=&quot;src&quot; value=&quot;.&quot;/&gt;<br />
&lt;property name=&quot;build&quot; value=&quot;build&quot;/&gt;<br />
&lt;property name=&quot;dist&quot; value=&quot;dist&quot;/&gt; <br />
<br />
&lt;target name=&quot;init&quot;&gt;<br />
&lt;!-- Create the time stamp --&gt;<br />
&lt;tstamp/&gt;<br />
&lt;!-- Create the build directory structure used by compile --&gt;<br />
&lt;mkdir dir=&quot;${build}&quot;/&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name=&quot;compile&quot; depends=&quot;init&quot;&gt;<br />
&lt;!-- Compile the java code from ${src} into ${build} --&gt;<br />
&lt;javac srcdir=&quot;${src}&quot; destdir=&quot;${build}&quot;/&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name=&quot;dist&quot; depends=&quot;compile&quot;&gt;<br />
&lt;!-- Create the distribution directory --&gt;<br />
&lt;mkdir dir=&quot;${dist}/lib&quot;/&gt;<br />
&lt;!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --&gt;<br />
&lt;jar jarfile=&quot;${dist}/lib/MyProject-${DSTAMP}.jar&quot; basedir=&quot;${build}&quot;/&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;target name=&quot;clean&quot;&gt;<br />
&lt;!-- Delete the ${build} and ${dist} directory trees --&gt;<br />
&lt;delete dir=&quot;${build}&quot;/&gt;<br />
&lt;delete dir=&quot;${dist}&quot;/&gt;<br />
&lt;/target&gt;<br />
<br />
&lt;/project&gt;<br />
<strong>3.5 Path-like Structures</strong><br />
你可以用&quot;:&quot;和&quot;;&quot;作为分隔符，指定类似PATH和CLASSPATH的引用。Ant会把分隔符转换为当前系统所用的分隔符。<br />
<br />
当需要指定类似路径的值时，可以使用嵌套元素。一般的形式是<br />
&lt;classpath&gt;<br />
&lt;pathelement path=&quot;${classpath}&quot;/&gt;<br />
&lt;pathelement location=&quot;lib/helper.jar&quot;/&gt;<br />
&lt;/classpath&gt;<br />
location属性指定了相对于project基目录的一个文件和目录，而path属性接受逗号或分号分隔的一个位置列表。path属性一般用作预定义的路径－－其他情况下，应该用多个location属性。<br />
<br />
为简洁起见，classpath标签支持自己的path和location属性。所以：<br />
&lt;classpath&gt;<br />
&lt;pathelement path=&quot;${classpath}&quot;/&gt;<br />
&lt;/classpath&gt;<br />
可以被简写作：<br />
&lt;classpath path=&quot;${classpath}&quot;/&gt;<br />
也可通过&lt;fileset&gt;元素指定路径。构成一个fileset的多个文件加入path-like structure的顺序是未定的。<br />
&lt;classpath&gt;<br />
&lt;pathelement path=&quot;${classpath}&quot;/&gt;<br />
&lt;fileset dir=&quot;lib&quot;&gt;<br />
&lt;include name=&quot;**/*.jar&quot;/&gt;<br />
&lt;/fileset&gt;<br />
&lt;pathelement location=&quot;classes&quot;/&gt;<br />
&lt;/classpath&gt;<br />
上面的例子构造了一个路径值包括：${classpath}的路径，跟着lib目录下的所有jar文件，接着是classes目录。<br />
<br />
如果你想在多个task中使用相同的path-like structure，你可以用&lt;path&gt;元素定义他们（与target同级），然后通过id属性引用－－参考Referencs例子。<br />
<br />
path-like structure可能包括对另一个path-like structurede的引用（通过嵌套&lt;path&gt;元素）：<br />
&lt;path id=&quot;base.path&quot;&gt;<br />
&lt;pathelement path=&quot;${classpath}&quot;/&gt;<br />
&lt;fileset dir=&quot;lib&quot;&gt;<br />
&lt;include name=&quot;**/*.jar&quot;/&gt;<br />
&lt;/fileset&gt;<br />
&lt;pathelement location=&quot;classes&quot;/&gt;<br />
&lt;/path&gt;<br />
&lt;path id=&quot;tests.path&quot;&gt;<br />
&lt;path refid=&quot;base.path&quot;/&gt;<br />
&lt;pathelement location=&quot;testclasses&quot;/&gt;<br />
&lt;/path&gt;<br />
前面所提的关于&lt;classpath&gt;的简洁写法对于&lt;path&gt;也是有效的，如：<br />
&lt;path id=&quot;tests.path&quot;&gt;<br />
&lt;path refid=&quot;base.path&quot;/&gt;<br />
&lt;pathelement location=&quot;testclasses&quot;/&gt;<br />
&lt;/path&gt;<br />
可写成：<br />
&lt;path id=&quot;base.path&quot; path=&quot;${classpath}&quot;/&gt;<br />
命令行变量<br />
<br />
有些task可接受参数，并将其传递给另一个进程。为了能在变量中包含空格字符，可使用嵌套的arg元素。<br />
Attribute Description Required<br />
value 一个命令行变量；可包含空格字符。 只能用一个<br />
line 空格分隔的命令行变量列表。 <br />
file 作为命令行变量的文件名；会被文件的绝对名替代。 <br />
path 一个作为单个命令行变量的path-like的字符串；或作为分隔符，Ant会将其转变为特定平台的分隔符。 <br />
<br />
例子<br />
&lt;arg value=&quot;-l -a&quot;/&gt;<br />
是一个含有空格的单个的命令行变量。<br />
&lt;arg line=&quot;-l -a&quot;/&gt;<br />
是两个空格分隔的命令行变量。<br />
&lt;arg path=&quot;/dir;/dir2:\dir3&quot;/&gt;<br />
是一个命令行变量，其值在DOS系统上为\dir;\dir2;\dir3；在Unix系统上为/dir:/dir2:/dir3 。<br />
<br />
References<br />
<br />
buildfile元素的id属性可用来引用这些元素。如果你需要一遍遍的复制相同的XML代码块，这一属性就很有用－－如多次使用&lt;classpath&gt;结构。<br />
<br />
下面的例子：<br />
&lt;project ... &gt;<br />
&lt;target ... &gt; <br />
&lt;rmic ...&gt; <br />
&lt;classpath&gt; <br />
&lt;pathelement location=&quot;lib/&quot;/&gt; <br />
&lt;pathelement path=&quot;${java.class.path}/&quot;/&gt; <br />
&lt;pathelement path=&quot;${additional.path}&quot;/&gt; <br />
&lt;/classpath&gt; <br />
&lt;/rmic&gt; <br />
&lt;/target&gt;<br />
&lt;target ... &gt;<br />
&lt;javac ...&gt;<br />
&lt;classpath&gt;<br />
&lt;pathelement location=&quot;lib/&quot;/&gt;<br />
&lt;pathelement path=&quot;${java.class.path}/&quot;/&gt;<br />
&lt;pathelement path=&quot;${additional.path}&quot;/&gt;<br />
&lt;/classpath&gt;<br />
&lt;/javac&gt;<br />
&lt;/target&gt;<br />
&lt;/project&gt;<br />
可以写成如下形式：<br />
&lt;project ... &gt; <br />
&lt;path id=&quot;project.class.path&quot;&gt; <br />
&lt;pathelement location=&quot;lib/&quot;/&gt;<br />
&lt;pathelement path=&quot;${java.class.path}/&quot;/&gt; <br />
&lt;pathelement path=&quot;${additional.path}&quot;/&gt; <br />
&lt;/path&gt;<br />
&lt;target ... &gt;<br />
&lt;rmic ...&gt;<br />
&lt;classpath refid=&quot;project.class.path&quot;/&gt;<br />
&lt;/rmic&gt;<br />
&lt;/target&gt;<br />
&lt;target ... &gt; <br />
&lt;javac ...&gt;<br />
&lt;classpath refid=&quot;project.class.path&quot;/&gt;<br />
&lt;/javac&gt;<br />
&lt;/target&gt;<br />
&lt;/project&gt;<br />
所有使用PatternSets, FileSets 或 path-like structures嵌套元素的task也接受这种类型的引用。<br />
</div>
          <br/>
          <span style="color:red;">
            <a href="http://ecchanger.javaeye.com/blog/80401#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 16 May 2007 19:18:53 +0800</pubDate>
        <link>http://ecchanger.javaeye.com/blog/80401</link>
        <guid>http://ecchanger.javaeye.com/blog/80401</guid>
      </item>
      <item>
        <title>struts2的struts.properties</title>
        <author>ecchanger</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ecchanger.javaeye.com">ecchanger</a>&nbsp;
          链接：<a href="http://ecchanger.javaeye.com/blog/80375" style="color:red;">http://ecchanger.javaeye.com/blog/80375</a>&nbsp;
          发表时间: 2007年05月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Courier New"><strong>struts.action.extension</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The URL extension to use to determine if the request is meant for a Struts action <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用URL扩展名来确定是否这个请求是被用作Struts action，其实也就是设置 action的后缀，例如login.do的\'do\'字。</font></p>
<p><font face="Courier New"><strong>struts.configuration</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.config.Configuration implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.config.Configuration接口名</font></p>
<p><font face="Courier New"><strong>struts.configuration.files</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A list of configuration files automatically loaded by Struts <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts自动加载的一个配置文件列表</font></p>
<p><font face="Courier New"><strong>struts.configuration.xml.reload</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to reload the XML configuration or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否加载xml配置(true,false)</font></p>
<p><font face="Courier New"><strong>struts.continuations.package</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The package containing actions that use Rife continuations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含有actions的完整连续的package名称</font></p>
<p><font face="Courier New"><strong>struts.custom.i18n.resources<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location of additional localization properties files to load <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载附加的国际化属性文件（不包含.properties后缀）</font></p>
<p><font face="Courier New"><strong>struts.custom.properties</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location of additional configuration properties files to load<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载附加的配置文件的位置</font></p>
<p><br />
<font face="Courier New"><strong>struts.devMode</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Struts is in development mode or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否为struts开发模式</font></p>
<p><font face="Courier New"><strong>struts.dispatcher.parametersWorkaround</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）</font></p>
<p><font face="Courier New"><strong>struts.enable.DynamicMethodInvocation</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allows one to disable dynamic method invocation from the URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许动态方法调用</font></p>
<p><font face="Courier New"><strong>struts.freemarker.manager.classname</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.views.freemarker.FreemarkerManager implementation class <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.freemarker.FreemarkerManager接口名</font></p>
<p><font face="Courier New"><strong>struts.i18n.encoding</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The encoding to use for localization messages<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国际化信息内码</font></p>
<p><font face="Courier New"><strong>struts.i18n.reload</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether the localization messages should automatically be reloaded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否国际化信息自动加载 </font></p>
<p><font face="Courier New"><strong>struts.locale</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default locale for the Struts application<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的国际化地区信息</font></p>
<p><font face="Courier New"><strong>struts.mapper.class</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.mapper.ActionMapper接口</font></p>
<p><font face="Courier New"><strong>struts.multipart.maxSize</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The maximize size of a multipart request (file upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart请求信息的最大尺寸（文件上传用） </font></p>
<p><font face="Courier New"><strong>struts.multipart.parser</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.dispatcher.multipart.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MultiPartRequest parser implementation for a multipart request (file upload) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）</font></p>
<p><br />
<font face="Courier New"><strong>struts.multipart.saveDir</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory to use for storing uploaded files <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置存储上传文件的目录夹</font></p>
<p><font face="Courier New"><strong>struts.objectFactory</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The com.opensymphony.xwork2.ObjectFactory implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.xwork2.ObjectFactory接口（spring）</font></p>
<p><font face="Courier New"><strong>struts.objectFactory.spring.autoWire</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Spring should autoWire or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否自动绑定Spring</font></p>
<p><font face="Courier New"><strong>struts.objectFactory.spring.useClassCache</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Spring should use its class cache or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否spring应该使用自身的cache </font></p>
<p><font face="Courier New"><strong>struts.objectTypeDeterminer</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.xwork2.util.ObjectTypeDeterminer接口</font></p>
<p><font face="Courier New"><strong>struts.serve.static.browserCache</strong><br />
&nbsp; If static content served by the Struts filter should set browser caching header properties or not <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;