web/wp-includes/js/imgareaselect/jquery.imgareaselect.dev.js
author ymh
Fri, 12 Mar 2010 13:29:04 +0000
changeset 1 0d28b7c10758
permissions -rw-r--r--
First commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
0d28b7c10758 First commit
ymh
parents:
diff changeset
     1
/*
0d28b7c10758 First commit
ymh
parents:
diff changeset
     2
 * imgAreaSelect jQuery plugin
0d28b7c10758 First commit
ymh
parents:
diff changeset
     3
 * version 0.9.1
0d28b7c10758 First commit
ymh
parents:
diff changeset
     4
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     5
 * Copyright (c) 2008-2009 Michal Wojciechowski (odyniec.net)
0d28b7c10758 First commit
ymh
parents:
diff changeset
     6
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     7
 * Dual licensed under the MIT (MIT-LICENSE.txt)
0d28b7c10758 First commit
ymh
parents:
diff changeset
     8
 * and GPL (GPL-LICENSE.txt) licenses.
0d28b7c10758 First commit
ymh
parents:
diff changeset
     9
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
    10
 * http://odyniec.net/projects/imgareaselect/
0d28b7c10758 First commit
ymh
parents:
diff changeset
    11
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
    12
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    13
0d28b7c10758 First commit
ymh
parents:
diff changeset
    14
(function($) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    15
0d28b7c10758 First commit
ymh
parents:
diff changeset
    16
var abs = Math.abs,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    17
    max = Math.max,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    18
    min = Math.min,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    19
    round = Math.round;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    20
0d28b7c10758 First commit
ymh
parents:
diff changeset
    21
function div() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    22
    return $('<div/>');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    23
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    24
0d28b7c10758 First commit
ymh
parents:
diff changeset
    25
$.imgAreaSelect = function (img, options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    26
    var
0d28b7c10758 First commit
ymh
parents:
diff changeset
    27
0d28b7c10758 First commit
ymh
parents:
diff changeset
    28
        $img = $(img),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    29
0d28b7c10758 First commit
ymh
parents:
diff changeset
    30
        imgLoaded,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    31
0d28b7c10758 First commit
ymh
parents:
diff changeset
    32
        $box = div(),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    33
        $area = div(),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    34
        $border = div().add(div()).add(div()).add(div()),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    35
        $outer = div().add(div()).add(div()).add(div()),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    36
        $handles = $([]),
0d28b7c10758 First commit
ymh
parents:
diff changeset
    37
0d28b7c10758 First commit
ymh
parents:
diff changeset
    38
        $areaOpera,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    39
0d28b7c10758 First commit
ymh
parents:
diff changeset
    40
        left, top,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    41
0d28b7c10758 First commit
ymh
parents:
diff changeset
    42
        imgOfs,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    43
0d28b7c10758 First commit
ymh
parents:
diff changeset
    44
        imgWidth, imgHeight,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    45
0d28b7c10758 First commit
ymh
parents:
diff changeset
    46
        $parent,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    47
0d28b7c10758 First commit
ymh
parents:
diff changeset
    48
        parOfs,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    49
0d28b7c10758 First commit
ymh
parents:
diff changeset
    50
        zIndex = 0,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    51
0d28b7c10758 First commit
ymh
parents:
diff changeset
    52
        position = 'absolute',
0d28b7c10758 First commit
ymh
parents:
diff changeset
    53
0d28b7c10758 First commit
ymh
parents:
diff changeset
    54
        startX, startY,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    55
0d28b7c10758 First commit
ymh
parents:
diff changeset
    56
        scaleX, scaleY,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    57
0d28b7c10758 First commit
ymh
parents:
diff changeset
    58
        resizeMargin = 10,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    59
0d28b7c10758 First commit
ymh
parents:
diff changeset
    60
        resize,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    61
0d28b7c10758 First commit
ymh
parents:
diff changeset
    62
        aspectRatio,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    63
0d28b7c10758 First commit
ymh
parents:
diff changeset
    64
        shown,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    65
0d28b7c10758 First commit
ymh
parents:
diff changeset
    66
        x1, y1, x2, y2,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    67
0d28b7c10758 First commit
ymh
parents:
diff changeset
    68
        selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 },
0d28b7c10758 First commit
ymh
parents:
diff changeset
    69
0d28b7c10758 First commit
ymh
parents:
diff changeset
    70
        $p, d, i, o, w, h, adjusted;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    71
0d28b7c10758 First commit
ymh
parents:
diff changeset
    72
    function viewX(x) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    73
        return x + imgOfs.left - parOfs.left;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    74
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    75
0d28b7c10758 First commit
ymh
parents:
diff changeset
    76
    function viewY(y) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    77
        return y + imgOfs.top - parOfs.top;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    78
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    79
0d28b7c10758 First commit
ymh
parents:
diff changeset
    80
    function selX(x) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    81
        return x - imgOfs.left + parOfs.left;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    82
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    83
0d28b7c10758 First commit
ymh
parents:
diff changeset
    84
    function selY(y) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    85
        return y - imgOfs.top + parOfs.top;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    86
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    87
0d28b7c10758 First commit
ymh
parents:
diff changeset
    88
    function evX(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    89
        return event.pageX - parOfs.left;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    90
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    91
0d28b7c10758 First commit
ymh
parents:
diff changeset
    92
    function evY(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    93
        return event.pageY - parOfs.top;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    94
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
    95
0d28b7c10758 First commit
ymh
parents:
diff changeset
    96
    function getSelection(noScale) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    97
        var sx = noScale || scaleX, sy = noScale || scaleY;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    98
0d28b7c10758 First commit
ymh
parents:
diff changeset
    99
        return { x1: round(selection.x1 * sx),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   100
            y1: round(selection.y1 * sy),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   101
            x2: round(selection.x2 * sx),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   102
            y2: round(selection.y2 * sy),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   103
            width: round(selection.x2 * sx) - round(selection.x1 * sx),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   104
            height: round(selection.y2 * sy) - round(selection.y1 * sy) };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   105
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   106
0d28b7c10758 First commit
ymh
parents:
diff changeset
   107
    function setSelection(x1, y1, x2, y2, noScale) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   108
        var sx = noScale || scaleX, sy = noScale || scaleY;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   109
0d28b7c10758 First commit
ymh
parents:
diff changeset
   110
        selection = {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   111
            x1: round(x1 / sx),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   112
            y1: round(y1 / sy),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   113
            x2: round(x2 / sx),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   114
            y2: round(y2 / sy)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   115
        };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   116
0d28b7c10758 First commit
ymh
parents:
diff changeset
   117
        selection.width = (x2 = viewX(selection.x2)) - (x1 = viewX(selection.x1));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   118
        selection.height = (y2 = viewX(selection.y2)) - (y1 = viewX(selection.y1));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   119
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   120
0d28b7c10758 First commit
ymh
parents:
diff changeset
   121
    function adjust() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   122
        if (!$img.width())
0d28b7c10758 First commit
ymh
parents:
diff changeset
   123
            return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   124
0d28b7c10758 First commit
ymh
parents:
diff changeset
   125
        imgOfs = { left: round($img.offset().left), top: round($img.offset().top) };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   126
0d28b7c10758 First commit
ymh
parents:
diff changeset
   127
        imgWidth = $img.width();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   128
        imgHeight = $img.height();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   129
0d28b7c10758 First commit
ymh
parents:
diff changeset
   130
        if ($().jquery == '1.3.2' && $.browser.safari && position == 'fixed') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   131
            imgOfs.top += max(document.documentElement.scrollTop, $('body').scrollTop());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   132
0d28b7c10758 First commit
ymh
parents:
diff changeset
   133
            imgOfs.left += max(document.documentElement.scrollLeft, $('body').scrollLeft());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   134
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   135
0d28b7c10758 First commit
ymh
parents:
diff changeset
   136
        parOfs = $.inArray($parent.css('position'), ['absolute', 'relative']) + 1 ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   137
            { left: round($parent.offset().left) - $parent.scrollLeft(),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   138
                top: round($parent.offset().top) - $parent.scrollTop() } :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   139
            position == 'fixed' ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   140
                { left: $(document).scrollLeft(), top: $(document).scrollTop() } :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   141
                { left: 0, top: 0 };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   142
0d28b7c10758 First commit
ymh
parents:
diff changeset
   143
        left = viewX(0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   144
        top = viewY(0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   145
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   146
0d28b7c10758 First commit
ymh
parents:
diff changeset
   147
    function update(resetKeyPress) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   148
        if (!shown) return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   149
0d28b7c10758 First commit
ymh
parents:
diff changeset
   150
        $box.css({ left: viewX(selection.x1), top: viewY(selection.y1) })
0d28b7c10758 First commit
ymh
parents:
diff changeset
   151
            .add($area).width(w = selection.width).height(h = selection.height);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   152
0d28b7c10758 First commit
ymh
parents:
diff changeset
   153
        $area.add($border).add($handles).css({ left: 0, top: 0 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   154
0d28b7c10758 First commit
ymh
parents:
diff changeset
   155
        $border
0d28b7c10758 First commit
ymh
parents:
diff changeset
   156
            .width(max(w - $border.outerWidth() + $border.innerWidth(), 0))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   157
            .height(max(h - $border.outerHeight() + $border.innerHeight(), 0));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   158
0d28b7c10758 First commit
ymh
parents:
diff changeset
   159
        $($outer[0]).css({ left: left, top: top,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   160
            width: selection.x1, height: imgHeight });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   161
        $($outer[1]).css({ left: left + selection.x1, top: top,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   162
            width: w, height: selection.y1 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   163
        $($outer[2]).css({ left: left + selection.x2, top: top,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   164
            width: imgWidth - selection.x2, height: imgHeight });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   165
        $($outer[3]).css({ left: left + selection.x1, top: top + selection.y2,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   166
            width: w, height: imgHeight - selection.y2 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   167
0d28b7c10758 First commit
ymh
parents:
diff changeset
   168
        w -= $handles.outerWidth();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   169
        h -= $handles.outerHeight();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   170
0d28b7c10758 First commit
ymh
parents:
diff changeset
   171
        switch ($handles.length) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   172
        case 8:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   173
            $($handles[4]).css({ left: w / 2 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   174
            $($handles[5]).css({ left: w, top: h / 2 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   175
            $($handles[6]).css({ left: w / 2, top: h });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   176
            $($handles[7]).css({ top: h / 2 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   177
        case 4:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   178
            $handles.slice(1,3).css({ left: w });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   179
            $handles.slice(2,4).css({ top: h });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   180
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   181
0d28b7c10758 First commit
ymh
parents:
diff changeset
   182
        if (resetKeyPress !== false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   183
            if ($.imgAreaSelect.keyPress != docKeyPress)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   184
                $(document).unbind($.imgAreaSelect.keyPress,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   185
                    $.imgAreaSelect.onKeyPress);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   186
0d28b7c10758 First commit
ymh
parents:
diff changeset
   187
            if (options.keys)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   188
                $(document)[$.imgAreaSelect.keyPress](
0d28b7c10758 First commit
ymh
parents:
diff changeset
   189
                    $.imgAreaSelect.onKeyPress = docKeyPress);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   190
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   191
0d28b7c10758 First commit
ymh
parents:
diff changeset
   192
        if ($.browser.msie && $border.outerWidth() - $border.innerWidth() == 2) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   193
            $border.css('margin', 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   194
            setTimeout(function () { $border.css('margin', 'auto'); }, 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   195
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   196
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   197
0d28b7c10758 First commit
ymh
parents:
diff changeset
   198
    function doUpdate(resetKeyPress) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   199
        adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   200
        update(resetKeyPress);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   201
        x1 = viewX(selection.x1); y1 = viewY(selection.y1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   202
        x2 = viewX(selection.x2); y2 = viewY(selection.y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   203
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   204
0d28b7c10758 First commit
ymh
parents:
diff changeset
   205
    function hide($elem, fn) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   206
        options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   207
0d28b7c10758 First commit
ymh
parents:
diff changeset
   208
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   209
0d28b7c10758 First commit
ymh
parents:
diff changeset
   210
    function areaMouseMove(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   211
        var x = selX(evX(event)) - selection.x1,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   212
            y = selY(evY(event)) - selection.y1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   213
0d28b7c10758 First commit
ymh
parents:
diff changeset
   214
        if (!adjusted) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   215
            adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   216
            adjusted = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   217
0d28b7c10758 First commit
ymh
parents:
diff changeset
   218
            $box.one('mouseout', function () { adjusted = false; });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   219
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   220
0d28b7c10758 First commit
ymh
parents:
diff changeset
   221
        resize = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   222
0d28b7c10758 First commit
ymh
parents:
diff changeset
   223
        if (options.resizable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   224
            if (y <= resizeMargin)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   225
                resize = 'n';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   226
            else if (y >= selection.height - resizeMargin)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   227
                resize = 's';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   228
            if (x <= resizeMargin)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   229
                resize += 'w';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   230
            else if (x >= selection.width - resizeMargin)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   231
                resize += 'e';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   232
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   233
0d28b7c10758 First commit
ymh
parents:
diff changeset
   234
        $box.css('cursor', resize ? resize + '-resize' :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   235
            options.movable ? 'move' : '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   236
        if ($areaOpera)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   237
            $areaOpera.toggle();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   238
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   239
0d28b7c10758 First commit
ymh
parents:
diff changeset
   240
    function docMouseUp(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   241
        $('body').css('cursor', '');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   242
0d28b7c10758 First commit
ymh
parents:
diff changeset
   243
        if (options.autoHide || selection.width * selection.height == 0)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   244
            hide($box.add($outer), function () { $(this).hide(); });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   245
0d28b7c10758 First commit
ymh
parents:
diff changeset
   246
        options.onSelectEnd(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   247
0d28b7c10758 First commit
ymh
parents:
diff changeset
   248
        $(document).unbind('mousemove', selectingMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   249
        $box.mousemove(areaMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   250
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   251
0d28b7c10758 First commit
ymh
parents:
diff changeset
   252
    function areaMouseDown(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   253
        if (event.which != 1) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   254
0d28b7c10758 First commit
ymh
parents:
diff changeset
   255
        adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   256
0d28b7c10758 First commit
ymh
parents:
diff changeset
   257
        if (resize) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   258
            $('body').css('cursor', resize + '-resize');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   259
0d28b7c10758 First commit
ymh
parents:
diff changeset
   260
            x1 = viewX(selection[/w/.test(resize) ? 'x2' : 'x1']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   261
            y1 = viewY(selection[/n/.test(resize) ? 'y2' : 'y1']);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   262
0d28b7c10758 First commit
ymh
parents:
diff changeset
   263
            $(document).mousemove(selectingMouseMove)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   264
                .one('mouseup', docMouseUp);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   265
            $box.unbind('mousemove', areaMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   266
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   267
        else if (options.movable) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   268
            startX = left + selection.x1 - evX(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   269
            startY = top + selection.y1 - evY(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   270
0d28b7c10758 First commit
ymh
parents:
diff changeset
   271
            $box.unbind('mousemove', areaMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   272
0d28b7c10758 First commit
ymh
parents:
diff changeset
   273
            $(document).mousemove(movingMouseMove)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   274
                .one('mouseup', function () {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   275
                    options.onSelectEnd(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   276
0d28b7c10758 First commit
ymh
parents:
diff changeset
   277
                    $(document).unbind('mousemove', movingMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   278
                    $box.mousemove(areaMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   279
                });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   280
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   281
        else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   282
            $img.mousedown(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   283
0d28b7c10758 First commit
ymh
parents:
diff changeset
   284
        return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   285
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   286
0d28b7c10758 First commit
ymh
parents:
diff changeset
   287
    function aspectRatioXY() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   288
        x2 = max(left, min(left + imgWidth,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   289
            x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   290
0d28b7c10758 First commit
ymh
parents:
diff changeset
   291
        y2 = round(max(top, min(top + imgHeight,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   292
            y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1))));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   293
        x2 = round(x2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   294
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   295
0d28b7c10758 First commit
ymh
parents:
diff changeset
   296
    function aspectRatioYX() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   297
        y2 = max(top, min(top + imgHeight,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   298
            y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   299
        x2 = round(max(left, min(left + imgWidth,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   300
            x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1))));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   301
        y2 = round(y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   302
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   303
0d28b7c10758 First commit
ymh
parents:
diff changeset
   304
    function doResize() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   305
        if (abs(x2 - x1) < options.minWidth) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   306
            x2 = x1 - options.minWidth * (x2 < x1 || -1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   307
0d28b7c10758 First commit
ymh
parents:
diff changeset
   308
            if (x2 < left)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   309
                x1 = left + options.minWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   310
            else if (x2 > left + imgWidth)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   311
                x1 = left + imgWidth - options.minWidth;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   312
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   313
0d28b7c10758 First commit
ymh
parents:
diff changeset
   314
        if (abs(y2 - y1) < options.minHeight) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   315
            y2 = y1 - options.minHeight * (y2 < y1 || -1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   316
0d28b7c10758 First commit
ymh
parents:
diff changeset
   317
            if (y2 < top)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   318
                y1 = top + options.minHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   319
            else if (y2 > top + imgHeight)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   320
                y1 = top + imgHeight - options.minHeight;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   321
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   322
0d28b7c10758 First commit
ymh
parents:
diff changeset
   323
        x2 = max(left, min(x2, left + imgWidth));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   324
        y2 = max(top, min(y2, top + imgHeight));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   325
0d28b7c10758 First commit
ymh
parents:
diff changeset
   326
        if (aspectRatio)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   327
            if (abs(x2 - x1) / aspectRatio > abs(y2 - y1))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   328
                aspectRatioYX();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   329
            else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   330
                aspectRatioXY();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   331
0d28b7c10758 First commit
ymh
parents:
diff changeset
   332
        if (abs(x2 - x1) > options.maxWidth) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   333
            x2 = x1 - options.maxWidth * (x2 < x1 || -1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   334
            if (aspectRatio) aspectRatioYX();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   335
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   336
0d28b7c10758 First commit
ymh
parents:
diff changeset
   337
        if (abs(y2 - y1) > options.maxHeight) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   338
            y2 = y1 - options.maxHeight * (y2 < y1 || -1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   339
            if (aspectRatio) aspectRatioXY();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   340
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   341
0d28b7c10758 First commit
ymh
parents:
diff changeset
   342
        selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   343
            y1: selY(min(y1, y2)), y2: selY(max(y1, y2)),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   344
            width: abs(x2 - x1), height: abs(y2 - y1) };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   345
0d28b7c10758 First commit
ymh
parents:
diff changeset
   346
        update();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   347
0d28b7c10758 First commit
ymh
parents:
diff changeset
   348
        options.onSelectChange(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   349
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   350
0d28b7c10758 First commit
ymh
parents:
diff changeset
   351
    function selectingMouseMove(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   352
        x2 = resize == '' || /w|e/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   353
        y2 = resize == '' || /n|s/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   354
0d28b7c10758 First commit
ymh
parents:
diff changeset
   355
        doResize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   356
0d28b7c10758 First commit
ymh
parents:
diff changeset
   357
        return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   358
0d28b7c10758 First commit
ymh
parents:
diff changeset
   359
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   360
0d28b7c10758 First commit
ymh
parents:
diff changeset
   361
    function doMove(newX1, newY1) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   362
        x2 = (x1 = newX1) + selection.width;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   363
        y2 = (y1 = newY1) + selection.height;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   364
0d28b7c10758 First commit
ymh
parents:
diff changeset
   365
        selection = $.extend(selection, { x1: selX(x1), y1: selY(y1),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   366
            x2: selX(x2), y2: selY(y2) });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   367
0d28b7c10758 First commit
ymh
parents:
diff changeset
   368
        update();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   369
0d28b7c10758 First commit
ymh
parents:
diff changeset
   370
        options.onSelectChange(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   371
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   372
0d28b7c10758 First commit
ymh
parents:
diff changeset
   373
    function movingMouseMove(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   374
        x1 = max(left, min(startX + evX(event), left + imgWidth - selection.width));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   375
        y1 = max(top, min(startY + evY(event), top + imgHeight - selection.height));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   376
0d28b7c10758 First commit
ymh
parents:
diff changeset
   377
        doMove(x1, y1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   378
0d28b7c10758 First commit
ymh
parents:
diff changeset
   379
        event.preventDefault();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   380
0d28b7c10758 First commit
ymh
parents:
diff changeset
   381
        return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   382
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   383
0d28b7c10758 First commit
ymh
parents:
diff changeset
   384
    function startSelection() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   385
        adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   386
0d28b7c10758 First commit
ymh
parents:
diff changeset
   387
        x2 = x1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   388
        y2 = y1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   389
0d28b7c10758 First commit
ymh
parents:
diff changeset
   390
        doResize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   391
0d28b7c10758 First commit
ymh
parents:
diff changeset
   392
        resize = '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   393
0d28b7c10758 First commit
ymh
parents:
diff changeset
   394
        if ($outer.is(':not(:visible)'))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   395
            $box.add($outer).hide().fadeIn(options.fadeSpeed||0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   396
0d28b7c10758 First commit
ymh
parents:
diff changeset
   397
        shown = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   398
0d28b7c10758 First commit
ymh
parents:
diff changeset
   399
        $(document).unbind('mouseup', cancelSelection)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   400
            .mousemove(selectingMouseMove).one('mouseup', docMouseUp);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   401
        $box.unbind('mousemove', areaMouseMove);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   402
0d28b7c10758 First commit
ymh
parents:
diff changeset
   403
        options.onSelectStart(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   404
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   405
0d28b7c10758 First commit
ymh
parents:
diff changeset
   406
    function cancelSelection() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   407
        $(document).unbind('mousemove', startSelection);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   408
        hide($box.add($outer));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   409
0d28b7c10758 First commit
ymh
parents:
diff changeset
   410
        selection = { x1: selX(x1), y1: selY(y1), x2: selX(x1), y2: selY(y1),
0d28b7c10758 First commit
ymh
parents:
diff changeset
   411
                width: 0, height: 0 };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   412
0d28b7c10758 First commit
ymh
parents:
diff changeset
   413
        options.onSelectChange(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   414
        options.onSelectEnd(img, getSelection());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   415
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   416
0d28b7c10758 First commit
ymh
parents:
diff changeset
   417
    function imgMouseDown(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   418
        if (event.which != 1 || $outer.is(':animated')) return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   419
0d28b7c10758 First commit
ymh
parents:
diff changeset
   420
        adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   421
        startX = x1 = evX(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   422
        startY = y1 = evY(event);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   423
0d28b7c10758 First commit
ymh
parents:
diff changeset
   424
        $(document).one('mousemove', startSelection)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   425
            .one('mouseup', cancelSelection);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   426
0d28b7c10758 First commit
ymh
parents:
diff changeset
   427
        return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   428
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   429
0d28b7c10758 First commit
ymh
parents:
diff changeset
   430
    function parentScroll() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   431
        doUpdate(false);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   432
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   433
0d28b7c10758 First commit
ymh
parents:
diff changeset
   434
    function imgLoad() {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   435
        imgLoaded = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   436
0d28b7c10758 First commit
ymh
parents:
diff changeset
   437
        setOptions(options = $.extend({
0d28b7c10758 First commit
ymh
parents:
diff changeset
   438
            classPrefix: 'imgareaselect',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   439
            movable: true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   440
            resizable: true,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   441
            parent: 'body',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   442
            onInit: function () {},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   443
            onSelectStart: function () {},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   444
            onSelectChange: function () {},
0d28b7c10758 First commit
ymh
parents:
diff changeset
   445
            onSelectEnd: function () {}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   446
        }, options));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   447
0d28b7c10758 First commit
ymh
parents:
diff changeset
   448
        $box.add($outer).css({ visibility: '' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   449
0d28b7c10758 First commit
ymh
parents:
diff changeset
   450
        if (options.show) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   451
            shown = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   452
            adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   453
            update();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   454
            $box.add($outer).hide().fadeIn(options.fadeSpeed||0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   455
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   456
0d28b7c10758 First commit
ymh
parents:
diff changeset
   457
        setTimeout(function () { options.onInit(img, getSelection()); }, 0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   458
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   459
0d28b7c10758 First commit
ymh
parents:
diff changeset
   460
    var docKeyPress = function(event) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   461
        var k = options.keys, d, t, key = event.keyCode || event.which;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   462
0d28b7c10758 First commit
ymh
parents:
diff changeset
   463
        d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   464
            !isNaN(k.ctrl) && event.ctrlKey ? k.ctrl :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   465
            !isNaN(k.shift) && event.shiftKey ? k.shift :
0d28b7c10758 First commit
ymh
parents:
diff changeset
   466
            !isNaN(k.arrows) ? k.arrows : 10;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   467
0d28b7c10758 First commit
ymh
parents:
diff changeset
   468
        if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
   469
            (k.ctrl == 'resize' && event.ctrlKey) ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
   470
            (k.alt == 'resize' && (event.altKey || event.originalEvent.altKey)))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   471
        {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   472
            switch (key) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   473
            case 37:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   474
                d = -d;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   475
            case 39:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   476
                t = max(x1, x2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   477
                x1 = min(x1, x2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   478
                x2 = max(t + d, x1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   479
                if (aspectRatio) aspectRatioYX();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   480
                break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   481
            case 38:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   482
                d = -d;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   483
            case 40:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   484
                t = max(y1, y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   485
                y1 = min(y1, y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   486
                y2 = max(t + d, y1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   487
                if (aspectRatio) aspectRatioXY();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   488
                break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   489
            default:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   490
                return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   491
            }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   492
0d28b7c10758 First commit
ymh
parents:
diff changeset
   493
            doResize();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   494
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   495
        else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   496
            x1 = min(x1, x2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   497
            y1 = min(y1, y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   498
0d28b7c10758 First commit
ymh
parents:
diff changeset
   499
            switch (key) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   500
            case 37:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   501
                doMove(max(x1 - d, left), y1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   502
                break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   503
            case 38:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   504
                doMove(x1, max(y1 - d, top));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   505
                break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   506
            case 39:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   507
                doMove(x1 + min(d, imgWidth - selX(x2)), y1);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   508
                break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   509
            case 40:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   510
                doMove(x1, y1 + min(d, imgHeight - selY(y2)));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   511
                break;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   512
            default:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   513
                return;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   514
            }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   515
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   516
0d28b7c10758 First commit
ymh
parents:
diff changeset
   517
        return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   518
    };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   519
0d28b7c10758 First commit
ymh
parents:
diff changeset
   520
    function styleOptions($elem, props) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   521
        for (option in props)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   522
            if (options[option] !== undefined)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   523
                $elem.css(props[option], options[option]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   524
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   525
0d28b7c10758 First commit
ymh
parents:
diff changeset
   526
    function setOptions(newOptions) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   527
        if (newOptions.parent)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   528
            ($parent = $(newOptions.parent)).append($box.add($outer));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   529
0d28b7c10758 First commit
ymh
parents:
diff changeset
   530
        options = $.extend(options, newOptions);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   531
0d28b7c10758 First commit
ymh
parents:
diff changeset
   532
        adjust();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   533
0d28b7c10758 First commit
ymh
parents:
diff changeset
   534
        if (newOptions.handles != null) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   535
            $handles.remove();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   536
            $handles = $([]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   537
0d28b7c10758 First commit
ymh
parents:
diff changeset
   538
            i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   539
0d28b7c10758 First commit
ymh
parents:
diff changeset
   540
            while (i--)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   541
                $handles = $handles.add(div());
0d28b7c10758 First commit
ymh
parents:
diff changeset
   542
0d28b7c10758 First commit
ymh
parents:
diff changeset
   543
            $handles.addClass(options.classPrefix + '-handle').css({
0d28b7c10758 First commit
ymh
parents:
diff changeset
   544
                position: 'absolute',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   545
                fontSize: 0,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   546
                zIndex: zIndex + 1 || 1
0d28b7c10758 First commit
ymh
parents:
diff changeset
   547
            });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   548
0d28b7c10758 First commit
ymh
parents:
diff changeset
   549
            if (!parseInt($handles.css('width')))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   550
                $handles.width(5).height(5);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   551
0d28b7c10758 First commit
ymh
parents:
diff changeset
   552
            if (o = options.borderWidth)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   553
                $handles.css({ borderWidth: o, borderStyle: 'solid' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   554
0d28b7c10758 First commit
ymh
parents:
diff changeset
   555
            styleOptions($handles, { borderColor1: 'border-color',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   556
                borderColor2: 'background-color',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   557
                borderOpacity: 'opacity' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   558
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   559
0d28b7c10758 First commit
ymh
parents:
diff changeset
   560
        scaleX = options.imageWidth / imgWidth || 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   561
        scaleY = options.imageHeight / imgHeight || 1;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   562
0d28b7c10758 First commit
ymh
parents:
diff changeset
   563
        if (newOptions.x1 != null) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   564
            setSelection(newOptions.x1, newOptions.y1, newOptions.x2,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   565
                    newOptions.y2);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   566
            newOptions.show = !newOptions.hide;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   567
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   568
0d28b7c10758 First commit
ymh
parents:
diff changeset
   569
        if (newOptions.keys)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   570
            options.keys = $.extend({ shift: 1, ctrl: 'resize' },
0d28b7c10758 First commit
ymh
parents:
diff changeset
   571
                newOptions.keys);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   572
0d28b7c10758 First commit
ymh
parents:
diff changeset
   573
        $outer.addClass(options.classPrefix + '-outer');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   574
        $area.addClass(options.classPrefix + '-selection');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   575
        for (i = 0; i++ < 4;)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   576
            $($border[i-1]).addClass(options.classPrefix + '-border' + i);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   577
0d28b7c10758 First commit
ymh
parents:
diff changeset
   578
        styleOptions($area, { selectionColor: 'background-color',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   579
            selectionOpacity: 'opacity' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   580
        styleOptions($border, { borderOpacity: 'opacity',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   581
            borderWidth: 'border-width' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   582
        styleOptions($outer, { outerColor: 'background-color',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   583
            outerOpacity: 'opacity' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   584
        if (o = options.borderColor1)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   585
            $($border[0]).css({ borderStyle: 'solid', borderColor: o });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   586
        if (o = options.borderColor2)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   587
            $($border[1]).css({ borderStyle: 'dashed', borderColor: o });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   588
0d28b7c10758 First commit
ymh
parents:
diff changeset
   589
        $box.append($area.add($border).add($handles).add($areaOpera));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   590
0d28b7c10758 First commit
ymh
parents:
diff changeset
   591
        if ($.browser.msie) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   592
            if (o = $outer.css('filter').match(/opacity=([0-9]+)/))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   593
                $outer.css('opacity', o[1]/100);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   594
            if (o = $border.css('filter').match(/opacity=([0-9]+)/))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   595
                $border.css('opacity', o[1]/100);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   596
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   597
0d28b7c10758 First commit
ymh
parents:
diff changeset
   598
        if (newOptions.hide)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   599
            hide($box.add($outer));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   600
        else if (newOptions.show && imgLoaded) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   601
            shown = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   602
            $box.add($outer).fadeIn(options.fadeSpeed||0);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   603
            doUpdate();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   604
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   605
0d28b7c10758 First commit
ymh
parents:
diff changeset
   606
        aspectRatio = (d = (options.aspectRatio || '').split(/:/))[0] / d[1];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   607
0d28b7c10758 First commit
ymh
parents:
diff changeset
   608
        if (options.disable || options.enable === false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   609
            $box.unbind('mousemove', areaMouseMove).unbind('mousedown', areaMouseDown);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   610
            $img.add($outer).unbind('mousedown', imgMouseDown);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   611
            $(window).unbind('resize', parentScroll);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   612
            $img.add($img.parents()).unbind('scroll', parentScroll);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   613
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   614
        else if (options.enable || options.disable === false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   615
            if (options.resizable || options.movable)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   616
                $box.mousemove(areaMouseMove).mousedown(areaMouseDown);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   617
0d28b7c10758 First commit
ymh
parents:
diff changeset
   618
            if (!options.persistent)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   619
                $img.add($outer).mousedown(imgMouseDown);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   620
            $(window).resize(parentScroll);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   621
            $img.add($img.parents()).scroll(parentScroll);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   622
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   623
0d28b7c10758 First commit
ymh
parents:
diff changeset
   624
        options.enable = options.disable = undefined;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   625
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   626
0d28b7c10758 First commit
ymh
parents:
diff changeset
   627
    this.getOptions = function () { return options; };
0d28b7c10758 First commit
ymh
parents:
diff changeset
   628
0d28b7c10758 First commit
ymh
parents:
diff changeset
   629
    this.setOptions = setOptions;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   630
0d28b7c10758 First commit
ymh
parents:
diff changeset
   631
    this.getSelection = getSelection;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   632
0d28b7c10758 First commit
ymh
parents:
diff changeset
   633
    this.setSelection = setSelection;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   634
0d28b7c10758 First commit
ymh
parents:
diff changeset
   635
    this.update = doUpdate;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   636
0d28b7c10758 First commit
ymh
parents:
diff changeset
   637
    $p = $img;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   638
0d28b7c10758 First commit
ymh
parents:
diff changeset
   639
    while ($p.length && !$p.is('body')) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   640
        if (!isNaN($p.css('z-index')) && $p.css('z-index') > zIndex)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   641
            zIndex = $p.css('z-index');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   642
        if ($p.css('position') == 'fixed')
0d28b7c10758 First commit
ymh
parents:
diff changeset
   643
            position = 'fixed';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   644
0d28b7c10758 First commit
ymh
parents:
diff changeset
   645
        $p = $p.parent();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   646
    }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   647
0d28b7c10758 First commit
ymh
parents:
diff changeset
   648
    if (!isNaN(options.zIndex))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   649
        zIndex = options.zIndex;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   650
0d28b7c10758 First commit
ymh
parents:
diff changeset
   651
    if ($.browser.msie)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   652
        $img.attr('unselectable', 'on');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   653
0d28b7c10758 First commit
ymh
parents:
diff changeset
   654
    $.imgAreaSelect.keyPress = $.browser.msie ||
0d28b7c10758 First commit
ymh
parents:
diff changeset
   655
        $.browser.safari ? 'keydown' : 'keypress';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   656
0d28b7c10758 First commit
ymh
parents:
diff changeset
   657
    if ($.browser.opera)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   658
        $areaOpera = div().css({ width: '100%', height: '100%',
0d28b7c10758 First commit
ymh
parents:
diff changeset
   659
            position: 'absolute', zIndex: zIndex + 2 || 2 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   660
0d28b7c10758 First commit
ymh
parents:
diff changeset
   661
    $box.add($outer).css({ visibility: 'hidden', position: position,
0d28b7c10758 First commit
ymh
parents:
diff changeset
   662
        overflow: 'hidden', zIndex: zIndex || '0' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   663
    $box.css({ zIndex: zIndex + 2 || 2 });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   664
    $area.add($border).css({ position: 'absolute' });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   665
0d28b7c10758 First commit
ymh
parents:
diff changeset
   666
    img.complete || img.readyState == 'complete' || !$img.is('img') ?
0d28b7c10758 First commit
ymh
parents:
diff changeset
   667
        imgLoad() : $img.one('load', imgLoad);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   668
0d28b7c10758 First commit
ymh
parents:
diff changeset
   669
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   670
0d28b7c10758 First commit
ymh
parents:
diff changeset
   671
$.fn.imgAreaSelect = function (options) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   672
    options = options || {};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   673
0d28b7c10758 First commit
ymh
parents:
diff changeset
   674
    this.each(function () {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   675
        if ($(this).data('imgAreaSelect'))
0d28b7c10758 First commit
ymh
parents:
diff changeset
   676
            $(this).data('imgAreaSelect').setOptions(options);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   677
        else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   678
            if (options.enable === undefined && options.disable === undefined)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   679
                options.enable = true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   680
0d28b7c10758 First commit
ymh
parents:
diff changeset
   681
            $(this).data('imgAreaSelect', new $.imgAreaSelect(this, options));
0d28b7c10758 First commit
ymh
parents:
diff changeset
   682
        }
0d28b7c10758 First commit
ymh
parents:
diff changeset
   683
    });
0d28b7c10758 First commit
ymh
parents:
diff changeset
   684
0d28b7c10758 First commit
ymh
parents:
diff changeset
   685
    if (options.instance)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   686
        return $(this).data('imgAreaSelect');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   687
0d28b7c10758 First commit
ymh
parents:
diff changeset
   688
    return this;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   689
};
0d28b7c10758 First commit
ymh
parents:
diff changeset
   690
0d28b7c10758 First commit
ymh
parents:
diff changeset
   691
})(jQuery);