WordPress.org

Make WordPress Core

Changeset 21633


Ignore:
Timestamp:
08/27/12 23:37:03 (3 years ago)
Author:
nacin
Message:

Update Jcrop to 0.9.10. Includes touch support. fixes #20728.

Location:
trunk/wp-includes
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-includes/js/jcrop/jquery.Jcrop.css

    r11015 r21633  
    1 /* Fixes issue here http://code.google.com/p/jcrop/issues/detail?id=1 */ 
    2 .jcrop-holder { text-align: left; } 
     1/* jquery.Jcrop.css v0.9.10 - MIT License */ 
    32 
    4 .jcrop-vline, .jcrop-hline 
    5 { 
    6     font-size: 0; 
    7     position: absolute; 
    8     background: white url('Jcrop.gif') top left repeat; 
    9 } 
    10 .jcrop-vline { height: 100%; width: 1px !important; } 
    11 .jcrop-hline { width: 100%; height: 1px !important; } 
    12 .jcrop-handle { 
    13     font-size: 1px; 
    14     width: 7px !important; 
    15     height: 7px !important; 
    16     border: 1px #eee solid; 
    17     background-color: #333; 
    18     *width: 9px; 
    19     *height: 9px; 
     3/* 
     4  The outer-most container in a typical Jcrop instance 
     5  If you are having difficulty with formatting related to styles 
     6  on a parent element, place any fixes here or in a like selector 
     7 
     8  You can also style this element if you want to add a border, etc 
     9  A better method for styling can be seen below with .jcrop-light 
     10  (Add a class to the holder and style elements for that extended class) 
     11*/ 
     12.jcrop-holder { 
     13  direction: ltr; 
     14  text-align: left; 
    2015} 
    2116 
    22 .jcrop-tracker { width: 100%; height: 100%; } 
     17/* These styles define the border lines */ 
     18.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;} 
     19.jcrop-vline{height:100%;width:1px!important;} 
     20.jcrop-hline{height:1px!important;width:100%;} 
     21.jcrop-vline.right{right:0;} 
     22.jcrop-hline.bottom{bottom:0;} 
    2323 
    24 .custom .jcrop-vline, 
    25 .custom .jcrop-hline 
     24/* Handle style - size is set by Jcrop handleSize option (currently) */ 
     25.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;} 
     26 
     27/* This style is used for invisible click targets */ 
     28.jcrop-tracker 
    2629{ 
    27     background: yellow; 
     30  height: 100%;  
     31  width: 100%; 
     32  -webkit-tap-highlight-color: transparent; /* "turn off" link highlight */ 
     33  -webkit-touch-callout: none;              /* disable callout, image save panel */ 
     34  -webkit-user-select: none;                /* disable cut copy paste */ 
    2835} 
    29 .custom .jcrop-handle 
     36 
     37/* Positioning of handles and drag bars */ 
     38.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;} 
     39.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;} 
     40.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;} 
     41.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;} 
     42.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;} 
     43.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;} 
     44.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;} 
     45.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;} 
     46.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;} 
     47.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;} 
     48.jcrop-dragbar.ord-n{margin-top:-4px;} 
     49.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;} 
     50.jcrop-dragbar.ord-e{margin-right:-4px;right:0;} 
     51.jcrop-dragbar.ord-w{margin-left:-4px;} 
     52 
     53/* The "jcrop-light" class/extension */ 
     54.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline 
    3055{ 
    31     border-color: black; 
    32     background-color: #C7BB00; 
    33     -moz-border-radius: 3px; 
    34     -webkit-border-radius: 3px; 
     56    background:#FFF; 
     57    filter:Alpha(opacity=70)!important; 
     58    opacity:.70!important; 
    3559} 
     60.jcrop-light .jcrop-handle 
     61{ 
     62    -moz-border-radius:3px; 
     63    -webkit-border-radius:3px; 
     64    background-color:#000; 
     65    border-color:#FFF; 
     66    border-radius:3px; 
     67} 
     68 
     69/* The "jcrop-dark" class/extension */ 
     70.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline 
     71{ 
     72    background:#000; 
     73    filter:Alpha(opacity=70)!important; 
     74    opacity:.7!important; 
     75} 
     76.jcrop-dark .jcrop-handle 
     77{ 
     78    -moz-border-radius:3px; 
     79    -webkit-border-radius:3px; 
     80    background-color:#FFF; 
     81    border-color:#000; 
     82    border-radius:3px; 
     83} 
     84 
     85/* Fix for twitter bootstrap et al. */ 
     86.jcrop-holder img,img.jcrop-preview{ max-width: none; } 
  • trunk/wp-includes/js/jcrop/jquery.Jcrop.js

    r21592 r21633  
    11/** 
    2  * jquery.Jcrop.js v0.9.8 
    3  * jQuery Image Cropping Plugin 
    4  * @author Kelly Hallman <khallman@gmail.com> 
    5  * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{ 
     2 * jquery.Jcrop.js v0.9.10 
     3 * jQuery Image Cropping Plugin - released under MIT License  
     4 * Author: Kelly Hallman <khallman@gmail.com> 
     5 * http://github.com/tapmodo/Jcrop 
     6 * Copyright (c) 2008-2012 Tapmodo Interactive LLC {{{ 
    67 * 
    78 * Permission is hereby granted, free of charge, to any person 
     
    1314 * Software is furnished to do so, subject to the following 
    1415 * conditions: 
    15  
     16 * 
    1617 * The above copyright notice and this permission notice shall be 
    1718 * included in all copies or substantial portions of the Software. 
    18  
     19 * 
    1920 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
    2021 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
     
    2526 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
    2627 * OTHER DEALINGS IN THE SOFTWARE. 
    27  
     28 * 
    2829 * }}} 
    2930 */ 
    3031 
    31 (function($) { 
    32  
    33 $.Jcrop = function(obj,opt) 
    34 { 
    35     // Initialization {{{ 
    36  
    37     // Sanitize some options {{{ 
    38     var obj = obj, opt = opt; 
    39  
    40     if (typeof(obj) !== 'object') obj = $(obj)[0]; 
    41     if (typeof(opt) !== 'object') opt = { }; 
    42  
    43     // Some on-the-fly fixes for MSIE...sigh 
    44     if (!('trackDocument' in opt)) 
    45     { 
    46         opt.trackDocument = $.browser.msie ? false : true; 
    47         if ($.browser.msie && $.browser.version.split('.')[0] == '8') 
    48             opt.trackDocument = true; 
    49     } 
    50  
    51     if (!('keySupport' in opt)) 
    52             opt.keySupport = $.browser.msie ? false : true; 
    53          
    54     // }}} 
    55     // Extend the default options {{{ 
    56     var defaults = { 
    57  
    58         // Basic Settings 
    59         trackDocument:      false, 
    60         baseClass:          'jcrop', 
    61         addClass:           null, 
    62  
    63         // Styling Options 
    64         bgColor:            'black', 
    65         bgOpacity:          .6, 
    66         borderOpacity:      .4, 
    67         handleOpacity:      .5, 
    68  
    69         handlePad:          5, 
    70         handleSize:         9, 
    71         handleOffset:       5, 
    72         edgeMargin:         14, 
    73  
    74         aspectRatio:        0, 
    75         keySupport:         true, 
    76         cornerHandles:      true, 
    77         sideHandles:        true, 
    78         drawBorders:        true, 
    79         dragEdges:          true, 
    80  
    81         boxWidth:           0, 
    82         boxHeight:          0, 
    83  
    84         boundary:           8, 
    85         animationDelay:     20, 
    86         swingSpeed:         3, 
    87  
    88         allowSelect:        true, 
    89         allowMove:          true, 
    90         allowResize:        true, 
    91  
    92         minSelect:          [ 0, 0 ], 
    93         maxSize:            [ 0, 0 ], 
    94         minSize:            [ 0, 0 ], 
    95  
    96         // Callbacks / Event Handlers 
    97         onChange: function() { }, 
    98         onSelect: function() { } 
    99  
    100     }; 
    101     var options = defaults; 
    102     setOptions(opt); 
    103  
    104     // }}} 
    105     // Initialize some jQuery objects {{{ 
    106  
    107     var $origimg = $(obj); 
    108     var $img = $origimg.clone().removeAttr('id').css({ position: 'absolute' }); 
    109  
    110     $img.width($origimg.width()); 
    111     $img.height($origimg.height()); 
    112     $origimg.after($img).hide(); 
    113  
    114     presize($img,options.boxWidth,options.boxHeight); 
    115  
    116     var boundx = $img.width(), 
    117         boundy = $img.height(), 
    118  
    119         $div = $('<div />') 
    120             .width(boundx).height(boundy) 
    121             .addClass(cssClass('holder')) 
    122             .css({ 
    123                 position: 'relative', 
    124                 backgroundColor: options.bgColor 
    125             }).insertAfter($origimg).append($img); 
    126     ; 
    127      
    128     if (options.addClass) $div.addClass(options.addClass); 
    129     //$img.wrap($div); 
    130  
    131     var $img2 = $('<img />')/*{{{*/ 
    132             .attr('src',$img.attr('src')) 
    133             .css('position','absolute') 
    134             .width(boundx).height(boundy) 
    135     ;/*}}}*/ 
    136     var $img_holder = $('<div />')/*{{{*/ 
    137         .width(pct(100)).height(pct(100)) 
    138         .css({ 
    139             zIndex: 310, 
    140             position: 'absolute', 
    141             overflow: 'hidden' 
    142         }) 
    143         .append($img2) 
    144     ;/*}}}*/ 
    145     var $hdl_holder = $('<div />')/*{{{*/ 
    146         .width(pct(100)).height(pct(100)) 
    147         .css('zIndex',320); 
    148     /*}}}*/ 
    149     var $sel = $('<div />')/*{{{*/ 
    150         .css({ 
    151             position: 'absolute', 
    152             zIndex: 300 
    153         }) 
    154         .insertBefore($img) 
    155         .append($img_holder,$hdl_holder) 
    156     ;/*}}}*/ 
    157  
    158     var bound = options.boundary; 
    159     var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2)) 
    160         .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 }) 
    161         .mousedown(newSelection);    
    162      
    163     /* }}} */ 
    164     // Set more variables {{{ 
    165  
    166     var xlimit, ylimit, xmin, ymin; 
    167     var xscale, yscale, enabled = true; 
    168     var docOffset = getPos($img), 
    169         // Internal states 
    170         btndown, lastcurs, dimmed, animating, 
    171         shift_down; 
    172  
    173     // }}} 
    174          
    175  
    176         // }}} 
    177     // Internal Modules {{{ 
    178  
    179     var Coords = function()/*{{{*/ 
    180     { 
    181         var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy; 
    182  
    183         function setPressed(pos)/*{{{*/ 
    184         { 
    185             var pos = rebound(pos); 
    186             x2 = x1 = pos[0]; 
    187             y2 = y1 = pos[1]; 
    188         }; 
    189         /*}}}*/ 
    190         function setCurrent(pos)/*{{{*/ 
    191         { 
    192             var pos = rebound(pos); 
    193             ox = pos[0] - x2; 
    194             oy = pos[1] - y2; 
    195             x2 = pos[0]; 
    196             y2 = pos[1]; 
    197         }; 
    198         /*}}}*/ 
    199         function getOffset()/*{{{*/ 
    200         { 
    201             return [ ox, oy ]; 
    202         }; 
    203         /*}}}*/ 
    204         function moveOffset(offset)/*{{{*/ 
    205         { 
    206             var ox = offset[0], oy = offset[1]; 
    207  
    208             if (0 > x1 + ox) ox -= ox + x1; 
    209             if (0 > y1 + oy) oy -= oy + y1; 
    210  
    211             if (boundy < y2 + oy) oy += boundy - (y2 + oy); 
    212             if (boundx < x2 + ox) ox += boundx - (x2 + ox); 
    213  
    214             x1 += ox; 
    215             x2 += ox; 
    216             y1 += oy; 
    217             y2 += oy; 
    218         }; 
    219         /*}}}*/ 
    220         function getCorner(ord)/*{{{*/ 
    221         { 
    222             var c = getFixed(); 
    223             switch(ord) 
    224             { 
    225                 case 'ne': return [ c.x2, c.y ]; 
    226                 case 'nw': return [ c.x, c.y ]; 
    227                 case 'se': return [ c.x2, c.y2 ]; 
    228                 case 'sw': return [ c.x, c.y2 ]; 
    229             } 
    230         }; 
    231         /*}}}*/ 
    232         function getFixed()/*{{{*/ 
    233         { 
    234             if (!options.aspectRatio) return getRect(); 
    235             // This function could use some optimization I think... 
    236             var aspect = options.aspectRatio, 
    237                 min_x = options.minSize[0]/xscale,  
    238                 min_y = options.minSize[1]/yscale, 
    239                 max_x = options.maxSize[0]/xscale,  
    240                 max_y = options.maxSize[1]/yscale, 
    241                 rw = x2 - x1, 
    242                 rh = y2 - y1, 
    243                 rwa = Math.abs(rw), 
    244                 rha = Math.abs(rh), 
    245                 real_ratio = rwa / rha, 
    246                 xx, yy 
    247             ; 
    248             if (max_x == 0) { max_x = boundx * 10 } 
    249             if (max_y == 0) { max_y = boundy * 10 } 
    250             if (real_ratio < aspect) 
    251             { 
    252                 yy = y2; 
    253                 w = rha * aspect; 
    254                 xx = rw < 0 ? x1 - w : w + x1; 
    255  
    256                 if (xx < 0) 
    257                 { 
    258                     xx = 0; 
    259                     h = Math.abs((xx - x1) / aspect); 
    260                     yy = rh < 0 ? y1 - h: h + y1; 
    261                 } 
    262                 else if (xx > boundx) 
    263                 { 
    264                     xx = boundx; 
    265                     h = Math.abs((xx - x1) / aspect); 
    266                     yy = rh < 0 ? y1 - h : h + y1; 
    267                 } 
    268             } 
    269             else 
    270             { 
    271                 xx = x2; 
    272                 h = rwa / aspect; 
    273                 yy = rh < 0 ? y1 - h : y1 + h; 
    274                 if (yy < 0) 
    275                 { 
    276                     yy = 0; 
    277                     w = Math.abs((yy - y1) * aspect); 
    278                     xx = rw < 0 ? x1 - w : w + x1; 
    279                 } 
    280                 else if (yy > boundy) 
    281                 { 
    282                     yy = boundy; 
    283                     w = Math.abs(yy - y1) * aspect; 
    284                     xx = rw < 0 ? x1 - w : w + x1; 
    285                 } 
    286             } 
    287  
    288             // Magic %-) 
    289             if(xx > x1) { // right side 
    290               if(xx - x1 < min_x) { 
    291                 xx = x1 + min_x; 
    292               } else if (xx - x1 > max_x) { 
    293                 xx = x1 + max_x; 
    294               } 
    295               if(yy > y1) { 
    296                 yy = y1 + (xx - x1)/aspect; 
    297               } else { 
    298                 yy = y1 - (xx - x1)/aspect; 
    299               } 
    300             } else if (xx < x1) { // left side 
    301               if(x1 - xx < min_x) { 
    302                 xx = x1 - min_x 
    303               } else if (x1 - xx > max_x) { 
    304                 xx = x1 - max_x; 
    305               } 
    306               if(yy > y1) { 
    307                 yy = y1 + (x1 - xx)/aspect; 
    308               } else { 
    309                 yy = y1 - (x1 - xx)/aspect; 
    310               } 
    311             } 
    312  
    313             if(xx < 0) { 
    314                 x1 -= xx; 
    315                 xx = 0; 
    316             } else  if (xx > boundx) { 
    317                 x1 -= xx - boundx; 
    318                 xx = boundx; 
    319             } 
    320  
    321             if(yy < 0) { 
    322                 y1 -= yy; 
    323                 yy = 0; 
    324             } else  if (yy > boundy) { 
    325                 y1 -= yy - boundy; 
    326                 yy = boundy; 
    327             } 
    328  
    329             return last = makeObj(flipCoords(x1,y1,xx,yy)); 
    330         }; 
    331         /*}}}*/ 
    332         function rebound(p)/*{{{*/ 
    333         { 
    334             if (p[0] < 0) p[0] = 0; 
    335             if (p[1] < 0) p[1] = 0; 
    336  
    337             if (p[0] > boundx) p[0] = boundx; 
    338             if (p[1] > boundy) p[1] = boundy; 
    339  
    340             return [ p[0], p[1] ]; 
    341         }; 
    342         /*}}}*/ 
    343         function flipCoords(x1,y1,x2,y2)/*{{{*/ 
    344         { 
    345             var xa = x1, xb = x2, ya = y1, yb = y2; 
    346             if (x2 < x1) 
    347             { 
    348                 xa = x2; 
    349                 xb = x1; 
    350             } 
    351             if (y2 < y1) 
    352             { 
    353                 ya = y2; 
    354                 yb = y1; 
    355             } 
    356             return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ]; 
    357         }; 
    358         /*}}}*/ 
    359         function getRect()/*{{{*/ 
    360         { 
    361             var xsize = x2 - x1; 
    362             var ysize = y2 - y1; 
    363  
    364             if (xlimit && (Math.abs(xsize) > xlimit)) 
    365                 x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); 
    366             if (ylimit && (Math.abs(ysize) > ylimit)) 
    367                 y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); 
    368  
    369             if (ymin && (Math.abs(ysize) < ymin)) 
    370                 y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin); 
    371             if (xmin && (Math.abs(xsize) < xmin)) 
    372                 x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin); 
    373  
    374             if (x1 < 0) { x2 -= x1; x1 -= x1; } 
    375             if (y1 < 0) { y2 -= y1; y1 -= y1; } 
    376             if (x2 < 0) { x1 -= x2; x2 -= x2; } 
    377             if (y2 < 0) { y1 -= y2; y2 -= y2; } 
    378             if (x2 > boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; } 
    379             if (y2 > boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; } 
    380             if (x1 > boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; } 
    381             if (y1 > boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; } 
    382  
    383             return makeObj(flipCoords(x1,y1,x2,y2)); 
    384         }; 
    385         /*}}}*/ 
    386         function makeObj(a)/*{{{*/ 
    387         { 
    388             return { x: a[0], y: a[1], x2: a[2], y2: a[3], 
    389                 w: a[2] - a[0], h: a[3] - a[1] }; 
    390         }; 
    391         /*}}}*/ 
    392  
    393         return { 
    394             flipCoords: flipCoords, 
    395             setPressed: setPressed, 
    396             setCurrent: setCurrent, 
    397             getOffset: getOffset, 
    398             moveOffset: moveOffset, 
    399             getCorner: getCorner, 
    400             getFixed: getFixed 
    401         }; 
    402     }(); 
    403  
    404     /*}}}*/ 
    405     var Selection = function()/*{{{*/ 
    406     { 
    407         var start, end, dragmode, awake, hdep = 370; 
    408         var borders = { }; 
    409         var handle = { }; 
    410         var seehandles = false; 
    411         var hhs = options.handleOffset; 
    412  
    413         /* Insert draggable elements {{{*/ 
    414  
    415         // Insert border divs for outline 
    416         if (options.drawBorders) { 
    417             borders = { 
    418                     top: insertBorder('hline') 
    419                         .css('top',$.browser.msie?px(-1):px(0)), 
    420                     bottom: insertBorder('hline'), 
    421                     left: insertBorder('vline'), 
    422                     right: insertBorder('vline') 
    423             }; 
    424         } 
    425  
    426         // Insert handles on edges 
    427         if (options.dragEdges) { 
    428             handle.t = insertDragbar('n'); 
    429             handle.b = insertDragbar('s'); 
    430             handle.r = insertDragbar('e'); 
    431             handle.l = insertDragbar('w'); 
    432         } 
    433  
    434         // Insert side handles 
    435         options.sideHandles && 
    436             createHandles(['n','s','e','w']); 
    437  
    438         // Insert corner handles 
    439         options.cornerHandles && 
    440             createHandles(['sw','nw','ne','se']); 
    441  
    442         /*}}}*/ 
    443         // Private Methods 
    444         function insertBorder(type)/*{{{*/ 
    445         { 
    446             var jq = $('<div />') 
    447                 .css({position: 'absolute', opacity: options.borderOpacity }) 
    448                 .addClass(cssClass(type)); 
    449             $img_holder.append(jq); 
    450             return jq; 
    451         }; 
    452         /*}}}*/ 
    453         function dragDiv(ord,zi)/*{{{*/ 
    454         { 
    455             var jq = $('<div />') 
    456                 .mousedown(createDragger(ord)) 
    457                 .css({ 
    458                     cursor: ord+'-resize', 
    459                     position: 'absolute', 
    460                     zIndex: zi  
    461                 }) 
    462             ; 
    463             $hdl_holder.append(jq); 
    464             return jq; 
    465         }; 
    466         /*}}}*/ 
    467         function insertHandle(ord)/*{{{*/ 
    468         { 
    469             return dragDiv(ord,hdep++) 
    470                 .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity }) 
    471                 .addClass(cssClass('handle')); 
    472         }; 
    473         /*}}}*/ 
    474         function insertDragbar(ord)/*{{{*/ 
    475         { 
    476             var s = options.handleSize, 
    477                 o = hhs, 
    478                 h = s, w = s, 
    479                 t = o, l = o; 
    480  
    481             switch(ord) 
    482             { 
    483                 case 'n': case 's': w = pct(100); break; 
    484                 case 'e': case 'w': h = pct(100); break; 
    485             } 
    486  
    487             return dragDiv(ord,hdep++).width(w).height(h) 
    488                 .css({ top: px(-t+1), left: px(-l+1)}); 
    489         }; 
    490         /*}}}*/ 
    491         function createHandles(li)/*{{{*/ 
    492         { 
    493             for(i in li) handle[li[i]] = insertHandle(li[i]); 
    494         }; 
    495         /*}}}*/ 
    496         function moveHandles(c)/*{{{*/ 
    497         { 
    498             var midvert  = Math.round((c.h / 2) - hhs), 
    499                 midhoriz = Math.round((c.w / 2) - hhs), 
    500                 north = west = -hhs+1, 
    501                 east = c.w - hhs, 
    502                 south = c.h - hhs, 
    503                 x, y; 
    504  
    505             'e' in handle && 
    506                 handle.e.css({ top: px(midvert), left: px(east) }) && 
    507                 handle.w.css({ top: px(midvert) }) && 
    508                 handle.s.css({ top: px(south), left: px(midhoriz) }) && 
    509                 handle.n.css({ left: px(midhoriz) }); 
    510  
    511             'ne' in handle && 
    512                 handle.ne.css({ left: px(east) }) && 
    513                 handle.se.css({ top: px(south), left: px(east) }) && 
    514                 handle.sw.css({ top: px(south) }); 
    515  
    516             'b' in handle && 
    517                 handle.b.css({ top: px(south) }) && 
    518                 handle.r.css({ left: px(east) }); 
    519         }; 
    520         /*}}}*/ 
    521         function moveto(x,y)/*{{{*/ 
    522         { 
    523             $img2.css({ top: px(-y), left: px(-x) }); 
    524             $sel.css({ top: px(y), left: px(x) }); 
    525         }; 
    526         /*}}}*/ 
    527         function resize(w,h)/*{{{*/ 
    528         { 
    529             $sel.width(w).height(h); 
    530         }; 
    531         /*}}}*/ 
    532         function refresh()/*{{{*/ 
    533         { 
    534             var c = Coords.getFixed(); 
    535  
    536             Coords.setPressed([c.x,c.y]); 
    537             Coords.setCurrent([c.x2,c.y2]); 
    538  
    539             updateVisible(); 
    540         }; 
    541         /*}}}*/ 
    542  
    543         // Internal Methods 
    544         function updateVisible()/*{{{*/ 
    545             { if (awake) return update(); }; 
    546         /*}}}*/ 
    547         function update()/*{{{*/ 
    548         { 
    549             var c = Coords.getFixed(); 
    550  
    551             resize(c.w,c.h); 
    552             moveto(c.x,c.y); 
    553  
    554             options.drawBorders && 
    555                 borders['right'].css({ left: px(c.w-1) }) && 
    556                     borders['bottom'].css({ top: px(c.h-1) }); 
    557  
    558             seehandles && moveHandles(c); 
    559             awake || show(); 
    560  
    561             options.onChange(unscale(c)); 
    562         }; 
    563         /*}}}*/ 
    564         function show()/*{{{*/ 
    565         { 
    566             $sel.show(); 
    567             $img.css('opacity',options.bgOpacity); 
    568             awake = true; 
    569         }; 
    570         /*}}}*/ 
    571         function release()/*{{{*/ 
    572         { 
    573             disableHandles(); 
    574             $sel.hide(); 
    575             $img.css('opacity',1); 
    576             awake = false; 
    577         }; 
    578         /*}}}*/ 
    579         function showHandles()//{{{ 
    580         { 
    581             if (seehandles) 
    582             { 
    583                 moveHandles(Coords.getFixed()); 
    584                 $hdl_holder.show(); 
    585             } 
    586         }; 
    587         //}}} 
    588         function enableHandles()/*{{{*/ 
    589         {  
    590             seehandles = true; 
    591             if (options.allowResize) 
    592             { 
    593                 moveHandles(Coords.getFixed()); 
    594                 $hdl_holder.show(); 
    595                 return true; 
    596             } 
    597         }; 
    598         /*}}}*/ 
    599         function disableHandles()/*{{{*/ 
    600         { 
    601             seehandles = false; 
    602             $hdl_holder.hide(); 
    603         }; 
    604         /*}}}*/ 
    605         function animMode(v)/*{{{*/ 
    606         { 
    607             (animating = v) ? disableHandles(): enableHandles(); 
    608         }; 
    609         /*}}}*/ 
    610         function done()/*{{{*/ 
    611         { 
    612             animMode(false); 
    613             refresh(); 
    614         }; 
    615         /*}}}*/ 
    616  
    617         var $track = newTracker().mousedown(createDragger('move')) 
    618                 .css({ cursor: 'move', position: 'absolute', zIndex: 360 }) 
    619  
    620         $img_holder.append($track); 
    621         disableHandles(); 
    622  
    623         return { 
    624             updateVisible: updateVisible, 
    625             update: update, 
    626             release: release, 
    627             refresh: refresh, 
    628             setCursor: function (cursor) { $track.css('cursor',cursor); }, 
    629             enableHandles: enableHandles, 
    630             enableOnly: function() { seehandles = true; }, 
    631             showHandles: showHandles, 
    632             disableHandles: disableHandles, 
    633             animMode: animMode, 
    634             done: done 
    635         }; 
    636     }(); 
    637     /*}}}*/ 
    638     var Tracker = function()/*{{{*/ 
    639     { 
    640         var onMove      = function() { }, 
    641             onDone      = function() { }, 
    642             trackDoc    = options.trackDocument; 
    643  
    644         if (!trackDoc) 
    645         { 
    646             $trk 
    647                 .mousemove(trackMove) 
    648                 .mouseup(trackUp) 
    649                 .mouseout(trackUp) 
    650             ; 
    651         } 
    652  
    653         function toFront()/*{{{*/ 
    654         { 
    655             $trk.css({zIndex:450}); 
    656             if (trackDoc) 
    657             { 
    658                 $(document) 
    659                     .mousemove(trackMove) 
    660                     .mouseup(trackUp) 
    661                 ; 
    662             } 
    663         } 
    664         /*}}}*/ 
    665         function toBack()/*{{{*/ 
    666         { 
    667             $trk.css({zIndex:290}); 
    668             if (trackDoc) 
    669             { 
    670                 $(document) 
    671                     .unbind('mousemove',trackMove) 
    672                     .unbind('mouseup',trackUp) 
    673                 ; 
    674             } 
    675         } 
    676         /*}}}*/ 
    677         function trackMove(e)/*{{{*/ 
    678         { 
    679             onMove(mouseAbs(e)); 
    680         }; 
    681         /*}}}*/ 
    682         function trackUp(e)/*{{{*/ 
    683         { 
    684             e.preventDefault(); 
    685             e.stopPropagation(); 
    686  
    687             if (btndown) 
    688             { 
    689                 btndown = false; 
    690  
    691                 onDone(mouseAbs(e)); 
    692                 options.onSelect(unscale(Coords.getFixed())); 
    693                 toBack(); 
    694                 onMove = function() { }; 
    695                 onDone = function() { }; 
    696             } 
    697  
    698             return false; 
    699         }; 
    700         /*}}}*/ 
    701  
    702         function activateHandlers(move,done)/* {{{ */ 
    703         { 
    704             btndown = true; 
    705             onMove = move; 
    706             onDone = done; 
    707             toFront(); 
    708             return false; 
    709         }; 
    710         /* }}} */ 
    711  
    712         function setCursor(t) { $trk.css('cursor',t); }; 
    713  
    714         $img.before($trk); 
    715         return { 
    716             activateHandlers: activateHandlers, 
    717             setCursor: setCursor 
    718         }; 
    719     }(); 
    720     /*}}}*/ 
    721     var KeyManager = function()/*{{{*/ 
    722     { 
    723         var $keymgr = $('<input type="radio" />') 
    724                 .css({ position: 'absolute', left: '-30px' }) 
    725                 .keypress(parseKey) 
    726                 .blur(onBlur), 
    727  
    728             $keywrap = $('<div />') 
    729                 .css({ 
    730                     position: 'absolute', 
    731                     overflow: 'hidden' 
    732                 }) 
    733                 .append($keymgr) 
    734         ; 
    735  
    736         function watchKeys()/*{{{*/ 
    737         { 
    738             if (options.keySupport) 
    739             { 
    740                 $keymgr.show(); 
    741                 $keymgr.focus(); 
    742             } 
    743         }; 
    744         /*}}}*/ 
    745         function onBlur(e)/*{{{*/ 
    746         { 
    747             $keymgr.hide(); 
    748         }; 
    749         /*}}}*/ 
    750         function doNudge(e,x,y)/*{{{*/ 
    751         { 
    752             if (options.allowMove) { 
    753                 Coords.moveOffset([x,y]); 
    754                 Selection.updateVisible(); 
    755             }; 
    756             e.preventDefault(); 
    757             e.stopPropagation(); 
    758         }; 
    759         /*}}}*/ 
    760         function parseKey(e)/*{{{*/ 
    761         { 
    762             if (e.ctrlKey) return true; 
    763             shift_down = e.shiftKey ? true : false; 
    764             var nudge = shift_down ? 10 : 1; 
    765             switch(e.keyCode) 
    766             { 
    767                 case 37: doNudge(e,-nudge,0); break; 
    768                 case 39: doNudge(e,nudge,0); break; 
    769                 case 38: doNudge(e,0,-nudge); break; 
    770                 case 40: doNudge(e,0,nudge); break; 
    771  
    772                 case 27: Selection.release(); break; 
    773  
    774                 case 9: return true; 
    775             } 
    776  
    777             return nothing(e); 
    778         }; 
    779         /*}}}*/ 
    780          
    781         if (options.keySupport) $keywrap.insertBefore($img); 
    782         return { 
    783             watchKeys: watchKeys 
    784         }; 
    785     }(); 
    786     /*}}}*/ 
    787  
    788     // }}} 
    789     // Internal Methods {{{ 
    790  
    791     function px(n) { return '' + parseInt(n) + 'px'; }; 
    792     function pct(n) { return '' + parseInt(n) + '%'; }; 
    793     function cssClass(cl) { return options.baseClass + '-' + cl; }; 
    794     function getPos(obj)/*{{{*/ 
    795     { 
    796         // Updated in v0.9.4 to use built-in dimensions plugin 
    797         var pos = $(obj).offset(); 
    798         return [ pos.left, pos.top ]; 
    799     }; 
    800     /*}}}*/ 
    801     function mouseAbs(e)/*{{{*/ 
    802     { 
    803         return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ]; 
    804     }; 
    805     /*}}}*/ 
    806     function myCursor(type)/*{{{*/ 
    807     { 
    808         if (type != lastcurs) 
    809         { 
    810             Tracker.setCursor(type); 
    811             //Handles.xsetCursor(type); 
    812             lastcurs = type; 
    813         } 
    814     }; 
    815     /*}}}*/ 
    816     function startDragMode(mode,pos)/*{{{*/ 
    817     { 
    818         docOffset = getPos($img); 
    819         Tracker.setCursor(mode=='move'?mode:mode+'-resize'); 
    820  
    821         if (mode == 'move') 
    822             return Tracker.activateHandlers(createMover(pos), doneSelect); 
    823  
    824         var fc = Coords.getFixed(); 
    825         var opp = oppLockCorner(mode); 
    826         var opc = Coords.getCorner(oppLockCorner(opp)); 
    827  
    828         Coords.setPressed(Coords.getCorner(opp)); 
    829         Coords.setCurrent(opc); 
    830  
    831         Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect); 
    832     }; 
    833     /*}}}*/ 
    834     function dragmodeHandler(mode,f)/*{{{*/ 
    835     { 
    836         return function(pos) { 
    837             if (!options.aspectRatio) switch(mode) 
    838             { 
    839                 case 'e': pos[1] = f.y2; break; 
    840                 case 'w': pos[1] = f.y2; break; 
    841                 case 'n': pos[0] = f.x2; break; 
    842                 case 's': pos[0] = f.x2; break; 
    843             } 
    844             else switch(mode) 
    845             { 
    846                 case 'e': pos[1] = f.y+1; break; 
    847                 case 'w': pos[1] = f.y+1; break; 
    848                 case 'n': pos[0] = f.x+1; break; 
    849                 case 's': pos[0] = f.x+1; break; 
    850             } 
    851             Coords.setCurrent(pos); 
    852             Selection.update(); 
    853         }; 
    854     }; 
    855     /*}}}*/ 
    856     function createMover(pos)/*{{{*/ 
    857     { 
    858         var lloc = pos; 
    859         KeyManager.watchKeys(); 
    860  
    861         return function(pos) 
    862         { 
    863             Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); 
    864             lloc = pos; 
    865              
    866             Selection.update(); 
    867         }; 
    868     }; 
    869     /*}}}*/ 
    870     function oppLockCorner(ord)/*{{{*/ 
    871     { 
    872         switch(ord) 
    873         { 
    874             case 'n': return 'sw'; 
    875             case 's': return 'nw'; 
    876             case 'e': return 'nw'; 
    877             case 'w': return 'ne'; 
    878             case 'ne': return 'sw'; 
    879             case 'nw': return 'se'; 
    880             case 'se': return 'nw'; 
    881             case 'sw': return 'ne'; 
    882         }; 
    883     }; 
    884     /*}}}*/ 
    885     function createDragger(ord)/*{{{*/ 
    886     { 
    887         return function(e) { 
    888             if (options.disabled) return false; 
    889             if ((ord == 'move') && !options.allowMove) return false; 
    890             btndown = true; 
    891             startDragMode(ord,mouseAbs(e)); 
    892             e.stopPropagation(); 
    893             e.preventDefault(); 
    894             return false; 
    895         }; 
    896     }; 
    897     /*}}}*/ 
    898     function presize($obj,w,h)/*{{{*/ 
    899     { 
    900         var nw = $obj.width(), nh = $obj.height(); 
    901         if ((nw > w) && w > 0) 
    902         { 
    903             nw = w; 
    904             nh = (w/$obj.width()) * $obj.height(); 
    905         } 
    906         if ((nh > h) && h > 0) 
    907         { 
    908             nh = h; 
    909             nw = (h/$obj.height()) * $obj.width(); 
    910         } 
    911         xscale = $obj.width() / nw; 
    912         yscale = $obj.height() / nh; 
    913         $obj.width(nw).height(nh); 
    914     }; 
    915     /*}}}*/ 
    916     function unscale(c)/*{{{*/ 
    917     { 
    918         return { 
    919             x: parseInt(c.x * xscale), y: parseInt(c.y * yscale),  
    920             x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale),  
    921             w: parseInt(c.w * xscale), h: parseInt(c.h * yscale) 
    922         }; 
    923     }; 
    924     /*}}}*/ 
    925     function doneSelect(pos)/*{{{*/ 
    926     { 
    927         var c = Coords.getFixed(); 
    928         if (c.w > options.minSelect[0] && c.h > options.minSelect[1]) 
    929         { 
    930             Selection.enableHandles(); 
    931             Selection.done(); 
    932         } 
    933         else 
    934         { 
    935             Selection.release(); 
    936         } 
    937         Tracker.setCursor( options.allowSelect?'crosshair':'default' ); 
    938     }; 
    939     /*}}}*/ 
    940     function newSelection(e)/*{{{*/ 
    941     { 
    942         if (options.disabled) return false; 
    943         if (!options.allowSelect) return false; 
    944         btndown = true; 
    945         docOffset = getPos($img); 
    946         Selection.disableHandles(); 
    947         myCursor('crosshair'); 
    948         var pos = mouseAbs(e); 
    949         Coords.setPressed(pos); 
    950         Tracker.activateHandlers(selectDrag,doneSelect); 
    951         KeyManager.watchKeys(); 
    952         Selection.update(); 
    953  
    954         e.stopPropagation(); 
    955         e.preventDefault(); 
    956         return false; 
    957     }; 
    958     /*}}}*/ 
    959     function selectDrag(pos)/*{{{*/ 
    960     { 
    961         Coords.setCurrent(pos); 
    962         Selection.update(); 
    963     }; 
    964     /*}}}*/ 
    965     function newTracker() 
    966     { 
    967         var trk = $('<div></div>').addClass(cssClass('tracker')); 
    968         $.browser.msie && trk.css({ opacity: 0, backgroundColor: 'white' }); 
    969         return trk; 
    970     }; 
    971  
    972     // }}} 
    973     // API methods {{{ 
    974          
    975     function animateTo(a)/*{{{*/ 
    976     { 
    977         var x1 = a[0] / xscale, 
    978             y1 = a[1] / yscale, 
    979             x2 = a[2] / xscale, 
    980             y2 = a[3] / yscale; 
    981  
    982         if (animating) return; 
    983  
    984         var animto = Coords.flipCoords(x1,y1,x2,y2); 
    985         var c = Coords.getFixed(); 
    986         var animat = initcr = [ c.x, c.y, c.x2, c.y2 ]; 
    987         var interv = options.animationDelay; 
    988  
    989         var x = animat[0]; 
    990         var y = animat[1]; 
    991         var x2 = animat[2]; 
    992         var y2 = animat[3]; 
    993         var ix1 = animto[0] - initcr[0]; 
    994         var iy1 = animto[1] - initcr[1]; 
    995         var ix2 = animto[2] - initcr[2]; 
    996         var iy2 = animto[3] - initcr[3]; 
    997         var pcent = 0; 
    998         var velocity = options.swingSpeed; 
    999  
    1000         Selection.animMode(true); 
    1001  
    1002         var animator = function() 
    1003         { 
    1004             return function() 
    1005             { 
    1006                 pcent += (100 - pcent) / velocity; 
    1007  
    1008                 animat[0] = x + ((pcent / 100) * ix1); 
    1009                 animat[1] = y + ((pcent / 100) * iy1); 
    1010                 animat[2] = x2 + ((pcent / 100) * ix2); 
    1011                 animat[3] = y2 + ((pcent / 100) * iy2); 
    1012  
    1013                 if (pcent < 100) animateStart(); 
    1014                     else Selection.done(); 
    1015  
    1016                 if (pcent >= 99.8) pcent = 100; 
    1017  
    1018                 setSelectRaw(animat); 
    1019             }; 
    1020         }(); 
    1021  
    1022         function animateStart() 
    1023             { window.setTimeout(animator,interv); }; 
    1024  
    1025         animateStart(); 
    1026     }; 
    1027     /*}}}*/ 
    1028     function setSelect(rect)//{{{ 
    1029     { 
    1030         setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]); 
    1031     }; 
    1032     //}}} 
    1033     function setSelectRaw(l) /*{{{*/ 
    1034     { 
    1035         Coords.setPressed([l[0],l[1]]); 
    1036         Coords.setCurrent([l[2],l[3]]); 
    1037         Selection.update(); 
    1038     }; 
    1039     /*}}}*/ 
    1040     function setOptions(opt)/*{{{*/ 
    1041     { 
    1042         if (typeof(opt) != 'object') opt = { }; 
    1043         options = $.extend(options,opt); 
    1044  
    1045         if (typeof(options.onChange)!=='function') 
    1046             options.onChange = function() { }; 
    1047  
    1048         if (typeof(options.onSelect)!=='function') 
    1049             options.onSelect = function() { }; 
    1050  
    1051     }; 
    1052     /*}}}*/ 
    1053     function tellSelect()/*{{{*/ 
    1054     { 
    1055         return unscale(Coords.getFixed()); 
    1056     }; 
    1057     /*}}}*/ 
    1058     function tellScaled()/*{{{*/ 
    1059     { 
    1060         return Coords.getFixed(); 
    1061     }; 
    1062     /*}}}*/ 
    1063     function setOptionsNew(opt)/*{{{*/ 
    1064     { 
    1065         setOptions(opt); 
    1066         interfaceUpdate(); 
    1067     }; 
    1068     /*}}}*/ 
    1069     function disableCrop()//{{{ 
    1070     { 
    1071         options.disabled = true; 
    1072         Selection.disableHandles(); 
    1073         Selection.setCursor('default'); 
    1074         Tracker.setCursor('default'); 
    1075     }; 
    1076     //}}} 
    1077     function enableCrop()//{{{ 
    1078     { 
    1079         options.disabled = false; 
    1080         interfaceUpdate(); 
    1081     }; 
    1082     //}}} 
    1083     function cancelCrop()//{{{ 
    1084     { 
    1085         Selection.done(); 
    1086         Tracker.activateHandlers(null,null); 
    1087     }; 
    1088     //}}} 
    1089     function destroy()//{{{ 
    1090     { 
    1091         $div.remove(); 
    1092         $origimg.show(); 
    1093     }; 
    1094     //}}} 
    1095  
    1096     function interfaceUpdate(alt)//{{{ 
    1097     // This method tweaks the interface based on options object. 
    1098     // Called when options are changed and at end of initialization. 
    1099     { 
    1100         options.allowResize ? 
    1101             alt?Selection.enableOnly():Selection.enableHandles(): 
    1102             Selection.disableHandles(); 
    1103  
    1104         Tracker.setCursor( options.allowSelect? 'crosshair': 'default' ); 
    1105         Selection.setCursor( options.allowMove? 'move': 'default' ); 
    1106  
    1107         $div.css('backgroundColor',options.bgColor); 
    1108  
    1109         if ('setSelect' in options) { 
    1110             setSelect(opt.setSelect); 
    1111             Selection.done(); 
    1112             delete(options.setSelect); 
    1113         } 
    1114  
    1115         if ('trueSize' in options) { 
    1116             xscale = options.trueSize[0] / boundx; 
    1117             yscale = options.trueSize[1] / boundy; 
    1118         } 
    1119  
    1120         xlimit = options.maxSize[0] || 0; 
    1121         ylimit = options.maxSize[1] || 0; 
    1122         xmin = options.minSize[0] || 0; 
    1123         ymin = options.minSize[1] || 0; 
    1124  
    1125         if ('outerImage' in options) 
    1126         { 
    1127             $img.attr('src',options.outerImage); 
    1128             delete(options.outerImage); 
    1129         } 
    1130  
    1131         Selection.refresh(); 
    1132     }; 
    1133     //}}} 
    1134  
    1135     // }}} 
    1136  
    1137     $hdl_holder.hide(); 
    1138     interfaceUpdate(true); 
    1139      
    1140     var api = { 
    1141         animateTo: animateTo, 
    1142         setSelect: setSelect, 
    1143         setOptions: setOptionsNew, 
    1144         tellSelect: tellSelect, 
    1145         tellScaled: tellScaled, 
    1146  
    1147         disable: disableCrop, 
    1148         enable: enableCrop, 
    1149         cancel: cancelCrop, 
    1150  
    1151         focus: KeyManager.watchKeys, 
    1152  
    1153         getBounds: function() { return [ boundx * xscale, boundy * yscale ]; }, 
    1154         getWidgetSize: function() { return [ boundx, boundy ]; }, 
    1155  
    1156         release: Selection.release, 
    1157         destroy: destroy 
    1158  
    1159     }; 
    1160  
    1161     $origimg.data('Jcrop',api); 
    1162     return api; 
    1163 }; 
    1164  
    1165 $.fn.Jcrop = function(options)/*{{{*/ 
    1166 { 
    1167     function attachWhenDone(from)/*{{{*/ 
    1168     { 
    1169         var loadsrc = options.useImg || from.src; 
    1170         var img = new Image(); 
    1171         img.onload = function() { $.Jcrop(from,options); }; 
    1172         img.src = loadsrc; 
    1173     }; 
    1174     /*}}}*/ 
    1175     if (typeof(options) !== 'object') options = { }; 
    1176  
    1177     // Iterate over each object, attach Jcrop 
    1178     this.each(function() 
    1179     { 
    1180         // If we've already attached to this object 
    1181         if ($(this).data('Jcrop')) 
    1182         { 
    1183             // The API can be requested this way (undocumented) 
    1184             if (options == 'api') return $(this).data('Jcrop'); 
    1185             // Otherwise, we just reset the options... 
    1186             else $(this).data('Jcrop').setOptions(options); 
    1187         } 
    1188         // If we haven't been attached, preload and attach 
    1189         else attachWhenDone(this); 
    1190     }); 
    1191  
    1192     // Return "this" so we're chainable a la jQuery plugin-style! 
    1193     return this; 
    1194 }; 
    1195 /*}}}*/ 
    1196  
    1197 })(jQuery); 
     32(function ($) { 
     33 
     34  $.Jcrop = function (obj, opt) { 
     35    var options = $.extend({}, $.Jcrop.defaults), 
     36        docOffset, lastcurs, ie6mode = false; 
     37 
     38    // Internal Methods {{{ 
     39    function px(n) { 
     40      return n + 'px'; 
     41    } 
     42    function cssClass(cl) { 
     43      return options.baseClass + '-' + cl; 
     44    } 
     45    function supportsColorFade() { 
     46      return $.fx.step.hasOwnProperty('backgroundColor'); 
     47    } 
     48    function getPos(obj) //{{{ 
     49    { 
     50      var pos = $(obj).offset(); 
     51      return [pos.left, pos.top]; 
     52    } 
     53    //}}} 
     54    function mouseAbs(e) //{{{ 
     55    { 
     56      return [(e.pageX - docOffset[0]), (e.pageY - docOffset[1])]; 
     57    } 
     58    //}}} 
     59    function setOptions(opt) //{{{ 
     60    { 
     61      if (typeof(opt) !== 'object') opt = {}; 
     62      options = $.extend(options, opt); 
     63 
     64      $.each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) { 
     65        if (typeof(options[e]) !== 'function') options[e] = function () {}; 
     66      }); 
     67    } 
     68    //}}} 
     69    function startDragMode(mode, pos) //{{{ 
     70    { 
     71      docOffset = getPos($img); 
     72      Tracker.setCursor(mode === 'move' ? mode : mode + '-resize'); 
     73 
     74      if (mode === 'move') { 
     75        return Tracker.activateHandlers(createMover(pos), doneSelect); 
     76      } 
     77 
     78      var fc = Coords.getFixed(); 
     79      var opp = oppLockCorner(mode); 
     80      var opc = Coords.getCorner(oppLockCorner(opp)); 
     81 
     82      Coords.setPressed(Coords.getCorner(opp)); 
     83      Coords.setCurrent(opc); 
     84 
     85      Tracker.activateHandlers(dragmodeHandler(mode, fc), doneSelect); 
     86    } 
     87    //}}} 
     88    function dragmodeHandler(mode, f) //{{{ 
     89    { 
     90      return function (pos) { 
     91        if (!options.aspectRatio) { 
     92          switch (mode) { 
     93          case 'e': 
     94            pos[1] = f.y2; 
     95            break; 
     96          case 'w': 
     97            pos[1] = f.y2; 
     98            break; 
     99          case 'n': 
     100            pos[0] = f.x2; 
     101            break; 
     102          case 's': 
     103            pos[0] = f.x2; 
     104            break; 
     105          } 
     106        } else { 
     107          switch (mode) { 
     108          case 'e': 
     109            pos[1] = f.y + 1; 
     110            break; 
     111          case 'w': 
     112            pos[1] = f.y + 1; 
     113            break; 
     114          case 'n': 
     115            pos[0] = f.x + 1; 
     116            break; 
     117          case 's': 
     118            pos[0] = f.x + 1; 
     119            break; 
     120          } 
     121        } 
     122        Coords.setCurrent(pos); 
     123        Selection.update(); 
     124      }; 
     125    } 
     126    //}}} 
     127    function createMover(pos) //{{{ 
     128    { 
     129      var lloc = pos; 
     130      KeyManager.watchKeys(); 
     131 
     132      return function (pos) { 
     133        Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]); 
     134        lloc = pos; 
     135 
     136        Selection.update(); 
     137      }; 
     138    } 
     139    //}}} 
     140    function oppLockCorner(ord) //{{{ 
     141    { 
     142      switch (ord) { 
     143      case 'n': 
     144        return 'sw'; 
     145      case 's': 
     146        return 'nw'; 
     147      case 'e': 
     148        return 'nw'; 
     149      case 'w': 
     150        return 'ne'; 
     151      case 'ne': 
     152        return 'sw'; 
     153      case 'nw': 
     154        return 'se'; 
     155      case 'se': 
     156        return 'nw'; 
     157      case 'sw': 
     158        return 'ne'; 
     159      } 
     160    } 
     161    //}}} 
     162    function createDragger(ord) //{{{ 
     163    { 
     164      return function (e) { 
     165        if (options.disabled) { 
     166          return false; 
     167        } 
     168        if ((ord === 'move') && !options.allowMove) { 
     169          return false; 
     170        } 
     171         
     172        // Fix position of crop area when dragged the very first time. 
     173        // Necessary when crop image is in a hidden element when page is loaded. 
     174        docOffset = getPos($img); 
     175 
     176        btndown = true; 
     177        startDragMode(ord, mouseAbs(e)); 
     178        e.stopPropagation(); 
     179        e.preventDefault(); 
     180        return false; 
     181      }; 
     182    } 
     183    //}}} 
     184    function presize($obj, w, h) //{{{ 
     185    { 
     186      var nw = $obj.width(), 
     187          nh = $obj.height(); 
     188      if ((nw > w) && w > 0) { 
     189        nw = w; 
     190        nh = (w / $obj.width()) * $obj.height(); 
     191      } 
     192      if ((nh > h) && h > 0) { 
     193        nh = h; 
     194        nw = (h / $obj.height()) * $obj.width(); 
     195      } 
     196      xscale = $obj.width() / nw; 
     197      yscale = $obj.height() / nh; 
     198      $obj.width(nw).height(nh); 
     199    } 
     200    //}}} 
     201    function unscale(c) //{{{ 
     202    { 
     203      return { 
     204        x: c.x * xscale, 
     205        y: c.y * yscale, 
     206        x2: c.x2 * xscale, 
     207        y2: c.y2 * yscale, 
     208        w: c.w * xscale, 
     209        h: c.h * yscale 
     210      }; 
     211    } 
     212    //}}} 
     213    function doneSelect(pos) //{{{ 
     214    { 
     215      var c = Coords.getFixed(); 
     216      if ((c.w > options.minSelect[0]) && (c.h > options.minSelect[1])) { 
     217        Selection.enableHandles(); 
     218        Selection.done(); 
     219      } else { 
     220        Selection.release(); 
     221      } 
     222      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); 
     223    } 
     224    //}}} 
     225    function newSelection(e) //{{{ 
     226    { 
     227      if (options.disabled) { 
     228        return false; 
     229      } 
     230      if (!options.allowSelect) { 
     231        return false; 
     232      } 
     233      btndown = true; 
     234      docOffset = getPos($img); 
     235      Selection.disableHandles(); 
     236      Tracker.setCursor('crosshair'); 
     237      var pos = mouseAbs(e); 
     238      Coords.setPressed(pos); 
     239      Selection.update(); 
     240      Tracker.activateHandlers(selectDrag, doneSelect); 
     241      KeyManager.watchKeys(); 
     242 
     243      e.stopPropagation(); 
     244      e.preventDefault(); 
     245      return false; 
     246    } 
     247    //}}} 
     248    function selectDrag(pos) //{{{ 
     249    { 
     250      Coords.setCurrent(pos); 
     251      Selection.update(); 
     252    } 
     253    //}}} 
     254    function newTracker() //{{{ 
     255    { 
     256      var trk = $('<div></div>').addClass(cssClass('tracker')); 
     257      if ($.browser.msie) { 
     258        trk.css({ 
     259          opacity: 0, 
     260          backgroundColor: 'white' 
     261        }); 
     262      } 
     263      return trk; 
     264    } 
     265    //}}} 
     266 
     267    // }}} 
     268    // Initialization {{{ 
     269    // Sanitize some options {{{ 
     270    if ($.browser.msie && ($.browser.version.split('.')[0] === '6')) { 
     271      ie6mode = true; 
     272    } 
     273    if (typeof(obj) !== 'object') { 
     274      obj = $(obj)[0]; 
     275    } 
     276    if (typeof(opt) !== 'object') { 
     277      opt = {}; 
     278    } 
     279    // }}} 
     280    setOptions(opt); 
     281    // Initialize some jQuery objects {{{ 
     282    // The values are SET on the image(s) for the interface 
     283    // If the original image has any of these set, they will be reset 
     284    // However, if you destroy() the Jcrop instance the original image's 
     285    // character in the DOM will be as you left it. 
     286    var img_css = { 
     287      border: 'none', 
     288      visibility: 'visible', 
     289      margin: 0, 
     290      padding: 0, 
     291      position: 'absolute', 
     292      top: 0, 
     293      left: 0 
     294    }; 
     295 
     296    var $origimg = $(obj), 
     297      img_mode = true; 
     298 
     299    if (obj.tagName == 'IMG') { 
     300      // Fix size of crop image. 
     301      // Necessary when crop image is within a hidden element when page is loaded. 
     302      if ($origimg[0].width != 0 && $origimg[0].height != 0) { 
     303        // Obtain dimensions from contained img element. 
     304        $origimg.width($origimg[0].width); 
     305        $origimg.height($origimg[0].height); 
     306      } else { 
     307        // Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0).  
     308        var tempImage = new Image(); 
     309        tempImage.src = $origimg[0].src; 
     310        $origimg.width(tempImage.width); 
     311        $origimg.height(tempImage.height); 
     312      }  
     313 
     314      var $img = $origimg.clone().removeAttr('id').css(img_css).show(); 
     315 
     316      $img.width($origimg.width()); 
     317      $img.height($origimg.height()); 
     318      $origimg.after($img).hide(); 
     319 
     320    } else { 
     321      $img = $origimg.css(img_css).show(); 
     322      img_mode = false; 
     323      if (options.shade === null) { options.shade = true; } 
     324    } 
     325 
     326    presize($img, options.boxWidth, options.boxHeight); 
     327 
     328    var boundx = $img.width(), 
     329        boundy = $img.height(), 
     330         
     331         
     332        $div = $('<div />').width(boundx).height(boundy).addClass(cssClass('holder')).css({ 
     333        position: 'relative', 
     334        backgroundColor: options.bgColor 
     335      }).insertAfter($origimg).append($img); 
     336 
     337    if (options.addClass) { 
     338      $div.addClass(options.addClass); 
     339    } 
     340 
     341    var $img2 = $('<div />'), 
     342 
     343        $img_holder = $('<div />')  
     344        .width('100%').height('100%').css({ 
     345          zIndex: 310, 
     346          position: 'absolute', 
     347          overflow: 'hidden' 
     348        }), 
     349 
     350        $hdl_holder = $('<div />')  
     351        .width('100%').height('100%').css('zIndex', 320),  
     352 
     353        $sel = $('<div />')  
     354        .css({ 
     355          position: 'absolute', 
     356          zIndex: 600 
     357        }).dblclick(function(){ 
     358          var c = Coords.getFixed(); 
     359          options.onDblClick.call(api,c); 
     360        }).insertBefore($img).append($img_holder, $hdl_holder);  
     361 
     362    if (img_mode) { 
     363 
     364      $img2 = $('<img />') 
     365          .attr('src', $img.attr('src')).css(img_css).width(boundx).height(boundy), 
     366 
     367      $img_holder.append($img2); 
     368 
     369    } 
     370 
     371    if (ie6mode) { 
     372      $sel.css({ 
     373        overflowY: 'hidden' 
     374      }); 
     375    } 
     376 
     377    var bound = options.boundary; 
     378    var $trk = newTracker().width(boundx + (bound * 2)).height(boundy + (bound * 2)).css({ 
     379      position: 'absolute', 
     380      top: px(-bound), 
     381      left: px(-bound), 
     382      zIndex: 290 
     383    }).mousedown(newSelection); 
     384 
     385    /* }}} */ 
     386    // Set more variables {{{ 
     387    var bgcolor = options.bgColor, 
     388        bgopacity = options.bgOpacity, 
     389        xlimit, ylimit, xmin, ymin, xscale, yscale, enabled = true, 
     390        btndown, animating, shift_down; 
     391 
     392    docOffset = getPos($img); 
     393    // }}} 
     394    // }}} 
     395    // Internal Modules {{{ 
     396    // Touch Module {{{  
     397    var Touch = (function () { 
     398      // Touch support detection function adapted (under MIT License) 
     399      // from code by Jeffrey Sambells - http://github.com/iamamused/ 
     400      function hasTouchSupport() { 
     401        var support = {}, 
     402            events = ['touchstart', 'touchmove', 'touchend'], 
     403            el = document.createElement('div'), i; 
     404 
     405        try { 
     406          for(i=0; i<events.length; i++) { 
     407            var eventName = events[i]; 
     408            eventName = 'on' + eventName; 
     409            var isSupported = (eventName in el); 
     410            if (!isSupported) { 
     411              el.setAttribute(eventName, 'return;'); 
     412              isSupported = typeof el[eventName] == 'function'; 
     413            } 
     414            support[events[i]] = isSupported; 
     415          } 
     416          return support.touchstart && support.touchend && support.touchmove; 
     417        } 
     418        catch(err) { 
     419          return false; 
     420        } 
     421      } 
     422 
     423      function detectSupport() { 
     424        if ((options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport; 
     425          else return hasTouchSupport(); 
     426      } 
     427      return { 
     428        createDragger: function (ord) { 
     429          return function (e) { 
     430            e.pageX = e.originalEvent.changedTouches[0].pageX; 
     431            e.pageY = e.originalEvent.changedTouches[0].pageY; 
     432            if (options.disabled) { 
     433              return false; 
     434            } 
     435            if ((ord === 'move') && !options.allowMove) { 
     436              return false; 
     437            } 
     438            btndown = true; 
     439            startDragMode(ord, mouseAbs(e)); 
     440            e.stopPropagation(); 
     441            e.preventDefault(); 
     442            return false; 
     443          }; 
     444        }, 
     445        newSelection: function (e) { 
     446          e.pageX = e.originalEvent.changedTouches[0].pageX; 
     447          e.pageY = e.originalEvent.changedTouches[0].pageY; 
     448          return newSelection(e); 
     449        }, 
     450        isSupported: hasTouchSupport, 
     451        support: detectSupport() 
     452      }; 
     453    }()); 
     454    // }}} 
     455    // Coords Module {{{ 
     456    var Coords = (function () { 
     457      var x1 = 0, 
     458          y1 = 0, 
     459          x2 = 0, 
     460          y2 = 0, 
     461          ox, oy; 
     462 
     463      function setPressed(pos) //{{{ 
     464      { 
     465        pos = rebound(pos); 
     466        x2 = x1 = pos[0]; 
     467        y2 = y1 = pos[1]; 
     468      } 
     469      //}}} 
     470      function setCurrent(pos) //{{{ 
     471      { 
     472        pos = rebound(pos); 
     473        ox = pos[0] - x2; 
     474        oy = pos[1] - y2; 
     475        x2 = pos[0]; 
     476        y2 = pos[1]; 
     477      } 
     478      //}}} 
     479      function getOffset() //{{{ 
     480      { 
     481        return [ox, oy]; 
     482      } 
     483      //}}} 
     484      function moveOffset(offset) //{{{ 
     485      { 
     486        var ox = offset[0], 
     487            oy = offset[1]; 
     488 
     489        if (0 > x1 + ox) { 
     490          ox -= ox + x1; 
     491        } 
     492        if (0 > y1 + oy) { 
     493          oy -= oy + y1; 
     494        } 
     495 
     496        if (boundy < y2 + oy) { 
     497          oy += boundy - (y2 + oy); 
     498        } 
     499        if (boundx < x2 + ox) { 
     500          ox += boundx - (x2 + ox); 
     501        } 
     502 
     503        x1 += ox; 
     504        x2 += ox; 
     505        y1 += oy; 
     506        y2 += oy; 
     507      } 
     508      //}}} 
     509      function getCorner(ord) //{{{ 
     510      { 
     511        var c = getFixed(); 
     512        switch (ord) { 
     513        case 'ne': 
     514          return [c.x2, c.y]; 
     515        case 'nw': 
     516          return [c.x, c.y]; 
     517        case 'se': 
     518          return [c.x2, c.y2]; 
     519        case 'sw': 
     520          return [c.x, c.y2]; 
     521        } 
     522      } 
     523      //}}} 
     524      function getFixed() //{{{ 
     525      { 
     526        if (!options.aspectRatio) { 
     527          return getRect(); 
     528        } 
     529        // This function could use some optimization I think... 
     530        var aspect = options.aspectRatio, 
     531            min_x = options.minSize[0] / xscale, 
     532             
     533             
     534            //min_y = options.minSize[1]/yscale, 
     535            max_x = options.maxSize[0] / xscale, 
     536            max_y = options.maxSize[1] / yscale, 
     537            rw = x2 - x1, 
     538            rh = y2 - y1, 
     539            rwa = Math.abs(rw), 
     540            rha = Math.abs(rh), 
     541            real_ratio = rwa / rha, 
     542            xx, yy, w, h; 
     543 
     544        if (max_x === 0) { 
     545          max_x = boundx * 10; 
     546        } 
     547        if (max_y === 0) { 
     548          max_y = boundy * 10; 
     549        } 
     550        if (real_ratio < aspect) { 
     551          yy = y2; 
     552          w = rha * aspect; 
     553          xx = rw < 0 ? x1 - w : w + x1; 
     554 
     555          if (xx < 0) { 
     556            xx = 0; 
     557            h = Math.abs((xx - x1) / aspect); 
     558            yy = rh < 0 ? y1 - h : h + y1; 
     559          } else if (xx > boundx) { 
     560            xx = boundx; 
     561            h = Math.abs((xx - x1) / aspect); 
     562            yy = rh < 0 ? y1 - h : h + y1; 
     563          } 
     564        } else { 
     565          xx = x2; 
     566          h = rwa / aspect; 
     567          yy = rh < 0 ? y1 - h : y1 + h; 
     568          if (yy < 0) { 
     569            yy = 0; 
     570            w = Math.abs((yy - y1) * aspect); 
     571            xx = rw < 0 ? x1 - w : w + x1; 
     572          } else if (yy > boundy) { 
     573            yy = boundy; 
     574            w = Math.abs(yy - y1) * aspect; 
     575            xx = rw < 0 ? x1 - w : w + x1; 
     576          } 
     577        } 
     578 
     579        // Magic %-) 
     580        if (xx > x1) { // right side 
     581          if (xx - x1 < min_x) { 
     582            xx = x1 + min_x; 
     583          } else if (xx - x1 > max_x) { 
     584            xx = x1 + max_x; 
     585          } 
     586          if (yy > y1) { 
     587            yy = y1 + (xx - x1) / aspect; 
     588          } else { 
     589            yy = y1 - (xx - x1) / aspect; 
     590          } 
     591        } else if (xx < x1) { // left side 
     592          if (x1 - xx < min_x) { 
     593            xx = x1 - min_x; 
     594          } else if (x1 - xx > max_x) { 
     595            xx = x1 - max_x; 
     596          } 
     597          if (yy > y1) { 
     598            yy = y1 + (x1 - xx) / aspect; 
     599          } else { 
     600            yy = y1 - (x1 - xx) / aspect; 
     601          } 
     602        } 
     603 
     604        if (xx < 0) { 
     605          x1 -= xx; 
     606          xx = 0; 
     607        } else if (xx > boundx) { 
     608          x1 -= xx - boundx; 
     609          xx = boundx; 
     610        } 
     611 
     612        if (yy < 0) { 
     613          y1 -= yy; 
     614          yy = 0; 
     615        } else if (yy > boundy) { 
     616          y1 -= yy - boundy; 
     617          yy = boundy; 
     618        } 
     619 
     620        return makeObj(flipCoords(x1, y1, xx, yy)); 
     621      } 
     622      //}}} 
     623      function rebound(p) //{{{ 
     624      { 
     625        if (p[0] < 0) { 
     626          p[0] = 0; 
     627        } 
     628        if (p[1] < 0) { 
     629          p[1] = 0; 
     630        } 
     631 
     632        if (p[0] > boundx) { 
     633          p[0] = boundx; 
     634        } 
     635        if (p[1] > boundy) { 
     636          p[1] = boundy; 
     637        } 
     638 
     639        return [p[0], p[1]]; 
     640      } 
     641      //}}} 
     642      function flipCoords(x1, y1, x2, y2) //{{{ 
     643      { 
     644        var xa = x1, 
     645            xb = x2, 
     646            ya = y1, 
     647            yb = y2; 
     648        if (x2 < x1) { 
     649          xa = x2; 
     650          xb = x1; 
     651        } 
     652        if (y2 < y1) { 
     653          ya = y2; 
     654          yb = y1; 
     655        } 
     656        return [xa, ya, xb, yb]; 
     657      } 
     658      //}}} 
     659      function getRect() //{{{ 
     660      { 
     661        var xsize = x2 - x1, 
     662            ysize = y2 - y1, 
     663            delta; 
     664 
     665        if (xlimit && (Math.abs(xsize) > xlimit)) { 
     666          x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit); 
     667        } 
     668        if (ylimit && (Math.abs(ysize) > ylimit)) { 
     669          y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit); 
     670        } 
     671 
     672        if (ymin / yscale && (Math.abs(ysize) < ymin / yscale)) { 
     673          y2 = (ysize > 0) ? (y1 + ymin / yscale) : (y1 - ymin / yscale); 
     674        } 
     675        if (xmin / xscale && (Math.abs(xsize) < xmin / xscale)) { 
     676          x2 = (xsize > 0) ? (x1 + xmin / xscale) : (x1 - xmin / xscale); 
     677        } 
     678 
     679        if (x1 < 0) { 
     680          x2 -= x1; 
     681          x1 -= x1; 
     682        } 
     683        if (y1 < 0) { 
     684          y2 -= y1; 
     685          y1 -= y1; 
     686        } 
     687        if (x2 < 0) { 
     688          x1 -= x2; 
     689          x2 -= x2; 
     690        } 
     691        if (y2 < 0) { 
     692          y1 -= y2; 
     693          y2 -= y2; 
     694        } 
     695        if (x2 > boundx) { 
     696          delta = x2 - boundx; 
     697          x1 -= delta; 
     698          x2 -= delta; 
     699        } 
     700        if (y2 > boundy) { 
     701          delta = y2 - boundy; 
     702          y1 -= delta; 
     703          y2 -= delta; 
     704        } 
     705        if (x1 > boundx) { 
     706          delta = x1 - boundy; 
     707          y2 -= delta; 
     708          y1 -= delta; 
     709        } 
     710        if (y1 > boundy) { 
     711          delta = y1 - boundy; 
     712          y2 -= delta; 
     713          y1 -= delta; 
     714        } 
     715 
     716        return makeObj(flipCoords(x1, y1, x2, y2)); 
     717      } 
     718      //}}} 
     719      function makeObj(a) //{{{ 
     720      { 
     721        return { 
     722          x: a[0], 
     723          y: a[1], 
     724          x2: a[2], 
     725          y2: a[3], 
     726          w: a[2] - a[0], 
     727          h: a[3] - a[1] 
     728        }; 
     729      } 
     730      //}}} 
     731 
     732      return { 
     733        flipCoords: flipCoords, 
     734        setPressed: setPressed, 
     735        setCurrent: setCurrent, 
     736        getOffset: getOffset, 
     737        moveOffset: moveOffset, 
     738        getCorner: getCorner, 
     739        getFixed: getFixed 
     740      }; 
     741    }()); 
     742 
     743    //}}} 
     744    // Shade Module {{{ 
     745    var Shade = (function() { 
     746      var enabled = false, 
     747          holder = $('<div />').css({ 
     748            position: 'absolute', 
     749            zIndex: 240, 
     750            opacity: 0 
     751          }), 
     752          shades = { 
     753            top: createShade(), 
     754            left: createShade().height(boundy), 
     755            right: createShade().height(boundy), 
     756            bottom: createShade() 
     757          }; 
     758 
     759      function resizeShades(w,h) { 
     760        shades.left.css({ height: px(h) }); 
     761        shades.right.css({ height: px(h) }); 
     762      } 
     763      function updateAuto() 
     764      { 
     765        return updateShade(Coords.getFixed()); 
     766      } 
     767      function updateShade(c) 
     768      { 
     769        shades.top.css({ 
     770          left: px(c.x), 
     771          width: px(c.w), 
     772          height: px(c.y) 
     773        }); 
     774        shades.bottom.css({ 
     775          top: px(c.y2), 
     776          left: px(c.x), 
     777          width: px(c.w), 
     778          height: px(boundy-c.y2) 
     779        }); 
     780        shades.right.css({ 
     781          left: px(c.x2), 
     782          width: px(boundx-c.x2) 
     783        }); 
     784        shades.left.css({ 
     785          width: px(c.x) 
     786        }); 
     787      } 
     788      function createShade() { 
     789        return $('<div />').css({ 
     790          position: 'absolute', 
     791          backgroundColor: options.shadeColor||options.bgColor 
     792        }).appendTo(holder); 
     793      } 
     794      function enableShade() { 
     795        if (!enabled) { 
     796          enabled = true; 
     797          holder.insertBefore($img); 
     798          updateAuto(); 
     799          Selection.setBgOpacity(1,0,1); 
     800          $img2.hide(); 
     801 
     802          setBgColor(options.shadeColor||options.bgColor,1); 
     803          if (Selection.isAwake()) 
     804          { 
     805            setOpacity(options.bgOpacity,1); 
     806          } 
     807            else setOpacity(1,1); 
     808        } 
     809      } 
     810      function setBgColor(color,now) { 
     811        colorChangeMacro(getShades(),color,now); 
     812      } 
     813      function disableShade() { 
     814        if (enabled) { 
     815          holder.remove(); 
     816          $img2.show(); 
     817          enabled = false; 
     818          if (Selection.isAwake()) { 
     819            Selection.setBgOpacity(options.bgOpacity,1,1); 
     820          } else { 
     821            Selection.setBgOpacity(1,1,1); 
     822            Selection.disableHandles(); 
     823          } 
     824          colorChangeMacro($div,0,1); 
     825        } 
     826      } 
     827      function setOpacity(opacity,now) { 
     828        if (enabled) { 
     829          if (options.bgFade && !now) { 
     830            holder.animate({ 
     831              opacity: 1-opacity 
     832            },{ 
     833              queue: false, 
     834              duration: options.fadeTime 
     835            }); 
     836          } 
     837          else holder.css({opacity:1-opacity}); 
     838        } 
     839      } 
     840      function refreshAll() { 
     841        options.shade ? enableShade() : disableShade(); 
     842        if (Selection.isAwake()) setOpacity(options.bgOpacity); 
     843      } 
     844      function getShades() { 
     845        return holder.children(); 
     846      } 
     847 
     848      return { 
     849        update: updateAuto, 
     850        updateRaw: updateShade, 
     851        getShades: getShades, 
     852        setBgColor: setBgColor, 
     853        enable: enableShade, 
     854        disable: disableShade, 
     855        resize: resizeShades, 
     856        refresh: refreshAll, 
     857        opacity: setOpacity 
     858      }; 
     859    }()); 
     860    // }}} 
     861    // Selection Module {{{ 
     862    var Selection = (function () { 
     863      var awake, 
     864          hdep = 370, 
     865          borders = {}, 
     866          handle = {}, 
     867          dragbar = {}, 
     868          seehandles = false; 
     869 
     870      // Private Methods 
     871      function insertBorder(type) //{{{ 
     872      { 
     873        var jq = $('<div />').css({ 
     874          position: 'absolute', 
     875          opacity: options.borderOpacity 
     876        }).addClass(cssClass(type)); 
     877        $img_holder.append(jq); 
     878        return jq; 
     879      } 
     880      //}}} 
     881      function dragDiv(ord, zi) //{{{ 
     882      { 
     883        var jq = $('<div />').mousedown(createDragger(ord)).css({ 
     884          cursor: ord + '-resize', 
     885          position: 'absolute', 
     886          zIndex: zi 
     887        }).addClass('ord-'+ord); 
     888 
     889        if (Touch.support) { 
     890          jq.bind('touchstart.jcrop', Touch.createDragger(ord)); 
     891        } 
     892 
     893        $hdl_holder.append(jq); 
     894        return jq; 
     895      } 
     896      //}}} 
     897      function insertHandle(ord) //{{{ 
     898      { 
     899        var hs = options.handleSize; 
     900        return dragDiv(ord, hdep++).css({ 
     901          opacity: options.handleOpacity 
     902        }).width(hs).height(hs).addClass(cssClass('handle')); 
     903      } 
     904      //}}} 
     905      function insertDragbar(ord) //{{{ 
     906      { 
     907        return dragDiv(ord, hdep++).addClass('jcrop-dragbar'); 
     908      } 
     909      //}}} 
     910      function createDragbars(li) //{{{ 
     911      { 
     912        var i; 
     913        for (i = 0; i < li.length; i++) { 
     914          dragbar[li[i]] = insertDragbar(li[i]); 
     915        } 
     916      } 
     917      //}}} 
     918      function createBorders(li) //{{{ 
     919      { 
     920        var cl,i; 
     921        for (i = 0; i < li.length; i++) { 
     922          switch(li[i]){ 
     923            case'n': cl='hline'; break; 
     924            case's': cl='hline bottom'; break; 
     925            case'e': cl='vline right'; break; 
     926            case'w': cl='vline'; break; 
     927          } 
     928          borders[li[i]] = insertBorder(cl); 
     929        } 
     930      } 
     931      //}}} 
     932      function createHandles(li) //{{{ 
     933      { 
     934        var i; 
     935        for (i = 0; i < li.length; i++) { 
     936          handle[li[i]] = insertHandle(li[i]); 
     937        } 
     938      } 
     939      //}}} 
     940      function moveto(x, y) //{{{ 
     941      { 
     942        if (!options.shade) { 
     943          $img2.css({ 
     944            top: px(-y), 
     945            left: px(-x) 
     946          }); 
     947        } 
     948        $sel.css({ 
     949          top: px(y), 
     950          left: px(x) 
     951        }); 
     952      } 
     953      //}}} 
     954      function resize(w, h) //{{{ 
     955      { 
     956        $sel.width(w).height(h); 
     957      } 
     958      //}}} 
     959      function refresh() //{{{ 
     960      { 
     961        var c = Coords.getFixed(); 
     962 
     963        Coords.setPressed([c.x, c.y]); 
     964        Coords.setCurrent([c.x2, c.y2]); 
     965 
     966        updateVisible(); 
     967      } 
     968      //}}} 
     969 
     970      // Internal Methods 
     971      function updateVisible(select) //{{{ 
     972      { 
     973        if (awake) { 
     974          return update(select); 
     975        } 
     976      } 
     977      //}}} 
     978      function update(select) //{{{ 
     979      { 
     980        var c = Coords.getFixed(); 
     981 
     982        resize(c.w, c.h); 
     983        moveto(c.x, c.y); 
     984        if (options.shade) Shade.updateRaw(c); 
     985 
     986        awake || show(); 
     987 
     988        if (select) { 
     989          options.onSelect.call(api, unscale(c)); 
     990        } else { 
     991          options.onChange.call(api, unscale(c)); 
     992        } 
     993      } 
     994      //}}} 
     995      function setBgOpacity(opacity,force,now) //{{{ 
     996      { 
     997        if (!awake && !force) return; 
     998        if (options.bgFade && !now) { 
     999          $img.animate({ 
     1000            opacity: opacity 
     1001          },{ 
     1002            queue: false, 
     1003            duration: options.fadeTime 
     1004          }); 
     1005        } else { 
     1006          $img.css('opacity', opacity); 
     1007        } 
     1008      } 
     1009      //}}} 
     1010      function show() //{{{ 
     1011      { 
     1012        $sel.show(); 
     1013 
     1014        if (options.shade) Shade.opacity(bgopacity); 
     1015          else setBgOpacity(bgopacity,true); 
     1016 
     1017        awake = true; 
     1018      } 
     1019      //}}} 
     1020      function release() //{{{ 
     1021      { 
     1022        disableHandles(); 
     1023        $sel.hide(); 
     1024 
     1025        if (options.shade) Shade.opacity(1); 
     1026          else setBgOpacity(1); 
     1027 
     1028        awake = false; 
     1029        options.onRelease.call(api); 
     1030      } 
     1031      //}}} 
     1032      function showHandles() //{{{ 
     1033      { 
     1034        if (seehandles) { 
     1035          $hdl_holder.show(); 
     1036        } 
     1037      } 
     1038      //}}} 
     1039      function enableHandles() //{{{ 
     1040      { 
     1041        seehandles = true; 
     1042        if (options.allowResize) { 
     1043          $hdl_holder.show(); 
     1044          return true; 
     1045        } 
     1046      } 
     1047      //}}} 
     1048      function disableHandles() //{{{ 
     1049      { 
     1050        seehandles = false; 
     1051        $hdl_holder.hide(); 
     1052      }  
     1053      //}}} 
     1054      function animMode(v) //{{{ 
     1055      { 
     1056        if (animating === v) { 
     1057          disableHandles(); 
     1058        } else { 
     1059          enableHandles(); 
     1060        } 
     1061      }  
     1062      //}}} 
     1063      function done() //{{{ 
     1064      { 
     1065        animMode(false); 
     1066        refresh(); 
     1067      }  
     1068      //}}} 
     1069      // Insert draggable elements {{{ 
     1070      // Insert border divs for outline 
     1071 
     1072      if (options.dragEdges && $.isArray(options.createDragbars)) 
     1073        createDragbars(options.createDragbars); 
     1074 
     1075      if ($.isArray(options.createHandles)) 
     1076        createHandles(options.createHandles); 
     1077 
     1078      if (options.drawBorders && $.isArray(options.createBorders)) 
     1079        createBorders(options.createBorders); 
     1080 
     1081      //}}} 
     1082 
     1083      // This is a hack for iOS5 to support drag/move touch functionality 
     1084      $(document).bind('touchstart.jcrop-ios',function(e) { 
     1085        if ($(e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation(); 
     1086      }); 
     1087 
     1088      var $track = newTracker().mousedown(createDragger('move')).css({ 
     1089        cursor: 'move', 
     1090        position: 'absolute', 
     1091        zIndex: 360 
     1092      }); 
     1093 
     1094      if (Touch.support) { 
     1095        $track.bind('touchstart.jcrop', Touch.createDragger('move')); 
     1096      } 
     1097 
     1098      $img_holder.append($track); 
     1099      disableHandles(); 
     1100 
     1101      return { 
     1102        updateVisible: updateVisible, 
     1103        update: update, 
     1104        release: release, 
     1105        refresh: refresh, 
     1106        isAwake: function () { 
     1107          return awake; 
     1108        }, 
     1109        setCursor: function (cursor) { 
     1110          $track.css('cursor', cursor); 
     1111        }, 
     1112        enableHandles: enableHandles, 
     1113        enableOnly: function () { 
     1114          seehandles = true; 
     1115        }, 
     1116        showHandles: showHandles, 
     1117        disableHandles: disableHandles, 
     1118        animMode: animMode, 
     1119        setBgOpacity: setBgOpacity, 
     1120        done: done 
     1121      }; 
     1122    }()); 
     1123     
     1124    //}}} 
     1125    // Tracker Module {{{ 
     1126    var Tracker = (function () { 
     1127      var onMove = function () {}, 
     1128          onDone = function () {}, 
     1129          trackDoc = options.trackDocument; 
     1130 
     1131      function toFront() //{{{ 
     1132      { 
     1133        $trk.css({ 
     1134          zIndex: 450 
     1135        }); 
     1136        if (Touch.support) { 
     1137          $(document) 
     1138            .bind('touchmove.jcrop', trackTouchMove) 
     1139            .bind('touchend.jcrop', trackTouchEnd); 
     1140        } 
     1141        if (trackDoc) { 
     1142          $(document) 
     1143            .bind('mousemove.jcrop',trackMove) 
     1144            .bind('mouseup.jcrop',trackUp); 
     1145        } 
     1146      }  
     1147      //}}} 
     1148      function toBack() //{{{ 
     1149      { 
     1150        $trk.css({ 
     1151          zIndex: 290 
     1152        }); 
     1153        $(document).unbind('.jcrop'); 
     1154      }  
     1155      //}}} 
     1156      function trackMove(e) //{{{ 
     1157      { 
     1158        onMove(mouseAbs(e)); 
     1159        return false; 
     1160      }  
     1161      //}}} 
     1162      function trackUp(e) //{{{ 
     1163      { 
     1164        e.preventDefault(); 
     1165        e.stopPropagation(); 
     1166 
     1167        if (btndown) { 
     1168          btndown = false; 
     1169 
     1170          onDone(mouseAbs(e)); 
     1171 
     1172          if (Selection.isAwake()) { 
     1173            options.onSelect.call(api, unscale(Coords.getFixed())); 
     1174          } 
     1175 
     1176          toBack(); 
     1177          onMove = function () {}; 
     1178          onDone = function () {}; 
     1179        } 
     1180 
     1181        return false; 
     1182      } 
     1183      //}}} 
     1184      function activateHandlers(move, done) //{{{ 
     1185      { 
     1186        btndown = true; 
     1187        onMove = move; 
     1188        onDone = done; 
     1189        toFront(); 
     1190        return false; 
     1191      } 
     1192      //}}} 
     1193      function trackTouchMove(e) //{{{ 
     1194      { 
     1195        e.pageX = e.originalEvent.changedTouches[0].pageX; 
     1196        e.pageY = e.originalEvent.changedTouches[0].pageY; 
     1197        return trackMove(e); 
     1198      } 
     1199      //}}} 
     1200      function trackTouchEnd(e) //{{{ 
     1201      { 
     1202        e.pageX = e.originalEvent.changedTouches[0].pageX; 
     1203        e.pageY = e.originalEvent.changedTouches[0].pageY; 
     1204        return trackUp(e); 
     1205      } 
     1206      //}}} 
     1207      function setCursor(t) //{{{ 
     1208      { 
     1209        $trk.css('cursor', t); 
     1210      } 
     1211      //}}} 
     1212 
     1213      if (!trackDoc) { 
     1214        $trk.mousemove(trackMove).mouseup(trackUp).mouseout(trackUp); 
     1215      } 
     1216 
     1217      $img.before($trk); 
     1218      return { 
     1219        activateHandlers: activateHandlers, 
     1220        setCursor: setCursor 
     1221      }; 
     1222    }()); 
     1223    //}}} 
     1224    // KeyManager Module {{{ 
     1225    var KeyManager = (function () { 
     1226      var $keymgr = $('<input type="radio" />').css({ 
     1227        position: 'fixed', 
     1228        left: '-120px', 
     1229        width: '12px' 
     1230      }), 
     1231          $keywrap = $('<div />').css({ 
     1232          position: 'absolute', 
     1233          overflow: 'hidden' 
     1234        }).append($keymgr); 
     1235 
     1236      function watchKeys() //{{{ 
     1237      { 
     1238        if (options.keySupport) { 
     1239          $keymgr.show(); 
     1240          $keymgr.focus(); 
     1241        } 
     1242      } 
     1243      //}}} 
     1244      function onBlur(e) //{{{ 
     1245      { 
     1246        $keymgr.hide(); 
     1247      } 
     1248      //}}} 
     1249      function doNudge(e, x, y) //{{{ 
     1250      { 
     1251        if (options.allowMove) { 
     1252          Coords.moveOffset([x, y]); 
     1253          Selection.updateVisible(true); 
     1254        } 
     1255        e.preventDefault(); 
     1256        e.stopPropagation(); 
     1257      } 
     1258      //}}} 
     1259      function parseKey(e) //{{{ 
     1260      { 
     1261        if (e.ctrlKey || e.metaKey) { 
     1262          return true; 
     1263        } 
     1264        shift_down = e.shiftKey ? true : false; 
     1265        var nudge = shift_down ? 10 : 1; 
     1266 
     1267        switch (e.keyCode) { 
     1268        case 37: 
     1269          doNudge(e, -nudge, 0); 
     1270          break; 
     1271        case 39: 
     1272          doNudge(e, nudge, 0); 
     1273          break; 
     1274        case 38: 
     1275          doNudge(e, 0, -nudge); 
     1276          break; 
     1277        case 40: 
     1278          doNudge(e, 0, nudge); 
     1279          break; 
     1280        case 27: 
     1281          if (options.allowSelect) Selection.release(); 
     1282          break; 
     1283        case 9: 
     1284          return true; 
     1285        } 
     1286 
     1287        return false; 
     1288      } 
     1289      //}}} 
     1290 
     1291      if (options.keySupport) { 
     1292        $keymgr.keydown(parseKey).blur(onBlur); 
     1293        if (ie6mode || !options.fixedSupport) { 
     1294          $keymgr.css({ 
     1295            position: 'absolute', 
     1296            left: '-20px' 
     1297          }); 
     1298          $keywrap.append($keymgr).insertBefore($img); 
     1299        } else { 
     1300          $keymgr.insertBefore($img); 
     1301        } 
     1302      } 
     1303 
     1304 
     1305      return { 
     1306        watchKeys: watchKeys 
     1307      }; 
     1308    }()); 
     1309    //}}} 
     1310    // }}} 
     1311    // API methods {{{ 
     1312    function setClass(cname) //{{{ 
     1313    { 
     1314      $div.removeClass().addClass(cssClass('holder')).addClass(cname); 
     1315    } 
     1316    //}}} 
     1317    function animateTo(a, callback) //{{{ 
     1318    { 
     1319      var x1 = a[0] / xscale, 
     1320          y1 = a[1] / yscale, 
     1321          x2 = a[2] / xscale, 
     1322          y2 = a[3] / yscale; 
     1323 
     1324      if (animating) { 
     1325        return; 
     1326      } 
     1327 
     1328      var animto = Coords.flipCoords(x1, y1, x2, y2), 
     1329          c = Coords.getFixed(), 
     1330          initcr = [c.x, c.y, c.x2, c.y2], 
     1331          animat = initcr, 
     1332          interv = options.animationDelay, 
     1333          ix1 = animto[0] - initcr[0], 
     1334          iy1 = animto[1] - initcr[1], 
     1335          ix2 = animto[2] - initcr[2], 
     1336          iy2 = animto[3] - initcr[3], 
     1337          pcent = 0, 
     1338          velocity = options.swingSpeed; 
     1339 
     1340      x = animat[0]; 
     1341      y = animat[1]; 
     1342      x2 = animat[2]; 
     1343      y2 = animat[3]; 
     1344 
     1345      Selection.animMode(true); 
     1346      var anim_timer; 
     1347 
     1348      function queueAnimator() { 
     1349        window.setTimeout(animator, interv); 
     1350      } 
     1351      var animator = (function () { 
     1352        return function () { 
     1353          pcent += (100 - pcent) / velocity; 
     1354 
     1355          animat[0] = x + ((pcent / 100) * ix1); 
     1356          animat[1] = y + ((pcent / 100) * iy1); 
     1357          animat[2] = x2 + ((pcent / 100) * ix2); 
     1358          animat[3] = y2 + ((pcent / 100) * iy2); 
     1359 
     1360          if (pcent >= 99.8) { 
     1361            pcent = 100; 
     1362          } 
     1363          if (pcent < 100) { 
     1364            setSelectRaw(animat); 
     1365            queueAnimator(); 
     1366          } else { 
     1367            Selection.done(); 
     1368            if (typeof(callback) === 'function') { 
     1369              callback.call(api); 
     1370            } 
     1371          } 
     1372        }; 
     1373      }()); 
     1374      queueAnimator(); 
     1375    } 
     1376    //}}} 
     1377    function setSelect(rect) //{{{ 
     1378    { 
     1379      setSelectRaw([rect[0] / xscale, rect[1] / yscale, rect[2] / xscale, rect[3] / yscale]); 
     1380      options.onSelect.call(api, unscale(Coords.getFixed())); 
     1381      Selection.enableHandles(); 
     1382    } 
     1383    //}}} 
     1384    function setSelectRaw(l) //{{{ 
     1385    { 
     1386      Coords.setPressed([l[0], l[1]]); 
     1387      Coords.setCurrent([l[2], l[3]]); 
     1388      Selection.update(); 
     1389    } 
     1390    //}}} 
     1391    function tellSelect() //{{{ 
     1392    { 
     1393      return unscale(Coords.getFixed()); 
     1394    } 
     1395    //}}} 
     1396    function tellScaled() //{{{ 
     1397    { 
     1398      return Coords.getFixed(); 
     1399    } 
     1400    //}}} 
     1401    function setOptionsNew(opt) //{{{ 
     1402    { 
     1403      setOptions(opt); 
     1404      interfaceUpdate(); 
     1405    } 
     1406    //}}} 
     1407    function disableCrop() //{{{ 
     1408    { 
     1409      options.disabled = true; 
     1410      Selection.disableHandles(); 
     1411      Selection.setCursor('default'); 
     1412      Tracker.setCursor('default'); 
     1413    } 
     1414    //}}} 
     1415    function enableCrop() //{{{ 
     1416    { 
     1417      options.disabled = false; 
     1418      interfaceUpdate(); 
     1419    } 
     1420    //}}} 
     1421    function cancelCrop() //{{{ 
     1422    { 
     1423      Selection.done(); 
     1424      Tracker.activateHandlers(null, null); 
     1425    } 
     1426    //}}} 
     1427    function destroy() //{{{ 
     1428    { 
     1429      $div.remove(); 
     1430      $origimg.show(); 
     1431      $(obj).removeData('Jcrop'); 
     1432    } 
     1433    //}}} 
     1434    function setImage(src, callback) //{{{ 
     1435    { 
     1436      Selection.release(); 
     1437      disableCrop(); 
     1438      var img = new Image(); 
     1439      img.onload = function () { 
     1440        var iw = img.width; 
     1441        var ih = img.height; 
     1442        var bw = options.boxWidth; 
     1443        var bh = options.boxHeight; 
     1444        $img.width(iw).height(ih); 
     1445        $img.attr('src', src); 
     1446        $img2.attr('src', src); 
     1447        presize($img, bw, bh); 
     1448        boundx = $img.width(); 
     1449        boundy = $img.height(); 
     1450        $img2.width(boundx).height(boundy); 
     1451        $trk.width(boundx + (bound * 2)).height(boundy + (bound * 2)); 
     1452        $div.width(boundx).height(boundy); 
     1453        Shade.resize(boundx,boundy); 
     1454        enableCrop(); 
     1455 
     1456        if (typeof(callback) === 'function') { 
     1457          callback.call(api); 
     1458        } 
     1459      }; 
     1460      img.src = src; 
     1461    } 
     1462    //}}} 
     1463    function colorChangeMacro($obj,color,now) { 
     1464      var mycolor = color || options.bgColor; 
     1465      if (options.bgFade && supportsColorFade() && options.fadeTime && !now) { 
     1466        $obj.animate({ 
     1467          backgroundColor: mycolor 
     1468        }, { 
     1469          queue: false, 
     1470          duration: options.fadeTime 
     1471        }); 
     1472      } else { 
     1473        $obj.css('backgroundColor', mycolor); 
     1474      } 
     1475    } 
     1476    function interfaceUpdate(alt) //{{{ 
     1477    // This method tweaks the interface based on options object. 
     1478    // Called when options are changed and at end of initialization. 
     1479    { 
     1480      if (options.allowResize) { 
     1481        if (alt) { 
     1482          Selection.enableOnly(); 
     1483        } else { 
     1484          Selection.enableHandles(); 
     1485        } 
     1486      } else { 
     1487        Selection.disableHandles(); 
     1488      } 
     1489 
     1490      Tracker.setCursor(options.allowSelect ? 'crosshair' : 'default'); 
     1491      Selection.setCursor(options.allowMove ? 'move' : 'default'); 
     1492 
     1493      if (options.hasOwnProperty('trueSize')) { 
     1494        xscale = options.trueSize[0] / boundx; 
     1495        yscale = options.trueSize[1] / boundy; 
     1496      } 
     1497 
     1498      if (options.hasOwnProperty('setSelect')) { 
     1499        setSelect(options.setSelect); 
     1500        Selection.done(); 
     1501        delete(options.setSelect); 
     1502      } 
     1503 
     1504      Shade.refresh(); 
     1505 
     1506      if (options.bgColor != bgcolor) { 
     1507        colorChangeMacro( 
     1508          options.shade? Shade.getShades(): $div, 
     1509          options.shade? 
     1510            (options.shadeColor || options.bgColor): 
     1511            options.bgColor 
     1512        ); 
     1513        bgcolor = options.bgColor; 
     1514      } 
     1515 
     1516      if (bgopacity != options.bgOpacity) { 
     1517        bgopacity = options.bgOpacity; 
     1518        if (options.shade) Shade.refresh(); 
     1519          else Selection.setBgOpacity(bgopacity); 
     1520      } 
     1521 
     1522      xlimit = options.maxSize[0] || 0; 
     1523      ylimit = options.maxSize[1] || 0; 
     1524      xmin = options.minSize[0] || 0; 
     1525      ymin = options.minSize[1] || 0; 
     1526 
     1527      if (options.hasOwnProperty('outerImage')) { 
     1528        $img.attr('src', options.outerImage); 
     1529        delete(options.outerImage); 
     1530      } 
     1531 
     1532      Selection.refresh(); 
     1533    } 
     1534    //}}} 
     1535    //}}} 
     1536 
     1537    if (Touch.support) $trk.bind('touchstart.jcrop', Touch.newSelection); 
     1538 
     1539    $hdl_holder.hide(); 
     1540    interfaceUpdate(true); 
     1541 
     1542    var api = { 
     1543      setImage: setImage, 
     1544      animateTo: animateTo, 
     1545      setSelect: setSelect, 
     1546      setOptions: setOptionsNew, 
     1547      tellSelect: tellSelect, 
     1548      tellScaled: tellScaled, 
     1549      setClass: setClass, 
     1550 
     1551      disable: disableCrop, 
     1552      enable: enableCrop, 
     1553      cancel: cancelCrop, 
     1554      release: Selection.release, 
     1555      destroy: destroy, 
     1556 
     1557      focus: KeyManager.watchKeys, 
     1558 
     1559      getBounds: function () { 
     1560        return [boundx * xscale, boundy * yscale]; 
     1561      }, 
     1562      getWidgetSize: function () { 
     1563        return [boundx, boundy]; 
     1564      }, 
     1565      getScaleFactor: function () { 
     1566        return [xscale, yscale]; 
     1567      }, 
     1568      getOptions: function() { 
     1569        // careful: internal values are returned 
     1570        return options; 
     1571      }, 
     1572 
     1573      ui: { 
     1574        holder: $div, 
     1575        selection: $sel 
     1576      } 
     1577    }; 
     1578 
     1579    if ($.browser.msie) 
     1580      $div.bind('selectstart', function () { return false; }); 
     1581 
     1582    $origimg.data('Jcrop', api); 
     1583    return api; 
     1584  }; 
     1585  $.fn.Jcrop = function (options, callback) //{{{ 
     1586  { 
     1587    var api; 
     1588    // Iterate over each object, attach Jcrop 
     1589    this.each(function () { 
     1590      // If we've already attached to this object 
     1591      if ($(this).data('Jcrop')) { 
     1592        // The API can be requested this way (undocumented) 
     1593        if (options === 'api') return $(this).data('Jcrop'); 
     1594        // Otherwise, we just reset the options... 
     1595        else $(this).data('Jcrop').setOptions(options); 
     1596      } 
     1597      // If we haven't been attached, preload and attach 
     1598      else { 
     1599        if (this.tagName == 'IMG') 
     1600          $.Jcrop.Loader(this,function(){ 
     1601            $(this).css({display:'block',visibility:'hidden'}); 
     1602            api = $.Jcrop(this, options); 
     1603            if ($.isFunction(callback)) callback.call(api); 
     1604          }); 
     1605        else { 
     1606          $(this).css({display:'block',visibility:'hidden'}); 
     1607          api = $.Jcrop(this, options); 
     1608          if ($.isFunction(callback)) callback.call(api); 
     1609        } 
     1610      } 
     1611    }); 
     1612 
     1613    // Return "this" so the object is chainable (jQuery-style) 
     1614    return this; 
     1615  }; 
     1616  //}}} 
     1617  // $.Jcrop.Loader - basic image loader {{{ 
     1618 
     1619  $.Jcrop.Loader = function(imgobj,success,error){ 
     1620    var $img = $(imgobj), img = $img[0]; 
     1621 
     1622    function completeCheck(){ 
     1623      if (img.complete) { 
     1624        $img.unbind('.jcloader'); 
     1625        if ($.isFunction(success)) success.call(img); 
     1626      } 
     1627      else window.setTimeout(completeCheck,50); 
     1628    } 
     1629 
     1630    $img 
     1631      .bind('load.jcloader',completeCheck) 
     1632      .bind('error.jcloader',function(e){ 
     1633        $img.unbind('.jcloader'); 
     1634        if ($.isFunction(error)) error.call(img); 
     1635      }); 
     1636 
     1637    if (img.complete && $.isFunction(success)){ 
     1638      $img.unbind('.jcloader'); 
     1639      success.call(img); 
     1640    } 
     1641  }; 
     1642 
     1643  //}}} 
     1644  // Global Defaults {{{ 
     1645  $.Jcrop.defaults = { 
     1646 
     1647    // Basic Settings 
     1648    allowSelect: true, 
     1649    allowMove: true, 
     1650    allowResize: true, 
     1651 
     1652    trackDocument: true, 
     1653 
     1654    // Styling Options 
     1655    baseClass: 'jcrop', 
     1656    addClass: null, 
     1657    bgColor: 'black', 
     1658    bgOpacity: 0.6, 
     1659    bgFade: false, 
     1660    borderOpacity: 0.4, 
     1661    handleOpacity: 0.5, 
     1662    handleSize: 7, 
     1663 
     1664    aspectRatio: 0, 
     1665    keySupport: true, 
     1666    createHandles: ['n','s','e','w','nw','ne','se','sw'], 
     1667    createDragbars: ['n','s','e','w'], 
     1668    createBorders: ['n','s','e','w'], 
     1669    drawBorders: true, 
     1670    dragEdges: true, 
     1671    fixedSupport: true, 
     1672    touchSupport: null, 
     1673 
     1674    shade: null, 
     1675 
     1676    boxWidth: 0, 
     1677    boxHeight: 0, 
     1678    boundary: 2, 
     1679    fadeTime: 400, 
     1680    animationDelay: 20, 
     1681    swingSpeed: 3, 
     1682 
     1683    minSelect: [0, 0], 
     1684    maxSize: [0, 0], 
     1685    minSize: [0, 0], 
     1686 
     1687    // Callbacks / Event Handlers 
     1688    onChange: function () {}, 
     1689    onSelect: function () {}, 
     1690    onDblClick: function () {}, 
     1691    onRelease: function () {} 
     1692  }; 
     1693 
     1694  // }}} 
     1695}(jQuery)); 
  • trunk/wp-includes/js/jcrop/jquery.Jcrop.min.js

    r21592 r21633  
    1 (function(a){a.Jcrop=function(d,A){var d=d,A=A;if(typeof(d)!=="object"){d=a(d)[0]}if(typeof(A)!=="object"){A={}}if(!("trackDocument" in A)){A.trackDocument=a.browser.msie?false:true;if(a.browser.msie&&a.browser.version.split(".")[0]=="8"){A.trackDocument=true}}if(!("keySupport" in A)){A.keySupport=a.browser.msie?false:true}var U={trackDocument:false,baseClass:"jcrop",addClass:null,bgColor:"black",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("id").css({position:"absolute"});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("<div />").width(Q).height(O).addClass(C("holder")).css({position:"relative",backgroundColor:H.bgColor}).insertAfter(W).append(al);if(H.addClass){Z.addClass(H.addClass)}var I=a("<img />").attr("src",al.attr("src")).css("position","absolute").width(Q).height(O);var k=a("<div />").width(K(100)).height(K(100)).css({zIndex:310,position:"absolute",overflow:"hidden"}).append(I);var L=a("<div />").width(K(100)).height(K(100)).css("zIndex",320);var y=a("<div />").css({position:"absolute",zIndex:300}).insertBefore(al).append(k,L);var t=H.boundary;var b=ae().width(Q+(t*2)).height(O+(t*2)).css({position:"absolute",top:l(-t),left:l(-t),zIndex:290}).mousedown(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>aq+aG){aG-=aG+aq}if(0>aC+aF){aF-=aF+aC}if(O<aB+aF){aF+=O-(aB+aF)}if(Q<ap+aG){aG+=Q-(ap+aG)}aq+=aG;ap+=aG;aC+=aF;aB+=aF}function ax(aF){var aG=aD();switch(aF){case"ne":return[aG.x2,aG.y];case"nw":return[aG.x,aG.y];case"se":return[aG.x2,aG.y2];case"sw":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<aH){aM=aB;w=aK*aH;aF=aI<0?aq-w:w+aq;if(aF<0){aF=0;h=Math.abs((aF-aq)/aH);aM=aP<0?aC-h:h+aC}else{if(aF>Q){aF=Q;h=Math.abs((aF-aq)/aH);aM=aP<0?aC-h:h+aC}}}else{aF=ap;h=aJ/aH;aM=aP<0?aC-h:aC+h;if(aM<0){aM=0;w=Math.abs((aM-aC)*aH);aF=aI<0?aq-w:w+aq}else{if(aM>O){aM=O;w=Math.abs(aM-aC)*aH;aF=aI<0?aq-w:w+aq}}}if(aF>aq){if(aF-aq<aO){aF=aq+aO}else{if(aF-aq>aG){aF=aq+aG}}if(aM>aC){aM=aC+(aF-aq)/aH}else{aM=aC-(aF-aq)/aH}}else{if(aF<aq){if(aq-aF<aO){aF=aq-aO}else{if(aq-aF>aG){aF=aq-aG}}if(aM>aC){aM=aC+(aq-aF)/aH}else{aM=aC-(aq-aF)/aH}}}if(aF<0){aq-=aF;aF=0}else{if(aF>Q){aq-=aF-Q;aF=Q}}if(aM<0){aC-=aM;aM=0}else{if(aM>O){aC-=aM-O;aM=O}}return last=az(ay(aq,aC,aF,aM))}function at(aF){if(aF[0]<0){aF[0]=0}if(aF[1]<0){aF[1]=0}if(aF[0]>Q){aF[0]=Q}if(aF[1]>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<aI){aM=aH;aL=aI}if(aJ<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&&(Math.abs(aG)>x)){ap=(aG>0)?(aq+x):(aq-x)}if(ah&&(Math.abs(aF)>ah)){aB=(aF>0)?(aC+ah):(aC-ah)}if(S&&(Math.abs(aF)<S)){aB=(aF>0)?(aC+S):(aC-S)}if(p&&(Math.abs(aG)<p)){ap=(aG>0)?(aq+p):(aq-p)}if(aq<0){ap-=aq;aq-=aq}if(aC<0){aB-=aC;aC-=aC}if(ap<0){aq-=ap;ap-=ap}if(aB<0){aC-=aB;aB-=aB}if(ap>Q){var aH=ap-Q;aq-=aH;ap-=aH}if(aB>O){var aH=aB-O;aC-=aH;aB-=aH}if(aq>Q){var aH=aq-O;aB-=aH;aC-=aH}if(aC>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("hline").css("top",a.browser.msie?l(-1):l(0)),bottom:ax("hline"),left:ax("vline"),right:ax("vline")}}if(H.dragEdges){aO.t=aJ("n");aO.b=aJ("s");aO.r=aJ("e");aO.l=aJ("w")}H.sideHandles&&aF(["n","s","e","w"]);H.cornerHandles&&aF(["sw","nw","ne","se"]);function ax(aR){var aS=a("<div />").css({position:"absolute",opacity:H.borderOpacity}).addClass(C(aR));k.append(aS);return aS}function ap(aR,aS){var aT=a("<div />").mousedown(c(aR)).css({cursor:aR+"-resize",position:"absolute",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("handle"))}function aJ(aT){var aW=H.handleSize,aX=aA,aV=aW,aS=aW,aU=aX,aR=aX;switch(aT){case"n":case"s":aS=K(100);break;case"e":case"w":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 in 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;"e" in aO&&aO.e.css({top:l(aT),left:l(aV)})&&aO.w.css({top:l(aT)})&&aO.s.css({top:l(aU),left:l(aS)})&&aO.n.css({left:l(aS)});"ne" in aO&&aO.ne.css({left:l(aV)})&&aO.se.css({top:l(aU),left:l(aV)})&&aO.sw.css({top:l(aU)});"b" in aO&&aO.b.css({top:l(aU)})&&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&&av.right.css({left:l(aR.w-1)})&&av.bottom.css({top:l(aR.h-1)});aq&&aH(aR);aB||aP();H.onChange(Y(aR))}function aP(){y.show();al.css("opacity",H.bgOpacity);aB=true}function aL(){aM();y.hide();al.css("opacity",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("move")).css({cursor:"move",position:"absolute",zIndex:360});k.append(au);aM();return{updateVisible:aN,update:ay,release:aL,refresh:at,setCursor:function(aR){au.css("cursor",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("mousemove",ao).unbind("mouseup",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("cursor",ay)}al.before(b);return{activateHandlers:au,setCursor:av}}();var ak=function(){var ar=a('<input type="radio" />').css({position:"absolute",left:"-30px"}).keypress(ao).blur(at),au=a("<div />").css({position:"absolute",overflow:"hidden"}).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;case 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""+parseInt(ao)+"px"}function K(ao){return""+parseInt(ao)+"%"}function C(ao){return H.baseClass+"-"+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=="move"?aq:aq+"-resize");if(aq=="move"){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"e":aq[1]=ao.y2;break;case"w":aq[1]=ao.y2;break;case"n":aq[0]=ao.x2;break;case"s":aq[0]=ao.x2;break}}else{switch(ap){case"e":aq[1]=ao.y+1;break;case"w":aq[1]=ao.y+1;break;case"n":aq[0]=ao.x+1;break;case"s":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"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 c(ao){return function(ap){if(H.disabled){return false}if((ao=="move")&&!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>ap)&&ap>0){ao=ap;aq=(ap/at.width())*at.height()}if((aq>ar)&&ar>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>H.minSelect[0]&&ao.h>H.minSelect[1]){X.enableHandles();X.done()}else{X.release()}P.setCursor(H.allowSelect?"crosshair":"default")}function ac(ao){if(H.disabled){return false}if(!H.allowSelect){return false}r=true;ad=D(al);X.disableHandles();E("crosshair");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("<div></div>").addClass(C("tracker"));a.browser.msie&&ao.css({opacity:0,backgroundColor:"white"});return ao}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<100){aH()}else{X.done()}if(ay>=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)!="object"){ao={}}H=a.extend(H,ao);if(typeof(H.onChange)!=="function"){H.onChange=function(){}}if(typeof(H.onSelect)!=="function"){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("default");P.setCursor("default")}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?"crosshair":"default");X.setCursor(H.allowMove?"move":"default");Z.css("backgroundColor",H.bgColor);if("setSelect" in H){J(A.setSelect);X.done();delete (H.setSelect)}if("trueSize" 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("outerImage" in H){al.attr("src",H.outerImage);delete (H.outerImage)}X.refresh()}L.hide();N(true);var g={animateTo:s,setSelect:J,setOptions:u,tellSelect:j,tellScaled: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("Jcrop",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)!=="object"){c={}}this.each(function(){if(a(this).data("Jcrop")){if(c=="api"){return a(this).data("Jcrop")}else{a(this).data("Jcrop").setOptions(c)}}else{b(this)}});return this}})(jQuery); 
     1/** 
     2 * jquery.Jcrop.min.js v0.9.10 (build:20120429) 
     3 * jQuery Image Cropping Plugin - released under MIT License 
     4 * Copyright (c) 2008-2012 Tapmodo Interactive LLC 
     5 * https://github.com/tapmodo/Jcrop 
     6 */ 
     7(function(a){a.Jcrop=function(b,c){function h(a){return a+"px"}function i(a){return d.baseClass+"-"+a}function j(){return a.fx.step.hasOwnProperty("backgroundColor")}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!="object"&&(b={}),d=a.extend(d,b),a.each(["onChange","onSelect","onRelease","onDblClick"],function(a,b){typeof d[b]!="function"&&(d[b]=function(){})})}function n(a,b){e=k(E),bd.setCursor(a==="move"?a:a+"-resize");if(a==="move")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"e":c[1]=b.y2;break;case"w":c[1]=b.y2;break;case"n":c[0]=b.x2;break;case"s":c[0]=b.x2}else switch(a){case"e":c[1]=b.y+1;break;case"w":c[1]=b.y+1;break;case"n":c[0]=b.x+1;break;case"s":c[0]=b.x+1}ba.setCurrent(c),bc.update()}}function p(a){var b=a;return be.watchKeys(),function( 
     8a){ba.moveOffset([a[0]-b[0],a[1]-b[1]]),b=a,bc.update()}}function q(a){switch(a){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 r(a){return function(b){return d.disabled?!1:a==="move"&&!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>b&&b>0&&(d=b,e=b/a.width()*a.height()),e>c&&c>0&&(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>d.minSelect[0]&&b.h>d.minSelect[1]?(bc.enableHandles(),bc.done()):bc.release(),bd.setCursor(d.allowSelect?"crosshair":"default")}function v(a){if(d.disabled)return!1;if(!d.allowSelect)return!1;X=!0,e=k(E),bc.disableHandles(),bd.setCursor("crosshair");var b=l(a);return ba.setPressed(b),bc.update(),bd.activateHandlers(w,u),be.watchKeys(),a.stopPropagation 
     9(),a.preventDefault(),!1}function w(a){ba.setCurrent(a),bc.update()}function z(){var b=a("<div></div>").addClass(i("tracker"));return a.browser.msie&&b.css({opacity:0,backgroundColor:"white"}),b}function bf(a){H.removeClass().addClass(i("holder")).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>=99.8&&(q=100),q<100?(bi(k),t()):(bc.done(),typeof b=="function"&&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 
     10(a){m(a),bs()}function bm(){d.disabled=!0,bc.disableHandles(),bc.setCursor("default"),bd.setCursor("default")}function bn(){d.disabled=!1,bs()}function bo(){bc.done(),bd.activateHandlers(null,null)}function bp(){H.remove(),B.show(),a(b).removeData("Jcrop")}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("src",a),I.attr("src",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=="function"&&b.call(bt)},c.src=a}function br(a,b,c){var e=b||d.bgColor;d.bgFade&&j()&&d.fadeTime&&!c?a.animate({backgroundColor:e},{queue:!1,duration:d.fadeTime}):a.css("backgroundColor",e)}function bs(a){d.allowResize?a?bc.enableOnly():bc.enableHandles():bc.disableHandles(),bd.setCursor(d.allowSelect?"crosshair":"default"),bc.setCursor(d.allowMove?"move":"default"),d.hasOwnProperty("trueSize")&&(U=d.trueSize[0]/F,V=d.trueSize[1]/G),d.hasOwnProperty("setSelect" 
     11)&&(bh(d.setSelect),bc.done(),delete d.setSelect),bb.refresh(),d.bgColor!=O&&(br(d.shade?bb.getShades():H,d.shade?d.shadeColor||d.bgColor:d.bgColor),O=d.bgColor),P!=d.bgOpacity&&(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("outerImage")&&(E.attr("src",d.outerImage),delete d.outerImage),bc.refresh()}var d=a.extend({},a.Jcrop.defaults),e,f,g=!1;a.browser.msie&&a.browser.version.split(".")[0]==="6"&&(g=!0),typeof b!="object"&&(b=a(b)[0]),typeof c!="object"&&(c={}),m(c);var A={border:"none",visibility:"visible",margin:0,padding:0,position:"absolute",top:0,left:0},B=a(b),C=!0;if(b.tagName=="IMG"){if(B[0].width!=0&&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("id").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&&(d.shade=!0);s(E,d.boxWidth,d. 
     12boxHeight);var F=E.width(),G=E.height(),H=a("<div />").width(F).height(G).addClass(i("holder")).css({position:"relative",backgroundColor:d.bgColor}).insertAfter(B).append(E);d.addClass&&H.addClass(d.addClass);var I=a("<div />"),J=a("<div />").width("100%").height("100%").css({zIndex:310,position:"absolute",overflow:"hidden"}),K=a("<div />").width("100%").height("100%").css("zIndex",320),L=a("<div />").css({position:"absolute",zIndex:600}).dblclick(function(){var a=ba.getFixed();d.onDblClick.call(bt,a)}).insertBefore(E).append(J,K);C&&(I=a("<img />").attr("src",E.attr("src")).css(A).width(F).height(G),J.append(I)),g&&L.css({overflowY:"hidden"});var M=d.boundary,N=z().width(F+M*2).height(G+M*2).css({position:"absolute",top: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=["touchstart","touchmove","touchend"],c=document.createElement("div"),d;try{for(d=0;d<b.length;d++){var e=b[d];e="on"+e;var f=e in c;f||(c.setAttribute(e,"return;" 
     13),f=typeof c[e]=="function"),a[b[d]]=f}return a.touchstart&&a.touchend&&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==="move"&&!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>a+f&&(f-=f+a),0>b+g&&(g-=g+b),G<e+g&&(g+=G-(e+g)),F<c+f&&(f+=F-(c+f)),a+=f,c+=f,b+=g,e+=g}function l(a){var b=m();switch(a){case"ne":return[b.x2,b.y];case"nw":return[b.x,b.y];case"se":return[b.x2,b.y2];case"sw":return[b.x,b.y2]}}function m(){if(!d.aspectRatio 
     14)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&&(h=F*10),i===0&&(i=G*10),n<f?(s=e,t=m*f,r=j<0?a-t:t+a,r<0?(r=0,u=Math.abs((r-a)/f),s=k<0?b-u:u+b):r>F&&(r=F,u=Math.abs((r-a)/f),s=k<0?b-u:u+b)):(r=c,u=l/f,s=k<0?b-u:b+u,s<0?(s=0,t=Math.abs((s-b)*f),r=j<0?a-t:t+a):s>G&&(s=G,t=Math.abs(s-b)*f,r=j<0?a-t:t+a)),r>a?(r-a<g?r=a+g:r-a>h&&(r=a+h),s>b?s=b+(r-a)/f:s=b-(r-a)/f):r<a&&(a-r<g?r=a-g:a-r>h&&(r=a-h),s>b?s=b+(a-r)/f:s=b-(a-r)/f),r<0?(a-=r,r=0):r>F&&(a-=r-F,r=F),s<0?(b-=s,s=0):s>G&&(b-=s-G,s=G),q(o(a,b,r,s))}function n(a){return a[0]<0&&(a[0]=0),a[1]<0&&(a[1]=0),a[0]>F&&(a[0]=F),a[1]>G&&(a[1]=G),[a[0],a[1]]}function o(a,b,c,d){var e=a,f=c,g=b,h=d;return c<a&&(e=c,f=a),d<b&&(g=d,h=b),[e,g,f,h]}function p(){var d=c-a,f=e-b,g;return Q&&Math.abs(d)>Q&&(c=d>0?a+Q:a-Q),R&&Math.abs(f)>R&&(e=f>0?b+R:b-R),T/V&&Math.abs(f)<T/V&&(e=f>0?b+T/V:b-T/V),S/U&&Math.abs(d)<S/U&&(c=d>0?a+S/U:a-S/U),a<0&&(c-=a,a-=a),b<0&&(e-=b,b-=b),c<0&& 
     15(a-=c,c-=c),e<0&&(b-=e,e-=e),c>F&&(g=c-F,a-=g,c-=g),e>G&&(g=e-G,b-=g,e-=g),a>F&&(g=a-G,e-=g,b-=g),b>G&&(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("<div />").css({position:"absolute",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&&(c.remove(),I.show(),b=!1,bc.isAwake()?bc.setBgOpacity(d.bgOpacity 
     16,1,1):(bc.setBgOpacity(1,1,1),bc.disableHandles()),br(H,0,1))}function n(a,e){b&&(d.bgFade&&!e?c.animate({opacity:1-a},{queue:!1,duration:d.fadeTime}):c.css({opacity:1-a}))}function o(){d.shade?k():m(),bc.isAwake()&&n(d.bgOpacity)}function p(){return c.children()}var b=!1,c=a("<div />").css({position:"absolute",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("<div />").css({position:"absolute",opacity:d.borderOpacity}).addClass(i(b));return J.append(c),c}function l(b,c){var d=a("<div />").mousedown(r(b)).css({cursor:b+"-resize",position:"absolute",zIndex:c}).addClass("ord-"+b);return _.support&&d.bind("touchstart.jcrop",_.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("handle"))}function n(a){return l(a,c++).addClass("jcrop-dragbar")}function o 
     17(a){var b;for(b=0;b<a.length;b++)g[a[b]]=n(a[b])}function p(a){var b,c;for(c=0;c<a.length;c++){switch(a[c]){case"n":b="hline";break;case"s":b="hline bottom";break;case"e":b="vline right";break;case"w":b="vline"}e[a[c]]=k(b)}}function q(a){var b;for(b=0;b<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&&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&&!c)return;d.bgFade&&!e?E.animate({opacity:a},{queue:!1,duration:d.fadeTime}):E.css("opacity",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&&K.show()}function D(){j=!0;if(d.allowResize)return K.show(),!0}function F(){j=!1,K.hide( 
     18)}function G(a){Y===a?F():D()}function H(){G(!1),v()}var b,c=370,e={},f={},g={},j=!1;d.dragEdges&&a.isArray(d.createDragbars)&&o(d.createDragbars),a.isArray(d.createHandles)&&q(d.createHandles),d.drawBorders&&a.isArray(d.createBorders)&&p(d.createBorders),a(document).bind("touchstart.jcrop-ios",function(b){a(b.currentTarget).hasClass("jcrop-tracker")&&b.stopPropagation()});var M=z().mousedown(r("move")).css({cursor:"move",position:"absolute",zIndex:360});return _.support&&M.bind("touchstart.jcrop",_.createDragger("move")),J.append(M),F(),{updateVisible:w,update:x,release:B,refresh:v,isAwake:function(){return b},setCursor:function(a){M.css("cursor",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&&a(document).bind("touchmove.jcrop",k).bind("touchend.jcrop",m),e&&a(document).bind("mousemove.jcrop",h).bind("mouseup.jcrop",i)}function g(){N.css({zIndex:290}),a(document).unbind(".jcrop")}function h 
     19(a){return b(l(a)),!1}function i(a){return a.preventDefault(),a.stopPropagation(),X&&(X=!1,c(l(a)),bc.isAwake()&&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("cursor",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&&(b.show(),b.focus())}function f(a){b.hide()}function h(a,b,c){d.allowMove&&(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.keyCode){case 37:h(a,-b,0);break;case 39:h(a,b,0);break;case 38:h(a,0,-b);break;case 40 
     20:h(a,0,b);break;case 27:d.allowSelect&&bc.release();break;case 9:return!0}return!1}var b=a('<input type="radio" />').css({position:"fixed",left:"-120px",width:"12px"}),c=a("<div />").css({position:"absolute",overflow:"hidden"}).append(b);return d.keySupport&&(b.keydown(i).blur(f),g||!d.fixedSupport?(b.css({position:"absolute",left:"-20px"}),c.append(b).insertBefore(E)):b.insertBefore(E)),{watchKeys:e}}();_.support&&N.bind("touchstart.jcrop",_.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&&H.bind("selectstart",function(){return!1}),B.data("Jcrop",bt),bt},a.fn.Jcrop=function(b,c){var d;return this.each(function(){if(a(this).data("Jcrop")){if(b==="api")return a 
     21(this).data("Jcrop");a(this).data("Jcrop").setOptions(b)}else this.tagName=="IMG"?a.Jcrop.Loader(this,function(){a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d)}):(a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d))}),this},a.Jcrop.Loader=function(b,c,d){function g(){f.complete?(e.unbind(".jcloader"),a.isFunction(c)&&c.call(f)):window.setTimeout(g,50)}var e=a(b),f=e[0];e.bind("load.jcloader",g).bind("error.jcloader",function(b){e.unbind(".jcloader"),a.isFunction(d)&&d.call(f)}),f.complete&&a.isFunction(c)&&(e.unbind(".jcloader"),c.call(f))},a.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:.6,bgFade:!1,borderOpacity:.4,handleOpacity:.5,handleSize:7,aspectRatio:0,keySupport:!0,createHandles:["n","s","e","w","nw","ne","se","sw"],createDragbars:["n","s","e","w"],createBorders:["n","s","e","w"],drawBorders:!0,dragEdges:!0,fixedSupport:!0, 
     22touchSupport: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); 
  • trunk/wp-includes/script-loader.php

    r21632 r21633  
    182182    ) ); 
    183183 
    184     $scripts->add( 'jcrop', "/wp-includes/js/jcrop/jquery.Jcrop$suffix.js", array('jquery'), '0.9.8-20110113'); 
     184    $scripts->add( 'jcrop', "/wp-includes/js/jcrop/jquery.Jcrop$suffix.js", array('jquery'), '0.9.10'); 
    185185 
    186186    $scripts->add( 'swfobject', "/wp-includes/js/swfobject.js", array(), '2.2-20120417'); 
     
    483483    $styles->add( 'thickbox', '/wp-includes/js/thickbox/thickbox.css' ); 
    484484    $styles->add( 'farbtastic', '/wp-admin/css/farbtastic.css', array(), '1.3u1' ); 
    485     $styles->add( 'jcrop', '/wp-includes/js/jcrop/jquery.Jcrop.css', array(), '0.9.8' ); 
     485    $styles->add( 'jcrop', "/wp-includes/js/jcrop/jquery.Jcrop$suffix.css", array(), '0.9.10' ); 
    486486    $styles->add( 'imgareaselect', '/wp-includes/js/imgareaselect/imgareaselect.css', array(), '0.9.8' ); 
    487487    $styles->add( 'admin-bar', "/wp-includes/css/admin-bar$suffix.css" ); 
Note: See TracChangeset for help on using the changeset viewer.