<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[21633] trunk/wp-includes: Update Jcrop to 0.9.10.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg > ul, #logmsg > ol { margin-left: 0; margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://core.trac.wordpress.org/changeset/21633">21633</a></dd>
<dt>Author</dt> <dd>nacin</dd>
<dt>Date</dt> <dd>2012-08-27 23:37:03 +0000 (Mon, 27 Aug 2012)</dd>
</dl>

<h3>Log Message</h3>
<pre>Update Jcrop to 0.9.10. Includes touch support. fixes <a href="http://core.trac.wordpress.org/ticket/20728">#20728</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpincludesjsjcropjqueryJcropcss">trunk/wp-includes/js/jcrop/jquery.Jcrop.css</a></li>
<li><a href="#trunkwpincludesjsjcropjqueryJcropjs">trunk/wp-includes/js/jcrop/jquery.Jcrop.js</a></li>
<li><a href="#trunkwpincludesjsjcropjqueryJcropminjs">trunk/wp-includes/js/jcrop/jquery.Jcrop.min.js</a></li>
<li><a href="#trunkwpincludesscriptloaderphp">trunk/wp-includes/script-loader.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkwpincludesjsjcropjqueryJcropmincss">trunk/wp-includes/js/jcrop/jquery.Jcrop.min.css</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpincludesjsjcropjqueryJcropcss"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/js/jcrop/jquery.Jcrop.css (21632 => 21633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jcrop/jquery.Jcrop.css        2012-08-27 23:27:14 UTC (rev 21632)
+++ trunk/wp-includes/js/jcrop/jquery.Jcrop.css        2012-08-27 23:37:03 UTC (rev 21633)
</span><span class="lines">@@ -1,35 +1,86 @@
</span><del>-/* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */
-.jcrop-holder { text-align: left; }
</del><ins>+/* jquery.Jcrop.css v0.9.10 - MIT License */
</ins><span class="cx"> 
</span><del>-.jcrop-vline, .jcrop-hline
</del><ins>+/*
+  The outer-most container in a typical Jcrop instance
+  If you are having difficulty with formatting related to styles
+  on a parent element, place any fixes here or in a like selector
+
+  You can also style this element if you want to add a border, etc
+  A better method for styling can be seen below with .jcrop-light
+  (Add a class to the holder and style elements for that extended class)
+*/
+.jcrop-holder {
+  direction: ltr;
+  text-align: left;
+}
+
+/* These styles define the border lines */
+.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;}
+.jcrop-vline{height:100%;width:1px!important;}
+.jcrop-hline{height:1px!important;width:100%;}
+.jcrop-vline.right{right:0;}
+.jcrop-hline.bottom{bottom:0;}
+
+/* Handle style - size is set by Jcrop handleSize option (currently) */
+.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;}
+
+/* This style is used for invisible click targets */
+.jcrop-tracker
</ins><span class="cx"> {
</span><del>-        font-size: 0;
-        position: absolute;
-        background: white url('Jcrop.gif') top left repeat;
</del><ins>+  height: 100%; 
+  width: 100%;
+  -webkit-tap-highlight-color: transparent; /* &quot;turn off&quot; link highlight */
+  -webkit-touch-callout: none;              /* disable callout, image save panel */
+  -webkit-user-select: none;                /* disable cut copy paste */
</ins><span class="cx"> }
</span><del>-.jcrop-vline { height: 100%; width: 1px !important; }
-.jcrop-hline { width: 100%; height: 1px !important; }
-.jcrop-handle {
-        font-size: 1px;
-        width: 7px !important;
-        height: 7px !important;
-        border: 1px #eee solid;
-        background-color: #333;
-        *width: 9px;
-        *height: 9px;
-}
</del><span class="cx"> 
</span><del>-.jcrop-tracker { width: 100%; height: 100%; }
</del><ins>+/* Positioning of handles and drag bars */
+.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;}
+.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;}
+.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;}
+.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;}
+.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;}
+.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;}
+.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;}
+.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;}
+.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;}
+.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;}
+.jcrop-dragbar.ord-n{margin-top:-4px;}
+.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;}
+.jcrop-dragbar.ord-e{margin-right:-4px;right:0;}
+.jcrop-dragbar.ord-w{margin-left:-4px;}
</ins><span class="cx"> 
</span><del>-.custom .jcrop-vline,
-.custom .jcrop-hline
</del><ins>+/* The &quot;jcrop-light&quot; class/extension */
+.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline
</ins><span class="cx"> {
</span><del>-        background: yellow;
</del><ins>+        background:#FFF;
+        filter:Alpha(opacity=70)!important;
+        opacity:.70!important;
</ins><span class="cx"> }
</span><del>-.custom .jcrop-handle
</del><ins>+.jcrop-light .jcrop-handle
</ins><span class="cx"> {
</span><del>-        border-color: black;
-        background-color: #C7BB00;
-        -moz-border-radius: 3px;
-        -webkit-border-radius: 3px;
</del><ins>+        -moz-border-radius:3px;
+        -webkit-border-radius:3px;
+        background-color:#000;
+        border-color:#FFF;
+        border-radius:3px;
</ins><span class="cx"> }
</span><ins>+
+/* The &quot;jcrop-dark&quot; class/extension */
+.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline
+{
+        background:#000;
+        filter:Alpha(opacity=70)!important;
+        opacity:.7!important;
+}
+.jcrop-dark .jcrop-handle
+{
+        -moz-border-radius:3px;
+        -webkit-border-radius:3px;
+        background-color:#FFF;
+        border-color:#000;
+        border-radius:3px;
+}
+
+/* Fix for twitter bootstrap et al. */
+.jcrop-holder img,img.jcrop-preview{ max-width: none; }
</ins></span></pre></div>
<a id="trunkwpincludesjsjcropjqueryJcropjs"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/js/jcrop/jquery.Jcrop.js (21632 => 21633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jcrop/jquery.Jcrop.js        2012-08-27 23:27:14 UTC (rev 21632)
+++ trunk/wp-includes/js/jcrop/jquery.Jcrop.js        2012-08-27 23:37:03 UTC (rev 21633)
</span><span class="lines">@@ -1,8 +1,9 @@
</span><span class="cx"> /**
</span><del>- * jquery.Jcrop.js v0.9.8
- * jQuery Image Cropping Plugin
- * @author Kelly Hallman &lt;khallman@gmail.com&gt;
- * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{
</del><ins>+ * jquery.Jcrop.js v0.9.10
+ * jQuery Image Cropping Plugin - released under MIT License 
+ * Author: Kelly Hallman &lt;khallman@gmail.com&gt;
+ * http://github.com/tapmodo/Jcrop
+ * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{
</ins><span class="cx">  *
</span><span class="cx">  * Permission is hereby granted, free of charge, to any person
</span><span class="cx">  * obtaining a copy of this software and associated documentation
</span><span class="lines">@@ -12,10 +13,10 @@
</span><span class="cx">  * copies of the Software, and to permit persons to whom the
</span><span class="cx">  * Software is furnished to do so, subject to the following
</span><span class="cx">  * conditions:
</span><del>-
</del><ins>+ *
</ins><span class="cx">  * The above copyright notice and this permission notice shall be
</span><span class="cx">  * included in all copies or substantial portions of the Software.
</span><del>-
</del><ins>+ *
</ins><span class="cx">  * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,
</span><span class="cx">  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
</span><span class="cx">  * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
</span><span class="lines">@@ -24,1174 +25,1671 @@
</span><span class="cx">  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
</span><span class="cx">  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
</span><span class="cx">  * OTHER DEALINGS IN THE SOFTWARE.
</span><del>-
</del><ins>+ *
</ins><span class="cx">  * }}}
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-(function($) {
</del><ins>+(function ($) {
</ins><span class="cx"> 
</span><del>-$.Jcrop = function(obj,opt)
-{
-        // Initialization {{{
</del><ins>+  $.Jcrop = function (obj, opt) {
+    var options = $.extend({}, $.Jcrop.defaults),
+        docOffset, lastcurs, ie6mode = false;
</ins><span class="cx"> 
</span><del>-        // Sanitize some options {{{
-        var obj = obj, opt = opt;
</del><ins>+    // Internal Methods {{{
+    function px(n) {
+      return n + 'px';
+    }
+    function cssClass(cl) {
+      return options.baseClass + '-' + cl;
+    }
+    function supportsColorFade() {
+      return $.fx.step.hasOwnProperty('backgroundColor');
+    }
+    function getPos(obj) //{{{
+    {
+      var pos = $(obj).offset();
+      return [pos.left, pos.top];
+    }
+    //}}}
+    function mouseAbs(e) //{{{
+    {
+      return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])];
+    }
+    //}}}
+    function setOptions(opt) //{{{
+    {
+      if (typeof(opt) !== 'object') opt = {};
+      options = $.extend(options, opt);
</ins><span class="cx"> 
</span><del>-        if (typeof(obj) !== 'object') obj = $(obj)[0];
-        if (typeof(opt) !== 'object') opt = { };
</del><ins>+      $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) {
+        if (typeof(options[e]) !== 'function') options[e] = function () {};
+      });
+    }
+    //}}}
+    function startDragMode(mode, pos) //{{{
+    {
+      docOffset = getPos($img);
+      Tracker.setCursor(mode === 'move' ? mode : mode + '-resize');
</ins><span class="cx"> 
</span><del>-        // Some on-the-fly fixes for MSIE...sigh
-        if (!('trackDocument' in opt))
-        {
-                opt.trackDocument = $.browser.msie ? false : true;
-                if ($.browser.msie &amp;&amp; $.browser.version.split('.')[0] == '8')
-                        opt.trackDocument = true;
-        }
</del><ins>+      if (mode === 'move') {
+        return Tracker.activateHandlers(createMover(pos), doneSelect);
+      }
</ins><span class="cx"> 
</span><del>-        if (!('keySupport' in opt))
-                        opt.keySupport = $.browser.msie ? false : true;
-                
-        // }}}
-        // Extend the default options {{{
-        var defaults = {
</del><ins>+      var fc = Coords.getFixed();
+      var opp = oppLockCorner(mode);
+      var opc = Coords.getCorner(oppLockCorner(opp));
</ins><span class="cx"> 
</span><del>-                // Basic Settings
-                trackDocument:                false,
-                baseClass:                        'jcrop',
-                addClass:                        null,
</del><ins>+      Coords.setPressed(Coords.getCorner(opp));
+      Coords.setCurrent(opc);
</ins><span class="cx"> 
</span><del>-                // Styling Options
-                bgColor:                        'black',
-                bgOpacity:                        .6,
-                borderOpacity:                .4,
-                handleOpacity:                .5,
</del><ins>+      Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect);
+    }
+    //}}}
+    function dragmodeHandler(mode, f) //{{{
+    {
+      return function (pos) {
+        if (!options.aspectRatio) {
+          switch (mode) {
+          case 'e':
+            pos[1] = f.y2;
+            break;
+          case 'w':
+            pos[1] = f.y2;
+            break;
+          case 'n':
+            pos[0] = f.x2;
+            break;
+          case 's':
+            pos[0] = f.x2;
+            break;
+          }
+        } else {
+          switch (mode) {
+          case 'e':
+            pos[1] = f.y + 1;
+            break;
+          case 'w':
+            pos[1] = f.y + 1;
+            break;
+          case 'n':
+            pos[0] = f.x + 1;
+            break;
+          case 's':
+            pos[0] = f.x + 1;
+            break;
+          }
+        }
+        Coords.setCurrent(pos);
+        Selection.update();
+      };
+    }
+    //}}}
+    function createMover(pos) //{{{
+    {
+      var lloc = pos;
+      KeyManager.watchKeys();
</ins><span class="cx"> 
</span><del>-                handlePad:                        5,
-                handleSize:                        9,
-                handleOffset:                5,
-                edgeMargin:                        14,
</del><ins>+      return function (pos) {
+        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
+        lloc = pos;
</ins><span class="cx"> 
</span><del>-                aspectRatio:                0,
-                keySupport:                        true,
-                cornerHandles:                true,
-                sideHandles:                true,
-                drawBorders:                true,
-                dragEdges:                        true,
</del><ins>+        Selection.update();
+      };
+    }
+    //}}}
+    function oppLockCorner(ord) //{{{
+    {
+      switch (ord) {
+      case 'n':
+        return 'sw';
+      case 's':
+        return 'nw';
+      case 'e':
+        return 'nw';
+      case 'w':
+        return 'ne';
+      case 'ne':
+        return 'sw';
+      case 'nw':
+        return 'se';
+      case 'se':
+        return 'nw';
+      case 'sw':
+        return 'ne';
+      }
+    }
+    //}}}
+    function createDragger(ord) //{{{
+    {
+      return function (e) {
+        if (options.disabled) {
+          return false;
+        }
+        if ((ord === 'move') &amp;&amp; !options.allowMove) {
+          return false;
+        }
+        
+        // Fix position of crop area when dragged the very first time.
+        // Necessary when crop image is in a hidden element when page is loaded.
+        docOffset = getPos($img);
</ins><span class="cx"> 
</span><del>-                boxWidth:                        0,
-                boxHeight:                        0,
</del><ins>+        btndown = true;
+        startDragMode(ord, mouseAbs(e));
+        e.stopPropagation();
+        e.preventDefault();
+        return false;
+      };
+    }
+    //}}}
+    function presize($obj, w, h) //{{{
+    {
+      var nw = $obj.width(),
+          nh = $obj.height();
+      if ((nw &gt; w) &amp;&amp; w &gt; 0) {
+        nw = w;
+        nh = (w / $obj.width()) * $obj.height();
+      }
+      if ((nh &gt; h) &amp;&amp; h &gt; 0) {
+        nh = h;
+        nw = (h / $obj.height()) * $obj.width();
+      }
+      xscale = $obj.width() / nw;
+      yscale = $obj.height() / nh;
+      $obj.width(nw).height(nh);
+    }
+    //}}}
+    function unscale(c) //{{{
+    {
+      return {
+        x: c.x * xscale,
+        y: c.y * yscale,
+        x2: c.x2 * xscale,
+        y2: c.y2 * yscale,
+        w: c.w * xscale,
+        h: c.h * yscale
+      };
+    }
+    //}}}
+    function doneSelect(pos) //{{{
+    {
+      var c = Coords.getFixed();
+      if ((c.w &gt; options.minSelect[0]) &amp;&amp; (c.h &gt; options.minSelect[1])) {
+        Selection.enableHandles();
+        Selection.done();
+      } else {
+        Selection.release();
+      }
+      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');
+    }
+    //}}}
+    function newSelection(e) //{{{
+    {
+      if (options.disabled) {
+        return false;
+      }
+      if (!options.allowSelect) {
+        return false;
+      }
+      btndown = true;
+      docOffset = getPos($img);
+      Selection.disableHandles();
+      Tracker.setCursor('crosshair');
+      var pos = mouseAbs(e);
+      Coords.setPressed(pos);
+      Selection.update();
+      Tracker.activateHandlers(selectDrag, doneSelect);
+      KeyManager.watchKeys();
</ins><span class="cx"> 
</span><del>-                boundary:                        8,
-                animationDelay:                20,
-                swingSpeed:                        3,
</del><ins>+      e.stopPropagation();
+      e.preventDefault();
+      return false;
+    }
+    //}}}
+    function selectDrag(pos) //{{{
+    {
+      Coords.setCurrent(pos);
+      Selection.update();
+    }
+    //}}}
+    function newTracker() //{{{
+    {
+      var trk = $('&lt;div&gt;&lt;/div&gt;').addClass(cssClass('tracker'));
+      if ($.browser.msie) {
+        trk.css({
+          opacity: 0,
+          backgroundColor: 'white'
+        });
+      }
+      return trk;
+    }
+    //}}}
</ins><span class="cx"> 
</span><del>-                allowSelect:                true,
-                allowMove:                        true,
-                allowResize:                true,
</del><ins>+    // }}}
+    // Initialization {{{
+    // Sanitize some options {{{
+    if ($.browser.msie &amp;&amp; ($.browser.version.split('.')[0] === '6')) {
+      ie6mode = true;
+    }
+    if (typeof(obj) !== 'object') {
+      obj = $(obj)[0];
+    }
+    if (typeof(opt) !== 'object') {
+      opt = {};
+    }
+    // }}}
+    setOptions(opt);
+    // Initialize some jQuery objects {{{
+    // The values are SET on the image(s) for the interface
+    // If the original image has any of these set, they will be reset
+    // However, if you destroy() the Jcrop instance the original image's
+    // character in the DOM will be as you left it.
+    var img_css = {
+      border: 'none',
+      visibility: 'visible',
+      margin: 0,
+      padding: 0,
+      position: 'absolute',
+      top: 0,
+      left: 0
+    };
</ins><span class="cx"> 
</span><del>-                minSelect:                        [ 0, 0 ],
-                maxSize:                        [ 0, 0 ],
-                minSize:                        [ 0, 0 ],
</del><ins>+    var $origimg = $(obj),
+      img_mode = true;
</ins><span class="cx"> 
</span><del>-                // Callbacks / Event Handlers
-                onChange: function() { },
-                onSelect: function() { }
</del><ins>+    if (obj.tagName == 'IMG') {
+      // Fix size of crop image.
+      // Necessary when crop image is within a hidden element when page is loaded.
+      if ($origimg[0].width != 0 &amp;&amp; $origimg[0].height != 0) {
+        // Obtain dimensions from contained img element.
+        $origimg.width($origimg[0].width);
+        $origimg.height($origimg[0].height);
+      } else {
+        // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). 
+        var tempImage = new Image();
+        tempImage.src = $origimg[0].src;
+        $origimg.width(tempImage.width);
+        $origimg.height(tempImage.height);
+      } 
</ins><span class="cx"> 
</span><del>-        };
-        var options = defaults;
-        setOptions(opt);
</del><ins>+      var $img = $origimg.clone().removeAttr('id').css(img_css).show();
</ins><span class="cx"> 
</span><del>-        // }}}
-        // Initialize some jQuery objects {{{
</del><ins>+      $img.width($origimg.width());
+      $img.height($origimg.height());
+      $origimg.after($img).hide();
</ins><span class="cx"> 
</span><del>-        var $origimg = $(obj);
-        var $img = $origimg.clone().removeAttr('id').css({ position: 'absolute' });
</del><ins>+    } else {
+      $img = $origimg.css(img_css).show();
+      img_mode = false;
+      if (options.shade === null) { options.shade = true; }
+    }
</ins><span class="cx"> 
</span><del>-        $img.width($origimg.width());
-        $img.height($origimg.height());
-        $origimg.after($img).hide();
</del><ins>+    presize($img, options.boxWidth, options.boxHeight);
</ins><span class="cx"> 
</span><del>-        presize($img,options.boxWidth,options.boxHeight);
</del><ins>+    var boundx = $img.width(),
+        boundy = $img.height(),
+        
+        
+        $div = $('&lt;div /&gt;').width(boundx).height(boundy).addClass(cssClass('holder')).css({
+        position: 'relative',
+        backgroundColor: options.bgColor
+      }).insertAfter($origimg).append($img);
</ins><span class="cx"> 
</span><del>-        var boundx = $img.width(),
-                boundy = $img.height(),
</del><ins>+    if (options.addClass) {
+      $div.addClass(options.addClass);
+    }
</ins><span class="cx"> 
</span><del>-                $div = $('&lt;div /&gt;')
-                        .width(boundx).height(boundy)
-                        .addClass(cssClass('holder'))
-                        .css({
-                                position: 'relative',
-                                backgroundColor: options.bgColor
-                        }).insertAfter($origimg).append($img);
-        
-        
-        if (options.addClass) $div.addClass(options.addClass);
-        //$img.wrap($div);
</del><ins>+    var $img2 = $('&lt;div /&gt;'),
</ins><span class="cx"> 
</span><del>-        var $img2 = $('&lt;img /&gt;')/*{{{*/
-                        .attr('src',$img.attr('src'))
-                        .css('position','absolute')
-                        .width(boundx).height(boundy)
-        /*}}}*/
-        var $img_holder = $('&lt;div /&gt;')/*{{{*/
-                .width(pct(100)).height(pct(100))
-                .css({
-                        zIndex: 310,
-                        position: 'absolute',
-                        overflow: 'hidden'
-                })
-                .append($img2)
-        /*}}}*/
-        var $hdl_holder = $('&lt;div /&gt;')/*{{{*/
-                .width(pct(100)).height(pct(100))
-                .css('zIndex',320);
-        /*}}}*/
-        var $sel = $('&lt;div /&gt;')/*{{{*/
-                .css({
-                        position: 'absolute',
-                        zIndex: 300
-                })
-                .insertBefore($img)
-                .append($img_holder,$hdl_holder)
-        /*}}}*/
</del><ins>+        $img_holder = $('&lt;div /&gt;') 
+        .width('100%').height('100%').css({
+          zIndex: 310,
+          position: 'absolute',
+          overflow: 'hidden'
+        }),
</ins><span class="cx"> 
</span><del>-        var bound = options.boundary;
-        var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2))
-                .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 })
-                .mousedown(newSelection);        
-        
-        /* }}} */
-        // Set more variables {{{
</del><ins>+        $hdl_holder = $('&lt;div /&gt;') 
+        .width('100%').height('100%').css('zIndex', 320), 
</ins><span class="cx"> 
</span><del>-        var xlimit, ylimit, xmin, ymin;
-        var xscale, yscale, enabled = true;
-        var docOffset = getPos($img),
-                // Internal states
-                btndown, lastcurs, dimmed, animating,
-                shift_down;
</del><ins>+        $sel = $('&lt;div /&gt;') 
+        .css({
+          position: 'absolute',
+          zIndex: 600
+        }).dblclick(function(){
+          var c = Coords.getFixed();
+          options.onDblClick.call(api,c);
+        }).insertBefore($img).append($img_holder, $hdl_holder); 
</ins><span class="cx"> 
</span><del>-        // }}}
-                
</del><ins>+    if (img_mode) {
</ins><span class="cx"> 
</span><del>-                // }}}
-        // Internal Modules {{{
</del><ins>+      $img2 = $('&lt;img /&gt;')
+          .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy),
</ins><span class="cx"> 
</span><del>-        var Coords = function()/*{{{*/
-        {
-                var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy;
</del><ins>+      $img_holder.append($img2);
</ins><span class="cx"> 
</span><del>-                function setPressed(pos)/*{{{*/
-                {
-                        var pos = rebound(pos);
-                        x2 = x1 = pos[0];
-                        y2 = y1 = pos[1];
-                };
-                /*}}}*/
-                function setCurrent(pos)/*{{{*/
-                {
-                        var pos = rebound(pos);
-                        ox = pos[0] - x2;
-                        oy = pos[1] - y2;
-                        x2 = pos[0];
-                        y2 = pos[1];
-                };
-                /*}}}*/
-                function getOffset()/*{{{*/
-                {
-                        return [ ox, oy ];
-                };
-                /*}}}*/
-                function moveOffset(offset)/*{{{*/
-                {
-                        var ox = offset[0], oy = offset[1];
</del><ins>+    }
</ins><span class="cx"> 
</span><del>-                        if (0 &gt; x1 + ox) ox -= ox + x1;
-                        if (0 &gt; y1 + oy) oy -= oy + y1;
</del><ins>+    if (ie6mode) {
+      $sel.css({
+        overflowY: 'hidden'
+      });
+    }
</ins><span class="cx"> 
</span><del>-                        if (boundy &lt; y2 + oy) oy += boundy - (y2 + oy);
-                        if (boundx &lt; x2 + ox) ox += boundx - (x2 + ox);
</del><ins>+    var bound = options.boundary;
+    var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({
+      position: 'absolute',
+      top: px(-bound),
+      left: px(-bound),
+      zIndex: 290
+    }).mousedown(newSelection);
</ins><span class="cx"> 
</span><del>-                        x1 += ox;
-                        x2 += ox;
-                        y1 += oy;
-                        y2 += oy;
-                };
-                /*}}}*/
-                function getCorner(ord)/*{{{*/
-                {
-                        var c = getFixed();
-                        switch(ord)
-                        {
-                                case 'ne': return [ c.x2, c.y ];
-                                case 'nw': return [ c.x, c.y ];
-                                case 'se': return [ c.x2, c.y2 ];
-                                case 'sw': return [ c.x, c.y2 ];
-                        }
-                };
-                /*}}}*/
-                function getFixed()/*{{{*/
-                {
-                        if (!options.aspectRatio) return getRect();
-                        // This function could use some optimization I think...
-                        var aspect = options.aspectRatio,
-                                min_x = options.minSize[0]/xscale, 
-                                min_y = options.minSize[1]/yscale,
-                                max_x = options.maxSize[0]/xscale, 
-                                max_y = options.maxSize[1]/yscale,
-                                rw = x2 - x1,
-                                rh = y2 - y1,
-                                rwa = Math.abs(rw),
-                                rha = Math.abs(rh),
-                                real_ratio = rwa / rha,
-                                xx, yy
-                        
-                        if (max_x == 0) { max_x = boundx * 10 }
-                        if (max_y == 0) { max_y = boundy * 10 }
-                        if (real_ratio &lt; aspect)
-                        {
-                                yy = y2;
-                                w = rha * aspect;
-                                xx = rw &lt; 0 ? x1 - w : w + x1;
</del><ins>+    /* }}} */
+    // Set more variables {{{
+    var bgcolor = options.bgColor,
+        bgopacity = options.bgOpacity,
+        xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true,
+        btndown, animating, shift_down;
</ins><span class="cx"> 
</span><del>-                                if (xx &lt; 0)
-                                {
-                                        xx = 0;
-                                        h = Math.abs((xx - x1) / aspect);
-                                        yy = rh &lt; 0 ? y1 - h: h + y1;
-                                }
-                                else if (xx &gt; boundx)
-                                {
-                                        xx = boundx;
-                                        h = Math.abs((xx - x1) / aspect);
-                                        yy = rh &lt; 0 ? y1 - h : h + y1;
-                                }
-                        }
-                        else
-                        {
-                                xx = x2;
-                                h = rwa / aspect;
-                                yy = rh &lt; 0 ? y1 - h : y1 + h;
-                                if (yy &lt; 0)
-                                {
-                                        yy = 0;
-                                        w = Math.abs((yy - y1) * aspect);
-                                        xx = rw &lt; 0 ? x1 - w : w + x1;
-                                }
-                                else if (yy &gt; boundy)
-                                {
-                                        yy = boundy;
-                                        w = Math.abs(yy - y1) * aspect;
-                                        xx = rw &lt; 0 ? x1 - w : w + x1;
-                                }
-                        }
</del><ins>+    docOffset = getPos($img);
+    // }}}
+    // }}}
+    // Internal Modules {{{
+    // Touch Module {{{ 
+    var Touch = (function () {
+      // Touch support detection function adapted (under MIT License)
+      // from code by Jeffrey Sambells - http://github.com/iamamused/
+      function hasTouchSupport() {
+        var support = {},
+            events = ['touchstart', 'touchmove', 'touchend'],
+            el = document.createElement('div'), i;
</ins><span class="cx"> 
</span><del>-                        // Magic %-)
-                        if(xx &gt; x1) { // right side
-                          if(xx - x1 &lt; min_x) {
-                                xx = x1 + min_x;
-                          } else if (xx - x1 &gt; max_x) {
-                                xx = x1 + max_x;
-                          }
-                          if(yy &gt; y1) {
-                                yy = y1 + (xx - x1)/aspect;
-                          } else {
-                                yy = y1 - (xx - x1)/aspect;
-                          }
-                        } else if (xx &lt; x1) { // left side
-                          if(x1 - xx &lt; min_x) {
-                                xx = x1 - min_x
-                          } else if (x1 - xx &gt; max_x) {
-                                xx = x1 - max_x;
-                          }
-                          if(yy &gt; y1) {
-                                yy = y1 + (x1 - xx)/aspect;
-                          } else {
-                                yy = y1 - (x1 - xx)/aspect;
-                          }
-                        }
</del><ins>+        try {
+          for(i=0; i&lt;events.length; i++) {
+            var eventName = events[i];
+            eventName = 'on' + eventName;
+            var isSupported = (eventName in el);
+            if (!isSupported) {
+              el.setAttribute(eventName, 'return;');
+              isSupported = typeof el[eventName] == 'function';
+            }
+            support[events[i]] = isSupported;
+          }
+          return support.touchstart &amp;&amp; support.touchend &amp;&amp; support.touchmove;
+        }
+        catch(err) {
+          return false;
+        }
+      }
</ins><span class="cx"> 
</span><del>-                        if(xx &lt; 0) {
-                                x1 -= xx;
-                                xx = 0;
-                        } else  if (xx &gt; boundx) {
-                                x1 -= xx - boundx;
-                                xx = boundx;
-                        }
</del><ins>+      function detectSupport() {
+        if ((options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport;
+          else return hasTouchSupport();
+      }
+      return {
+        createDragger: function (ord) {
+          return function (e) {
+            e.pageX = e.originalEvent.changedTouches[0].pageX;
+            e.pageY = e.originalEvent.changedTouches[0].pageY;
+            if (options.disabled) {
+              return false;
+            }
+            if ((ord === 'move') &amp;&amp; !options.allowMove) {
+              return false;
+            }
+            btndown = true;
+            startDragMode(ord, mouseAbs(e));
+            e.stopPropagation();
+            e.preventDefault();
+            return false;
+          };
+        },
+        newSelection: function (e) {
+          e.pageX = e.originalEvent.changedTouches[0].pageX;
+          e.pageY = e.originalEvent.changedTouches[0].pageY;
+          return newSelection(e);
+        },
+        isSupported: hasTouchSupport,
+        support: detectSupport()
+      };
+    }());
+    // }}}
+    // Coords Module {{{
+    var Coords = (function () {
+      var x1 = 0,
+          y1 = 0,
+          x2 = 0,
+          y2 = 0,
+          ox, oy;
</ins><span class="cx"> 
</span><del>-                        if(yy &lt; 0) {
-                                y1 -= yy;
-                                yy = 0;
-                        } else  if (yy &gt; boundy) {
-                                y1 -= yy - boundy;
-                                yy = boundy;
-                        }
</del><ins>+      function setPressed(pos) //{{{
+      {
+        pos = rebound(pos);
+        x2 = x1 = pos[0];
+        y2 = y1 = pos[1];
+      }
+      //}}}
+      function setCurrent(pos) //{{{
+      {
+        pos = rebound(pos);
+        ox = pos[0] - x2;
+        oy = pos[1] - y2;
+        x2 = pos[0];
+        y2 = pos[1];
+      }
+      //}}}
+      function getOffset() //{{{
+      {
+        return [ox, oy];
+      }
+      //}}}
+      function moveOffset(offset) //{{{
+      {
+        var ox = offset[0],
+            oy = offset[1];
</ins><span class="cx"> 
</span><del>-                        return last = makeObj(flipCoords(x1,y1,xx,yy));
-                };
-                /*}}}*/
-                function rebound(p)/*{{{*/
-                {
-                        if (p[0] &lt; 0) p[0] = 0;
-                        if (p[1] &lt; 0) p[1] = 0;
</del><ins>+        if (0 &gt; x1 + ox) {
+          ox -= ox + x1;
+        }
+        if (0 &gt; y1 + oy) {
+          oy -= oy + y1;
+        }
</ins><span class="cx"> 
</span><del>-                        if (p[0] &gt; boundx) p[0] = boundx;
-                        if (p[1] &gt; boundy) p[1] = boundy;
</del><ins>+        if (boundy &lt; y2 + oy) {
+          oy += boundy - (y2 + oy);
+        }
+        if (boundx &lt; x2 + ox) {
+          ox += boundx - (x2 + ox);
+        }
</ins><span class="cx"> 
</span><del>-                        return [ p[0], p[1] ];
-                };
-                /*}}}*/
-                function flipCoords(x1,y1,x2,y2)/*{{{*/
-                {
-                        var xa = x1, xb = x2, ya = y1, yb = y2;
-                        if (x2 &lt; x1)
-                        {
-                                xa = x2;
-                                xb = x1;
-                        }
-                        if (y2 &lt; y1)
-                        {
-                                ya = y2;
-                                yb = y1;
-                        }
-                        return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ];
-                };
-                /*}}}*/
-                function getRect()/*{{{*/
-                {
-                        var xsize = x2 - x1;
-                        var ysize = y2 - y1;
</del><ins>+        x1 += ox;
+        x2 += ox;
+        y1 += oy;
+        y2 += oy;
+      }
+      //}}}
+      function getCorner(ord) //{{{
+      {
+        var c = getFixed();
+        switch (ord) {
+        case 'ne':
+          return [c.x2, c.y];
+        case 'nw':
+          return [c.x, c.y];
+        case 'se':
+          return [c.x2, c.y2];
+        case 'sw':
+          return [c.x, c.y2];
+        }
+      }
+      //}}}
+      function getFixed() //{{{
+      {
+        if (!options.aspectRatio) {
+          return getRect();
+        }
+        // This function could use some optimization I think...
+        var aspect = options.aspectRatio,
+            min_x = options.minSize[0] / xscale,
+            
+            
+            //min_y = options.minSize[1]/yscale,
+            max_x = options.maxSize[0] / xscale,
+            max_y = options.maxSize[1] / yscale,
+            rw = x2 - x1,
+            rh = y2 - y1,
+            rwa = Math.abs(rw),
+            rha = Math.abs(rh),
+            real_ratio = rwa / rha,
+            xx, yy, w, h;
</ins><span class="cx"> 
</span><del>-                        if (xlimit &amp;&amp; (Math.abs(xsize) &gt; xlimit))
-                                x2 = (xsize &gt; 0) ? (x1 + xlimit) : (x1 - xlimit);
-                        if (ylimit &amp;&amp; (Math.abs(ysize) &gt; ylimit))
-                                y2 = (ysize &gt; 0) ? (y1 + ylimit) : (y1 - ylimit);
</del><ins>+        if (max_x === 0) {
+          max_x = boundx * 10;
+        }
+        if (max_y === 0) {
+          max_y = boundy * 10;
+        }
+        if (real_ratio &lt; aspect) {
+          yy = y2;
+          w = rha * aspect;
+          xx = rw &lt; 0 ? x1 - w : w + x1;
</ins><span class="cx"> 
</span><del>-                        if (ymin &amp;&amp; (Math.abs(ysize) &lt; ymin))
-                                y2 = (ysize &gt; 0) ? (y1 + ymin) : (y1 - ymin);
-                        if (xmin &amp;&amp; (Math.abs(xsize) &lt; xmin))
-                                x2 = (xsize &gt; 0) ? (x1 + xmin) : (x1 - xmin);
</del><ins>+          if (xx &lt; 0) {
+            xx = 0;
+            h = Math.abs((xx - x1) / aspect);
+            yy = rh &lt; 0 ? y1 - h : h + y1;
+          } else if (xx &gt; boundx) {
+            xx = boundx;
+            h = Math.abs((xx - x1) / aspect);
+            yy = rh &lt; 0 ? y1 - h : h + y1;
+          }
+        } else {
+          xx = x2;
+          h = rwa / aspect;
+          yy = rh &lt; 0 ? y1 - h : y1 + h;
+          if (yy &lt; 0) {
+            yy = 0;
+            w = Math.abs((yy - y1) * aspect);
+            xx = rw &lt; 0 ? x1 - w : w + x1;
+          } else if (yy &gt; boundy) {
+            yy = boundy;
+            w = Math.abs(yy - y1) * aspect;
+            xx = rw &lt; 0 ? x1 - w : w + x1;
+          }
+        }
</ins><span class="cx"> 
</span><del>-                        if (x1 &lt; 0) { x2 -= x1; x1 -= x1; }
-                        if (y1 &lt; 0) { y2 -= y1; y1 -= y1; }
-                        if (x2 &lt; 0) { x1 -= x2; x2 -= x2; }
-                        if (y2 &lt; 0) { y1 -= y2; y2 -= y2; }
-                        if (x2 &gt; boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; }
-                        if (y2 &gt; boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; }
-                        if (x1 &gt; boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; }
-                        if (y1 &gt; boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; }
</del><ins>+        // Magic %-)
+        if (xx &gt; x1) { // right side
+          if (xx - x1 &lt; min_x) {
+            xx = x1 + min_x;
+          } else if (xx - x1 &gt; max_x) {
+            xx = x1 + max_x;
+          }
+          if (yy &gt; y1) {
+            yy = y1 + (xx - x1) / aspect;
+          } else {
+            yy = y1 - (xx - x1) / aspect;
+          }
+        } else if (xx &lt; x1) { // left side
+          if (x1 - xx &lt; min_x) {
+            xx = x1 - min_x;
+          } else if (x1 - xx &gt; max_x) {
+            xx = x1 - max_x;
+          }
+          if (yy &gt; y1) {
+            yy = y1 + (x1 - xx) / aspect;
+          } else {
+            yy = y1 - (x1 - xx) / aspect;
+          }
+        }
</ins><span class="cx"> 
</span><del>-                        return makeObj(flipCoords(x1,y1,x2,y2));
-                };
-                /*}}}*/
-                function makeObj(a)/*{{{*/
-                {
-                        return { x: a[0], y: a[1], x2: a[2], y2: a[3],
-                                w: a[2] - a[0], h: a[3] - a[1] };
-                };
-                /*}}}*/
</del><ins>+        if (xx &lt; 0) {
+          x1 -= xx;
+          xx = 0;
+        } else if (xx &gt; boundx) {
+          x1 -= xx - boundx;
+          xx = boundx;
+        }
</ins><span class="cx"> 
</span><del>-                return {
-                        flipCoords: flipCoords,
-                        setPressed: setPressed,
-                        setCurrent: setCurrent,
-                        getOffset: getOffset,
-                        moveOffset: moveOffset,
-                        getCorner: getCorner,
-                        getFixed: getFixed
-                };
-        }();
</del><ins>+        if (yy &lt; 0) {
+          y1 -= yy;
+          yy = 0;
+        } else if (yy &gt; boundy) {
+          y1 -= yy - boundy;
+          yy = boundy;
+        }
</ins><span class="cx"> 
</span><del>-        /*}}}*/
-        var Selection = function()/*{{{*/
-        {
-                var start, end, dragmode, awake, hdep = 370;
-                var borders = { };
-                var handle = { };
-                var seehandles = false;
-                var hhs = options.handleOffset;
</del><ins>+        return makeObj(flipCoords(x1, y1, xx, yy));
+      }
+      //}}}
+      function rebound(p) //{{{
+      {
+        if (p[0] &lt; 0) {
+          p[0] = 0;
+        }
+        if (p[1] &lt; 0) {
+          p[1] = 0;
+        }
</ins><span class="cx"> 
</span><del>-                /* Insert draggable elements {{{*/
</del><ins>+        if (p[0] &gt; boundx) {
+          p[0] = boundx;
+        }
+        if (p[1] &gt; boundy) {
+          p[1] = boundy;
+        }
</ins><span class="cx"> 
</span><del>-                // Insert border divs for outline
-                if (options.drawBorders) {
-                        borders = {
-                                        top: insertBorder('hline')
-                                                .css('top',$.browser.msie?px(-1):px(0)),
-                                        bottom: insertBorder('hline'),
-                                        left: insertBorder('vline'),
-                                        right: insertBorder('vline')
-                        };
-                }
</del><ins>+        return [p[0], p[1]];
+      }
+      //}}}
+      function flipCoords(x1, y1, x2, y2) //{{{
+      {
+        var xa = x1,
+            xb = x2,
+            ya = y1,
+            yb = y2;
+        if (x2 &lt; x1) {
+          xa = x2;
+          xb = x1;
+        }
+        if (y2 &lt; y1) {
+          ya = y2;
+          yb = y1;
+        }
+        return [xa, ya, xb, yb];
+      }
+      //}}}
+      function getRect() //{{{
+      {
+        var xsize = x2 - x1,
+            ysize = y2 - y1,
+            delta;
</ins><span class="cx"> 
</span><del>-                // Insert handles on edges
-                if (options.dragEdges) {
-                        handle.t = insertDragbar('n');
-                        handle.b = insertDragbar('s');
-                        handle.r = insertDragbar('e');
-                        handle.l = insertDragbar('w');
-                }
</del><ins>+        if (xlimit &amp;&amp; (Math.abs(xsize) &gt; xlimit)) {
+          x2 = (xsize &gt; 0) ? (x1 + xlimit) : (x1 - xlimit);
+        }
+        if (ylimit &amp;&amp; (Math.abs(ysize) &gt; ylimit)) {
+          y2 = (ysize &gt; 0) ? (y1 + ylimit) : (y1 - ylimit);
+        }
</ins><span class="cx"> 
</span><del>-                // Insert side handles
-                options.sideHandles &amp;&amp;
-                        createHandles(['n','s','e','w']);
</del><ins>+        if (ymin / yscale &amp;&amp; (Math.abs(ysize) &lt; ymin / yscale)) {
+          y2 = (ysize &gt; 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale);
+        }
+        if (xmin / xscale &amp;&amp; (Math.abs(xsize) &lt; xmin / xscale)) {
+          x2 = (xsize &gt; 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale);
+        }
</ins><span class="cx"> 
</span><del>-                // Insert corner handles
-                options.cornerHandles &amp;&amp;
-                        createHandles(['sw','nw','ne','se']);
</del><ins>+        if (x1 &lt; 0) {
+          x2 -= x1;
+          x1 -= x1;
+        }
+        if (y1 &lt; 0) {
+          y2 -= y1;
+          y1 -= y1;
+        }
+        if (x2 &lt; 0) {
+          x1 -= x2;
+          x2 -= x2;
+        }
+        if (y2 &lt; 0) {
+          y1 -= y2;
+          y2 -= y2;
+        }
+        if (x2 &gt; boundx) {
+          delta = x2 - boundx;
+          x1 -= delta;
+          x2 -= delta;
+        }
+        if (y2 &gt; boundy) {
+          delta = y2 - boundy;
+          y1 -= delta;
+          y2 -= delta;
+        }
+        if (x1 &gt; boundx) {
+          delta = x1 - boundy;
+          y2 -= delta;
+          y1 -= delta;
+        }
+        if (y1 &gt; boundy) {
+          delta = y1 - boundy;
+          y2 -= delta;
+          y1 -= delta;
+        }
</ins><span class="cx"> 
</span><del>-                /*}}}*/
-                // Private Methods
-                function insertBorder(type)/*{{{*/
-                {
-                        var jq = $('&lt;div /&gt;')
-                                .css({position: 'absolute', opacity: options.borderOpacity })
-                                .addClass(cssClass(type));
-                        $img_holder.append(jq);
-                        return jq;
-                };
-                /*}}}*/
-                function dragDiv(ord,zi)/*{{{*/
-                {
-                        var jq = $('&lt;div /&gt;')
-                                .mousedown(createDragger(ord))
-                                .css({
-                                        cursor: ord+'-resize',
-                                        position: 'absolute',
-                                        zIndex: zi 
-                                })
-                        
-                        $hdl_holder.append(jq);
-                        return jq;
-                };
-                /*}}}*/
-                function insertHandle(ord)/*{{{*/
-                {
-                        return dragDiv(ord,hdep++)
-                                .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity })
-                                .addClass(cssClass('handle'));
-                };
-                /*}}}*/
-                function insertDragbar(ord)/*{{{*/
-                {
-                        var s = options.handleSize,
-                                o = hhs,
-                                h = s, w = s,
-                                t = o, l = o;
</del><ins>+        return makeObj(flipCoords(x1, y1, x2, y2));
+      }
+      //}}}
+      function makeObj(a) //{{{
+      {
+        return {
+          x: a[0],
+          y: a[1],
+          x2: a[2],
+          y2: a[3],
+          w: a[2] - a[0],
+          h: a[3] - a[1]
+        };
+      }
+      //}}}
</ins><span class="cx"> 
</span><del>-                        switch(ord)
-                        {
-                                case 'n': case 's': w = pct(100); break;
-                                case 'e': case 'w': h = pct(100); break;
-                        }
</del><ins>+      return {
+        flipCoords: flipCoords,
+        setPressed: setPressed,
+        setCurrent: setCurrent,
+        getOffset: getOffset,
+        moveOffset: moveOffset,
+        getCorner: getCorner,
+        getFixed: getFixed
+      };
+    }());
</ins><span class="cx"> 
</span><del>-                        return dragDiv(ord,hdep++).width(w).height(h)
-                                .css({ top: px(-t+1), left: px(-l+1)});
-                };
-                /*}}}*/
-                function createHandles(li)/*{{{*/
-                {
-                        for(i in li) handle[li[i]] = insertHandle(li[i]);
-                };
-                /*}}}*/
-                function moveHandles(c)/*{{{*/
-                {
-                        var midvert  = Math.round((c.h / 2) - hhs),
-                                midhoriz = Math.round((c.w / 2) - hhs),
-                                north = west = -hhs+1,
-                                east = c.w - hhs,
-                                south = c.h - hhs,
-                                x, y;
</del><ins>+    //}}}
+    // Shade Module {{{
+    var Shade = (function() {
+      var enabled = false,
+          holder = $('&lt;div /&gt;').css({
+            position: 'absolute',
+            zIndex: 240,
+            opacity: 0
+          }),
+          shades = {
+            top: createShade(),
+            left: createShade().height(boundy),
+            right: createShade().height(boundy),
+            bottom: createShade()
+          };
</ins><span class="cx"> 
</span><del>-                        'e' in handle &amp;&amp;
-                                handle.e.css({ top: px(midvert), left: px(east) }) &amp;&amp;
-                                handle.w.css({ top: px(midvert) }) &amp;&amp;
-                                handle.s.css({ top: px(south), left: px(midhoriz) }) &amp;&amp;
-                                handle.n.css({ left: px(midhoriz) });
</del><ins>+      function resizeShades(w,h) {
+        shades.left.css({ height: px(h) });
+        shades.right.css({ height: px(h) });
+      }
+      function updateAuto()
+      {
+        return updateShade(Coords.getFixed());
+      }
+      function updateShade(c)
+      {
+        shades.top.css({
+          left: px(c.x),
+          width: px(c.w),
+          height: px(c.y)
+        });
+        shades.bottom.css({
+          top: px(c.y2),
+          left: px(c.x),
+          width: px(c.w),
+          height: px(boundy-c.y2)
+        });
+        shades.right.css({
+          left: px(c.x2),
+          width: px(boundx-c.x2)
+        });
+        shades.left.css({
+          width: px(c.x)
+        });
+      }
+      function createShade() {
+        return $('&lt;div /&gt;').css({
+          position: 'absolute',
+          backgroundColor: options.shadeColor||options.bgColor
+        }).appendTo(holder);
+      }
+      function enableShade() {
+        if (!enabled) {
+          enabled = true;
+          holder.insertBefore($img);
+          updateAuto();
+          Selection.setBgOpacity(1,0,1);
+          $img2.hide();
</ins><span class="cx"> 
</span><del>-                        'ne' in handle &amp;&amp;
-                                handle.ne.css({ left: px(east) }) &amp;&amp;
-                                handle.se.css({ top: px(south), left: px(east) }) &amp;&amp;
-                                handle.sw.css({ top: px(south) });
</del><ins>+          setBgColor(options.shadeColor||options.bgColor,1);
+          if (Selection.isAwake())
+          {
+            setOpacity(options.bgOpacity,1);
+          }
+            else setOpacity(1,1);
+        }
+      }
+      function setBgColor(color,now) {
+        colorChangeMacro(getShades(),color,now);
+      }
+      function disableShade() {
+        if (enabled) {
+          holder.remove();
+          $img2.show();
+          enabled = false;
+          if (Selection.isAwake()) {
+            Selection.setBgOpacity(options.bgOpacity,1,1);
+          } else {
+            Selection.setBgOpacity(1,1,1);
+            Selection.disableHandles();
+          }
+          colorChangeMacro($div,0,1);
+        }
+      }
+      function setOpacity(opacity,now) {
+        if (enabled) {
+          if (options.bgFade &amp;&amp; !now) {
+            holder.animate({
+              opacity: 1-opacity
+            },{
+              queue: false,
+              duration: options.fadeTime
+            });
+          }
+          else holder.css({opacity:1-opacity});
+        }
+      }
+      function refreshAll() {
+        options.shade ? enableShade() : disableShade();
+        if (Selection.isAwake()) setOpacity(options.bgOpacity);
+      }
+      function getShades() {
+        return holder.children();
+      }
</ins><span class="cx"> 
</span><del>-                        'b' in handle &amp;&amp;
-                                handle.b.css({ top: px(south) }) &amp;&amp;
-                                handle.r.css({ left: px(east) });
-                };
-                /*}}}*/
-                function moveto(x,y)/*{{{*/
-                {
-                        $img2.css({ top: px(-y), left: px(-x) });
-                        $sel.css({ top: px(y), left: px(x) });
-                };
-                /*}}}*/
-                function resize(w,h)/*{{{*/
-                {
-                        $sel.width(w).height(h);
-                };
-                /*}}}*/
-                function refresh()/*{{{*/
-                {
-                        var c = Coords.getFixed();
</del><ins>+      return {
+        update: updateAuto,
+        updateRaw: updateShade,
+        getShades: getShades,
+        setBgColor: setBgColor,
+        enable: enableShade,
+        disable: disableShade,
+        resize: resizeShades,
+        refresh: refreshAll,
+        opacity: setOpacity
+      };
+    }());
+    // }}}
+    // Selection Module {{{
+    var Selection = (function () {
+      var awake,
+          hdep = 370,
+          borders = {},
+          handle = {},
+          dragbar = {},
+          seehandles = false;
</ins><span class="cx"> 
</span><del>-                        Coords.setPressed([c.x,c.y]);
-                        Coords.setCurrent([c.x2,c.y2]);
</del><ins>+      // Private Methods
+      function insertBorder(type) //{{{
+      {
+        var jq = $('&lt;div /&gt;').css({
+          position: 'absolute',
+          opacity: options.borderOpacity
+        }).addClass(cssClass(type));
+        $img_holder.append(jq);
+        return jq;
+      }
+      //}}}
+      function dragDiv(ord, zi) //{{{
+      {
+        var jq = $('&lt;div /&gt;').mousedown(createDragger(ord)).css({
+          cursor: ord + '-resize',
+          position: 'absolute',
+          zIndex: zi
+        }).addClass('ord-'+ord);
</ins><span class="cx"> 
</span><del>-                        updateVisible();
-                };
-                /*}}}*/
</del><ins>+        if (Touch.support) {
+          jq.bind('touchstart.jcrop', Touch.createDragger(ord));
+        }
</ins><span class="cx"> 
</span><del>-                // Internal Methods
-                function updateVisible()/*{{{*/
-                        { if (awake) return update(); };
-                /*}}}*/
-                function update()/*{{{*/
-                {
-                        var c = Coords.getFixed();
</del><ins>+        $hdl_holder.append(jq);
+        return jq;
+      }
+      //}}}
+      function insertHandle(ord) //{{{
+      {
+        var hs = options.handleSize;
+        return dragDiv(ord, hdep++).css({
+          opacity: options.handleOpacity
+        }).width(hs).height(hs).addClass(cssClass('handle'));
+      }
+      //}}}
+      function insertDragbar(ord) //{{{
+      {
+        return dragDiv(ord, hdep++).addClass('jcrop-dragbar');
+      }
+      //}}}
+      function createDragbars(li) //{{{
+      {
+        var i;
+        for (i = 0; i &lt; li.length; i++) {
+          dragbar[li[i]] = insertDragbar(li[i]);
+        }
+      }
+      //}}}
+      function createBorders(li) //{{{
+      {
+        var cl,i;
+        for (i = 0; i &lt; li.length; i++) {
+          switch(li[i]){
+            case'n': cl='hline'; break;
+            case's': cl='hline bottom'; break;
+            case'e': cl='vline right'; break;
+            case'w': cl='vline'; break;
+          }
+          borders[li[i]] = insertBorder(cl);
+        }
+      }
+      //}}}
+      function createHandles(li) //{{{
+      {
+        var i;
+        for (i = 0; i &lt; li.length; i++) {
+          handle[li[i]] = insertHandle(li[i]);
+        }
+      }
+      //}}}
+      function moveto(x, y) //{{{
+      {
+        if (!options.shade) {
+          $img2.css({
+            top: px(-y),
+            left: px(-x)
+          });
+        }
+        $sel.css({
+          top: px(y),
+          left: px(x)
+        });
+      }
+      //}}}
+      function resize(w, h) //{{{
+      {
+        $sel.width(w).height(h);
+      }
+      //}}}
+      function refresh() //{{{
+      {
+        var c = Coords.getFixed();
</ins><span class="cx"> 
</span><del>-                        resize(c.w,c.h);
-                        moveto(c.x,c.y);
</del><ins>+        Coords.setPressed([c.x, c.y]);
+        Coords.setCurrent([c.x2, c.y2]);
</ins><span class="cx"> 
</span><del>-                        options.drawBorders &amp;&amp;
-                                borders['right'].css({ left: px(c.w-1) }) &amp;&amp;
-                                        borders['bottom'].css({ top: px(c.h-1) });
</del><ins>+        updateVisible();
+      }
+      //}}}
</ins><span class="cx"> 
</span><del>-                        seehandles &amp;&amp; moveHandles(c);
-                        awake || show();
</del><ins>+      // Internal Methods
+      function updateVisible(select) //{{{
+      {
+        if (awake) {
+          return update(select);
+        }
+      }
+      //}}}
+      function update(select) //{{{
+      {
+        var c = Coords.getFixed();
</ins><span class="cx"> 
</span><del>-                        options.onChange(unscale(c));
-                };
-                /*}}}*/
-                function show()/*{{{*/
-                {
-                        $sel.show();
-                        $img.css('opacity',options.bgOpacity);
-                        awake = true;
-                };
-                /*}}}*/
-                function release()/*{{{*/
-                {
-                        disableHandles();
-                        $sel.hide();
-                        $img.css('opacity',1);
-                        awake = false;
-                };
-                /*}}}*/
-                function showHandles()//{{{
-                {
-                        if (seehandles)
-                        {
-                                moveHandles(Coords.getFixed());
-                                $hdl_holder.show();
-                        }
-                };
-                //}}}
-                function enableHandles()/*{{{*/
-                { 
-                        seehandles = true;
-                        if (options.allowResize)
-                        {
-                                moveHandles(Coords.getFixed());
-                                $hdl_holder.show();
-                                return true;
-                        }
-                };
-                /*}}}*/
-                function disableHandles()/*{{{*/
-                {
-                        seehandles = false;
-                        $hdl_holder.hide();
-                };
-                /*}}}*/
-                function animMode(v)/*{{{*/
-                {
-                        (animating = v) ? disableHandles(): enableHandles();
-                };
-                /*}}}*/
-                function done()/*{{{*/
-                {
-                        animMode(false);
-                        refresh();
-                };
-                /*}}}*/
</del><ins>+        resize(c.w, c.h);
+        moveto(c.x, c.y);
+        if (options.shade) Shade.updateRaw(c);
</ins><span class="cx"> 
</span><del>-                var $track = newTracker().mousedown(createDragger('move'))
-                                .css({ cursor: 'move', position: 'absolute', zIndex: 360 })
</del><ins>+        awake || show();
</ins><span class="cx"> 
</span><del>-                $img_holder.append($track);
-                disableHandles();
</del><ins>+        if (select) {
+          options.onSelect.call(api, unscale(c));
+        } else {
+          options.onChange.call(api, unscale(c));
+        }
+      }
+      //}}}
+      function setBgOpacity(opacity,force,now) //{{{
+      {
+        if (!awake &amp;&amp; !force) return;
+        if (options.bgFade &amp;&amp; !now) {
+          $img.animate({
+            opacity: opacity
+          },{
+            queue: false,
+            duration: options.fadeTime
+          });
+        } else {
+          $img.css('opacity', opacity);
+        }
+      }
+      //}}}
+      function show() //{{{
+      {
+        $sel.show();
</ins><span class="cx"> 
</span><del>-                return {
-                        updateVisible: updateVisible,
-                        update: update,
-                        release: release,
-                        refresh: refresh,
-                        setCursor: function (cursor) { $track.css('cursor',cursor); },
-                        enableHandles: enableHandles,
-                        enableOnly: function() { seehandles = true; },
-                        showHandles: showHandles,
-                        disableHandles: disableHandles,
-                        animMode: animMode,
-                        done: done
-                };
-        }();
-        /*}}}*/
-        var Tracker = function()/*{{{*/
-        {
-                var onMove                = function() { },
-                        onDone                = function() { },
-                        trackDoc        = options.trackDocument;
</del><ins>+        if (options.shade) Shade.opacity(bgopacity);
+          else setBgOpacity(bgopacity,true);
</ins><span class="cx"> 
</span><del>-                if (!trackDoc)
-                {
-                        $trk
-                                .mousemove(trackMove)
-                                .mouseup(trackUp)
-                                .mouseout(trackUp)
-                        
-                }
</del><ins>+        awake = true;
+      }
+      //}}}
+      function release() //{{{
+      {
+        disableHandles();
+        $sel.hide();
</ins><span class="cx"> 
</span><del>-                function toFront()/*{{{*/
-                {
-                        $trk.css({zIndex:450});
-                        if (trackDoc)
-                        {
-                                $(document)
-                                        .mousemove(trackMove)
-                                        .mouseup(trackUp)
-                                
-                        }
-                }
-                /*}}}*/
-                function toBack()/*{{{*/
-                {
-                        $trk.css({zIndex:290});
-                        if (trackDoc)
-                        {
-                                $(document)
-                                        .unbind('mousemove',trackMove)
-                                        .unbind('mouseup',trackUp)
-                                
-                        }
-                }
-                /*}}}*/
-                function trackMove(e)/*{{{*/
-                {
-                        onMove(mouseAbs(e));
-                };
-                /*}}}*/
-                function trackUp(e)/*{{{*/
-                {
-                        e.preventDefault();
-                        e.stopPropagation();
</del><ins>+        if (options.shade) Shade.opacity(1);
+          else setBgOpacity(1);
</ins><span class="cx"> 
</span><del>-                        if (btndown)
-                        {
-                                btndown = false;
</del><ins>+        awake = false;
+        options.onRelease.call(api);
+      }
+      //}}}
+      function showHandles() //{{{
+      {
+        if (seehandles) {
+          $hdl_holder.show();
+        }
+      }
+      //}}}
+      function enableHandles() //{{{
+      {
+        seehandles = true;
+        if (options.allowResize) {
+          $hdl_holder.show();
+          return true;
+        }
+      }
+      //}}}
+      function disableHandles() //{{{
+      {
+        seehandles = false;
+        $hdl_holder.hide();
+      } 
+      //}}}
+      function animMode(v) //{{{
+      {
+        if (animating === v) {
+          disableHandles();
+        } else {
+          enableHandles();
+        }
+      } 
+      //}}}
+      function done() //{{{
+      {
+        animMode(false);
+        refresh();
+      } 
+      //}}}
+      // Insert draggable elements {{{
+      // Insert border divs for outline
</ins><span class="cx"> 
</span><del>-                                onDone(mouseAbs(e));
-                                options.onSelect(unscale(Coords.getFixed()));
-                                toBack();
-                                onMove = function() { };
-                                onDone = function() { };
-                        }
</del><ins>+      if (options.dragEdges &amp;&amp; $.isArray(options.createDragbars))
+        createDragbars(options.createDragbars);
</ins><span class="cx"> 
</span><del>-                        return false;
-                };
-                /*}}}*/
</del><ins>+      if ($.isArray(options.createHandles))
+        createHandles(options.createHandles);
</ins><span class="cx"> 
</span><del>-                function activateHandlers(move,done)/* {{{ */
-                {
-                        btndown = true;
-                        onMove = move;
-                        onDone = done;
-                        toFront();
-                        return false;
-                };
-                /* }}} */
</del><ins>+      if (options.drawBorders &amp;&amp; $.isArray(options.createBorders))
+        createBorders(options.createBorders);
</ins><span class="cx"> 
</span><del>-                function setCursor(t) { $trk.css('cursor',t); };
</del><ins>+      //}}}
</ins><span class="cx"> 
</span><del>-                $img.before($trk);
-                return {
-                        activateHandlers: activateHandlers,
-                        setCursor: setCursor
-                };
-        }();
-        /*}}}*/
-        var KeyManager = function()/*{{{*/
-        {
-                var $keymgr = $('&lt;input type=&quot;radio&quot; /&gt;')
-                                .css({ position: 'absolute', left: '-30px' })
-                                .keypress(parseKey)
-                                .blur(onBlur),
</del><ins>+      // This is a hack for iOS5 to support drag/move touch functionality
+      $(document).bind('touchstart.jcrop-ios',function(e) {
+        if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation();
+      });
</ins><span class="cx"> 
</span><del>-                        $keywrap = $('&lt;div /&gt;')
-                                .css({
-                                        position: 'absolute',
-                                        overflow: 'hidden'
-                                })
-                                .append($keymgr)
-                
</del><ins>+      var $track = newTracker().mousedown(createDragger('move')).css({
+        cursor: 'move',
+        position: 'absolute',
+        zIndex: 360
+      });
</ins><span class="cx"> 
</span><del>-                function watchKeys()/*{{{*/
-                {
-                        if (options.keySupport)
-                        {
-                                $keymgr.show();
-                                $keymgr.focus();
-                        }
-                };
-                /*}}}*/
-                function onBlur(e)/*{{{*/
-                {
-                        $keymgr.hide();
-                };
-                /*}}}*/
-                function doNudge(e,x,y)/*{{{*/
-                {
-                        if (options.allowMove) {
-                                Coords.moveOffset([x,y]);
-                                Selection.updateVisible();
-                        };
-                        e.preventDefault();
-                        e.stopPropagation();
-                };
-                /*}}}*/
-                function parseKey(e)/*{{{*/
-                {
-                        if (e.ctrlKey) return true;
-                        shift_down = e.shiftKey ? true : false;
-                        var nudge = shift_down ? 10 : 1;
-                        switch(e.keyCode)
-                        {
-                                case 37: doNudge(e,-nudge,0); break;
-                                case 39: doNudge(e,nudge,0); break;
-                                case 38: doNudge(e,0,-nudge); break;
-                                case 40: doNudge(e,0,nudge); break;
</del><ins>+      if (Touch.support) {
+        $track.bind('touchstart.jcrop', Touch.createDragger('move'));
+      }
</ins><span class="cx"> 
</span><del>-                                case 27: Selection.release(); break;
</del><ins>+      $img_holder.append($track);
+      disableHandles();
</ins><span class="cx"> 
</span><del>-                                case 9: return true;
-                        }
</del><ins>+      return {
+        updateVisible: updateVisible,
+        update: update,
+        release: release,
+        refresh: refresh,
+        isAwake: function () {
+          return awake;
+        },
+        setCursor: function (cursor) {
+          $track.css('cursor', cursor);
+        },
+        enableHandles: enableHandles,
+        enableOnly: function () {
+          seehandles = true;
+        },
+        showHandles: showHandles,
+        disableHandles: disableHandles,
+        animMode: animMode,
+        setBgOpacity: setBgOpacity,
+        done: done
+      };
+    }());
+    
+    //}}}
+    // Tracker Module {{{
+    var Tracker = (function () {
+      var onMove = function () {},
+          onDone = function () {},
+          trackDoc = options.trackDocument;
</ins><span class="cx"> 
</span><del>-                        return nothing(e);
-                };
-                /*}}}*/
-                
-                if (options.keySupport) $keywrap.insertBefore($img);
-                return {
-                        watchKeys: watchKeys
-                };
-        }();
-        /*}}}*/
</del><ins>+      function toFront() //{{{
+      {
+        $trk.css({
+          zIndex: 450
+        });
+        if (Touch.support) {
+          $(document)
+            .bind('touchmove.jcrop', trackTouchMove)
+            .bind('touchend.jcrop', trackTouchEnd);
+        }
+        if (trackDoc) {
+          $(document)
+            .bind('mousemove.jcrop',trackMove)
+            .bind('mouseup.jcrop',trackUp);
+        }
+      } 
+      //}}}
+      function toBack() //{{{
+      {
+        $trk.css({
+          zIndex: 290
+        });
+        $(document).unbind('.jcrop');
+      } 
+      //}}}
+      function trackMove(e) //{{{
+      {
+        onMove(mouseAbs(e));
+        return false;
+      } 
+      //}}}
+      function trackUp(e) //{{{
+      {
+        e.preventDefault();
+        e.stopPropagation();
</ins><span class="cx"> 
</span><del>-        // }}}
-        // Internal Methods {{{
</del><ins>+        if (btndown) {
+          btndown = false;
</ins><span class="cx"> 
</span><del>-        function px(n) { return '' + parseInt(n) + 'px'; };
-        function pct(n) { return '' + parseInt(n) + '%'; };
-        function cssClass(cl) { return options.baseClass + '-' + cl; };
-        function getPos(obj)/*{{{*/
-        {
-                // Updated in v0.9.4 to use built-in dimensions plugin
-                var pos = $(obj).offset();
-                return [ pos.left, pos.top ];
-        };
-        /*}}}*/
-        function mouseAbs(e)/*{{{*/
-        {
-                return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ];
-        };
-        /*}}}*/
-        function myCursor(type)/*{{{*/
-        {
-                if (type != lastcurs)
-                {
-                        Tracker.setCursor(type);
-                        //Handles.xsetCursor(type);
-                        lastcurs = type;
-                }
-        };
-        /*}}}*/
-        function startDragMode(mode,pos)/*{{{*/
-        {
-                docOffset = getPos($img);
-                Tracker.setCursor(mode=='move'?mode:mode+'-resize');
</del><ins>+          onDone(mouseAbs(e));
</ins><span class="cx"> 
</span><del>-                if (mode == 'move')
-                        return Tracker.activateHandlers(createMover(pos), doneSelect);
</del><ins>+          if (Selection.isAwake()) {
+            options.onSelect.call(api, unscale(Coords.getFixed()));
+          }
</ins><span class="cx"> 
</span><del>-                var fc = Coords.getFixed();
-                var opp = oppLockCorner(mode);
-                var opc = Coords.getCorner(oppLockCorner(opp));
</del><ins>+          toBack();
+          onMove = function () {};
+          onDone = function () {};
+        }
</ins><span class="cx"> 
</span><del>-                Coords.setPressed(Coords.getCorner(opp));
-                Coords.setCurrent(opc);
</del><ins>+        return false;
+      }
+      //}}}
+      function activateHandlers(move, done) //{{{
+      {
+        btndown = true;
+        onMove = move;
+        onDone = done;
+        toFront();
+        return false;
+      }
+      //}}}
+      function trackTouchMove(e) //{{{
+      {
+        e.pageX = e.originalEvent.changedTouches[0].pageX;
+        e.pageY = e.originalEvent.changedTouches[0].pageY;
+        return trackMove(e);
+      }
+      //}}}
+      function trackTouchEnd(e) //{{{
+      {
+        e.pageX = e.originalEvent.changedTouches[0].pageX;
+        e.pageY = e.originalEvent.changedTouches[0].pageY;
+        return trackUp(e);
+      }
+      //}}}
+      function setCursor(t) //{{{
+      {
+        $trk.css('cursor', t);
+      }
+      //}}}
</ins><span class="cx"> 
</span><del>-                Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);
-        };
-        /*}}}*/
-        function dragmodeHandler(mode,f)/*{{{*/
-        {
-                return function(pos) {
-                        if (!options.aspectRatio) switch(mode)
-                        {
-                                case 'e': pos[1] = f.y2; break;
-                                case 'w': pos[1] = f.y2; break;
-                                case 'n': pos[0] = f.x2; break;
-                                case 's': pos[0] = f.x2; break;
-                        }
-                        else switch(mode)
-                        {
-                                case 'e': pos[1] = f.y+1; break;
-                                case 'w': pos[1] = f.y+1; break;
-                                case 'n': pos[0] = f.x+1; break;
-                                case 's': pos[0] = f.x+1; break;
-                        }
-                        Coords.setCurrent(pos);
-                        Selection.update();
-                };
-        };
-        /*}}}*/
-        function createMover(pos)/*{{{*/
-        {
-                var lloc = pos;
-                KeyManager.watchKeys();
</del><ins>+      if (!trackDoc) {
+        $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp);
+      }
</ins><span class="cx"> 
</span><del>-                return function(pos)
-                {
-                        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
-                        lloc = pos;
-                        
-                        Selection.update();
-                };
-        };
-        /*}}}*/
-        function oppLockCorner(ord)/*{{{*/
-        {
-                switch(ord)
-                {
-                        case 'n': return 'sw';
-                        case 's': return 'nw';
-                        case 'e': return 'nw';
-                        case 'w': return 'ne';
-                        case 'ne': return 'sw';
-                        case 'nw': return 'se';
-                        case 'se': return 'nw';
-                        case 'sw': return 'ne';
-                };
-        };
-        /*}}}*/
-        function createDragger(ord)/*{{{*/
-        {
-                return function(e) {
-                        if (options.disabled) return false;
-                        if ((ord == 'move') &amp;&amp; !options.allowMove) return false;
-                        btndown = true;
-                        startDragMode(ord,mouseAbs(e));
-                        e.stopPropagation();
-                        e.preventDefault();
-                        return false;
-                };
-        };
-        /*}}}*/
-        function presize($obj,w,h)/*{{{*/
-        {
-                var nw = $obj.width(), nh = $obj.height();
-                if ((nw &gt; w) &amp;&amp; w &gt; 0)
-                {
-                        nw = w;
-                        nh = (w/$obj.width()) * $obj.height();
-                }
-                if ((nh &gt; h) &amp;&amp; h &gt; 0)
-                {
-                        nh = h;
-                        nw = (h/$obj.height()) * $obj.width();
-                }
-                xscale = $obj.width() / nw;
-                yscale = $obj.height() / nh;
-                $obj.width(nw).height(nh);
-        };
-        /*}}}*/
-        function unscale(c)/*{{{*/
-        {
-                return {
-                        x: parseInt(c.x * xscale), y: parseInt(c.y * yscale), 
-                        x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale), 
-                        w: parseInt(c.w * xscale), h: parseInt(c.h * yscale)
-                };
-        };
-        /*}}}*/
-        function doneSelect(pos)/*{{{*/
-        {
-                var c = Coords.getFixed();
-                if (c.w &gt; options.minSelect[0] &amp;&amp; c.h &gt; options.minSelect[1])
-                {
-                        Selection.enableHandles();
-                        Selection.done();
-                }
-                else
-                {
-                        Selection.release();
-                }
-                Tracker.setCursor( options.allowSelect?'crosshair':'default' );
-        };
-        /*}}}*/
-        function newSelection(e)/*{{{*/
-        {
-                if (options.disabled) return false;
-                if (!options.allowSelect) return false;
-                btndown = true;
-                docOffset = getPos($img);
-                Selection.disableHandles();
-                myCursor('crosshair');
-                var pos = mouseAbs(e);
-                Coords.setPressed(pos);
-                Tracker.activateHandlers(selectDrag,doneSelect);
-                KeyManager.watchKeys();
-                Selection.update();
</del><ins>+      $img.before($trk);
+      return {
+        activateHandlers: activateHandlers,
+        setCursor: setCursor
+      };
+    }());
+    //}}}
+    // KeyManager Module {{{
+    var KeyManager = (function () {
+      var $keymgr = $('&lt;input type=&quot;radio&quot; /&gt;').css({
+        position: 'fixed',
+        left: '-120px',
+        width: '12px'
+      }),
+          $keywrap = $('&lt;div /&gt;').css({
+          position: 'absolute',
+          overflow: 'hidden'
+        }).append($keymgr);
</ins><span class="cx"> 
</span><del>-                e.stopPropagation();
-                e.preventDefault();
-                return false;
-        };
-        /*}}}*/
-        function selectDrag(pos)/*{{{*/
-        {
-                Coords.setCurrent(pos);
-                Selection.update();
-        };
-        /*}}}*/
-        function newTracker()
-        {
-                var trk = $('&lt;div&gt;&lt;/div&gt;').addClass(cssClass('tracker'));
-                $.browser.msie &amp;&amp; trk.css({ opacity: 0, backgroundColor: 'white' });
-                return trk;
-        };
</del><ins>+      function watchKeys() //{{{
+      {
+        if (options.keySupport) {
+          $keymgr.show();
+          $keymgr.focus();
+        }
+      }
+      //}}}
+      function onBlur(e) //{{{
+      {
+        $keymgr.hide();
+      }
+      //}}}
+      function doNudge(e, x, y) //{{{
+      {
+        if (options.allowMove) {
+          Coords.moveOffset([x, y]);
+          Selection.updateVisible(true);
+        }
+        e.preventDefault();
+        e.stopPropagation();
+      }
+      //}}}
+      function parseKey(e) //{{{
+      {
+        if (e.ctrlKey || e.metaKey) {
+          return true;
+        }
+        shift_down = e.shiftKey ? true : false;
+        var nudge = shift_down ? 10 : 1;
</ins><span class="cx"> 
</span><del>-        // }}}
-        // API methods {{{
-                
-        function animateTo(a)/*{{{*/
-        {
-                var x1 = a[0] / xscale,
-                        y1 = a[1] / yscale,
-                        x2 = a[2] / xscale,
-                        y2 = a[3] / yscale;
</del><ins>+        switch (e.keyCode) {
+        case 37:
+          doNudge(e, -nudge, 0);
+          break;
+        case 39:
+          doNudge(e, nudge, 0);
+          break;
+        case 38:
+          doNudge(e, 0, -nudge);
+          break;
+        case 40:
+          doNudge(e, 0, nudge);
+          break;
+        case 27:
+          if (options.allowSelect) Selection.release();
+          break;
+        case 9:
+          return true;
+        }
</ins><span class="cx"> 
</span><del>-                if (animating) return;
</del><ins>+        return false;
+      }
+      //}}}
</ins><span class="cx"> 
</span><del>-                var animto = Coords.flipCoords(x1,y1,x2,y2);
-                var c = Coords.getFixed();
-                var animat = initcr = [ c.x, c.y, c.x2, c.y2 ];
-                var interv = options.animationDelay;
</del><ins>+      if (options.keySupport) {
+        $keymgr.keydown(parseKey).blur(onBlur);
+        if (ie6mode || !options.fixedSupport) {
+          $keymgr.css({
+            position: 'absolute',
+            left: '-20px'
+          });
+          $keywrap.append($keymgr).insertBefore($img);
+        } else {
+          $keymgr.insertBefore($img);
+        }
+      }
</ins><span class="cx"> 
</span><del>-                var x = animat[0];
-                var y = animat[1];
-                var x2 = animat[2];
-                var y2 = animat[3];
-                var ix1 = animto[0] - initcr[0];
-                var iy1 = animto[1] - initcr[1];
-                var ix2 = animto[2] - initcr[2];
-                var iy2 = animto[3] - initcr[3];
-                var pcent = 0;
-                var velocity = options.swingSpeed;
</del><span class="cx"> 
</span><del>-                Selection.animMode(true);
</del><ins>+      return {
+        watchKeys: watchKeys
+      };
+    }());
+    //}}}
+    // }}}
+    // API methods {{{
+    function setClass(cname) //{{{
+    {
+      $div.removeClass().addClass(cssClass('holder')).addClass(cname);
+    }
+    //}}}
+    function animateTo(a, callback) //{{{
+    {
+      var x1 = a[0] / xscale,
+          y1 = a[1] / yscale,
+          x2 = a[2] / xscale,
+          y2 = a[3] / yscale;
</ins><span class="cx"> 
</span><del>-                var animator = function()
-                {
-                        return function()
-                        {
-                                pcent += (100 - pcent) / velocity;
</del><ins>+      if (animating) {
+        return;
+      }
</ins><span class="cx"> 
</span><del>-                                animat[0] = x + ((pcent / 100) * ix1);
-                                animat[1] = y + ((pcent / 100) * iy1);
-                                animat[2] = x2 + ((pcent / 100) * ix2);
-                                animat[3] = y2 + ((pcent / 100) * iy2);
</del><ins>+      var animto = Coords.flipCoords(x1, y1, x2, y2),
+          c = Coords.getFixed(),
+          initcr = [c.x, c.y, c.x2, c.y2],
+          animat = initcr,
+          interv = options.animationDelay,
+          ix1 = animto[0] - initcr[0],
+          iy1 = animto[1] - initcr[1],
+          ix2 = animto[2] - initcr[2],
+          iy2 = animto[3] - initcr[3],
+          pcent = 0,
+          velocity = options.swingSpeed;
</ins><span class="cx"> 
</span><del>-                                if (pcent &lt; 100) animateStart();
-                                        else Selection.done();
</del><ins>+      x = animat[0];
+      y = animat[1];
+      x2 = animat[2];
+      y2 = animat[3];
</ins><span class="cx"> 
</span><del>-                                if (pcent &gt;= 99.8) pcent = 100;
</del><ins>+      Selection.animMode(true);
+      var anim_timer;
</ins><span class="cx"> 
</span><del>-                                setSelectRaw(animat);
-                        };
-                }();
</del><ins>+      function queueAnimator() {
+        window.setTimeout(animator, interv);
+      }
+      var animator = (function () {
+        return function () {
+          pcent += (100 - pcent) / velocity;
</ins><span class="cx"> 
</span><del>-                function animateStart()
-                        { window.setTimeout(animator,interv); };
</del><ins>+          animat[0] = x + ((pcent / 100) * ix1);
+          animat[1] = y + ((pcent / 100) * iy1);
+          animat[2] = x2 + ((pcent / 100) * ix2);
+          animat[3] = y2 + ((pcent / 100) * iy2);
</ins><span class="cx"> 
</span><del>-                animateStart();
-        };
-        /*}}}*/
-        function setSelect(rect)//{{{
-        {
-                setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);
-        };
-        //}}}
-        function setSelectRaw(l) /*{{{*/
-        {
-                Coords.setPressed([l[0],l[1]]);
-                Coords.setCurrent([l[2],l[3]]);
-                Selection.update();
-        };
-        /*}}}*/
-        function setOptions(opt)/*{{{*/
-        {
-                if (typeof(opt) != 'object') opt = { };
-                options = $.extend(options,opt);
</del><ins>+          if (pcent &gt;= 99.8) {
+            pcent = 100;
+          }
+          if (pcent &lt; 100) {
+            setSelectRaw(animat);
+            queueAnimator();
+          } else {
+            Selection.done();
+            if (typeof(callback) === 'function') {
+              callback.call(api);
+            }
+          }
+        };
+      }());
+      queueAnimator();
+    }
+    //}}}
+    function setSelect(rect) //{{{
+    {
+      setSelectRaw([rect[0] / xscale, rect[1] / yscale, rect[2] / xscale, rect[3] / yscale]);
+      options.onSelect.call(api, unscale(Coords.getFixed()));
+      Selection.enableHandles();
+    }
+    //}}}
+    function setSelectRaw(l) //{{{
+    {
+      Coords.setPressed([l[0], l[1]]);
+      Coords.setCurrent([l[2], l[3]]);
+      Selection.update();
+    }
+    //}}}
+    function tellSelect() //{{{
+    {
+      return unscale(Coords.getFixed());
+    }
+    //}}}
+    function tellScaled() //{{{
+    {
+      return Coords.getFixed();
+    }
+    //}}}
+    function setOptionsNew(opt) //{{{
+    {
+      setOptions(opt);
+      interfaceUpdate();
+    }
+    //}}}
+    function disableCrop() //{{{
+    {
+      options.disabled = true;
+      Selection.disableHandles();
+      Selection.setCursor('default');
+      Tracker.setCursor('default');
+    }
+    //}}}
+    function enableCrop() //{{{
+    {
+      options.disabled = false;
+      interfaceUpdate();
+    }
+    //}}}
+    function cancelCrop() //{{{
+    {
+      Selection.done();
+      Tracker.activateHandlers(null, null);
+    }
+    //}}}
+    function destroy() //{{{
+    {
+      $div.remove();
+      $origimg.show();
+      $(obj).removeData('Jcrop');
+    }
+    //}}}
+    function setImage(src, callback) //{{{
+    {
+      Selection.release();
+      disableCrop();
+      var img = new Image();
+      img.onload = function () {
+        var iw = img.width;
+        var ih = img.height;
+        var bw = options.boxWidth;
+        var bh = options.boxHeight;
+        $img.width(iw).height(ih);
+        $img.attr('src', src);
+        $img2.attr('src', src);
+        presize($img, bw, bh);
+        boundx = $img.width();
+        boundy = $img.height();
+        $img2.width(boundx).height(boundy);
+        $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2));
+        $div.width(boundx).height(boundy);
+        Shade.resize(boundx,boundy);
+        enableCrop();
</ins><span class="cx"> 
</span><del>-                if (typeof(options.onChange)!=='function')
-                        options.onChange = function() { };
</del><ins>+        if (typeof(callback) === 'function') {
+          callback.call(api);
+        }
+      };
+      img.src = src;
+    }
+    //}}}
+    function colorChangeMacro($obj,color,now) {
+      var mycolor = color || options.bgColor;
+      if (options.bgFade &amp;&amp; supportsColorFade() &amp;&amp; options.fadeTime &amp;&amp; !now) {
+        $obj.animate({
+          backgroundColor: mycolor
+        }, {
+          queue: false,
+          duration: options.fadeTime
+        });
+      } else {
+        $obj.css('backgroundColor', mycolor);
+      }
+    }
+    function interfaceUpdate(alt) //{{{
+    // This method tweaks the interface based on options object.
+    // Called when options are changed and at end of initialization.
+    {
+      if (options.allowResize) {
+        if (alt) {
+          Selection.enableOnly();
+        } else {
+          Selection.enableHandles();
+        }
+      } else {
+        Selection.disableHandles();
+      }
</ins><span class="cx"> 
</span><del>-                if (typeof(options.onSelect)!=='function')
-                        options.onSelect = function() { };
</del><ins>+      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default');
+      Selection.setCursor(options.allowMove ? 'move' : 'default');
</ins><span class="cx"> 
</span><del>-        };
-        /*}}}*/
-        function tellSelect()/*{{{*/
-        {
-                return unscale(Coords.getFixed());
-        };
-        /*}}}*/
-        function tellScaled()/*{{{*/
-        {
-                return Coords.getFixed();
-        };
-        /*}}}*/
-        function setOptionsNew(opt)/*{{{*/
-        {
-                setOptions(opt);
-                interfaceUpdate();
-        };
-        /*}}}*/
-        function disableCrop()//{{{
-        {
-                options.disabled = true;
-                Selection.disableHandles();
-                Selection.setCursor('default');
-                Tracker.setCursor('default');
-        };
-        //}}}
-        function enableCrop()//{{{
-        {
-                options.disabled = false;
-                interfaceUpdate();
-        };
-        //}}}
-        function cancelCrop()//{{{
-        {
-                Selection.done();
-                Tracker.activateHandlers(null,null);
-        };
-        //}}}
-        function destroy()//{{{
-        {
-                $div.remove();
-                $origimg.show();
-        };
-        //}}}
</del><ins>+      if (options.hasOwnProperty('trueSize')) {
+        xscale = options.trueSize[0] / boundx;
+        yscale = options.trueSize[1] / boundy;
+      }
</ins><span class="cx"> 
</span><del>-        function interfaceUpdate(alt)//{{{
-        // This method tweaks the interface based on options object.
-        // Called when options are changed and at end of initialization.
-        {
-                options.allowResize ?
-                        alt?Selection.enableOnly():Selection.enableHandles():
-                        Selection.disableHandles();
</del><ins>+      if (options.hasOwnProperty('setSelect')) {
+        setSelect(options.setSelect);
+        Selection.done();
+        delete(options.setSelect);
+      }
</ins><span class="cx"> 
</span><del>-                Tracker.setCursor( options.allowSelect? 'crosshair': 'default' );
-                Selection.setCursor( options.allowMove? 'move': 'default' );
</del><ins>+      Shade.refresh();
</ins><span class="cx"> 
</span><del>-                $div.css('backgroundColor',options.bgColor);
</del><ins>+      if (options.bgColor != bgcolor) {
+        colorChangeMacro(
+          options.shade? Shade.getShades(): $div,
+          options.shade?
+            (options.shadeColor || options.bgColor):
+            options.bgColor
+        );
+        bgcolor = options.bgColor;
+      }
</ins><span class="cx"> 
</span><del>-                if ('setSelect' in options) {
-                        setSelect(opt.setSelect);
-                        Selection.done();
-                        delete(options.setSelect);
-                }
</del><ins>+      if (bgopacity != options.bgOpacity) {
+        bgopacity = options.bgOpacity;
+        if (options.shade) Shade.refresh();
+          else Selection.setBgOpacity(bgopacity);
+      }
</ins><span class="cx"> 
</span><del>-                if ('trueSize' in options) {
-                        xscale = options.trueSize[0] / boundx;
-                        yscale = options.trueSize[1] / boundy;
-                }
</del><ins>+      xlimit = options.maxSize[0] || 0;
+      ylimit = options.maxSize[1] || 0;
+      xmin = options.minSize[0] || 0;
+      ymin = options.minSize[1] || 0;
</ins><span class="cx"> 
</span><del>-                xlimit = options.maxSize[0] || 0;
-                ylimit = options.maxSize[1] || 0;
-                xmin = options.minSize[0] || 0;
-                ymin = options.minSize[1] || 0;
</del><ins>+      if (options.hasOwnProperty('outerImage')) {
+        $img.attr('src', options.outerImage);
+        delete(options.outerImage);
+      }
</ins><span class="cx"> 
</span><del>-                if ('outerImage' in options)
-                {
-                        $img.attr('src',options.outerImage);
-                        delete(options.outerImage);
-                }
</del><ins>+      Selection.refresh();
+    }
+    //}}}
+    //}}}
</ins><span class="cx"> 
</span><del>-                Selection.refresh();
-        };
-        //}}}
</del><ins>+    if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection);
</ins><span class="cx"> 
</span><del>-        // }}}
</del><ins>+    $hdl_holder.hide();
+    interfaceUpdate(true);
</ins><span class="cx"> 
</span><del>-        $hdl_holder.hide();
-        interfaceUpdate(true);
-        
-        var api = {
-                animateTo: animateTo,
-                setSelect: setSelect,
-                setOptions: setOptionsNew,
-                tellSelect: tellSelect,
-                tellScaled: tellScaled,
</del><ins>+    var api = {
+      setImage: setImage,
+      animateTo: animateTo,
+      setSelect: setSelect,
+      setOptions: setOptionsNew,
+      tellSelect: tellSelect,
+      tellScaled: tellScaled,
+      setClass: setClass,
</ins><span class="cx"> 
</span><del>-                disable: disableCrop,
-                enable: enableCrop,
-                cancel: cancelCrop,
</del><ins>+      disable: disableCrop,
+      enable: enableCrop,
+      cancel: cancelCrop,
+      release: Selection.release,
+      destroy: destroy,
</ins><span class="cx"> 
</span><del>-                focus: KeyManager.watchKeys,
</del><ins>+      focus: KeyManager.watchKeys,
</ins><span class="cx"> 
</span><del>-                getBounds: function() { return [ boundx * xscale, boundy * yscale ]; },
-                getWidgetSize: function() { return [ boundx, boundy ]; },
</del><ins>+      getBounds: function () {
+        return [boundx * xscale, boundy * yscale];
+      },
+      getWidgetSize: function () {
+        return [boundx, boundy];
+      },
+      getScaleFactor: function () {
+        return [xscale, yscale];
+      },
+      getOptions: function() {
+        // careful: internal values are returned
+        return options;
+      },
</ins><span class="cx"> 
</span><del>-                release: Selection.release,
-                destroy: destroy
</del><ins>+      ui: {
+        holder: $div,
+        selection: $sel
+      }
+    };
</ins><span class="cx"> 
</span><del>-        };
</del><ins>+    if ($.browser.msie)
+      $div.bind('selectstart', function () { return false; });
</ins><span class="cx"> 
</span><del>-        $origimg.data('Jcrop',api);
-        return api;
-};
</del><ins>+    $origimg.data('Jcrop', api);
+    return api;
+  };
+  $.fn.Jcrop = function (options, callback) //{{{
+  {
+    var api;
+    // Iterate over each object, attach Jcrop
+    this.each(function () {
+      // If we've already attached to this object
+      if ($(this).data('Jcrop')) {
+        // The API can be requested this way (undocumented)
+        if (options === 'api') return $(this).data('Jcrop');
+        // Otherwise, we just reset the options...
+        else $(this).data('Jcrop').setOptions(options);
+      }
+      // If we haven't been attached, preload and attach
+      else {
+        if (this.tagName == 'IMG')
+          $.Jcrop.Loader(this,function(){
+            $(this).css({display:'block',visibility:'hidden'});
+            api = $.Jcrop(this, options);
+            if ($.isFunction(callback)) callback.call(api);
+          });
+        else {
+          $(this).css({display:'block',visibility:'hidden'});
+          api = $.Jcrop(this, options);
+          if ($.isFunction(callback)) callback.call(api);
+        }
+      }
+    });
</ins><span class="cx"> 
</span><del>-$.fn.Jcrop = function(options)/*{{{*/
-{
-        function attachWhenDone(from)/*{{{*/
-        {
-                var loadsrc = options.useImg || from.src;
-                var img = new Image();
-                img.onload = function() { $.Jcrop(from,options); };
-                img.src = loadsrc;
-        };
-        /*}}}*/
-        if (typeof(options) !== 'object') options = { };
</del><ins>+    // Return &quot;this&quot; so the object is chainable (jQuery-style)
+    return this;
+  };
+  //}}}
+  // $.Jcrop.Loader - basic image loader {{{
</ins><span class="cx"> 
</span><del>-        // Iterate over each object, attach Jcrop
-        this.each(function()
-        {
-                // If we've already attached to this object
-                if ($(this).data('Jcrop'))
-                {
-                        // The API can be requested this way (undocumented)
-                        if (options == 'api') return $(this).data('Jcrop');
-                        // Otherwise, we just reset the options...
-                        else $(this).data('Jcrop').setOptions(options);
-                }
-                // If we haven't been attached, preload and attach
-                else attachWhenDone(this);
-        });
</del><ins>+  $.Jcrop.Loader = function(imgobj,success,error){
+    var $img = $(imgobj), img = $img[0];
</ins><span class="cx"> 
</span><del>-        // Return &quot;this&quot; so we're chainable a la jQuery plugin-style!
-        return this;
-};
-/*}}}*/
</del><ins>+    function completeCheck(){
+      if (img.complete) {
+        $img.unbind('.jcloader');
+        if ($.isFunction(success)) success.call(img);
+      }
+      else window.setTimeout(completeCheck,50);
+    }
</ins><span class="cx"> 
</span><del>-})(jQuery);
</del><ins>+    $img
+      .bind('load.jcloader',completeCheck)
+      .bind('error.jcloader',function(e){
+        $img.unbind('.jcloader');
+        if ($.isFunction(error)) error.call(img);
+      });
+
+    if (img.complete &amp;&amp; $.isFunction(success)){
+      $img.unbind('.jcloader');
+      success.call(img);
+    }
+  };
+
+  //}}}
+  // Global Defaults {{{
+  $.Jcrop.defaults = {
+
+    // Basic Settings
+    allowSelect: true,
+    allowMove: true,
+    allowResize: true,
+
+    trackDocument: true,
+
+    // Styling Options
+    baseClass: 'jcrop',
+    addClass: null,
+    bgColor: 'black',
+    bgOpacity: 0.6,
+    bgFade: false,
+    borderOpacity: 0.4,
+    handleOpacity: 0.5,
+    handleSize: 7,
+
+    aspectRatio: 0,
+    keySupport: true,
+    createHandles: ['n','s','e','w','nw','ne','se','sw'],
+    createDragbars: ['n','s','e','w'],
+    createBorders: ['n','s','e','w'],
+    drawBorders: true,
+    dragEdges: true,
+    fixedSupport: true,
+    touchSupport: null,
+
+    shade: null,
+
+    boxWidth: 0,
+    boxHeight: 0,
+    boundary: 2,
+    fadeTime: 400,
+    animationDelay: 20,
+    swingSpeed: 3,
+
+    minSelect: [0, 0],
+    maxSize: [0, 0],
+    minSize: [0, 0],
+
+    // Callbacks / Event Handlers
+    onChange: function () {},
+    onSelect: function () {},
+    onDblClick: function () {},
+    onRelease: function () {}
+  };
+
+  // }}}
+}(jQuery));
</ins></span></pre></div>
<a id="trunkwpincludesjsjcropjqueryJcropmincss"></a>
<div class="addfile"><h4>Added: trunk/wp-includes/js/jcrop/jquery.Jcrop.min.css (0 => 21633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jcrop/jquery.Jcrop.min.css                                (rev 0)
+++ trunk/wp-includes/js/jcrop/jquery.Jcrop.min.css        2012-08-27 23:37:03 UTC (rev 21633)
</span><span class="lines">@@ -0,0 +1,28 @@
</span><ins>+/* jquery.Jcrop.min.css v0.9.10 (build:20120429) */
+.jcrop-holder{direction:ltr;text-align:left;}
+.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;}
+.jcrop-vline{height:100%;width:1px!important;}
+.jcrop-hline{height:1px!important;width:100%;}
+.jcrop-vline.right{right:0;}
+.jcrop-hline.bottom{bottom:0;}
+.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;}
+.jcrop-tracker{-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none;-webkit-user-select:none;height:100%;width:100%;}
+.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;}
+.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;}
+.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;}
+.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;}
+.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;}
+.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;}
+.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;}
+.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;}
+.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;}
+.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;}
+.jcrop-dragbar.ord-n{margin-top:-4px;}
+.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;}
+.jcrop-dragbar.ord-e{margin-right:-4px;right:0;}
+.jcrop-dragbar.ord-w{margin-left:-4px;}
+.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline{background:#FFF;filter:Alpha(opacity=70)!important;opacity:.70!important;}
+.jcrop-light .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#000;border-color:#FFF;border-radius:3px;}
+.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline{background:#000;filter:Alpha(opacity=70)!important;opacity:.7!important;}
+.jcrop-dark .jcrop-handle{-moz-border-radius:3px;-webkit-border-radius:3px;background-color:#FFF;border-color:#000;border-radius:3px;}
+.jcrop-holder img,img.jcrop-preview{max-width:none;}
</ins><span class="cx">Property changes on: trunk/wp-includes/js/jcrop/jquery.Jcrop.min.css
</span><span class="cx">___________________________________________________________________
</span></span></pre></div>
<a id="svnexecutable"></a>
<div class="addfile"><h4>Added: svn:executable</h4></div>
<a id="trunkwpincludesjsjcropjqueryJcropminjs"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/js/jcrop/jquery.Jcrop.min.js (21632 => 21633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/js/jcrop/jquery.Jcrop.min.js        2012-08-27 23:27:14 UTC (rev 21632)
+++ trunk/wp-includes/js/jcrop/jquery.Jcrop.min.js        2012-08-27 23:37:03 UTC (rev 21633)
</span><span class="lines">@@ -1 +1,22 @@
</span><del>-(function(a){a.Jcrop=function(d,A){var d=d,A=A;if(typeof(d)!==&quot;object&quot;){d=a(d)[0]}if(typeof(A)!==&quot;object&quot;){A={}}if(!(&quot;trackDocument&quot; in A)){A.trackDocument=a.browser.msie?false:true;if(a.browser.msie&amp;&amp;a.browser.version.split(&quot;.&quot;)[0]==&quot;8&quot;){A.trackDocument=true}}if(!(&quot;keySupport&quot; in A)){A.keySupport=a.browser.msie?false:true}var U={trackDocument:false,baseClass:&quot;jcrop&quot;,addClass:null,bgColor:&quot;black&quot;,bgOpacity:0.6,borderOpacity:0.4,handleOpacity:0.5,handlePad:5,handleSize:9,handleOffset:5,edgeMargin:14,aspectRatio:0,keySupport:true,cornerHandles:true,sideHandles:true,drawBorders:true,dragEdges:true,boxWidth:0,boxHeight:0,boundary:8,animationDelay:20,swingSpeed:3,allowSelect:true,allowMove:true,allowResize:true,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){}};var H=U;z(A);var W=a(d);var al=W.clone().removeAttr(&quot;id&quot;).css({position:&q
 uot;absolute&quot;});al.width(W.width());al.height(W.height());W.after(al).hide();T(al,H.boxWidth,H.boxHeight);var Q=al.width(),O=al.height(),Z=a(&quot;&lt;div /&gt;&quot;).width(Q).height(O).addClass(C(&quot;holder&quot;)).css({position:&quot;relative&quot;,backgroundColor:H.bgColor}).insertAfter(W).append(al);if(H.addClass){Z.addClass(H.addClass)}var I=a(&quot;&lt;img /&gt;&quot;).attr(&quot;src&quot;,al.attr(&quot;src&quot;)).css(&quot;position&quot;,&quot;absolute&quot;).width(Q).height(O);var k=a(&quot;&lt;div /&gt;&quot;).width(K(100)).height(K(100)).css({zIndex:310,position:&quot;absolute&quot;,overflow:&quot;hidden&quot;}).append(I);var L=a(&quot;&lt;div /&gt;&quot;).width(K(100)).height(K(100)).css(&quot;zIndex&quot;,320);var y=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,zIndex:300}).insertBefore(al).append(k,L);var t=H.boundary;var b=ae().width(Q+(t*2)).height(O+(t*2)).css({position:&quot;absolute&quot;,top:l(-t),left:l(-t),zIndex:290}).mousedow
 n(ac);var x,ah,p,S;var M,e,n=true;var ad=D(al),r,an,am,B,ab;var aa=function(){var aq=0,aC=0,ap=0,aB=0,au,ar;function aw(aF){var aF=at(aF);ap=aq=aF[0];aB=aC=aF[1]}function av(aF){var aF=at(aF);au=aF[0]-ap;ar=aF[1]-aB;ap=aF[0];aB=aF[1]}function aE(){return[au,ar]}function ao(aH){var aG=aH[0],aF=aH[1];if(0&gt;aq+aG){aG-=aG+aq}if(0&gt;aC+aF){aF-=aF+aC}if(O&lt;aB+aF){aF+=O-(aB+aF)}if(Q&lt;ap+aG){aG+=Q-(ap+aG)}aq+=aG;ap+=aG;aC+=aF;aB+=aF}function ax(aF){var aG=aD();switch(aF){case&quot;ne&quot;:return[aG.x2,aG.y];case&quot;nw&quot;:return[aG.x,aG.y];case&quot;se&quot;:return[aG.x2,aG.y2];case&quot;sw&quot;:return[aG.x,aG.y2]}}function aD(){if(!H.aspectRatio){return aA()}var aH=H.aspectRatio,aO=H.minSize[0]/M,aN=H.minSize[1]/e,aG=H.maxSize[0]/M,aQ=H.maxSize[1]/e,aI=ap-aq,aP=aB-aC,aJ=Math.abs(aI),aK=Math.abs(aP),aL=aJ/aK,aF,aM;if(aG==0){aG=Q*10}if(aQ==0){aQ=O*10}if(aL&lt;aH){aM=aB;w=aK*aH;aF=aI&lt;0?aq-w:w+aq;if(aF&lt;0){aF=0;h=Math.abs((aF-aq)/aH);aM=aP&lt;0?aC-h:h+aC}else{if(aF&gt
 ;Q){aF=Q;h=Math.abs((aF-aq)/aH);aM=aP&lt;0?aC-h:h+aC}}}else{aF=ap;h=aJ/aH;aM=aP&lt;0?aC-h:aC+h;if(aM&lt;0){aM=0;w=Math.abs((aM-aC)*aH);aF=aI&lt;0?aq-w:w+aq}else{if(aM&gt;O){aM=O;w=Math.abs(aM-aC)*aH;aF=aI&lt;0?aq-w:w+aq}}}if(aF&gt;aq){if(aF-aq&lt;aO){aF=aq+aO}else{if(aF-aq&gt;aG){aF=aq+aG}}if(aM&gt;aC){aM=aC+(aF-aq)/aH}else{aM=aC-(aF-aq)/aH}}else{if(aF&lt;aq){if(aq-aF&lt;aO){aF=aq-aO}else{if(aq-aF&gt;aG){aF=aq-aG}}if(aM&gt;aC){aM=aC+(aq-aF)/aH}else{aM=aC-(aq-aF)/aH}}}if(aF&lt;0){aq-=aF;aF=0}else{if(aF&gt;Q){aq-=aF-Q;aF=Q}}if(aM&lt;0){aC-=aM;aM=0}else{if(aM&gt;O){aC-=aM-O;aM=O}}return last=az(ay(aq,aC,aF,aM))}function at(aF){if(aF[0]&lt;0){aF[0]=0}if(aF[1]&lt;0){aF[1]=0}if(aF[0]&gt;Q){aF[0]=Q}if(aF[1]&gt;O){aF[1]=O}return[aF[0],aF[1]]}function ay(aI,aK,aH,aJ){var aM=aI,aL=aH,aG=aK,aF=aJ;if(aH&lt;aI){aM=aH;aL=aI}if(aJ&lt;aK){aG=aJ;aF=aK}return[Math.round(aM),Math.round(aG),Math.round(aL),Math.round(aF)]}function aA(){var aG=ap-aq;var aF=aB-aC;if(x&amp;&amp;(Math.abs(aG)&gt;x))
 {ap=(aG&gt;0)?(aq+x):(aq-x)}if(ah&amp;&amp;(Math.abs(aF)&gt;ah)){aB=(aF&gt;0)?(aC+ah):(aC-ah)}if(S&amp;&amp;(Math.abs(aF)&lt;S)){aB=(aF&gt;0)?(aC+S):(aC-S)}if(p&amp;&amp;(Math.abs(aG)&lt;p)){ap=(aG&gt;0)?(aq+p):(aq-p)}if(aq&lt;0){ap-=aq;aq-=aq}if(aC&lt;0){aB-=aC;aC-=aC}if(ap&lt;0){aq-=ap;ap-=ap}if(aB&lt;0){aC-=aB;aB-=aB}if(ap&gt;Q){var aH=ap-Q;aq-=aH;ap-=aH}if(aB&gt;O){var aH=aB-O;aC-=aH;aB-=aH}if(aq&gt;Q){var aH=aq-O;aB-=aH;aC-=aH}if(aC&gt;O){var aH=aC-O;aB-=aH;aC-=aH}return az(ay(aq,aC,ap,aB))}function az(aF){return{x:aF[0],y:aF[1],x2:aF[2],y2:aF[3],w:aF[2]-aF[0],h:aF[3]-aF[1]}}return{flipCoords:ay,setPressed:aw,setCurrent:av,getOffset:aE,moveOffset:ao,getCorner:ax,getFixed:aD}}();var X=function(){var aw,ar,aC,aB,aK=370;var av={};var aO={};var aq=false;var aA=H.handleOffset;if(H.drawBorders){av={top:ax(&quot;hline&quot;).css(&quot;top&quot;,a.browser.msie?l(-1):l(0)),bottom:ax(&quot;hline&quot;),left:ax(&quot;vline&quot;),right:ax(&quot;vline&quot;)}}if(H.dragEdges){aO.t=a
 J(&quot;n&quot;);aO.b=aJ(&quot;s&quot;);aO.r=aJ(&quot;e&quot;);aO.l=aJ(&quot;w&quot;)}H.sideHandles&amp;&amp;aF([&quot;n&quot;,&quot;s&quot;,&quot;e&quot;,&quot;w&quot;]);H.cornerHandles&amp;&amp;aF([&quot;sw&quot;,&quot;nw&quot;,&quot;ne&quot;,&quot;se&quot;]);function ax(aR){var aS=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,opacity:H.borderOpacity}).addClass(C(aR));k.append(aS);return aS}function ap(aR,aS){var aT=a(&quot;&lt;div /&gt;&quot;).mousedown(c(aR)).css({cursor:aR+&quot;-resize&quot;,position:&quot;absolute&quot;,zIndex:aS});L.append(aT);return aT}function aD(aR){return ap(aR,aK++).css({top:l(-aA+1),left:l(-aA+1),opacity:H.handleOpacity}).addClass(C(&quot;handle&quot;))}function aJ(aT){var aW=H.handleSize,aX=aA,aV=aW,aS=aW,aU=aX,aR=aX;switch(aT){case&quot;n&quot;:case&quot;s&quot;:aS=K(100);break;case&quot;e&quot;:case&quot;w&quot;:aV=K(100);break}return ap(aT,aK++).width(aS).height(aV).css({top:l(-aU+1),left:l(-aR+1)})}function aF(aR){for(i i
 n aR){aO[aR[i]]=aD(aR[i])}}function aH(aY){var aT=Math.round((aY.h/2)-aA),aS=Math.round((aY.w/2)-aA),aW=west=-aA+1,aV=aY.w-aA,aU=aY.h-aA,aR,aX;&quot;e&quot; in aO&amp;&amp;aO.e.css({top:l(aT),left:l(aV)})&amp;&amp;aO.w.css({top:l(aT)})&amp;&amp;aO.s.css({top:l(aU),left:l(aS)})&amp;&amp;aO.n.css({left:l(aS)});&quot;ne&quot; in aO&amp;&amp;aO.ne.css({left:l(aV)})&amp;&amp;aO.se.css({top:l(aU),left:l(aV)})&amp;&amp;aO.sw.css({top:l(aU)});&quot;b&quot; in aO&amp;&amp;aO.b.css({top:l(aU)})&amp;&amp;aO.r.css({left:l(aV)})}function az(aR,aS){I.css({top:l(-aS),left:l(-aR)});y.css({top:l(aS),left:l(aR)})}function aQ(aR,aS){y.width(aR).height(aS)}function at(){var aR=aa.getFixed();aa.setPressed([aR.x,aR.y]);aa.setCurrent([aR.x2,aR.y2]);aN()}function aN(){if(aB){return ay()}}function ay(){var aR=aa.getFixed();aQ(aR.w,aR.h);az(aR.x,aR.y);H.drawBorders&amp;&amp;av.right.css({left:l(aR.w-1)})&amp;&amp;av.bottom.css({top:l(aR.h-1)});aq&amp;&amp;aH(aR);aB||aP();H.onChange(Y(aR))}function aP
 (){y.show();al.css(&quot;opacity&quot;,H.bgOpacity);aB=true}function aL(){aM();y.hide();al.css(&quot;opacity&quot;,1);aB=false}function ao(){if(aq){aH(aa.getFixed());L.show()}}function aG(){aq=true;if(H.allowResize){aH(aa.getFixed());L.show();return true}}function aM(){aq=false;L.hide()}function aI(aR){(B=aR)?aM():aG()}function aE(){aI(false);at()}var au=ae().mousedown(c(&quot;move&quot;)).css({cursor:&quot;move&quot;,position:&quot;absolute&quot;,zIndex:360});k.append(au);aM();return{updateVisible:aN,update:ay,release:aL,refresh:at,setCursor:function(aR){au.css(&quot;cursor&quot;,aR)},enableHandles:aG,enableOnly:function(){aq=true},showHandles:ao,disableHandles:aM,animMode:aI,done:aE}}();var P=function(){var ap=function(){},ar=function(){},aq=H.trackDocument;if(!aq){b.mousemove(ao).mouseup(at).mouseout(at)}function ax(){b.css({zIndex:450});if(aq){a(document).mousemove(ao).mouseup(at)}}function aw(){b.css({zIndex:290});if(aq){a(document).unbind(&quot;mousemove&quot;,ao).unbi
 nd(&quot;mouseup&quot;,at)}}function ao(ay){ap(F(ay))}function at(ay){ay.preventDefault();ay.stopPropagation();if(r){r=false;ar(F(ay));H.onSelect(Y(aa.getFixed()));aw();ap=function(){};ar=function(){}}return false}function au(az,ay){r=true;ap=az;ar=ay;ax();return false}function av(ay){b.css(&quot;cursor&quot;,ay)}al.before(b);return{activateHandlers:au,setCursor:av}}();var ak=function(){var ar=a('&lt;input type=&quot;radio&quot; /&gt;').css({position:&quot;absolute&quot;,left:&quot;-30px&quot;}).keypress(ao).blur(at),au=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,overflow:&quot;hidden&quot;}).append(ar);function ap(){if(H.keySupport){ar.show();ar.focus()}}function at(av){ar.hide()}function aq(aw,av,ax){if(H.allowMove){aa.moveOffset([av,ax]);X.updateVisible()}aw.preventDefault();aw.stopPropagation()}function ao(aw){if(aw.ctrlKey){return true}ab=aw.shiftKey?true:false;var av=ab?10:1;switch(aw.keyCode){case 37:aq(aw,-av,0);break;case 39:aq(aw,av,0);break;cas
 e 38:aq(aw,0,-av);break;case 40:aq(aw,0,av);break;case 27:X.release();break;case 9:return true}return nothing(aw)}if(H.keySupport){au.insertBefore(al)}return{watchKeys:ap}}();function l(ao){return&quot;&quot;+parseInt(ao)+&quot;px&quot;}function K(ao){return&quot;&quot;+parseInt(ao)+&quot;%&quot;}function C(ao){return H.baseClass+&quot;-&quot;+ao}function D(ao){var ap=a(ao).offset();return[ap.left,ap.top]}function F(ao){return[(ao.pageX-ad[0]),(ao.pageY-ad[1])]}function E(ao){if(ao!=an){P.setCursor(ao);an=ao}}function f(aq,at){ad=D(al);P.setCursor(aq==&quot;move&quot;?aq:aq+&quot;-resize&quot;);if(aq==&quot;move&quot;){return P.activateHandlers(R(at),o)}var ao=aa.getFixed();var ap=q(aq);var ar=aa.getCorner(q(ap));aa.setPressed(aa.getCorner(ap));aa.setCurrent(ar);P.activateHandlers(G(aq,ao),o)}function G(ap,ao){return function(aq){if(!H.aspectRatio){switch(ap){case&quot;e&quot;:aq[1]=ao.y2;break;case&quot;w&quot;:aq[1]=ao.y2;break;case&quot;n&quot;:aq[0]=ao.x2;break;case&quot
 ;s&quot;:aq[0]=ao.x2;break}}else{switch(ap){case&quot;e&quot;:aq[1]=ao.y+1;break;case&quot;w&quot;:aq[1]=ao.y+1;break;case&quot;n&quot;:aq[0]=ao.x+1;break;case&quot;s&quot;:aq[0]=ao.x+1;break}}aa.setCurrent(aq);X.update()}}function R(ap){var ao=ap;ak.watchKeys();return function(aq){aa.moveOffset([aq[0]-ao[0],aq[1]-ao[1]]);ao=aq;X.update()}}function q(ao){switch(ao){case&quot;n&quot;:return&quot;sw&quot;;case&quot;s&quot;:return&quot;nw&quot;;case&quot;e&quot;:return&quot;nw&quot;;case&quot;w&quot;:return&quot;ne&quot;;case&quot;ne&quot;:return&quot;sw&quot;;case&quot;nw&quot;:return&quot;se&quot;;case&quot;se&quot;:return&quot;nw&quot;;case&quot;sw&quot;:return&quot;ne&quot;}}function c(ao){return function(ap){if(H.disabled){return false}if((ao==&quot;move&quot;)&amp;&amp;!H.allowMove){return false}r=true;f(ao,F(ap));ap.stopPropagation();ap.preventDefault();return false}}function T(at,ap,ar){var ao=at.width(),aq=at.height();if((ao&gt;ap)&amp;&amp;ap&gt;0){ao=ap;aq=(ap/at.wid
 th())*at.height()}if((aq&gt;ar)&amp;&amp;ar&gt;0){aq=ar;ao=(ar/at.height())*at.width()}M=at.width()/ao;e=at.height()/aq;at.width(ao).height(aq)}function Y(ao){return{x:parseInt(ao.x*M),y:parseInt(ao.y*e),x2:parseInt(ao.x2*M),y2:parseInt(ao.y2*e),w:parseInt(ao.w*M),h:parseInt(ao.h*e)}}function o(ap){var ao=aa.getFixed();if(ao.w&gt;H.minSelect[0]&amp;&amp;ao.h&gt;H.minSelect[1]){X.enableHandles();X.done()}else{X.release()}P.setCursor(H.allowSelect?&quot;crosshair&quot;:&quot;default&quot;)}function ac(ao){if(H.disabled){return false}if(!H.allowSelect){return false}r=true;ad=D(al);X.disableHandles();E(&quot;crosshair&quot;);var ap=F(ao);aa.setPressed(ap);P.activateHandlers(aj,o);ak.watchKeys();X.update();ao.stopPropagation();ao.preventDefault();return false}function aj(ao){aa.setCurrent(ao);X.update()}function ae(){var ao=a(&quot;&lt;div&gt;&lt;/div&gt;&quot;).addClass(C(&quot;tracker&quot;));a.browser.msie&amp;&amp;ao.css({opacity:0,backgroundColor:&quot;white&quot;});return a
 o}function s(aG){var aB=aG[0]/M,ap=aG[1]/e,aA=aG[2]/M,ao=aG[3]/e;if(B){return}var az=aa.flipCoords(aB,ap,aA,ao);var aE=aa.getFixed();var ar=initcr=[aE.x,aE.y,aE.x2,aE.y2];var aq=H.animationDelay;var ax=ar[0];var aw=ar[1];var aA=ar[2];var ao=ar[3];var aD=az[0]-initcr[0];var au=az[1]-initcr[1];var aC=az[2]-initcr[2];var at=az[3]-initcr[3];var ay=0;var av=H.swingSpeed;X.animMode(true);var aF=function(){return function(){ay+=(100-ay)/av;ar[0]=ax+((ay/100)*aD);ar[1]=aw+((ay/100)*au);ar[2]=aA+((ay/100)*aC);ar[3]=ao+((ay/100)*at);if(ay&lt;100){aH()}else{X.done()}if(ay&gt;=99.8){ay=100}ai(ar)}}();function aH(){window.setTimeout(aF,aq)}aH()}function J(ao){ai([ao[0]/M,ao[1]/e,ao[2]/M,ao[3]/e])}function ai(ao){aa.setPressed([ao[0],ao[1]]);aa.setCurrent([ao[2],ao[3]]);X.update()}function z(ao){if(typeof(ao)!=&quot;object&quot;){ao={}}H=a.extend(H,ao);if(typeof(H.onChange)!==&quot;function&quot;){H.onChange=function(){}}if(typeof(H.onSelect)!==&quot;function&quot;){H.onSelect=function(){
 }}}function j(){return Y(aa.getFixed())}function ag(){return aa.getFixed()}function u(ao){z(ao);N()}function v(){H.disabled=true;X.disableHandles();X.setCursor(&quot;default&quot;);P.setCursor(&quot;default&quot;)}function V(){H.disabled=false;N()}function m(){X.done();P.activateHandlers(null,null)}function af(){Z.remove();W.show()}function N(ao){H.allowResize?ao?X.enableOnly():X.enableHandles():X.disableHandles();P.setCursor(H.allowSelect?&quot;crosshair&quot;:&quot;default&quot;);X.setCursor(H.allowMove?&quot;move&quot;:&quot;default&quot;);Z.css(&quot;backgroundColor&quot;,H.bgColor);if(&quot;setSelect&quot; in H){J(A.setSelect);X.done();delete (H.setSelect)}if(&quot;trueSize&quot; in H){M=H.trueSize[0]/Q;e=H.trueSize[1]/O}x=H.maxSize[0]||0;ah=H.maxSize[1]||0;p=H.minSize[0]||0;S=H.minSize[1]||0;if(&quot;outerImage&quot; in H){al.attr(&quot;src&quot;,H.outerImage);delete (H.outerImage)}X.refresh()}L.hide();N(true);var g={animateTo:s,setSelect:J,setOptions:u,tellSelect:j,te
 llScaled:ag,disable:v,enable:V,cancel:m,focus:ak.watchKeys,getBounds:function(){return[Q*M,O*e]},getWidgetSize:function(){return[Q,O]},release:X.release,destroy:af};W.data(&quot;Jcrop&quot;,g);return g};a.fn.Jcrop=function(c){function b(f){var e=c.useImg||f.src;var d=new Image();d.onload=function(){a.Jcrop(f,c)};d.src=e}if(typeof(c)!==&quot;object&quot;){c={}}this.each(function(){if(a(this).data(&quot;Jcrop&quot;)){if(c==&quot;api&quot;){return a(this).data(&quot;Jcrop&quot;)}else{a(this).data(&quot;Jcrop&quot;).setOptions(c)}}else{b(this)}});return this}})(jQuery);
</del><span class="cx">\ No newline at end of file
</span><ins>+/**
+ * jquery.Jcrop.min.js v0.9.10 (build:20120429)
+ * jQuery Image Cropping Plugin - released under MIT License
+ * Copyright (c) 2008-2012 Tapmodo Interactive LLC
+ * https://github.com/tapmodo/Jcrop
+ */
+(function(a){a.Jcrop=function(b,c){function h(a){return a+&quot;px&quot;}function i(a){return d.baseClass+&quot;-&quot;+a}function j(){return a.fx.step.hasOwnProperty(&quot;backgroundColor&quot;)}function k(b){var c=a(b).offset();return[c.left,c.top]}function l(a){return[a.pageX-e[0],a.pageY-e[1]]}function m(b){typeof b!=&quot;object&quot;&amp;&amp;(b={}),d=a.extend(d,b),a.each([&quot;onChange&quot;,&quot;onSelect&quot;,&quot;onRelease&quot;,&quot;onDblClick&quot;],function(a,b){typeof d[b]!=&quot;function&quot;&amp;&amp;(d[b]=function(){})})}function n(a,b){e=k(E),bd.setCursor(a===&quot;move&quot;?a:a+&quot;-resize&quot;);if(a===&quot;move&quot;)return bd.activateHandlers(p(b),u);var c=ba.getFixed(),d=q(a),f=ba.getCorner(q(d));ba.setPressed(ba.getCorner(d)),ba.setCurrent(f),bd.activateHandlers(o(a,c),u)}function o(a,b){return function(c){if(!d.aspectRatio)switch(a){case&quot;e&quot;:c[1]=b.y2;break;case&quot;w&quot;:c[1]=b.y2;break;case&quot;n&quot;:c[0]=b.x2;break;case&quo
 t;s&quot;:c[0]=b.x2}else switch(a){case&quot;e&quot;:c[1]=b.y+1;break;case&quot;w&quot;:c[1]=b.y+1;break;case&quot;n&quot;:c[0]=b.x+1;break;case&quot;s&quot;:c[0]=b.x+1}ba.setCurrent(c),bc.update()}}function p(a){var b=a;return be.watchKeys(),function(
+a){ba.moveOffset([a[0]-b[0],a[1]-b[1]]),b=a,bc.update()}}function q(a){switch(a){case&quot;n&quot;:return&quot;sw&quot;;case&quot;s&quot;:return&quot;nw&quot;;case&quot;e&quot;:return&quot;nw&quot;;case&quot;w&quot;:return&quot;ne&quot;;case&quot;ne&quot;:return&quot;sw&quot;;case&quot;nw&quot;:return&quot;se&quot;;case&quot;se&quot;:return&quot;nw&quot;;case&quot;sw&quot;:return&quot;ne&quot;}}function r(a){return function(b){return d.disabled?!1:a===&quot;move&quot;&amp;&amp;!d.allowMove?!1:(e=k(E),X=!0,n(a,l(b)),b.stopPropagation(),b.preventDefault(),!1)}}function s(a,b,c){var d=a.width(),e=a.height();d&gt;b&amp;&amp;b&gt;0&amp;&amp;(d=b,e=b/a.width()*a.height()),e&gt;c&amp;&amp;c&gt;0&amp;&amp;(e=c,d=c/a.height()*a.width()),U=a.width()/d,V=a.height()/e,a.width(d).height(e)}function t(a){return{x:a.x*U,y:a.y*V,x2:a.x2*U,y2:a.y2*V,w:a.w*U,h:a.h*V}}function u(a){var b=ba.getFixed();b.w&gt;d.minSelect[0]&amp;&amp;b.h&gt;d.minSelect[1]?(bc.enableHandles(),bc.done()):bc.releas
 e(),bd.setCursor(d.allowSelect?&quot;crosshair&quot;:&quot;default&quot;)}function v(a){if(d.disabled)return!1;if(!d.allowSelect)return!1;X=!0,e=k(E),bc.disableHandles(),bd.setCursor(&quot;crosshair&quot;);var b=l(a);return ba.setPressed(b),bc.update(),bd.activateHandlers(w,u),be.watchKeys(),a.stopPropagation
+(),a.preventDefault(),!1}function w(a){ba.setCurrent(a),bc.update()}function z(){var b=a(&quot;&lt;div&gt;&lt;/div&gt;&quot;).addClass(i(&quot;tracker&quot;));return a.browser.msie&amp;&amp;b.css({opacity:0,backgroundColor:&quot;white&quot;}),b}function bf(a){H.removeClass().addClass(i(&quot;holder&quot;)).addClass(a)}function bg(a,b){function t(){window.setTimeout(u,l)}var c=a[0]/U,e=a[1]/V,f=a[2]/U,g=a[3]/V;if(Y)return;var h=ba.flipCoords(c,e,f,g),i=ba.getFixed(),j=[i.x,i.y,i.x2,i.y2],k=j,l=d.animationDelay,m=h[0]-j[0],n=h[1]-j[1],o=h[2]-j[2],p=h[3]-j[3],q=0,r=d.swingSpeed;x=k[0],y=k[1],f=k[2],g=k[3],bc.animMode(!0);var s,u=function(){return function(){q+=(100-q)/r,k[0]=x+q/100*m,k[1]=y+q/100*n,k[2]=f+q/100*o,k[3]=g+q/100*p,q&gt;=99.8&amp;&amp;(q=100),q&lt;100?(bi(k),t()):(bc.done(),typeof b==&quot;function&quot;&amp;&amp;b.call(bt))}}();t()}function bh(a){bi([a[0]/U,a[1]/V,a[2]/U,a[3]/V]),d.onSelect.call(bt,t(ba.getFixed())),bc.enableHandles()}function bi(a){ba.setPressed
 ([a[0],a[1]]),ba.setCurrent([a[2],a[3]]),bc.update()}function bj(){return t(ba.getFixed())}function bk(){return ba.getFixed()}function bl
+(a){m(a),bs()}function bm(){d.disabled=!0,bc.disableHandles(),bc.setCursor(&quot;default&quot;),bd.setCursor(&quot;default&quot;)}function bn(){d.disabled=!1,bs()}function bo(){bc.done(),bd.activateHandlers(null,null)}function bp(){H.remove(),B.show(),a(b).removeData(&quot;Jcrop&quot;)}function bq(a,b){bc.release(),bm();var c=new Image;c.onload=function(){var e=c.width,f=c.height,g=d.boxWidth,h=d.boxHeight;E.width(e).height(f),E.attr(&quot;src&quot;,a),I.attr(&quot;src&quot;,a),s(E,g,h),F=E.width(),G=E.height(),I.width(F).height(G),N.width(F+M*2).height(G+M*2),H.width(F).height(G),bb.resize(F,G),bn(),typeof b==&quot;function&quot;&amp;&amp;b.call(bt)},c.src=a}function br(a,b,c){var e=b||d.bgColor;d.bgFade&amp;&amp;j()&amp;&amp;d.fadeTime&amp;&amp;!c?a.animate({backgroundColor:e},{queue:!1,duration:d.fadeTime}):a.css(&quot;backgroundColor&quot;,e)}function bs(a){d.allowResize?a?bc.enableOnly():bc.enableHandles():bc.disableHandles(),bd.setCursor(d.allowSelect?&quot;crosshair&q
 uot;:&quot;default&quot;),bc.setCursor(d.allowMove?&quot;move&quot;:&quot;default&quot;),d.hasOwnProperty(&quot;trueSize&quot;)&amp;&amp;(U=d.trueSize[0]/F,V=d.trueSize[1]/G),d.hasOwnProperty(&quot;setSelect&quot;
+)&amp;&amp;(bh(d.setSelect),bc.done(),delete d.setSelect),bb.refresh(),d.bgColor!=O&amp;&amp;(br(d.shade?bb.getShades():H,d.shade?d.shadeColor||d.bgColor:d.bgColor),O=d.bgColor),P!=d.bgOpacity&amp;&amp;(P=d.bgOpacity,d.shade?bb.refresh():bc.setBgOpacity(P)),Q=d.maxSize[0]||0,R=d.maxSize[1]||0,S=d.minSize[0]||0,T=d.minSize[1]||0,d.hasOwnProperty(&quot;outerImage&quot;)&amp;&amp;(E.attr(&quot;src&quot;,d.outerImage),delete d.outerImage),bc.refresh()}var d=a.extend({},a.Jcrop.defaults),e,f,g=!1;a.browser.msie&amp;&amp;a.browser.version.split(&quot;.&quot;)[0]===&quot;6&quot;&amp;&amp;(g=!0),typeof b!=&quot;object&quot;&amp;&amp;(b=a(b)[0]),typeof c!=&quot;object&quot;&amp;&amp;(c={}),m(c);var A={border:&quot;none&quot;,visibility:&quot;visible&quot;,margin:0,padding:0,position:&quot;absolute&quot;,top:0,left:0},B=a(b),C=!0;if(b.tagName==&quot;IMG&quot;){if(B[0].width!=0&amp;&amp;B[0].height!=0)B.width(B[0].width),B.height(B[0].height);else{var D=new Image;D.src=B[0].src,B.width
 (D.width),B.height(D.height)}var E=B.clone().removeAttr(&quot;id&quot;).css(A).show();E.width(B.width()),E.height(B.height()),B.after(E).hide()}else E=B.css(A).show(),C=!1,d.shade===null&amp;&amp;(d.shade=!0);s(E,d.boxWidth,d.
+boxHeight);var F=E.width(),G=E.height(),H=a(&quot;&lt;div /&gt;&quot;).width(F).height(G).addClass(i(&quot;holder&quot;)).css({position:&quot;relative&quot;,backgroundColor:d.bgColor}).insertAfter(B).append(E);d.addClass&amp;&amp;H.addClass(d.addClass);var I=a(&quot;&lt;div /&gt;&quot;),J=a(&quot;&lt;div /&gt;&quot;).width(&quot;100%&quot;).height(&quot;100%&quot;).css({zIndex:310,position:&quot;absolute&quot;,overflow:&quot;hidden&quot;}),K=a(&quot;&lt;div /&gt;&quot;).width(&quot;100%&quot;).height(&quot;100%&quot;).css(&quot;zIndex&quot;,320),L=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,zIndex:600}).dblclick(function(){var a=ba.getFixed();d.onDblClick.call(bt,a)}).insertBefore(E).append(J,K);C&amp;&amp;(I=a(&quot;&lt;img /&gt;&quot;).attr(&quot;src&quot;,E.attr(&quot;src&quot;)).css(A).width(F).height(G),J.append(I)),g&amp;&amp;L.css({overflowY:&quot;hidden&quot;});var M=d.boundary,N=z().width(F+M*2).height(G+M*2).css({position:&quot;absolute&quot;,to
 p:h(-M),left:h(-M),zIndex:290}).mousedown(v),O=d.bgColor,P=d.bgOpacity,Q,R,S,T,U,V,W=!0,X,Y,Z;e=k(E);var _=function(){function a(){var a={},b=[&quot;touchstart&quot;,&quot;touchmove&quot;,&quot;touchend&quot;],c=document.createElement(&quot;div&quot;),d;try{for(d=0;d&lt;b.length;d++){var e=b[d];e=&quot;on&quot;+e;var f=e in c;f||(c.setAttribute(e,&quot;return;&quot;
+),f=typeof c[e]==&quot;function&quot;),a[b[d]]=f}return a.touchstart&amp;&amp;a.touchend&amp;&amp;a.touchmove}catch(g){return!1}}function b(){return d.touchSupport===!0||d.touchSupport===!1?d.touchSupport:a()}return{createDragger:function(a){return function(b){return b.pageX=b.originalEvent.changedTouches[0].pageX,b.pageY=b.originalEvent.changedTouches[0].pageY,d.disabled?!1:a===&quot;move&quot;&amp;&amp;!d.allowMove?!1:(X=!0,n(a,l(b)),b.stopPropagation(),b.preventDefault(),!1)}},newSelection:function(a){return a.pageX=a.originalEvent.changedTouches[0].pageX,a.pageY=a.originalEvent.changedTouches[0].pageY,v(a)},isSupported:a,support:b()}}(),ba=function(){function h(d){d=n(d),c=a=d[0],e=b=d[1]}function i(a){a=n(a),f=a[0]-c,g=a[1]-e,c=a[0],e=a[1]}function j(){return[f,g]}function k(d){var f=d[0],g=d[1];0&gt;a+f&amp;&amp;(f-=f+a),0&gt;b+g&amp;&amp;(g-=g+b),G&lt;e+g&amp;&amp;(g+=G-(e+g)),F&lt;c+f&amp;&amp;(f+=F-(c+f)),a+=f,c+=f,b+=g,e+=g}function l(a){var b=m();switch(a){case&qu
 ot;ne&quot;:return[b.x2,b.y];case&quot;nw&quot;:return[b.x,b.y];case&quot;se&quot;:return[b.x2,b.y2];case&quot;sw&quot;:return[b.x,b.y2]}}function m(){if(!d.aspectRatio
+)return p();var f=d.aspectRatio,g=d.minSize[0]/U,h=d.maxSize[0]/U,i=d.maxSize[1]/V,j=c-a,k=e-b,l=Math.abs(j),m=Math.abs(k),n=l/m,r,s,t,u;return h===0&amp;&amp;(h=F*10),i===0&amp;&amp;(i=G*10),n&lt;f?(s=e,t=m*f,r=j&lt;0?a-t:t+a,r&lt;0?(r=0,u=Math.abs((r-a)/f),s=k&lt;0?b-u:u+b):r&gt;F&amp;&amp;(r=F,u=Math.abs((r-a)/f),s=k&lt;0?b-u:u+b)):(r=c,u=l/f,s=k&lt;0?b-u:b+u,s&lt;0?(s=0,t=Math.abs((s-b)*f),r=j&lt;0?a-t:t+a):s&gt;G&amp;&amp;(s=G,t=Math.abs(s-b)*f,r=j&lt;0?a-t:t+a)),r&gt;a?(r-a&lt;g?r=a+g:r-a&gt;h&amp;&amp;(r=a+h),s&gt;b?s=b+(r-a)/f:s=b-(r-a)/f):r&lt;a&amp;&amp;(a-r&lt;g?r=a-g:a-r&gt;h&amp;&amp;(r=a-h),s&gt;b?s=b+(a-r)/f:s=b-(a-r)/f),r&lt;0?(a-=r,r=0):r&gt;F&amp;&amp;(a-=r-F,r=F),s&lt;0?(b-=s,s=0):s&gt;G&amp;&amp;(b-=s-G,s=G),q(o(a,b,r,s))}function n(a){return a[0]&lt;0&amp;&amp;(a[0]=0),a[1]&lt;0&amp;&amp;(a[1]=0),a[0]&gt;F&amp;&amp;(a[0]=F),a[1]&gt;G&amp;&amp;(a[1]=G),[a[0],a[1]]}function o(a,b,c,d){var e=a,f=c,g=b,h=d;return c&lt;a&amp;&amp;(e=c,f=a),d&lt;b&amp;&amp;(g=
 d,h=b),[e,g,f,h]}function p(){var d=c-a,f=e-b,g;return Q&amp;&amp;Math.abs(d)&gt;Q&amp;&amp;(c=d&gt;0?a+Q:a-Q),R&amp;&amp;Math.abs(f)&gt;R&amp;&amp;(e=f&gt;0?b+R:b-R),T/V&amp;&amp;Math.abs(f)&lt;T/V&amp;&amp;(e=f&gt;0?b+T/V:b-T/V),S/U&amp;&amp;Math.abs(d)&lt;S/U&amp;&amp;(c=d&gt;0?a+S/U:a-S/U),a&lt;0&amp;&amp;(c-=a,a-=a),b&lt;0&amp;&amp;(e-=b,b-=b),c&lt;0&amp;&amp;
+(a-=c,c-=c),e&lt;0&amp;&amp;(b-=e,e-=e),c&gt;F&amp;&amp;(g=c-F,a-=g,c-=g),e&gt;G&amp;&amp;(g=e-G,b-=g,e-=g),a&gt;F&amp;&amp;(g=a-G,e-=g,b-=g),b&gt;G&amp;&amp;(g=b-G,e-=g,b-=g),q(o(a,b,c,e))}function q(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}var a=0,b=0,c=0,e=0,f,g;return{flipCoords:o,setPressed:h,setCurrent:i,getOffset:j,moveOffset:k,getCorner:l,getFixed:m}}(),bb=function(){function f(a,b){e.left.css({height:h(b)}),e.right.css({height:h(b)})}function g(){return i(ba.getFixed())}function i(a){e.top.css({left:h(a.x),width:h(a.w),height:h(a.y)}),e.bottom.css({top:h(a.y2),left:h(a.x),width:h(a.w),height:h(G-a.y2)}),e.right.css({left:h(a.x2),width:h(F-a.x2)}),e.left.css({width:h(a.x)})}function j(){return a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,backgroundColor:d.shadeColor||d.bgColor}).appendTo(c)}function k(){b||(b=!0,c.insertBefore(E),g(),bc.setBgOpacity(1,0,1),I.hide(),l(d.shadeColor||d.bgColor,1),bc.isAwake()?n(d.bgOpacity,1):n
 (1,1))}function l(a,b){br(p(),a,b)}function m(){b&amp;&amp;(c.remove(),I.show(),b=!1,bc.isAwake()?bc.setBgOpacity(d.bgOpacity
+,1,1):(bc.setBgOpacity(1,1,1),bc.disableHandles()),br(H,0,1))}function n(a,e){b&amp;&amp;(d.bgFade&amp;&amp;!e?c.animate({opacity:1-a},{queue:!1,duration:d.fadeTime}):c.css({opacity:1-a}))}function o(){d.shade?k():m(),bc.isAwake()&amp;&amp;n(d.bgOpacity)}function p(){return c.children()}var b=!1,c=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,zIndex:240,opacity:0}),e={top:j(),left:j().height(G),right:j().height(G),bottom:j()};return{update:g,updateRaw:i,getShades:p,setBgColor:l,enable:k,disable:m,resize:f,refresh:o,opacity:n}}(),bc=function(){function k(b){var c=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,opacity:d.borderOpacity}).addClass(i(b));return J.append(c),c}function l(b,c){var d=a(&quot;&lt;div /&gt;&quot;).mousedown(r(b)).css({cursor:b+&quot;-resize&quot;,position:&quot;absolute&quot;,zIndex:c}).addClass(&quot;ord-&quot;+b);return _.support&amp;&amp;d.bind(&quot;touchstart.jcrop&quot;,_.createDragger(b)),K.append(d),d}function 
 m(a){var b=d.handleSize;return l(a,c++).css({opacity:d.handleOpacity}).width(b).height(b).addClass(i(&quot;handle&quot;))}function n(a){return l(a,c++).addClass(&quot;jcrop-dragbar&quot;)}function o
+(a){var b;for(b=0;b&lt;a.length;b++)g[a[b]]=n(a[b])}function p(a){var b,c;for(c=0;c&lt;a.length;c++){switch(a[c]){case&quot;n&quot;:b=&quot;hline&quot;;break;case&quot;s&quot;:b=&quot;hline bottom&quot;;break;case&quot;e&quot;:b=&quot;vline right&quot;;break;case&quot;w&quot;:b=&quot;vline&quot;}e[a[c]]=k(b)}}function q(a){var b;for(b=0;b&lt;a.length;b++)f[a[b]]=m(a[b])}function s(a,b){d.shade||I.css({top:h(-b),left:h(-a)}),L.css({top:h(b),left:h(a)})}function u(a,b){L.width(a).height(b)}function v(){var a=ba.getFixed();ba.setPressed([a.x,a.y]),ba.setCurrent([a.x2,a.y2]),w()}function w(a){if(b)return x(a)}function x(a){var c=ba.getFixed();u(c.w,c.h),s(c.x,c.y),d.shade&amp;&amp;bb.updateRaw(c),b||A(),a?d.onSelect.call(bt,t(c)):d.onChange.call(bt,t(c))}function y(a,c,e){if(!b&amp;&amp;!c)return;d.bgFade&amp;&amp;!e?E.animate({opacity:a},{queue:!1,duration:d.fadeTime}):E.css(&quot;opacity&quot;,a)}function A(){L.show(),d.shade?bb.opacity(P):y(P,!0),b=!0}function B(){F(),L.hide(
 ),d.shade?bb.opacity(1):y(1),b=!1,d.onRelease.call(bt)}function C(){j&amp;&amp;K.show()}function D(){j=!0;if(d.allowResize)return K.show(),!0}function F(){j=!1,K.hide(
+)}function G(a){Y===a?F():D()}function H(){G(!1),v()}var b,c=370,e={},f={},g={},j=!1;d.dragEdges&amp;&amp;a.isArray(d.createDragbars)&amp;&amp;o(d.createDragbars),a.isArray(d.createHandles)&amp;&amp;q(d.createHandles),d.drawBorders&amp;&amp;a.isArray(d.createBorders)&amp;&amp;p(d.createBorders),a(document).bind(&quot;touchstart.jcrop-ios&quot;,function(b){a(b.currentTarget).hasClass(&quot;jcrop-tracker&quot;)&amp;&amp;b.stopPropagation()});var M=z().mousedown(r(&quot;move&quot;)).css({cursor:&quot;move&quot;,position:&quot;absolute&quot;,zIndex:360});return _.support&amp;&amp;M.bind(&quot;touchstart.jcrop&quot;,_.createDragger(&quot;move&quot;)),J.append(M),F(),{updateVisible:w,update:x,release:B,refresh:v,isAwake:function(){return b},setCursor:function(a){M.css(&quot;cursor&quot;,a)},enableHandles:D,enableOnly:function(){j=!0},showHandles:C,disableHandles:F,animMode:G,setBgOpacity:y,done:H}}(),bd=function(){function f(){N.css({zIndex:450}),_.support&amp;&amp;a(document).bin
 d(&quot;touchmove.jcrop&quot;,k).bind(&quot;touchend.jcrop&quot;,m),e&amp;&amp;a(document).bind(&quot;mousemove.jcrop&quot;,h).bind(&quot;mouseup.jcrop&quot;,i)}function g(){N.css({zIndex:290}),a(document).unbind(&quot;.jcrop&quot;)}function h
+(a){return b(l(a)),!1}function i(a){return a.preventDefault(),a.stopPropagation(),X&amp;&amp;(X=!1,c(l(a)),bc.isAwake()&amp;&amp;d.onSelect.call(bt,t(ba.getFixed())),g(),b=function(){},c=function(){}),!1}function j(a,d){return X=!0,b=a,c=d,f(),!1}function k(a){return a.pageX=a.originalEvent.changedTouches[0].pageX,a.pageY=a.originalEvent.changedTouches[0].pageY,h(a)}function m(a){return a.pageX=a.originalEvent.changedTouches[0].pageX,a.pageY=a.originalEvent.changedTouches[0].pageY,i(a)}function n(a){N.css(&quot;cursor&quot;,a)}var b=function(){},c=function(){},e=d.trackDocument;return e||N.mousemove(h).mouseup(i).mouseout(i),E.before(N),{activateHandlers:j,setCursor:n}}(),be=function(){function e(){d.keySupport&amp;&amp;(b.show(),b.focus())}function f(a){b.hide()}function h(a,b,c){d.allowMove&amp;&amp;(ba.moveOffset([b,c]),bc.updateVisible(!0)),a.preventDefault(),a.stopPropagation()}function i(a){if(a.ctrlKey||a.metaKey)return!0;Z=a.shiftKey?!0:!1;var b=Z?10:1;switch(a.keyCo
 de){case 37:h(a,-b,0);break;case 39:h(a,b,0);break;case 38:h(a,0,-b);break;case 40
+:h(a,0,b);break;case 27:d.allowSelect&amp;&amp;bc.release();break;case 9:return!0}return!1}var b=a('&lt;input type=&quot;radio&quot; /&gt;').css({position:&quot;fixed&quot;,left:&quot;-120px&quot;,width:&quot;12px&quot;}),c=a(&quot;&lt;div /&gt;&quot;).css({position:&quot;absolute&quot;,overflow:&quot;hidden&quot;}).append(b);return d.keySupport&amp;&amp;(b.keydown(i).blur(f),g||!d.fixedSupport?(b.css({position:&quot;absolute&quot;,left:&quot;-20px&quot;}),c.append(b).insertBefore(E)):b.insertBefore(E)),{watchKeys:e}}();_.support&amp;&amp;N.bind(&quot;touchstart.jcrop&quot;,_.newSelection),K.hide(),bs(!0);var bt={setImage:bq,animateTo:bg,setSelect:bh,setOptions:bl,tellSelect:bj,tellScaled:bk,setClass:bf,disable:bm,enable:bn,cancel:bo,release:bc.release,destroy:bp,focus:be.watchKeys,getBounds:function(){return[F*U,G*V]},getWidgetSize:function(){return[F,G]},getScaleFactor:function(){return[U,V]},getOptions:function(){return d},ui:{holder:H,selection:L}};return a.browser.msie&
 amp;&amp;H.bind(&quot;selectstart&quot;,function(){return!1}),B.data(&quot;Jcrop&quot;,bt),bt},a.fn.Jcrop=function(b,c){var d;return this.each(function(){if(a(this).data(&quot;Jcrop&quot;)){if(b===&quot;api&quot;)return a
+(this).data(&quot;Jcrop&quot;);a(this).data(&quot;Jcrop&quot;).setOptions(b)}else this.tagName==&quot;IMG&quot;?a.Jcrop.Loader(this,function(){a(this).css({display:&quot;block&quot;,visibility:&quot;hidden&quot;}),d=a.Jcrop(this,b),a.isFunction(c)&amp;&amp;c.call(d)}):(a(this).css({display:&quot;block&quot;,visibility:&quot;hidden&quot;}),d=a.Jcrop(this,b),a.isFunction(c)&amp;&amp;c.call(d))}),this},a.Jcrop.Loader=function(b,c,d){function g(){f.complete?(e.unbind(&quot;.jcloader&quot;),a.isFunction(c)&amp;&amp;c.call(f)):window.setTimeout(g,50)}var e=a(b),f=e[0];e.bind(&quot;load.jcloader&quot;,g).bind(&quot;error.jcloader&quot;,function(b){e.unbind(&quot;.jcloader&quot;),a.isFunction(d)&amp;&amp;d.call(f)}),f.complete&amp;&amp;a.isFunction(c)&amp;&amp;(e.unbind(&quot;.jcloader&quot;),c.call(f))},a.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:&quot;jcrop&quot;,addClass:null,bgColor:&quot;black&quot;,bgOpacity:.6,bgFade:!1,borderOpacit
 y:.4,handleOpacity:.5,handleSize:7,aspectRatio:0,keySupport:!0,createHandles:[&quot;n&quot;,&quot;s&quot;,&quot;e&quot;,&quot;w&quot;,&quot;nw&quot;,&quot;ne&quot;,&quot;se&quot;,&quot;sw&quot;],createDragbars:[&quot;n&quot;,&quot;s&quot;,&quot;e&quot;,&quot;w&quot;],createBorders:[&quot;n&quot;,&quot;s&quot;,&quot;e&quot;,&quot;w&quot;],drawBorders:!0,dragEdges:!0,fixedSupport:!0,
+touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}}})(jQuery);
</ins><span class="cx">\ No newline at end of file
</span></span></pre></div>
<a id="trunkwpincludesscriptloaderphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-includes/script-loader.php (21632 => 21633)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-includes/script-loader.php        2012-08-27 23:27:14 UTC (rev 21632)
+++ trunk/wp-includes/script-loader.php        2012-08-27 23:37:03 UTC (rev 21633)
</span><span class="lines">@@ -181,7 +181,7 @@
</span><span class="cx">                         'closeImage' =&gt; includes_url('js/thickbox/tb-close.png')
</span><span class="cx">         ) );
</span><span class="cx"> 
</span><del>-        $scripts-&gt;add( 'jcrop', &quot;/wp-includes/js/jcrop/jquery.Jcrop$suffix.js&quot;, array('jquery'), '0.9.8-20110113');
</del><ins>+        $scripts-&gt;add( 'jcrop', &quot;/wp-includes/js/jcrop/jquery.Jcrop$suffix.js&quot;, array('jquery'), '0.9.10');
</ins><span class="cx"> 
</span><span class="cx">         $scripts-&gt;add( 'swfobject', &quot;/wp-includes/js/swfobject.js&quot;, array(), '2.2-20120417');
</span><span class="cx"> 
</span><span class="lines">@@ -482,7 +482,7 @@
</span><span class="cx">         $styles-&gt;add( 'install', &quot;/wp-admin/css/install$suffix.css&quot; );
</span><span class="cx">         $styles-&gt;add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css' );
</span><span class="cx">         $styles-&gt;add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.3u1' );
</span><del>-        $styles-&gt;add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.css', array(), '0.9.8' );
</del><ins>+        $styles-&gt;add( 'jcrop', &quot;/wp-includes/js/jcrop/jquery.Jcrop$suffix.css&quot;, array(), '0.9.10' );
</ins><span class="cx">         $styles-&gt;add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.8' );
</span><span class="cx">         $styles-&gt;add( 'admin-bar', &quot;/wp-includes/css/admin-bar$suffix.css&quot; );
</span><span class="cx">         $styles-&gt;add( 'wp-jquery-ui-dialog', &quot;/wp-includes/css/jquery-ui-dialog$suffix.css&quot; );
</span></span></pre>
</div>
</div>

</body>
</html>