Вход Регистрация
Файл: monst/core/j/jquery.Jcrop.js
Строк: 1212
<?php
/**
 * jquery.Jcrop.js v0.9.12
 * jQuery Image Cropping Plugin - released under MIT License 
 * Author: Kelly Hallman <khallman@gmail.com>
 * http://github.com/tapmodo/Jcrop
 * Copyright (c) 2008-2013 Tapmodo Interactive LLC {{{
 *
 * 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 (objopt) {
    var 
options = $.extend({}, $.Jcrop.defaults),
        
docOffset,
        
_ua navigator.userAgent.toLowerCase(),
        
is_msie = /msie/.test(_ua),
        
ie6mode = /msie [1-6]./.test(_ua);

    
// Internal Methods {{{
    
function px(n) {
      return 
Math.round(n) + 'px';
    }
    function 
cssClass(cl) {
      return 
options.baseClass '-' cl;
    }
    function 
supportsColorFade() {
      return $.
fx.step.hasOwnProperty('backgroundColor');
    }
    function 
getPos(obj//{{{
    
{
      var 
pos = $(obj).offset();
      return [
pos.leftpos.top];
    }
    
//}}}
    
function mouseAbs(e//{{{
    
{
      return [(
e.pageX docOffset[0]), (e.pageY docOffset[1])];
    }
    
//}}}
    
function setOptions(opt//{{{
    
{
      if (
typeof(opt) !== 'object'opt = {};
      
options = $.extend(optionsopt);

      $.
each(['onChange','onSelect','onRelease','onDblClick'],function(i,e) {
        if (
typeof(options[e]) !== 'function'options[e] = function () {};
      });
    }
    
//}}}
    
function startDragMode(modepostouch//{{{
    
{
      
docOffset getPos($img);
      
Tracker.setCursor(mode === 'move' mode mode '-resize');

      if (
mode === 'move') {
        return 
Tracker.activateHandlers(createMover(pos), doneSelecttouch);
      }

      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(modefc), doneSelecttouch);
    }
    
//}}}
    
function dragmodeHandler(modef//{{{
    
{
      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.1;
            break;
          case 
'w':
            
pos[1] = f.1;
            break;
          case 
'n':
            
pos[0] = f.1;
            break;
          case 
's':
            
pos[0] = f.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;
        }
        
        
// Fix position of crop area when dragged the very first time.
        // Necessary when crop image is in a hidden element when page is loaded.
        
docOffset getPos($img);

        
btndown true;
        
startDragMode(ordmouseAbs(e));
        
e.stopPropagation();
        
e.preventDefault();
        return 
false;
      };
    }
    
//}}}
    
function presize($objwh//{{{
    
{
      var 
nw $obj.width(),
          
nh $obj.height();
      if ((
nw w) && 0) {
        
nw w;
        
nh = ($obj.width()) * $obj.height();
      }
      if ((
nh h) && 0) {
        
nh h;
        
nw = ($obj.height()) * $obj.width();
      }
      
xscale $obj.width() / nw;
      
yscale $obj.height() / nh;
      
$obj.width(nw).height(nh);
    }
    
//}}}
    
function unscale(c//{{{
    
{
      return {
        
xc.xscale,
        
yc.yscale,
        
x2c.x2 xscale,
        
y2c.y2 yscale,
        
wc.xscale,
        
hc.yscale
      
};
    }
    
//}}}
    
function doneSelect(pos//{{{
    
{
      var 
Coords.getFixed();
      if ((
c.options.minSelect[0]) && (c.options.minSelect[1])) {
        
Selection.enableHandles();
        
Selection.done();
      } else {
        
Selection.release();
      }
      
Tracker.setCursor(options.allowSelect 'crosshair' 'default');
    }
    
//}}}
    
function newSelection(e//{{{
    
{
      if (
options.disabled) {
        return 
false;
      }
      if (!
options.allowSelect) {
        return 
false;
      }
      
btndown true;
      
docOffset getPos($img);
      
Selection.disableHandles();
      
Tracker.setCursor('crosshair');
      var 
pos mouseAbs(e);
      
Coords.setPressed(pos);
      
Selection.update();
      
Tracker.activateHandlers(selectDragdoneSelecte.type.substring(0,5)==='touch');
      
KeyManager.watchKeys();

      
e.stopPropagation();
      
e.preventDefault();
      return 
false;
    }
    
//}}}
    
function selectDrag(pos//{{{
    
{
      
Coords.setCurrent(pos);
      
Selection.update();
    }
    
//}}}
    
function newTracker() //{{{
    
{
      var 
trk = $('<div></div>').addClass(cssClass('tracker'));
      if (
is_msie) {
        
trk.css({
          
opacity0,
          
backgroundColor'white'
        
});
      }
      return 
trk;
    }
    
//}}}

    // }}}
    // Initialization {{{
    // Sanitize some options {{{
    
if (typeof(obj) !== 'object') {
      
obj = $(obj)[0];
    }
    if (
typeof(opt) !== 'object') {
      
opt = {};
    }
    
// }}}
    
setOptions(opt);
    
// Initialize some jQuery objects {{{
    // The values are SET on the image(s) for the interface
    // If the original image has any of these set, they will be reset
    // However, if you destroy() the Jcrop instance the original image's
    // character in the DOM will be as you left it.
    
var img_css = {
      
border'none',
      
visibility'visible',
      
margin0,
      
padding0,
      
position'absolute',
      
top0,
      
left0
    
};

    var 
$origimg = $(obj),
      
img_mode true;

    if (
obj.tagName == 'IMG') {
      
// Fix size of crop image.
      // Necessary when crop image is within a hidden element when page is loaded.
      
if ($origimg[0].width != && $origimg[0].height != 0) {
        
// Obtain dimensions from contained img element.
        
$origimg.width($origimg[0].width);
        
$origimg.height($origimg[0].height);
      } else {
        
// Obtain dimensions from temporary image in case the original is not loaded yet (e.g. IE 7.0). 
        
var tempImage = new Image();
        
tempImage.src $origimg[0].src;
        
$origimg.width(tempImage.width);
        
$origimg.height(tempImage.height);
      } 

      var 
$img $origimg.clone().removeAttr('id').css(img_css).show();

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

    } else {
      
$img $origimg.css(img_css).show();
      
img_mode false;
      if (
options.shade === null) { options.shade true; }
    }

    
presize($imgoptions.boxWidthoptions.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);
    }

    var 
$img2 = $('<div />'),

        
$img_holder = $('<div />'
        .
width('100%').height('100%').css({
          
zIndex310,
          
position'absolute',
          
overflow'hidden'
        
}),

        
$hdl_holder = $('<div />'
        .
width('100%').height('100%').css('zIndex'320), 

        
$sel = $('<div />'
        .
css({
          
position'absolute',
          
zIndex600
        
}).dblclick(function(){
          var 
Coords.getFixed();
          
options.onDblClick.call(api,c);
        }).
insertBefore($img).append($img_holder$hdl_holder); 

    if (
img_mode) {

      
$img2 = $('<img />')
          .
attr('src'$img.attr('src')).css(img_css).width(boundx).height(boundy),

      
$img_holder.append($img2);

    }

    if (
ie6mode) {
      
$sel.css({
        
overflowY'hidden'
      
});
    }

    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 bgcolor options.bgColor,
        
bgopacity options.bgOpacity,
        
xlimitylimitxminyminxscaleyscaleenabled true,
        
btndownanimatingshift_down;

    
docOffset getPos($img);
    
// }}}
    // }}}
    // Internal Modules {{{
    // Touch Module {{{ 
    
var Touch = (function () {
      
// Touch support detection function adapted (under MIT License)
      // from code by Jeffrey Sambells - http://github.com/iamamused/
      
function hasTouchSupport() {
        var 
support = {}, events = ['touchstart''touchmove''touchend'],
            
el document.createElement('div'), i;

        try {
          for(
i=0i<events.lengthi++) {
            var 
eventName events[i];
            
eventName 'on' eventName;
            var 
isSupported = (eventName in el);
            if (!
isSupported) {
              
el.setAttribute(eventName'return;');
              
isSupported typeof el[eventName] == 'function';
            }
            
support[events[i]] = isSupported;
          }
          return 
support.touchstart && support.touchend && support.touchmove;
        }
        catch(
err) {
          return 
false;
        }
      }

      function 
detectSupport() {
        if ((
options.touchSupport === true) || (options.touchSupport === false)) return options.touchSupport;
          else return 
hasTouchSupport();
      }
      return {
        
createDragger: function (ord) {
          return function (
e) {
            if (
options.disabled) {
              return 
false;
            }
            if ((
ord === 'move') && !options.allowMove) {
              return 
false;
            }
            
docOffset getPos($img);
            
btndown true;
            
startDragMode(ordmouseAbs(Touch.cfilter(e)), true);
            
e.stopPropagation();
            
e.preventDefault();
            return 
false;
          };
        },
        
newSelection: function (e) {
          return 
newSelection(Touch.cfilter(e));
        },
        
cfilter: function (e){
          
e.pageX e.originalEvent.changedTouches[0].pageX;
          
e.pageY e.originalEvent.changedTouches[0].pageY;
          return 
e;
        },
        
isSupportedhasTouchSupport,
        
supportdetectSupport()
      };
    }());
    
// }}}
    // Coords Module {{{
    
var Coords = (function () {
      var 
x1 0,
          
y1 0,
          
x2 0,
          
y2 0,
          
oxoy;

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

        if (
x1 ox) {
          
ox -= ox x1;
        }
        if (
y1 oy) {
          
oy -= oy y1;
        }

        if (
boundy y2 oy) {
          
oy += boundy - (y2 oy);
        }
        if (
boundx x2 ox) {
          
ox += boundx - (x2 ox);
        }

        
x1 += ox;
        
x2 += ox;
        
y1 += oy;
        
y2 += oy;
      }
      
//}}}
      
function getCorner(ord//{{{
      
{
        var 
getFixed();
        switch (
ord) {
        case 
'ne':
          return [
c.x2c.y];
        case 
'nw':
          return [
c.xc.y];
        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,
            
xxyywh;

        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 y1;
          } 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 
makeObj(flipCoords(x1y1xxyy));
      }
      
//}}}
      
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 [
Math.round(p[0]), Math.round(p[1])];
      }
      
//}}}
      
function flipCoords(x1y1x2y2//{{{
      
{
        var 
xa x1,
            
xb x2,
            
ya y1,
            
yb y2;
        if (
x2 x1) {
          
xa x2;
          
xb x1;
        }
        if (
y2 y1) {
          
ya y2;
          
yb y1;
        }
        return [
xayaxbyb];
      }
      
//}}}
      
function getRect() //{{{
      
{
        var 
xsize x2 x1,
            
ysize y2 y1,
            
delta;

        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 yscale && (Math.abs(ysize) < ymin yscale)) {
          
y2 = (ysize 0) ? (y1 ymin yscale) : (y1 ymin yscale);
        }
        if (
xmin xscale && (Math.abs(xsize) < xmin xscale)) {
          
x2 = (xsize 0) ? (x1 xmin xscale) : (x1 xmin xscale);
        }

        if (
x1 0) {
          
x2 -= x1;
          
x1 -= x1;
        }
        if (
y1 0) {
          
y2 -= y1;
          
y1 -= y1;
        }
        if (
x2 0) {
          
x1 -= x2;
          
x2 -= x2;
        }
        if (
y2 0) {
          
y1 -= y2;
          
y2 -= y2;
        }
        if (
x2 boundx) {
          
delta x2 boundx;
          
x1 -= delta;
          
x2 -= delta;
        }
        if (
y2 boundy) {
          
delta y2 boundy;
          
y1 -= delta;
          
y2 -= delta;
        }
        if (
x1 boundx) {
          
delta x1 boundy;
          
y2 -= delta;
          
y1 -= delta;
        }
        if (
y1 boundy) {
          
delta y1 boundy;
          
y2 -= delta;
          
y1 -= delta;
        }

        return 
makeObj(flipCoords(x1y1x2y2));
      }
      
//}}}
      
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
      
};
    }());

    
//}}}
    // Shade Module {{{
    
var Shade = (function() {
      var 
enabled false,
          
holder = $('<div />').css({
            
position'absolute',
            
zIndex240,
            
opacity0
          
}),
          
shades = {
            
topcreateShade(),
            
leftcreateShade().height(boundy),
            
rightcreateShade().height(boundy),
            
bottomcreateShade()
          };

      function 
resizeShades(w,h) {
        
shades.left.css({ heightpx(h) });
        
shades.right.css({ heightpx(h) });
      }
      function 
updateAuto()
      {
        return 
updateShade(Coords.getFixed());
      }
      function 
updateShade(c)
      {
        
shades.top.css({
          
leftpx(c.x),
          
widthpx(c.w),
          
heightpx(c.y)
        });
        
shades.bottom.css({
          
toppx(c.y2),
          
leftpx(c.x),
          
widthpx(c.w),
          
heightpx(boundy-c.y2)
        });
        
shades.right.css({
          
leftpx(c.x2),
          
widthpx(boundx-c.x2)
        });
        
shades.left.css({
          
widthpx(c.x)
        });
      }
      function 
createShade() {
        return $(
'<div />').css({
          
position'absolute',
          
backgroundColoroptions.shadeColor||options.bgColor
        
}).appendTo(holder);
      }
      function 
enableShade() {
        if (!
enabled) {
          
enabled true;
          
holder.insertBefore($img);
          
updateAuto();
          
Selection.setBgOpacity(1,0,1);
          
$img2.hide();

          
setBgColor(options.shadeColor||options.bgColor,1);
          if (
Selection.isAwake())
          {
            
setOpacity(options.bgOpacity,1);
          }
            else 
setOpacity(1,1);
        }
      }
      function 
setBgColor(color,now) {
        
colorChangeMacro(getShades(),color,now);
      }
      function 
disableShade() {
        if (
enabled) {
          
holder.remove();
          
$img2.show();
          
enabled false;
          if (
Selection.isAwake()) {
            
Selection.setBgOpacity(options.bgOpacity,1,1);
          } else {
            
Selection.setBgOpacity(1,1,1);
            
Selection.disableHandles();
          }
          
colorChangeMacro($div,0,1);
        }
      }
      function 
setOpacity(opacity,now) {
        if (
enabled) {
          if (
options.bgFade && !now) {
            
holder.animate({
              
opacity1-opacity
            
},{
              
queuefalse,
              
durationoptions.fadeTime
            
});
          }
          else 
holder.css({opacity:1-opacity});
        }
      }
      function 
refreshAll() {
        
options.shade enableShade() : disableShade();
        if (
Selection.isAwake()) setOpacity(options.bgOpacity);
      }
      function 
getShades() {
        return 
holder.children();
      }

      return {
        
updateupdateAuto,
        
updateRawupdateShade,
        
getShadesgetShades,
        
setBgColorsetBgColor,
        
enableenableShade,
        
disabledisableShade,
        
resizeresizeShades,
        
refreshrefreshAll,
        
opacitysetOpacity
      
};
    }());
    
// }}}
    // Selection Module {{{
    
var Selection = (function () {
      var 
awake,
          
hdep 370,
          
borders = {},
          
handle = {},
          
dragbar = {},
          
seehandles false;

      
// Private Methods
      
function insertBorder(type//{{{
      
{
        var 
jq = $('<div />').css({
          
position'absolute',
          
opacityoptions.borderOpacity
        
}).addClass(cssClass(type));
        
$img_holder.append(jq);
        return 
jq;
      }
      
//}}}
      
function dragDiv(ordzi//{{{
      
{
        var 
jq = $('<div />').mousedown(createDragger(ord)).css({
          
cursorord '-resize',
          
position'absolute',
          
zIndexzi
        
}).addClass('ord-'+ord);

        if (
Touch.support) {
          
jq.bind('touchstart.jcrop'Touch.createDragger(ord));
        }

        
$hdl_holder.append(jq);
        return 
jq;
      }
      
//}}}
      
function insertHandle(ord//{{{
      
{
        var 
hs options.handleSize,

          
div dragDiv(ordhdep++).css({
            
opacityoptions.handleOpacity
          
}).addClass(cssClass('handle'));

        if (
hs) { div.width(hs).height(hs); }

        return 
div;
      }
      
//}}}
      
function insertDragbar(ord//{{{
      
{
        return 
dragDiv(ordhdep++).addClass('jcrop-dragbar');
      }
      
//}}}
      
function createDragbars(li//{{{
      
{
        var 
i;
        for (
0li.lengthi++) {
          
dragbar[li[i]] = insertDragbar(li[i]);
        }
      }
      
//}}}
      
function createBorders(li//{{{
      
{
        var 
cl,i;
        for (
0li.lengthi++) {
          switch(
li[i]){
            case
'n'cl='hline'; break;
            case
's'cl='hline bottom'; break;
            case
'e'cl='vline right'; break;
            case
'w'cl='vline'; break;
          }
          
borders[li[i]] = insertBorder(cl);
        }
      }
      
//}}}
      
function createHandles(li//{{{
      
{
        var 
i;
        for (
0li.lengthi++) {
          
handle[li[i]] = insertHandle(li[i]);
        }
      }
      
//}}}
      
function moveto(xy//{{{
      
{
        if (!
options.shade) {
          
$img2.css({
            
toppx(-y),
            
leftpx(-x)
          });
        }
        
$sel.css({
          
toppx(y),
          
leftpx(x)
        });
      }
      
//}}}
      
function resize(wh//{{{
      
{
        
$sel.width(Math.round(w)).height(Math.round(h));
      }
      
//}}}
      
function refresh() //{{{
      
{
        var 
Coords.getFixed();

        
Coords.setPressed([c.xc.y]);
        
Coords.setCurrent([c.x2c.y2]);

        
updateVisible();
      }
      
//}}}

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

        
resize(c.wc.h);
        
moveto(c.xc.y);
        if (
options.shadeShade.updateRaw(c);

        
awake || show();

        if (
select) {
          
options.onSelect.call(apiunscale(c));
        } else {
          
options.onChange.call(apiunscale(c));
        }
      }
      
//}}}
      
function setBgOpacity(opacity,force,now//{{{
      
{
        if (!
awake && !force) return;
        if (
options.bgFade && !now) {
          
$img.animate({
            
opacityopacity
          
},{
            
queuefalse,
            
durationoptions.fadeTime
          
});
        } else {
          
$img.css('opacity'opacity);
        }
      }
      
//}}}
      
function show() //{{{
      
{
        
$sel.show();

        if (
options.shadeShade.opacity(bgopacity);
          else 
setBgOpacity(bgopacity,true);

        
awake true;
      }
      
//}}}
      
function release() //{{{
      
{
        
disableHandles();
        
$sel.hide();

        if (
options.shadeShade.opacity(1);
          else 
setBgOpacity(1);

        
awake false;
        
options.onRelease.call(api);
      }
      
//}}}
      
function showHandles() //{{{
      
{
        if (
seehandles) {
          
$hdl_holder.show();
        }
      }
      
//}}}
      
function enableHandles() //{{{
      
{
        
seehandles true;
        if (
options.allowResize) {
          
$hdl_holder.show();
          return 
true;
        }
      }
      
//}}}
      
function disableHandles() //{{{
      
{
        
seehandles false;
        
$hdl_holder.hide();
      } 
      
//}}}
      
function animMode(v//{{{
      
{
        if (
v) {
          
animating true;
          
disableHandles();
        } else {
          
animating false;
          
enableHandles();
        }
      } 
      
//}}}
      
function done() //{{{
      
{
        
animMode(false);
        
refresh();
      } 
      
//}}}
      // Insert draggable elements {{{
      // Insert border divs for outline

      
if (options.dragEdges && $.isArray(options.createDragbars))
        
createDragbars(options.createDragbars);

      if ($.
isArray(options.createHandles))
        
createHandles(options.createHandles);

      if (
options.drawBorders && $.isArray(options.createBorders))
        
createBorders(options.createBorders);

      
//}}}

      // This is a hack for iOS5 to support drag/move touch functionality
      
$(document).bind('touchstart.jcrop-ios',function(e) {
        if ($(
e.currentTarget).hasClass('jcrop-tracker')) e.stopPropagation();
      });

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

      if (
Touch.support) {
        
$track.bind('touchstart.jcrop'Touch.createDragger('move'));
      }

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

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

      function 
toFront(touch//{{{
      
{
        
$trk.css({
          
zIndex450
        
});

        if (
touch)
          $(
document)
            .
bind('touchmove.jcrop'trackTouchMove)
            .
bind('touchend.jcrop'trackTouchEnd);

        else if (
trackDoc)
          $(
document)
            .
bind('mousemove.jcrop',trackMove)
            .
bind('mouseup.jcrop',trackUp);
      } 
      
//}}}
      
function toBack() //{{{
      
{
        
$trk.css({
          
zIndex290
        
});
        $(
document).unbind('.jcrop');
      } 
      
//}}}
      
function trackMove(e//{{{
      
{
        
onMove(mouseAbs(e));
        return 
false;
      } 
      
//}}}
      
function trackUp(e//{{{
      
{
        
e.preventDefault();
        
e.stopPropagation();

        if (
btndown) {
          
btndown false;

          
onDone(mouseAbs(e));

          if (
Selection.isAwake()) {
            
options.onSelect.call(apiunscale(Coords.getFixed()));
          }

          
toBack();
          
onMove = function () {};
          
onDone = function () {};
        }

        return 
false;
      }
      
//}}}
      
function activateHandlers(movedonetouch//{{{
      
{
        
btndown true;
        
onMove move;
        
onDone done;
        
toFront(touch);
        return 
false;
      }
      
//}}}
      
function trackTouchMove(e//{{{
      
{
        
onMove(mouseAbs(Touch.cfilter(e)));
        return 
false;
      }
      
//}}}
      
function trackTouchEnd(e//{{{
      
{
        return 
trackUp(Touch.cfilter(e));
      }
      
//}}}
      
function setCursor(t//{{{
      
{
        
$trk.css('cursor't);
      }
      
//}}}

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

      
$img.before($trk);
      return {
        
activateHandlersactivateHandlers,
        
setCursorsetCursor
      
};
    }());
    
//}}}
    // KeyManager Module {{{
    
var KeyManager = (function () {
      var 
$keymgr = $('<input type="radio" />').css({
        
position'fixed',
        
left'-120px',
        
width'12px'
      
}).addClass('jcrop-keymgr'),

        
$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(exy//{{{
      
{
        if (
options.allowMove) {
          
Coords.moveOffset([xy]);
          
Selection.updateVisible(true);
        }
        
e.preventDefault();
        
e.stopPropagation();
      }
      
//}}}
      
function parseKey(e//{{{
      
{
        if (
e.ctrlKey || e.metaKey) {
          return 
true;
        }
        
shift_down e.shiftKey true false;
        var 
nudge shift_down 10 1;

        switch (
e.keyCode) {
        case 
37:
          
doNudge(e, -nudge0);
          break;
        case 
39:
          
doNudge(enudge0);
          break;
        case 
38:
          
doNudge(e0, -nudge);
          break;
        case 
40:
          
doNudge(e0nudge);
          break;
        case 
27:
          if (
options.allowSelectSelection.release();
          break;
        case 
9:
          return 
true;
        }

        return 
false;
      }
      
//}}}

      
if (options.keySupport) {
        
$keymgr.keydown(parseKey).blur(onBlur);
        if (
ie6mode || !options.fixedSupport) {
          
$keymgr.css({
            
position'absolute',
            
left'-20px'
          
});
          
$keywrap.append($keymgr).insertBefore($img);
        } else {
          
$keymgr.insertBefore($img);
        }
      }


      return {
        
watchKeyswatchKeys
      
};
    }());
    
//}}}
    // }}}
    // API methods {{{
    
function setClass(cname//{{{
    
{
      
$div.removeClass().addClass(cssClass('holder')).addClass(cname);
    }
    
//}}}
    
function animateTo(acallback//{{{
    
{
      var 
x1 a[0] / xscale,
          
y1 a[1] / yscale,
          
x2 a[2] / xscale,
          
y2 a[3] / yscale;

      if (
animating) {
        return;
      }

      var 
animto Coords.flipCoords(x1y1x2y2),
          
Coords.getFixed(),
          
initcr = [c.xc.yc.x2c.y2],
          
animat initcr,
          
interv options.animationDelay,
          
ix1 animto[0] - initcr[0],
          
iy1 animto[1] - initcr[1],
          
ix2 animto[2] - initcr[2],
          
iy2 animto[3] - initcr[3],
          
pcent 0,
          
velocity options.swingSpeed;

      
x1 animat[0];
      
y1 animat[1];
      
x2 animat[2];
      
y2 animat[3];

      
Selection.animMode(true);
      var 
anim_timer;

      function 
queueAnimator() {
        
window.setTimeout(animatorinterv);
      }
      var 
animator = (function () {
        return function () {
          
pcent += (100 pcent) / velocity;

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

          if (
pcent >= 99.8) {
            
pcent 100;
          }
          if (
pcent 100) {
            
setSelectRaw(animat);
            
queueAnimator();
          } else {
            
Selection.done();
            
Selection.animMode(false);
            if (
typeof(callback) === 'function') {
              
callback.call(api);
            }
          }
        };
      }());
      
queueAnimator();
    }
    
//}}}
    
function setSelect(rect//{{{
    
{
      
setSelectRaw([rect[0] / xscalerect[1] / yscalerect[2] / xscalerect[3] / yscale]);
      
options.onSelect.call(apiunscale(Coords.getFixed()));
      
Selection.enableHandles();
    }
    
//}}}
    
function setSelectRaw(l//{{{
    
{
      
Coords.setPressed([l[0], l[1]]);
      
Coords.setCurrent([l[2], l[3]]);
      
Selection.update();
    }
    
//}}}
    
function tellSelect() //{{{
    
{
      return 
unscale(Coords.getFixed());
    }
    
//}}}
    
function tellScaled() //{{{
    
{
      return 
Coords.getFixed();
    }
    
//}}}
    
function setOptionsNew(opt//{{{
    
{
      
setOptions(opt);
      
interfaceUpdate();
    }
    
//}}}
    
function disableCrop() //{{{
    
{
      
options.disabled true;
      
Selection.disableHandles();
      
Selection.setCursor('default');
      
Tracker.setCursor('default');
    }
    
//}}}
    
function enableCrop() //{{{
    
{
      
options.disabled false;
      
interfaceUpdate();
    }
    
//}}}
    
function cancelCrop() //{{{
    
{
      
Selection.done();
      
Tracker.activateHandlers(nullnull);
    }
    
//}}}
    
function destroy() //{{{
    
{
      
$div.remove();
      
$origimg.show();
      
$origimg.css('visibility','visible');
      $(
obj).removeData('Jcrop');
    }
    
//}}}
    
function setImage(srccallback//{{{
    
{
      
Selection.release();
      
disableCrop();
      var 
img = new Image();
      
img.onload = function () {
        var 
iw img.width;
        var 
ih img.height;
        var 
bw options.boxWidth;
        var 
bh options.boxHeight;
        
$img.width(iw).height(ih);
        
$img.attr('src'src);
        
$img2.attr('src'src);
        
presize($imgbwbh);
        
boundx $img.width();
        
boundy $img.height();
        
$img2.width(boundx).height(boundy);
        
$trk.width(boundx + (bound 2)).height(boundy + (bound 2));
        
$div.width(boundx).height(boundy);
        
Shade.resize(boundx,boundy);
        
enableCrop();

        if (
typeof(callback) === 'function') {
          
callback.call(api);
        }
      };
      
img.src src;
    }
    
//}}}
    
function colorChangeMacro($obj,color,now) {
      var 
mycolor color || options.bgColor;
      if (
options.bgFade && supportsColorFade() && options.fadeTime && !now) {
        
$obj.animate({
          
backgroundColormycolor
        
}, {
          
queuefalse,
          
durationoptions.fadeTime
        
});
      } else {
        
$obj.css('backgroundColor'mycolor);
      }
    }
    function 
interfaceUpdate(alt//{{{
    // This method tweaks the interface based on options object.
    // Called when options are changed and at end of initialization.
    
{
      if (
options.allowResize) {
        if (
alt) {
          
Selection.enableOnly();
        } else {
          
Selection.enableHandles();
        }
      } else {
        
Selection.disableHandles();
      }

      
Tracker.setCursor(options.allowSelect 'crosshair' 'default');
      
Selection.setCursor(options.allowMove 'move' 'default');

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

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

      
Shade.refresh();

      if (
options.bgColor != bgcolor) {
        
colorChangeMacro(
          
options.shadeShade.getShades(): $div,
          
options.shade?
            (
options.shadeColor || options.bgColor):
            
options.bgColor
        
);
        
bgcolor options.bgColor;
      }

      if (
bgopacity != options.bgOpacity) {
        
bgopacity options.bgOpacity;
        if (
options.shadeShade.refresh();
          else 
Selection.setBgOpacity(bgopacity);
      }

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

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

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

    
if (Touch.support$trk.bind('touchstart.jcrop'Touch.newSelection);

    
$hdl_holder.hide();
    
interfaceUpdate(true);

    var 
api = {
      
setImagesetImage,
      
animateToanimateTo,
      
setSelectsetSelect,
      
setOptionssetOptionsNew,
      
tellSelecttellSelect,
      
tellScaledtellScaled,
      
setClasssetClass,

      
disabledisableCrop,
      
enableenableCrop,
      
cancelcancelCrop,
      
releaseSelection.release,
      
destroydestroy,

      
focusKeyManager.watchKeys,

      
getBounds: function () {
        return [
boundx xscaleboundy yscale];
      },
      
getWidgetSize: function () {
        return [
boundxboundy];
      },
      
getScaleFactor: function () {
        return [
xscaleyscale];
      },
      
getOptions: function() {
        
// careful: internal values are returned
        
return options;
      },

      
ui: {
        
holder$div,
        
selection$sel
      
}
    };

    if (
is_msie$div.bind('selectstart', function () { return false; });

    
$origimg.data('Jcrop'api);
    return 
api;
  };
  $.fn.
Jcrop = function (optionscallback//{{{
  
{
    var 
api;
    
// Iterate over each object, attach Jcrop
    
this.each(function () {
      
// If we've already attached to this object
      
if ($(this).data('Jcrop')) {
        
// The API can be requested this way (undocumented)
        
if (options === 'api') return $(this).data('Jcrop');
        
// Otherwise, we just reset the options...
        
else $(this).data('Jcrop').setOptions(options);
      }
      
// If we haven't been attached, preload and attach
      
else {
        if (
this.tagName == 'IMG')
          $.
Jcrop.Loader(this,function(){
            $(
this).css({display:'block',visibility:'hidden'});
            
api = $.Jcrop(thisoptions);
            if ($.
isFunction(callback)) callback.call(api);
          });
        else {
          $(
this).css({display:'block',visibility:'hidden'});
          
api = $.Jcrop(thisoptions);
          if ($.
isFunction(callback)) callback.call(api);
        }
      }
    });

    
// Return "this" so the object is chainable (jQuery-style)
    
return this;
  };
  
//}}}
  // $.Jcrop.Loader - basic image loader {{{

  
$.Jcrop.Loader = function(imgobj,success,error){
    var 
$img = $(imgobj), img $img[0];

    function 
completeCheck(){
      if (
img.complete) {
        
$img.unbind('.jcloader');
        if ($.
isFunction(success)) success.call(img);
      }
      else 
window.setTimeout(completeCheck,50);
    }

    
$img
      
.bind('load.jcloader',completeCheck)
      .
bind('error.jcloader',function(e){
        
$img.unbind('.jcloader');
        if ($.
isFunction(error)) error.call(img);
      });

    if (
img.complete && $.isFunction(success)){
      
$img.unbind('.jcloader');
      
success.call(img);
    }
  };

  
//}}}
  // Global Defaults {{{
  
$.Jcrop.defaults = {

    
// Basic Settings
    
allowSelecttrue,
    
allowMovetrue,
    
allowResizetrue,

    
trackDocumenttrue,

    
// Styling Options
    
baseClass'jcrop',
    
addClassnull,
    
bgColor'black',
    
bgOpacity0.6,
    
bgFadefalse,
    
borderOpacity0.4,
    
handleOpacity0.5,
    
handleSizenull,

    
aspectRatio0,
    
keySupporttrue,
    
createHandles: ['n','s','e','w','nw','ne','se','sw'],
    
createDragbars: ['n','s','e','w'],
    
createBorders: ['n','s','e','w'],
    
drawBorderstrue,
    
dragEdgestrue,
    
fixedSupporttrue,
    
touchSupportnull,

    
shadenull,

    
boxWidth0,
    
boxHeight0,
    
boundary2,
    
fadeTime400,
    
animationDelay20,
    
swingSpeed3,

    
minSelect: [00],
    
maxSize: [00],
    
minSize: [00],

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

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