Вход Регистрация
Файл: static/plugins/base/js/jquery.Jcrop.js
Строк: 932
<?php
/**
 * jquery.Jcrop.js v0.9.8
 * jQuery Image Cropping Plugin
 * @author Kelly Hallman <khallman@gmail.com>
 * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:

 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.

 * }}}
 */

(function($) {

$.
Jcrop = function(obj,opt)
{
    
// Initialization {{{

    // Sanitize some options {{{
    
var obj objopt opt;

    if (
typeof(obj) !== 'object'obj = $(obj)[0];
    if (
typeof(opt) !== 'object'opt = { };

    
// Some on-the-fly fixes for MSIE...sigh
    
if (!('trackDocument' in opt))
    {
        
opt.trackDocument = $.browser.msie false true;
        if ($.
browser.msie && $.browser.version.split('.')[0] == '8')
            
opt.trackDocument true;
    }

    if (!(
'keySupport' in opt))
            
opt.keySupport = $.browser.msie false true;
        
    
// }}}
    // Extend the default options {{{
    
var defaults = {

        
// Basic Settings
        
trackDocument:        false,
        
baseClass:            'jcrop',
        
addClass:            null,

        
// Styling Options
        
bgColor:            'black',
        
bgOpacity:            .6,
        
borderOpacity:        .4,
        
handleOpacity:        .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],
        
maxSize:            [ 0],
        
minSize:            [ 0],

        
// Callbacks / Event Handlers
        
onChange: function() { },
        
onSelect: function() { }

    };
    var 
options defaults;
    
setOptions(opt);

    
// }}}
    // Initialize some jQuery objects {{{

    
var $origimg = $(obj);
    var 
$img $origimg.clone().removeAttr('id').css({ position'absolute' });

    
$img.width($origimg.width());
    
$img.height($origimg.height());
    
$origimg.after($img).hide();

    
presize($img,options.boxWidth,options.boxHeight);

    var 
boundx $img.width(),
        
boundy $img.height(),

        
$div = $('<div />')
            .
width(boundx).height(boundy)
            .
addClass(cssClass('holder'))
            .
css({
                
position'relative',
                
backgroundColoroptions.bgColor
            
}).insertAfter($origimg).append($img);
    ;
    
    if (
options.addClass$div.addClass(options.addClass);
    
//$img.wrap($div);

    
var $img2 = $('<img />')/*{{{*/
            
.attr('src',$img.attr('src'))
            .
css('position','absolute')
            .
width(boundx).height(boundy)
    ;
/*}}}*/
    
var $img_holder = $('<div />')/*{{{*/
        
.width(pct(100)).height(pct(100))
        .
css({
            
zIndex310,
            
position'absolute',
            
overflow'hidden'
        
})
        .
append($img2)
    ;
/*}}}*/
    
var $hdl_holder = $('<div />')/*{{{*/
        
.width(pct(100)).height(pct(100))
        .
css('zIndex',320);
    
/*}}}*/
    
var $sel = $('<div />')/*{{{*/
        
.css({
            
position'absolute',
            
zIndex300
        
})
        .
insertBefore($img)
        .
append($img_holder,$hdl_holder)
    ;
/*}}}*/

    
var bound options.boundary;
    var 
$trk newTracker().width(boundx+(bound*2)).height(boundy+(bound*2))
        .
css({ position'absolute'toppx(-bound), leftpx(-bound), zIndex290 })
        .
mousedown(newSelection);    
    
    
/* }}} */
    // Set more variables {{{

    
var xlimitylimitxminymin;
    var 
xscaleyscaleenabled true;
    var 
docOffset getPos($img),
        
// Internal states
        
btndownlastcursdimmedanimating,
        
shift_down;

    
// }}}
        

        // }}}
    // Internal Modules {{{

    
var Coords = function()/*{{{*/
    
{
        var 
x1 0y1 0x2 0y2 0oxoy;

        function 
setPressed(pos)/*{{{*/
        
{
            var 
pos rebound(pos);
            
x2 x1 pos[0];
            
y2 y1 pos[1];
        };
        
/*}}}*/
        
function setCurrent(pos)/*{{{*/
        
{
            var 
pos rebound(pos);
            
ox pos[0] - x2;
            
oy pos[1] - y2;
            
x2 pos[0];
            
y2 pos[1];
        };
        
/*}}}*/
        
function getOffset()/*{{{*/
        
{
            return [ 
oxoy ];
        };
        
/*}}}*/
        
function moveOffset(offset)/*{{{*/
        
{
            var 
ox offset[0], oy offset[1];

            if (
x1 oxox -= ox x1;
            if (
y1 oyoy -= oy y1;

            if (
boundy y2 oyoy += boundy - (y2 oy);
            if (
boundx x2 oxox += boundx - (x2 ox);

            
x1 += ox;
            
x2 += ox;
            
y1 += oy;
            
y2 += oy;
        };
        
/*}}}*/
        
function getCorner(ord)/*{{{*/
        
{
            var 
getFixed();
            switch(
ord)
            {
                case 
'ne': return [ c.x2c.];
                case 
'nw': return [ c.xc.];
                case 
'se': return [ c.x2c.y2 ];
                case 
'sw': return [ c.xc.y2 ];
            }
        };
        
/*}}}*/
        
function getFixed()/*{{{*/
        
{
            if (!
options.aspectRatio) return getRect();
            
// This function could use some optimization I think...
            
var aspect options.aspectRatio,
                
min_x options.minSize[0]/xscale
                
min_y options.minSize[1]/yscale,
                
max_x options.maxSize[0]/xscale
                
max_y options.maxSize[1]/yscale,
                
rw x2 x1,
                
rh y2 y1,
                
rwa Math.abs(rw),
                
rha Math.abs(rh),
                
real_ratio rwa rha,
                
xxyy
            
;
            if (
max_x == 0) { max_x boundx 10 }
            if (
max_y == 0) { max_y boundy 10 }
            if (
real_ratio aspect)
            {
                
yy y2;
                
rha aspect;
                
xx rw x1 x1;

                if (
xx 0)
                {
                    
xx 0;
                    
Math.abs((xx x1) / aspect);
                    
yy rh y1 hy1;
                }
                else if (
xx boundx)
                {
                    
xx boundx;
                    
Math.abs((xx x1) / aspect);
                    
yy rh y1 y1;
                }
            }
            else
            {
                
xx x2;
                
rwa aspect;
                
yy rh y1 y1 h;
                if (
yy 0)
                {
                    
yy 0;
                    
Math.abs((yy y1) * aspect);
                    
xx rw x1 x1;
                }
                else if (
yy boundy)
                {
                    
yy boundy;
                    
Math.abs(yy y1) * aspect;
                    
xx rw x1 x1;
                }
            }

            
// Magic %-)
            
if(xx x1) { // right side
              
if(xx x1 min_x) {
                
xx x1 min_x;
              } else if (
xx x1 max_x) {
                
xx x1 max_x;
              }
              if(
yy y1) {
                
yy y1 + (xx x1)/aspect;
              } else {
                
yy y1 - (xx x1)/aspect;
              }
            } else if (
xx x1) { // left side
              
if(x1 xx min_x) {
                
xx x1 min_x
              
} else if (x1 xx max_x) {
                
xx x1 max_x;
              }
              if(
yy y1) {
                
yy y1 + (x1 xx)/aspect;
              } else {
                
yy y1 - (x1 xx)/aspect;
              }
            }

            if(
xx 0) {
                
x1 -= xx;
                
xx 0;
            } else  if (
xx boundx) {
                
x1 -= xx boundx;
                
xx boundx;
            }

            if(
yy 0) {
                
y1 -= yy;
                
yy 0;
            } else  if (
yy boundy) {
                
y1 -= yy boundy;
                
yy boundy;
            }

            return 
last makeObj(flipCoords(x1,y1,xx,yy));
        };
        
/*}}}*/
        
function rebound(p)/*{{{*/
        
{
            if (
p[0] < 0p[0] = 0;
            if (
p[1] < 0p[1] = 0;

            if (
p[0] > boundxp[0] = boundx;
            if (
p[1] > boundyp[1] = boundy;

            return [ 
p[0], p[1] ];
        };
        
/*}}}*/
        
function flipCoords(x1,y1,x2,y2)/*{{{*/
        
{
            var 
xa x1xb x2ya y1yb y2;
            if (
x2 x1)
            {
                
xa x2;
                
xb x1;
            }
            if (
y2 y1)
            {
                
ya y2;
                
yb y1;
            }
            return [ 
Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ];
        };
        
/*}}}*/
        
function getRect()/*{{{*/
        
{
            var 
xsize x2 x1;
            var 
ysize y2 y1;

            if (
xlimit && (Math.abs(xsize) > xlimit))
                
x2 = (xsize 0) ? (x1 xlimit) : (x1 xlimit);
            if (
ylimit && (Math.abs(ysize) > ylimit))
                
y2 = (ysize 0) ? (y1 ylimit) : (y1 ylimit);

            if (
ymin && (Math.abs(ysize) < ymin))
                
y2 = (ysize 0) ? (y1 ymin) : (y1 ymin);
            if (
xmin && (Math.abs(xsize) < xmin))
                
x2 = (xsize 0) ? (x1 xmin) : (x1 xmin);

            if (
x1 0) { x2 -= x1x1 -= x1; }
            if (
y1 0) { y2 -= y1y1 -= y1; }
            if (
x2 0) { x1 -= x2x2 -= x2; }
            if (
y2 0) { y1 -= y2y2 -= y2; }
            if (
x2 boundx) { var delta x2 boundxx1 -= deltax2 -= delta; }
            if (
y2 boundy) { var delta y2 boundyy1 -= deltay2 -= delta; }
            if (
x1 boundx) { var delta x1 boundyy2 -= deltay1 -= delta; }
            if (
y1 boundy) { var delta y1 boundyy2 -= deltay1 -= delta; }

            return 
makeObj(flipCoords(x1,y1,x2,y2));
        };
        
/*}}}*/
        
function makeObj(a)/*{{{*/
        
{
            return { 
xa[0], ya[1], x2a[2], y2a[3],
                
wa[2] - a[0], ha[3] - a[1] };
        };
        
/*}}}*/

        
return {
            
flipCoordsflipCoords,
            
setPressedsetPressed,
            
setCurrentsetCurrent,
            
getOffsetgetOffset,
            
moveOffsetmoveOffset,
            
getCornergetCorner,
            
getFixedgetFixed
        
};
    }();

    
/*}}}*/
    
var Selection = function()/*{{{*/
    
{
        var 
startenddragmodeawakehdep 370;
        var 
borders = { };
        var 
handle = { };
        var 
seehandles false;
        var 
hhs options.handleOffset;

        
/* Insert draggable elements {{{*/

        // Insert border divs for outline
        
if (options.drawBorders) {
            
borders = {
                    
topinsertBorder('hline')
                        .
css('top',$.browser.msie?px(-1):px(0)),
                    
bottominsertBorder('hline'),
                    
leftinsertBorder('vline'),
                    
rightinsertBorder('vline')
            };
        }

        
// Insert handles on edges
        
if (options.dragEdges) {
            
handle.insertDragbar('n');
            
handle.insertDragbar('s');
            
handle.insertDragbar('e');
            
handle.insertDragbar('w');
        }

        
// Insert side handles
        
options.sideHandles &&
            
createHandles(['n','s','e','w']);

        
// Insert corner handles
        
options.cornerHandles &&
            
createHandles(['sw','nw','ne','se']);

        
/*}}}*/
        // Private Methods
        
function insertBorder(type)/*{{{*/
        
{
            var 
jq = $('<div />')
                .
css({position'absolute'opacityoptions.borderOpacity })
                .
addClass(cssClass(type));
            
$img_holder.append(jq);
            return 
jq;
        };
        
/*}}}*/
        
function dragDiv(ord,zi)/*{{{*/
        
{
            var 
jq = $('<div />')
                .
mousedown(createDragger(ord))
                .
css({
                    
cursorord+'-resize',
                    
position'absolute',
                    
zIndexzi 
                
})
            ;
            
$hdl_holder.append(jq);
            return 
jq;
        };
        
/*}}}*/
        
function insertHandle(ord)/*{{{*/
        
{
            return 
dragDiv(ord,hdep++)
                .
css({ toppx(-hhs+1), leftpx(-hhs+1), opacityoptions.handleOpacity })
                .
addClass(cssClass('handle'));
        };
        
/*}}}*/
        
function insertDragbar(ord)/*{{{*/
        
{
            var 
options.handleSize,
                
hhs,
                
ss,
                
oo;

            switch(
ord)
            {
                case 
'n': case 's'pct(100); break;
                case 
'e': case 'w'pct(100); break;
            }

            return 
dragDiv(ord,hdep++).width(w).height(h)
                .
css({ toppx(-t+1), leftpx(-l+1)});
        };
        
/*}}}*/
        
function createHandles(li)/*{{{*/
        
{
            for(
i in lihandle[li[i]] = insertHandle(li[i]);
        };
        
/*}}}*/
        
function moveHandles(c)/*{{{*/
        
{
            var 
midvert  Math.round((c.2) - hhs),
                
midhoriz Math.round((c.2) - hhs),
                
north west = -hhs+1,
                
east c.hhs,
                
south c.hhs,
                
xy;

            
'e' in handle &&
                
handle.e.css({ toppx(midvert), leftpx(east) }) &&
                
handle.w.css({ toppx(midvert) }) &&
                
handle.s.css({ toppx(south), leftpx(midhoriz) }) &&
                
handle.n.css({ leftpx(midhoriz) });

            
'ne' in handle &&
                
handle.ne.css({ leftpx(east) }) &&
                
handle.se.css({ toppx(south), leftpx(east) }) &&
                
handle.sw.css({ toppx(south) });

            
'b' in handle &&
                
handle.b.css({ toppx(south) }) &&
                
handle.r.css({ leftpx(east) });
        };
        
/*}}}*/
        
function moveto(x,y)/*{{{*/
        
{
            
$img2.css({ toppx(-y), leftpx(-x) });
            
$sel.css({ toppx(y), leftpx(x) });
        };
        
/*}}}*/
        
function resize(w,h)/*{{{*/
        
{
            
$sel.width(w).height(h);
        };
        
/*}}}*/
        
function refresh()/*{{{*/
        
{
            var 
Coords.getFixed();

            
Coords.setPressed([c.x,c.y]);
            
Coords.setCurrent([c.x2,c.y2]);

            
updateVisible();
        };
        
/*}}}*/

        // Internal Methods
        
function updateVisible()/*{{{*/
            
{ if (awake) return update(); };
        
/*}}}*/
        
function update()/*{{{*/
        
{
            var 
Coords.getFixed();

            
resize(c.w,c.h);
            
moveto(c.x,c.y);

            
options.drawBorders &&
                
borders['right'].css({ leftpx(c.w-1) }) &&
                    
borders['bottom'].css({ toppx(c.h-1) });

            
seehandles && moveHandles(c);
            
awake || show();

            
options.onChange(unscale(c));
        };
        
/*}}}*/
        
function show()/*{{{*/
        
{
            
$sel.show();
            
$img.css('opacity',options.bgOpacity);
            
awake true;
        };
        
/*}}}*/
        
function release()/*{{{*/
        
{
            
disableHandles();
            
$sel.hide();
            
$img.css('opacity',1);
            
awake false;
        };
        
/*}}}*/
        
function showHandles()//{{{
        
{
            if (
seehandles)
            {
                
moveHandles(Coords.getFixed());
                
$hdl_holder.show();
            }
        };
        
//}}}
        
function enableHandles()/*{{{*/
        

            
seehandles true;
            if (
options.allowResize)
            {
                
moveHandles(Coords.getFixed());
                
$hdl_holder.show();
                return 
true;
            }
        };
        
/*}}}*/
        
function disableHandles()/*{{{*/
        
{
            
seehandles false;
            
$hdl_holder.hide();
        };
        
/*}}}*/
        
function animMode(v)/*{{{*/
        
{
            (
animating v) ? disableHandles(): enableHandles();
        };
        
/*}}}*/
        
function done()/*{{{*/
        
{
            
animMode(false);
            
refresh();
        };
        
/*}}}*/

        
var $track newTracker().mousedown(createDragger('move'))
                .
css({ cursor'move'position'absolute'zIndex360 })

        
$img_holder.append($track);
        
disableHandles();

        return {
            
updateVisibleupdateVisible,
            
updateupdate,
            
releaserelease,
            
refreshrefresh,
            
setCursor: function (cursor) { $track.css('cursor',cursor); },
            
enableHandlesenableHandles,
            
enableOnly: function() { seehandles true; },
            
showHandlesshowHandles,
            
disableHandlesdisableHandles,
            
animModeanimMode,
            
donedone
        
};
    }();
    
/*}}}*/
    
var Tracker = function()/*{{{*/
    
{
        var 
onMove        = function() { },
            
onDone        = function() { },
            
trackDoc    options.trackDocument;

        if (!
trackDoc)
        {
            
$trk
                
.mousemove(trackMove)
                .
mouseup(trackUp)
                .
mouseout(trackUp)
            ;
        }

        function 
toFront()/*{{{*/
        
{
            
$trk.css({zIndex:450});
            if (
trackDoc)
            {
                $(
document)
                    .
mousemove(trackMove)
                    .
mouseup(trackUp)
                ;
            }
        }
        
/*}}}*/
        
function toBack()/*{{{*/
        
{
            
$trk.css({zIndex:290});
            if (
trackDoc)
            {
                $(
document)
                    .
unbind('mousemove',trackMove)
                    .
unbind('mouseup',trackUp)
                ;
            }
        }
        
/*}}}*/
        
function trackMove(e)/*{{{*/
        
{
            
onMove(mouseAbs(e));
        };
        
/*}}}*/
        
function trackUp(e)/*{{{*/
        
{
            
e.preventDefault();
            
e.stopPropagation();

            if (
btndown)
            {
                
btndown false;

                
onDone(mouseAbs(e));
                
options.onSelect(unscale(Coords.getFixed()));
                
toBack();
                
onMove = function() { };
                
onDone = function() { };
            }

            return 
false;
        };
        
/*}}}*/

        
function activateHandlers(move,done)/* {{{ */
        
{
            
btndown true;
            
onMove move;
            
onDone done;
            
toFront();
            return 
false;
        };
        
/* }}} */

        
function setCursor(t) { $trk.css('cursor',t); };

        
$img.before($trk);
        return {
            
activateHandlersactivateHandlers,
            
setCursorsetCursor
        
};
    }();
    
/*}}}*/
    
var KeyManager = function()/*{{{*/
    
{
        var 
$keymgr = $('<input type="radio" />')
                .
css({ position'absolute'left'-30px' })
                .
keypress(parseKey)
                .
blur(onBlur),

            
$keywrap = $('<div />')
                .
css({
                    
position'absolute',
                    
overflow'hidden'
                
})
                .
append($keymgr)
        ;

        function 
watchKeys()/*{{{*/
        
{
            if (
options.keySupport)
            {
                
$keymgr.show();
                
$keymgr.focus();
            }
        };
        
/*}}}*/
        
function onBlur(e)/*{{{*/
        
{
            
$keymgr.hide();
        };
        
/*}}}*/
        
function doNudge(e,x,y)/*{{{*/
        
{
            if (
options.allowMove) {
                
Coords.moveOffset([x,y]);
                
Selection.updateVisible();
            };
            
e.preventDefault();
            
e.stopPropagation();
        };
        
/*}}}*/
        
function parseKey(e)/*{{{*/
        
{
            if (
e.ctrlKey) return true;
            
shift_down e.shiftKey true false;
            var 
nudge shift_down 10 1;
            switch(
e.keyCode)
            {
                case 
37doNudge(e,-nudge,0); break;
                case 
39doNudge(e,nudge,0); break;
                case 
38doNudge(e,0,-nudge); break;
                case 
40doNudge(e,0,nudge); break;

                case 
27Selection.release(); break;

                case 
9: return true;
            }

            return 
nothing(e);
        };
        
/*}}}*/
        
        
if (options.keySupport$keywrap.insertBefore($img);
        return {
            
watchKeyswatchKeys
        
};
    }();
    
/*}}}*/

    // }}}
    // Internal Methods {{{

    
function px(n) { return '' parseInt(n) + 'px'; };
    function 
pct(n) { return '' parseInt(n) + '%'; };
    function 
cssClass(cl) { return options.baseClass '-' cl; };
    function 
getPos(obj)/*{{{*/
    
{
        
// Updated in v0.9.4 to use built-in dimensions plugin
        
var pos = $(obj).offset();
        return [ 
pos.leftpos.top ];
    };
    
/*}}}*/
    
function mouseAbs(e)/*{{{*/
    
{
        return [ (
e.pageX docOffset[0]), (e.pageY docOffset[1]) ];
    };
    
/*}}}*/
    
function myCursor(type)/*{{{*/
    
{
        if (
type != lastcurs)
        {
            
Tracker.setCursor(type);
            
//Handles.xsetCursor(type);
            
lastcurs type;
        }
    };
    
/*}}}*/
    
function startDragMode(mode,pos)/*{{{*/
    
{
        
docOffset getPos($img);
        
Tracker.setCursor(mode=='move'?mode:mode+'-resize');

        if (
mode == 'move')
            return 
Tracker.activateHandlers(createMover(pos), doneSelect);

        var 
fc Coords.getFixed();
        var 
opp oppLockCorner(mode);
        var 
opc Coords.getCorner(oppLockCorner(opp));

        
Coords.setPressed(Coords.getCorner(opp));
        
Coords.setCurrent(opc);

        
Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);
    };
    
/*}}}*/
    
function dragmodeHandler(mode,f)/*{{{*/
    
{
        return function(
pos) {
            if (!
options.aspectRatio) switch(mode)
            {
                case 
'e'pos[1] = f.y2; break;
                case 
'w'pos[1] = f.y2; break;
                case 
'n'pos[0] = f.x2; break;
                case 
's'pos[0] = f.x2; break;
            }
            else switch(
mode)
            {
                case 
'e'pos[1] = f.y+1; break;
                case 
'w'pos[1] = f.y+1; break;
                case 
'n'pos[0] = f.x+1; break;
                case 
's'pos[0] = f.x+1; break;
            }
            
Coords.setCurrent(pos);
            
Selection.update();
        };
    };
    
/*}}}*/
    
function createMover(pos)/*{{{*/
    
{
        var 
lloc pos;
        
KeyManager.watchKeys();

        return function(
pos)
        {
            
Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
            
lloc pos;
            
            
Selection.update();
        };
    };
    
/*}}}*/
    
function oppLockCorner(ord)/*{{{*/
    
{
        switch(
ord)
        {
            case 
'n': return 'sw';
            case 
's': return 'nw';
            case 
'e': return 'nw';
            case 
'w': return 'ne';
            case 
'ne': return 'sw';
            case 
'nw': return 'se';
            case 
'se': return 'nw';
            case 
'sw': return 'ne';
        };
    };
    
/*}}}*/
    
function createDragger(ord)/*{{{*/
    
{
        return function(
e) {
            if (
options.disabled) return false;
            if ((
ord == 'move') && !options.allowMove) return false;
            
btndown true;
            
startDragMode(ord,mouseAbs(e));
            
e.stopPropagation();
            
e.preventDefault();
            return 
false;
        };
    };
    
/*}}}*/
    
function presize($obj,w,h)/*{{{*/
    
{
        var 
nw $obj.width(), nh $obj.height();
        if ((
nw w) && 0)
        {
            
nw w;
            
nh = (w/$obj.width()) * $obj.height();
        }
        if ((
nh h) && 0)
        {
            
nh h;
            
nw = (h/$obj.height()) * $obj.width();
        }
        
xscale $obj.width() / nw;
        
yscale $obj.height() / nh;
        
$obj.width(nw).height(nh);
    };
    
/*}}}*/
    
function unscale(c)/*{{{*/
    
{
        return {
            
xparseInt(c.xscale), yparseInt(c.yscale), 
            
x2parseInt(c.x2 xscale), y2parseInt(c.y2 yscale), 
            
wparseInt(c.xscale), hparseInt(c.yscale)
        };
    };
    
/*}}}*/
    
function doneSelect(pos)/*{{{*/
    
{
        var 
Coords.getFixed();
        if (
c.options.minSelect[0] && c.options.minSelect[1])
        {
            
Selection.enableHandles();
            
Selection.done();
        }
        else
        {
            
Selection.release();
        }
        
Tracker.setCursoroptions.allowSelect?'crosshair':'default' );
    };
    
/*}}}*/
    
function newSelection(e)/*{{{*/
    
{
        if (
options.disabled) return false;
        if (!
options.allowSelect) return false;
        
btndown true;
        
docOffset getPos($img);
        
Selection.disableHandles();
        
myCursor('crosshair');
        var 
pos mouseAbs(e);
        
Coords.setPressed(pos);
        
Tracker.activateHandlers(selectDrag,doneSelect);
        
KeyManager.watchKeys();
        
Selection.update();

        
e.stopPropagation();
        
e.preventDefault();
        return 
false;
    };
    
/*}}}*/
    
function selectDrag(pos)/*{{{*/
    
{
        
Coords.setCurrent(pos);
        
Selection.update();
    };
    
/*}}}*/
    
function newTracker()
    {
        var 
trk = $('<div></div>').addClass(cssClass('tracker'));
        $.
browser.msie && trk.css({ opacity0backgroundColor'white' });
        return 
trk;
    };

    
// }}}
    // API methods {{{
        
    
function animateTo(a)/*{{{*/
    
{
        var 
x1 a[0] / xscale,
            
y1 a[1] / yscale,
            
x2 a[2] / xscale,
            
y2 a[3] / yscale;

        if (
animating) return;

        var 
animto Coords.flipCoords(x1,y1,x2,y2);
        var 
Coords.getFixed();
        var 
animat initcr = [ c.xc.yc.x2c.y2 ];
        var 
interv options.animationDelay;

        var 
animat[0];
        var 
animat[1];
        var 
x2 animat[2];
        var 
y2 animat[3];
        var 
ix1 animto[0] - initcr[0];
        var 
iy1 animto[1] - initcr[1];
        var 
ix2 animto[2] - initcr[2];
        var 
iy2 animto[3] - initcr[3];
        var 
pcent 0;
        var 
velocity options.swingSpeed;

        
Selection.animMode(true);

        var 
animator = function()
        {
            return function()
            {
                
pcent += (100 pcent) / velocity;

                
animat[0] = + ((pcent 100) * ix1);
                
animat[1] = + ((pcent 100) * iy1);
                
animat[2] = x2 + ((pcent 100) * ix2);
                
animat[3] = y2 + ((pcent 100) * iy2);

                if (
pcent 100animateStart();
                    else 
Selection.done();

                if (
pcent >= 99.8pcent 100;

                
setSelectRaw(animat);
            };
        }();

        function 
animateStart()
            { 
window.setTimeout(animator,interv); };

        
animateStart();
    };
    
/*}}}*/
    
function setSelect(rect)//{{{
    
{
        
setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);
    };
    
//}}}
    
function setSelectRaw(l/*{{{*/
    
{
        
Coords.setPressed([l[0],l[1]]);
        
Coords.setCurrent([l[2],l[3]]);
        
Selection.update();
    };
    
/*}}}*/
    
function setOptions(opt)/*{{{*/
    
{
        if (
typeof(opt) != 'object'opt = { };
        
options = $.extend(options,opt);

        if (
typeof(options.onChange)!=='function')
            
options.onChange = function() { };

        if (
typeof(options.onSelect)!=='function')
            
options.onSelect = function() { };

    };
    
/*}}}*/
    
function tellSelect()/*{{{*/
    
{
        return 
unscale(Coords.getFixed());
    };
    
/*}}}*/
    
function tellScaled()/*{{{*/
    
{
        return 
Coords.getFixed();
    };
    
/*}}}*/
    
function setOptionsNew(opt)/*{{{*/
    
{
        
setOptions(opt);
        
interfaceUpdate();
    };
    
/*}}}*/
    
function disableCrop()//{{{
    
{
        
options.disabled true;
        
Selection.disableHandles();
        
Selection.setCursor('default');
        
Tracker.setCursor('default');
    };
    
//}}}
    
function enableCrop()//{{{
    
{
        
options.disabled false;
        
interfaceUpdate();
    };
    
//}}}
    
function cancelCrop()//{{{
    
{
        
Selection.done();
        
Tracker.activateHandlers(null,null);
    };
    
//}}}
    
function destroy()//{{{
    
{
        
$div.remove();
        
$origimg.show();
    };
    
//}}}

    
function interfaceUpdate(alt)//{{{
    // This method tweaks the interface based on options object.
    // Called when options are changed and at end of initialization.
    
{
        
options.allowResize ?
            
alt?Selection.enableOnly():Selection.enableHandles():
            
Selection.disableHandles();

        
Tracker.setCursoroptions.allowSelect'crosshair''default' );
        
Selection.setCursoroptions.allowMove'move''default' );

        
$div.css('backgroundColor',options.bgColor);

        if (
'setSelect' in options) {
            
setSelect(opt.setSelect);
            
Selection.done();
            
delete(options.setSelect);
        }

        if (
'trueSize' in options) {
            
xscale options.trueSize[0] / boundx;
            
yscale options.trueSize[1] / boundy;
        }

        
xlimit options.maxSize[0] || 0;
        
ylimit options.maxSize[1] || 0;
        
xmin options.minSize[0] || 0;
        
ymin options.minSize[1] || 0;

        if (
'outerImage' in options)
        {
            
$img.attr('src',options.outerImage);
            
delete(options.outerImage);
        }

        
Selection.refresh();
    };
    
//}}}

    // }}}

    
$hdl_holder.hide();
    
interfaceUpdate(true);
    
    var 
api = {
        
animateToanimateTo,
        
setSelectsetSelect,
        
setOptionssetOptionsNew,
        
tellSelecttellSelect,
        
tellScaledtellScaled,

        
disabledisableCrop,
        
enableenableCrop,
        
cancelcancelCrop,

        
focusKeyManager.watchKeys,

        
getBounds: function() { return [ boundx xscaleboundy yscale ]; },
        
getWidgetSize: function() { return [ boundxboundy ]; },

        
releaseSelection.release,
        
destroydestroy

    
};

    
$origimg.data('Jcrop',api);
    return 
api;
};

$.fn.
Jcrop = function(options)/*{{{*/
{
    function 
attachWhenDone(from)/*{{{*/
    
{
        var 
loadsrc options.useImg || from.src;
        var 
img = new Image();
        
img.onload = function() { $.Jcrop(from,options); };
        
img.src loadsrc;
    };
    
/*}}}*/
    
if (typeof(options) !== 'object'options = { };

    
// Iterate over each object, attach Jcrop
    
this.each(function()
    {
        
// If we've already attached to this object
        
if ($(this).data('Jcrop'))
        {
            
// The API can be requested this way (undocumented)
            
if (options == 'api') return $(this).data('Jcrop');
            
// Otherwise, we just reset the options...
            
else $(this).data('Jcrop').setOptions(options);
        }
        
// If we haven't been attached, preload and attach
        
else attachWhenDone(this);
    });

    
// Return "this" so we're chainable a la jQuery plugin-style!
    
return this;
};
/*}}}*/

})(jQuery);
?>
Онлайн: 1
Реклама