<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,27 +1,27 @@
-module ActionView
-  module Helpers
-    module AssetTagHelper
-      
-      def javascript_include_tag_with_holly(*sources)
-        holly_asset_tags(expand_javascript_sources(sources), &quot;js&quot;)
-      end
-      alias_method_chain(:javascript_include_tag, :holly)
-      
-      def stylesheet_link_tag_with_holly(*sources)
-        holly_asset_tags(expand_stylesheet_sources(sources), &quot;css&quot;)
-      end
-      alias_method_chain(:stylesheet_link_tag, :holly)
-      
-      def holly_asset_tags(sources, asset_type)
-        sources = sources.map { |s| Holly.resolve_source(s.to_s, asset_type) }
-        files = Holly::Asset::Collection.new(*sources).files
-        files.delete_if { |f| request.holly_logger.rendered?(f.source) }
-        request.holly_logger.log(*files.map { |f| f.source})
-        files.map { |file|
-          __send__(&quot;#{file.asset_tag_method}_without_holly&quot;, file.source)
-        }.join(&quot;\n&quot;)
-      end
-      
-    end
-  end
-end
+module ActionView
+  module Helpers
+    module AssetTagHelper
+      
+      def javascript_include_tag_with_holly(*sources)
+        holly_asset_tags(expand_javascript_sources(sources), &quot;js&quot;)
+      end
+      alias_method_chain(:javascript_include_tag, :holly)
+      
+      def stylesheet_link_tag_with_holly(*sources)
+        holly_asset_tags(expand_stylesheet_sources(sources), &quot;css&quot;)
+      end
+      alias_method_chain(:stylesheet_link_tag, :holly)
+      
+      def holly_asset_tags(sources, asset_type)
+        sources = sources.map { |s| Holly.resolve_source(s.to_s, asset_type) }
+        files = Holly::Asset::Collection.new(*sources).files
+        files.delete_if { |f| request.holly_logger.rendered?(f.source) }
+        request.holly_logger.log(*files.map { |f| f.source})
+        files.map { |file|
+          __send__(&quot;#{file.asset_tag_method}_without_holly&quot;, file.source)
+        }.join(&quot;\n&quot;)
+      end
+      
+    end
+  end
+end</diff>
      <filename>lib/asset_tag_helper.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,13 @@
-module ActionController
-  class CgiRequest
-    
-    attr_accessor :holly_logger
-    
-    def initialize_with_holly(*args)
-      @holly_logger = Holly::Logger.new
-      initialize_without_holly(*args)
-    end
-    alias_method_chain(:initialize, :holly)
-    
-  end
-end
+module ActionController
+  class CgiRequest
+    
+    attr_accessor :holly_logger
+    
+    def initialize_with_holly(*args)
+      @holly_logger = Holly::Logger.new
+      initialize_without_holly(*args)
+    end
+    alias_method_chain(:initialize, :holly)
+    
+  end
+end</diff>
      <filename>lib/cgi_request.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,77 +1,77 @@
-require 'find'
-
-module Holly
-  class Asset
-    
-    class &lt;&lt; self
-      def find_all
-        files, dir = [], Holly.public_dir
-        Find.find(dir) do |path|
-          files &lt;&lt; path.gsub(%r{^#{dir}}, &quot;&quot;) if path =~ /\.(js|css)$/i
-        end
-        files.sort.map { |f| self.new(f) }
-      end
-    end
-    
-    attr_accessor :source
-    
-    def initialize(source, context = DEFAULT_TYPE)
-      @source = Holly.resolve_source(source, context)
-    end
-    
-    def is_local?
-      !Holly.is_remote_path?(@source)
-    end
-    
-    def path
-      is_local? ? &quot;#{Holly.public_dir}#{@source}&quot; : @source
-    end
-    
-    def asset_type
-      @source.match(/\.([a-z]+)$/i).to_a[1]
-    end
-    
-    def asset_tag_method
-      asset_type == &quot;css&quot; ? :stylesheet_link_tag : :javascript_include_tag
-    end
-    
-    def exists?
-      !is_local? or File.file?(path)
-    end
-    
-    def read
-      @read ||= is_local? ? (exists? ? File.read(path) : &quot;&quot;) : &quot;&quot;
-    end
-    
-    def lines
-      @lines ||= read.split(/[\r\n]/).delete_if { |s| s.empty? }
-    end
-    
-    def requires
-      @requires ||= Holly.parse(read, REQUIRE, asset_type)
-      @requires.dup
-    end
-    
-    def loads
-      @loads ||= Holly.parse(read, LOAD, asset_type)
-      @loads.dup
-    end
-    
-    def expanded
-      Collection.new(@source)
-    end
-    
-    def referring_assets
-      self.class.find_all.find_all do |asset|
-        asset.source != @source and (asset.requires + asset.loads).include?(@source)
-      end
-    end
-    
-    def dependant_assets
-      self.class.find_all.find_all do |asset|
-        asset.source != @source and asset.expanded.sources.include?(@source)
-      end
-    end
-    
-  end
-end
+require 'find'
+
+module Holly
+  class Asset
+    
+    class &lt;&lt; self
+      def find_all
+        files, dir = [], Holly.public_dir
+        Find.find(dir) do |path|
+          files &lt;&lt; path.gsub(%r{^#{dir}}, &quot;&quot;) if path =~ /\.(js|css)$/i
+        end
+        files.sort.map { |f| self.new(f) }
+      end
+    end
+    
+    attr_accessor :source
+    
+    def initialize(source, context = DEFAULT_TYPE)
+      @source = Holly.resolve_source(source, context)
+    end
+    
+    def is_local?
+      !Holly.is_remote_path?(@source)
+    end
+    
+    def path
+      is_local? ? &quot;#{Holly.public_dir}#{@source}&quot; : @source
+    end
+    
+    def asset_type
+      @source.match(/\.([a-z]+)$/i).to_a[1]
+    end
+    
+    def asset_tag_method
+      asset_type == &quot;css&quot; ? :stylesheet_link_tag : :javascript_include_tag
+    end
+    
+    def exists?
+      !is_local? or File.file?(path)
+    end
+    
+    def read
+      @read ||= is_local? ? (exists? ? File.read(path) : &quot;&quot;) : &quot;&quot;
+    end
+    
+    def lines
+      @lines ||= read.split(/[\r\n]/).delete_if { |s| s.empty? }
+    end
+    
+    def requires
+      @requires ||= Holly.parse(read, REQUIRE, asset_type)
+      @requires.dup
+    end
+    
+    def loads
+      @loads ||= Holly.parse(read, LOAD, asset_type)
+      @loads.dup
+    end
+    
+    def expanded
+      Collection.new(@source)
+    end
+    
+    def referring_assets
+      self.class.find_all.find_all do |asset|
+        asset.source != @source and (asset.requires + asset.loads).include?(@source)
+      end
+    end
+    
+    def dependant_assets
+      self.class.find_all.find_all do |asset|
+        asset.source != @source and asset.expanded.sources.include?(@source)
+      end
+    end
+    
+  end
+end</diff>
      <filename>lib/holly/asset.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,33 +1,33 @@
-module Holly
-  class Asset
-    class Collection
-      
-      attr_accessor :sources
-      
-      def initialize(*sources)
-        @sources = sources.map { |s| Holly.resolve_source(s) }.uniq
-        expand!
-      end
-      
-      def expand!
-        n = @sources.size
-        while true
-          # Expand files in reverse order. @load-ed files are not reloaded if tmp
-          # already contains them, so files are loaded as late as possible.
-          # @require-d files are bumped as early in the list as they are needed.
-          @sources = files.reverse.inject([]) do |tmp, file|
-            (file.requires + [file.source] +
-                file.loads.delete_if { |f| tmp.include?(f) } + tmp).flatten.uniq
-          end
-          return if n == @sources.size
-          n = @sources.size
-        end
-      end
-      
-      def files
-        @sources.map { |s| Asset.new(s) }
-      end
-      
-    end
-  end
-end
+module Holly
+  class Asset
+    class Collection
+      
+      attr_accessor :sources
+      
+      def initialize(*sources)
+        @sources = sources.map { |s| Holly.resolve_source(s) }.uniq
+        expand!
+      end
+      
+      def expand!
+        n = @sources.size
+        while true
+          # Expand files in reverse order. @load-ed files are not reloaded if tmp
+          # already contains them, so files are loaded as late as possible.
+          # @require-d files are bumped as early in the list as they are needed.
+          @sources = files.reverse.inject([]) do |tmp, file|
+            (file.requires + [file.source] +
+                file.loads.delete_if { |f| tmp.include?(f) } + tmp).flatten.uniq
+          end
+          return if n == @sources.size
+          n = @sources.size
+        end
+      end
+      
+      def files
+        @sources.map { |s| Asset.new(s) }
+      end
+      
+    end
+  end
+end</diff>
      <filename>lib/holly/asset/collection.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,20 +1,20 @@
-module Holly
-  class Logger
-    
-    attr :sources
-    
-    def initialize
-      @sources = []
-    end
-    
-    def log(*sources)
-      sources = sources.map { |s| Holly.resolve_source(s) }
-      @sources = (@sources + sources).uniq
-    end
-    
-    def rendered?(source)
-      @sources.include?(Holly.resolve_source(source))
-    end
-    
-  end
-end
+module Holly
+  class Logger
+    
+    attr :sources
+    
+    def initialize
+      @sources = []
+    end
+    
+    def log(*sources)
+      sources = sources.map { |s| Holly.resolve_source(s) }
+      @sources = (@sources + sources).uniq
+    end
+    
+    def rendered?(source)
+      @sources.include?(Holly.resolve_source(source))
+    end
+    
+  end
+end</diff>
      <filename>lib/holly/logger.rb</filename>
    </modified>
    <modified>
      <diff>@@ -1,126 +1,126 @@
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-//           (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
-// 
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/
-
-// @require effects
-
-if(Object.isUndefined(Effect))
-  throw(&quot;dragdrop.js requires including script.aculo.us' effects.js library&quot;);
-
-var Droppables = {
-  drops: [],
-
-  remove: function(element) {
-    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
-  },
-
-  add: function(element) {
-    element = $(element);
-    var options = Object.extend({
-      greedy:     true,
-      hoverclass: null,
-      tree:       false
-    }, arguments[1] || { });
-
-    // cache containers
-    if(options.containment) {
-      options._containers = [];
-      var containment = options.containment;
-      if(Object.isArray(containment)) {
-        containment.each( function(c) { options._containers.push($(c)) });
-      } else {
-        options._containers.push($(containment));
-      }
-    }
-    
-    if(options.accept) options.accept = [options.accept].flatten();
-
-    Element.makePositioned(element); // fix IE
-    options.element = element;
-
-    this.drops.push(options);
-  },
-  
-  findDeepestChild: function(drops) {
-    deepest = drops[0];
-      
-    for (i = 1; i &lt; drops.length; ++i)
-      if (Element.isParent(drops[i].element, deepest.element))
-        deepest = drops[i];
-    
-    return deepest;
-  },
-
-  isContained: function(element, drop) {
-    var containmentNode;
-    if(drop.tree) {
-      containmentNode = element.treeNode; 
-    } else {
-      containmentNode = element.parentNode;
-    }
-    return drop._containers.detect(function(c) { return containmentNode == c });
-  },
-  
-  isAffected: function(point, element, drop) {
-    return (
-      (drop.element!=element) &amp;&amp;
-      ((!drop._containers) ||
-        this.isContained(element, drop)) &amp;&amp;
-      ((!drop.accept) ||
-        (Element.classNames(element).detect( 
-          function(v) { return drop.accept.include(v) } ) )) &amp;&amp;
-      Position.within(drop.element, point[0], point[1]) );
-  },
-
-  deactivate: function(drop) {
-    if(drop.hoverclass)
-      Element.removeClassName(drop.element, drop.hoverclass);
-    this.last_active = null;
-  },
-
-  activate: function(drop) {
-    if(drop.hoverclass)
-      Element.addClassName(drop.element, drop.hoverclass);
-    this.last_active = drop;
-  },
-
-  show: function(point, element) {
-    if(!this.drops.length) return;
-    var drop, affected = [];
-    
-    this.drops.each( function(drop) {
-      if(Droppables.isAffected(point, element, drop))
-        affected.push(drop);
-    });
-        
-    if(affected.length&gt;0)
-      drop = Droppables.findDeepestChild(affected);
-
-    if(this.last_active &amp;&amp; this.last_active != drop) this.deactivate(this.last_active);
-    if (drop) {
-      Position.within(drop.element, point[0], point[1]);
-      if(drop.onHover)
-        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
-      
-      if (drop != this.last_active) Droppables.activate(drop);
-    }
-  },
-
-  fire: function(event, element) {
-    if(!this.last_active) return;
-    Position.prepare();
-
-    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
-      if (this.last_active.onDrop) {
-        this.last_active.onDrop(element, this.last_active.element, event); 
-        return true; 
-      }
-  },
-
-  reset: function() {
-    if(this.last_active)
-      this.deactivate(this.last_active);
-  }
-}
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//           (c) 2005-2007 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// @require effects
+
+if(Object.isUndefined(Effect))
+  throw(&quot;dragdrop.js requires including script.aculo.us' effects.js library&quot;);
+
+var Droppables = {
+  drops: [],
+
+  remove: function(element) {
+    this.drops = this.drops.reject(function(d) { return d.element==$(element) });
+  },
+
+  add: function(element) {
+    element = $(element);
+    var options = Object.extend({
+      greedy:     true,
+      hoverclass: null,
+      tree:       false
+    }, arguments[1] || { });
+
+    // cache containers
+    if(options.containment) {
+      options._containers = [];
+      var containment = options.containment;
+      if(Object.isArray(containment)) {
+        containment.each( function(c) { options._containers.push($(c)) });
+      } else {
+        options._containers.push($(containment));
+      }
+    }
+    
+    if(options.accept) options.accept = [options.accept].flatten();
+
+    Element.makePositioned(element); // fix IE
+    options.element = element;
+
+    this.drops.push(options);
+  },
+  
+  findDeepestChild: function(drops) {
+    deepest = drops[0];
+      
+    for (i = 1; i &lt; drops.length; ++i)
+      if (Element.isParent(drops[i].element, deepest.element))
+        deepest = drops[i];
+    
+    return deepest;
+  },
+
+  isContained: function(element, drop) {
+    var containmentNode;
+    if(drop.tree) {
+      containmentNode = element.treeNode; 
+    } else {
+      containmentNode = element.parentNode;
+    }
+    return drop._containers.detect(function(c) { return containmentNode == c });
+  },
+  
+  isAffected: function(point, element, drop) {
+    return (
+      (drop.element!=element) &amp;&amp;
+      ((!drop._containers) ||
+        this.isContained(element, drop)) &amp;&amp;
+      ((!drop.accept) ||
+        (Element.classNames(element).detect( 
+          function(v) { return drop.accept.include(v) } ) )) &amp;&amp;
+      Position.within(drop.element, point[0], point[1]) );
+  },
+
+  deactivate: function(drop) {
+    if(drop.hoverclass)
+      Element.removeClassName(drop.element, drop.hoverclass);
+    this.last_active = null;
+  },
+
+  activate: function(drop) {
+    if(drop.hoverclass)
+      Element.addClassName(drop.element, drop.hoverclass);
+    this.last_active = drop;
+  },
+
+  show: function(point, element) {
+    if(!this.drops.length) return;
+    var drop, affected = [];
+    
+    this.drops.each( function(drop) {
+      if(Droppables.isAffected(point, element, drop))
+        affected.push(drop);
+    });
+        
+    if(affected.length&gt;0)
+      drop = Droppables.findDeepestChild(affected);
+
+    if(this.last_active &amp;&amp; this.last_active != drop) this.deactivate(this.last_active);
+    if (drop) {
+      Position.within(drop.element, point[0], point[1]);
+      if(drop.onHover)
+        drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
+      
+      if (drop != this.last_active) Droppables.activate(drop);
+    }
+  },
+
+  fire: function(event, element) {
+    if(!this.last_active) return;
+    Position.prepare();
+
+    if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
+      if (this.last_active.onDrop) {
+        this.last_active.onDrop(element, this.last_active.element, event); 
+        return true; 
+      }
+  },
+
+  reset: function() {
+    if(this.last_active)
+      this.deactivate(this.last_active);
+  }
+}</diff>
      <filename>test/assets/javascripts/dragdrop.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,171 +1,171 @@
-// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
-// Contributors:
-//  Justin Palmer (http://encytemedia.com/)
-//  Mark Pilgrim (http://diveintomark.org/)
-//  Martin Bialasinki
-// 
-// script.aculo.us is freely distributable under the terms of an MIT-style license.
-// For details, see the script.aculo.us web site: http://script.aculo.us/ 
-
-// converts rgb() and #xxx to #xxxxxx format,  
-// returns self (or first argument) if not convertable  
-
-    // @require prototype
-
-String.prototype.parseColor = function() {  
-  var color = '#';
-  if (this.slice(0,4) == 'rgb(') {  
-    var cols = this.slice(4,this.length-1).split(',');  
-    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i&lt;3);  
-  } else {  
-    if (this.slice(0,1) == '#') {  
-      if (this.length==4) for(var i=1;i&lt;4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
-      if (this.length==7) color = this.toLowerCase();  
-    }  
-  }  
-  return (color.length==7 ? color : (arguments[0] || this));  
-};
-
-/*--------------------------------------------------------------------------*/
-
-Element.collectTextNodes = function(element) {  
-  return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
-      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
-  }).flatten().join('');
-};
-
-Element.collectTextNodesIgnoreClass = function(element, className) {  
-  return $A($(element).childNodes).collect( function(node) {
-    return (node.nodeType==3 ? node.nodeValue : 
-      ((node.hasChildNodes() &amp;&amp; !Element.hasClassName(node,className)) ? 
-        Element.collectTextNodesIgnoreClass(node, className) : ''));
-  }).flatten().join('');
-};
-
-// @require http://yui.yahooapis.com/2.4.1/build/yahoo-dom-event/yahoo-dom-event.js
-
-Element.setContentZoom = function(element, percent) {
-  element = $(element);  
-  element.setStyle({fontSize: (percent/100) + 'em'});   
-  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
-  return element;
-};
-
-// @load dragdrop
-
-Element.getInlineOpacity = function(element){
-  return $(element).style.opacity || '';
-};
-
-Element.forceRerendering = function(element) {
-  try {
-    element = $(element);
-    var n = document.createTextNode(' ');
-    element.appendChild(n);
-    element.removeChild(n);
-  } catch(e) { }
-};
-
-/*--------------------------------------------------------------------------*/
-
-var Effect = {
-  _elementDoesNotExistError: {
-    name: 'ElementDoesNotExistError',
-    message: 'The specified DOM element does not exist, but is required for this effect to operate'
-  },
-  Transitions: {
-    linear: Prototype.K,
-    sinoidal: function(pos) {
-      return (-Math.cos(pos*Math.PI)/2) + 0.5;
-    },
-    reverse: function(pos) {
-      return 1-pos;
-    },
-    flicker: function(pos) {
-      var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
-      return pos &gt; 1 ? 1 : pos;
-    },
-    wobble: function(pos) {
-      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
-    },
-    pulse: function(pos, pulses) { 
-      pulses = pulses || 5; 
-      return (
-        ((pos % (1/pulses)) * pulses).round() == 0 ? 
-              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
-          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
-        );
-    },
-    spring: function(pos) { 
-      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
-    },
-    none: function(pos) {
-      return 0;
-    },
-    full: function(pos) {
-      return 1;
-    }
-  },
-  DefaultOptions: {
-    duration:   1.0,   // seconds
-    fps:        100,   // 100= assume 66fps max.
-    sync:       false, // true for combining
-    from:       0.0,
-    to:         1.0,
-    delay:      0.0,
-    queue:      'parallel'
-  },
-  tagifyText: function(element) {
-    var tagifyStyle = 'position:relative';
-    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
-    
-    element = $(element);
-    $A(element.childNodes).each( function(child) {
-      if (child.nodeType==3) {
-        child.nodeValue.toArray().each( function(character) {
-          element.insertBefore(
-            new Element('span', {style: tagifyStyle}).update(
-              character == ' ' ? String.fromCharCode(160) : character), 
-              child);
-        });
-        Element.remove(child);
-      }
-    });
-  },
-  multiple: function(element, effect) {
-    var elements;
-    if (((typeof element == 'object') || 
-        Object.isFunction(element)) &amp;&amp; 
-       (element.length))
-      elements = element;
-    else
-      elements = $(element).childNodes;
-      
-    var options = Object.extend({
-      speed: 0.1,
-      delay: 0.0
-    }, arguments[2] || { });
-    var masterDelay = options.delay;
-
-    $A(elements).each( function(element, index) {
-      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
-    });
-  },
-  PAIRS: {
-    'slide':  ['SlideDown','SlideUp'],
-    'blind':  ['BlindDown','BlindUp'],
-    'appear': ['Appear','Fade']
-  },
-  toggle: function(element, effect) {
-    element = $(element);
-    effect = (effect || 'appear').toLowerCase();
-    var options = Object.extend({
-      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
-    }, arguments[2] || { });
-    Effect[element.visible() ? 
-      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
-  }
-};
-
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+//  Justin Palmer (http://encytemedia.com/)
+//  Mark Pilgrim (http://diveintomark.org/)
+//  Martin Bialasinki
+// 
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/ 
+
+// converts rgb() and #xxx to #xxxxxx format,  
+// returns self (or first argument) if not convertable  
+
+    // @require prototype
+
+String.prototype.parseColor = function() {  
+  var color = '#';
+  if (this.slice(0,4) == 'rgb(') {  
+    var cols = this.slice(4,this.length-1).split(',');  
+    var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i&lt;3);  
+  } else {  
+    if (this.slice(0,1) == '#') {  
+      if (this.length==4) for(var i=1;i&lt;4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();  
+      if (this.length==7) color = this.toLowerCase();  
+    }  
+  }  
+  return (color.length==7 ? color : (arguments[0] || this));  
+};
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+  }).flatten().join('');
+};
+
+Element.collectTextNodesIgnoreClass = function(element, className) {  
+  return $A($(element).childNodes).collect( function(node) {
+    return (node.nodeType==3 ? node.nodeValue : 
+      ((node.hasChildNodes() &amp;&amp; !Element.hasClassName(node,className)) ? 
+        Element.collectTextNodesIgnoreClass(node, className) : ''));
+  }).flatten().join('');
+};
+
+// @require http://yui.yahooapis.com/2.4.1/build/yahoo-dom-event/yahoo-dom-event.js
+
+Element.setContentZoom = function(element, percent) {
+  element = $(element);  
+  element.setStyle({fontSize: (percent/100) + 'em'});   
+  if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+  return element;
+};
+
+// @load dragdrop
+
+Element.getInlineOpacity = function(element){
+  return $(element).style.opacity || '';
+};
+
+Element.forceRerendering = function(element) {
+  try {
+    element = $(element);
+    var n = document.createTextNode(' ');
+    element.appendChild(n);
+    element.removeChild(n);
+  } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+  _elementDoesNotExistError: {
+    name: 'ElementDoesNotExistError',
+    message: 'The specified DOM element does not exist, but is required for this effect to operate'
+  },
+  Transitions: {
+    linear: Prototype.K,
+    sinoidal: function(pos) {
+      return (-Math.cos(pos*Math.PI)/2) + 0.5;
+    },
+    reverse: function(pos) {
+      return 1-pos;
+    },
+    flicker: function(pos) {
+      var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+      return pos &gt; 1 ? 1 : pos;
+    },
+    wobble: function(pos) {
+      return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+    },
+    pulse: function(pos, pulses) { 
+      pulses = pulses || 5; 
+      return (
+        ((pos % (1/pulses)) * pulses).round() == 0 ? 
+              ((pos * pulses * 2) - (pos * pulses * 2).floor()) : 
+          1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
+        );
+    },
+    spring: function(pos) { 
+      return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6)); 
+    },
+    none: function(pos) {
+      return 0;
+    },
+    full: function(pos) {
+      return 1;
+    }
+  },
+  DefaultOptions: {
+    duration:   1.0,   // seconds
+    fps:        100,   // 100= assume 66fps max.
+    sync:       false, // true for combining
+    from:       0.0,
+    to:         1.0,
+    delay:      0.0,
+    queue:      'parallel'
+  },
+  tagifyText: function(element) {
+    var tagifyStyle = 'position:relative';
+    if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+    
+    element = $(element);
+    $A(element.childNodes).each( function(child) {
+      if (child.nodeType==3) {
+        child.nodeValue.toArray().each( function(character) {
+          element.insertBefore(
+            new Element('span', {style: tagifyStyle}).update(
+              character == ' ' ? String.fromCharCode(160) : character), 
+              child);
+        });
+        Element.remove(child);
+      }
+    });
+  },
+  multiple: function(element, effect) {
+    var elements;
+    if (((typeof element == 'object') || 
+        Object.isFunction(element)) &amp;&amp; 
+       (element.length))
+      elements = element;
+    else
+      elements = $(element).childNodes;
+      
+    var options = Object.extend({
+      speed: 0.1,
+      delay: 0.0
+    }, arguments[2] || { });
+    var masterDelay = options.delay;
+
+    $A(elements).each( function(element, index) {
+      new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+    });
+  },
+  PAIRS: {
+    'slide':  ['SlideDown','SlideUp'],
+    'blind':  ['BlindDown','BlindUp'],
+    'appear': ['Appear','Fade']
+  },
+  toggle: function(element, effect) {
+    element = $(element);
+    effect = (effect || 'appear').toLowerCase();
+    var options = Object.extend({
+      queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+    }, arguments[2] || { });
+    Effect[element.visible() ? 
+      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+  }
+};
+
 Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
\ No newline at end of file</diff>
      <filename>test/assets/javascripts/effects.js</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-// @load order/3
+// @load order/3</diff>
      <filename>test/assets/javascripts/order/1.js</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-// @require order/1
+// @require order/1</diff>
      <filename>test/assets/javascripts/order/2.js</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-// @require order/2
+// @require order/2</diff>
      <filename>test/assets/javascripts/order/3.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,26 +1,26 @@
-var Prototype = {
-  Version: '1.6.0.1',
-
-  Browser: {
-    IE:     !!(window.attachEvent &amp;&amp; !window.opera),
-    Opera:  !!window.opera,
-    WebKit: navigator.userAgent.indexOf('AppleWebKit/') &gt; -1,
-    Gecko:  navigator.userAgent.indexOf('Gecko') &gt; -1 &amp;&amp; navigator.userAgent.indexOf('KHTML') == -1,
-    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
-  },
-
-  BrowserFeatures: {
-    XPath: !!document.evaluate,
-    ElementExtensions: !!window.HTMLElement,
-    SpecificElementExtensions:
-      document.createElement('div').__proto__ &amp;&amp;
-      document.createElement('div').__proto__ !==
-        document.createElement('form').__proto__
-  },
-
-  ScriptFragment: '&lt;script[^&gt;]*&gt;([\\S\\s]*?)&lt;\/script&gt;',
-  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
-
-  emptyFunction: function() { },
-  K: function(x) { return x }
-};
+var Prototype = {
+  Version: '1.6.0.1',
+
+  Browser: {
+    IE:     !!(window.attachEvent &amp;&amp; !window.opera),
+    Opera:  !!window.opera,
+    WebKit: navigator.userAgent.indexOf('AppleWebKit/') &gt; -1,
+    Gecko:  navigator.userAgent.indexOf('Gecko') &gt; -1 &amp;&amp; navigator.userAgent.indexOf('KHTML') == -1,
+    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+  },
+
+  BrowserFeatures: {
+    XPath: !!document.evaluate,
+    ElementExtensions: !!window.HTMLElement,
+    SpecificElementExtensions:
+      document.createElement('div').__proto__ &amp;&amp;
+      document.createElement('div').__proto__ !==
+        document.createElement('form').__proto__
+  },
+
+  ScriptFragment: '&lt;script[^&gt;]*&gt;([\\S\\s]*?)&lt;\/script&gt;',
+  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+  emptyFunction: function() { },
+  K: function(x) { return x }
+};</diff>
      <filename>test/assets/javascripts/prototype.js</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,13 @@
-// @require prototype
-// @require prototype.js
-// @require prototype.js?34737
-// @require widget/item.js
-// @require widget/style.css
-// @require /prototype
-// @require /prototype.js
-// @require /prototype.rb
-// @require /stylesheets/style
-// @require /stylesheets/style.css
-// @require /stylesheets/style.js
-// @require http://svn.jcoglan.com/foo
-// @require http://svn.jcoglan.com/foo.css
+// @require prototype
+// @require prototype.js
+// @require prototype.js?34737
+// @require widget/item.js
+// @require widget/style.css
+// @require /prototype
+// @require /prototype.js
+// @require /prototype.rb
+// @require /stylesheets/style
+// @require /stylesheets/style.css
+// @require /stylesheets/style.js
+// @require http://svn.jcoglan.com/foo
+// @require http://svn.jcoglan.com/foo.css</diff>
      <filename>test/assets/javascripts/script.js</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-/* @load gallery/page */
+/* @load gallery/page */</diff>
      <filename>test/assets/stylesheets/bar.css</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-/* @require gallery/item */
+/* @require gallery/item */</diff>
      <filename>test/assets/stylesheets/foo.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,3 @@
-/* @load gallery/container */
-/* @load gallery/page */
-/* @load gallery/item */
+/* @load gallery/container */
+/* @load gallery/page */
+/* @load gallery/item */</diff>
      <filename>test/assets/stylesheets/gallery.css</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-/* @require gallery/item */
+/* @require gallery/item */</diff>
      <filename>test/assets/stylesheets/gallery/container.css</filename>
    </modified>
    <modified>
      <diff>@@ -1 +1 @@
-/* @require gallery */
+/* @require gallery */</diff>
      <filename>test/assets/stylesheets/gallery/page.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,13 @@
-/* @load style */
-/* @load style.css */
-/* @load style.css?34737 */
-/* @load widget/item.js */
-/* @load widget/style.css */
-/* @load /style */
-/* @load /style.css */
-/* @load /style.rb */
-/* @load /javascripts/script */
-/* @load /javascripts/script.css */
-/* @load /javascripts/script.js */
-/* @load http://svn.jcoglan.com/foo */
-/* @load http://svn.jcoglan.com/foo.js */
+/* @load style */
+/* @load style.css */
+/* @load style.css?34737 */
+/* @load widget/item.js */
+/* @load widget/style.css */
+/* @load /style */
+/* @load /style.css */
+/* @load /style.rb */
+/* @load /javascripts/script */
+/* @load /javascripts/script.css */
+/* @load /javascripts/script.js */
+/* @load http://svn.jcoglan.com/foo */
+/* @load http://svn.jcoglan.com/foo.js */</diff>
      <filename>test/assets/stylesheets/style.css</filename>
    </modified>
    <modified>
      <diff>@@ -1,3 +1,3 @@
-// @require dragdrop
-// @load /widget/item
-// @load widget.css
+// @require dragdrop
+// @load /widget/item
+// @load widget.css</diff>
      <filename>test/assets/widget.js</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>066b3c60f0ffe179a0d5043c4764e07786b7f11b</id>
    </parent>
  </parents>
  <author>
    <name>James Coglan</name>
    <email>jcoglan@googlemail.com</email>
  </author>
  <url>http://github.com/jcoglan/holly/commit/763eb8c17a19b2ce3d8f3ffa6244a0560035f08a</url>
  <id>763eb8c17a19b2ce3d8f3ffa6244a0560035f08a</id>
  <committed-date>2008-09-10T05:15:20-07:00</committed-date>
  <authored-date>2008-09-10T05:15:20-07:00</authored-date>
  <message>Unix line endings</message>
  <tree>edd8270de823ac8837887ba9c8d14a0e1fc640d8</tree>
  <committer>
    <name>James Coglan</name>
    <email>jcoglan@googlemail.com</email>
  </committer>
</commit>
