WordPress.org

Make WordPress Core

Changeset 21633


Ignore:
Timestamp:
08/27/2012 11:37:03 PM (6 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.