Вход Регистрация
Файл: js/al/tagger.js
Строк: 540
<?php
function photoTagger(elemopts) {
  
elem ge(elem);
  if (!
elem) return false;
  var 
inittries 0node elem.parentNode;

  var 
mabs Math.absmmin Math.minmmax Math.maxmfloor Math.floormceil Math.ceilmround Math.roundmsign = function(v) {
    return 
? -1;
  }

  var 
zstart intval(opts.zstart), square intval(opts.square), rot 0;
  var 
minw intval(opts.minw) || 30minh intval(opts.minh) || 30;
  var 
defw intval(opts.defw) || mmax(minw100), defh intval(opts.defh) || mmax(minh100), defw2defh2;
  var 
addXaddYpreview50preview100bgimg vkImage();
  var 
swidthsheightsrectmina square floatval(opts.mina), maxa square floatval(opts.maxa);
  if (
mina && maxa && mina maxamaxa mina;
  if (
elem.src) {
    
img.src elem.src;
  }

  var 
tagframetagimgtagfadedtaghandles = {};
  var 
width 0height 0rect = {}

  var 
showRect = function(rnoUpdate) {
    
rect extend(rectr);
    
each(r, function(i) {
      var 
this + (== 'left' addX : (== 'top' addY 0));
      
tagframe.style[i] = 'px';
    });
    
tagimg.style.marginLeft = -r.left 'px';
    
tagimg.style.marginTop = -r.top 'px';
    
each(taghandles, function(i) {
      if (
i.length 2) { // n, w, e, s
        
if (== 'n' || == 's') {
          
this.style.left = (addX r.left intval(r.width 2) - 5) + 'px';
          
this.style.top = (addY r.top + (== 'n' r.height) - 5) + 'px';
        } else {
          
this.style.left = (addX r.left + (== 'w' r.width) - 5) + 'px';
          
this.style.top = (addY r.top intval(r.height 2) - 5) + 'px';
        }
      } else { 
// nw, ne, sw, se
        
var i.charAt(0), i.charAt(1);
        
this.style.left = (addX r.left + ((== 'w') ? r.width) - 5) + 'px';
        
this.style.top = (addY r.top + ((== 'n') ? r.height) - 5) + 'px';
      }
    });
    if (!
noUpdate) {
      if (
preview50) {
        
preview50.style.width mceil(width 50 r.width) + 'px';
        
preview50.style.height mceil(height 50 r.height) + 'px';
        
preview50.style.marginLeft = -mfloor(r.left 50 r.width) + 'px';
        
preview50.style.marginTop = -mfloor(r.top 50 r.width) + 'px';
      }
      if (
preview100) {
        
preview100.style.width mceil(width 100 r.width) + 'px';
        
preview100.style.height mceil(height 100 r.height) + 'px';
        
preview100.style.marginLeft = -mfloor(r.left 100 r.width) + 'px';
        
preview100.style.marginTop = -mfloor(r.top 100 r.width) + 'px';
      }
    }
  }

  var 
action 0startadjXadjYstartRectelemXY;

  var 
adjustPos = function(xy) {
    return [
mmin(widthmmax(0elemXY[0])), mmin(heightmmax(0elemXY[1]))];
  }

  var 
winResize = function() {
    var 
dwidth Math.max(intval(window.innerWidth), intval(document.documentElement.clientWidth));
    var 
dheight Math.max(intval(window.innerHeight), intval(document.documentElement.clientHeight));
    
bg.style.width dwidth 'px';
    
bg.style.height dheight 'px';
  }

  var 
cursorAct = function(a) {
    if (!
aaction;
    var 
dirs = ['n''ne''e''se''s''sw''w''nw'];
    switch (
rot) {
      case 
1: return dirs[(dirs.indexOf(a) + 2) % 8];
      case 
2: return dirs[(dirs.indexOf(a) + 4) % 8];
      case 
3: return dirs[(dirs.indexOf(a) + 6) % 8];
      default: return 
a;
    }
  }

  var 
updateCursor = function(c) {
    if (
action) {
      if (
action == || action == preview50 || action == preview100) {
        
'move';
      } else if (
action == 2) {
        
'crosshair';
      } else if (
action.length) {
        
cursorAct() + '-resize';
      }
      
bg.style.cursor c;
    }
  }

  var 
cursorXY = function(e) {
    switch (
rot) {
      case 
1:
        return [
          
elemXY[0] + e.pageY elemXY[1] + mfloor((width height) / 2),
          
elemXY[1] - e.pageX elemXY[0] + mfloor((width height) / 2)
        ];
      case 
2:
        return [
          
elemXY[0] + (elemXY[0] + width e.pageX),
          
elemXY[1] + (elemXY[1] + height e.pageY)
        ];
      case 
3:
        return [
          
elemXY[0] - e.pageY elemXY[1] + mfloor((width height) / 2),
          
elemXY[1] + e.pageX elemXY[0] - mfloor((width height) / 2)
        ];
      default: return [
e.pageXe.pageY];
    }
  }

  var 
mouseDown = function(e) {
    
elemXY getXY(elem);
    
elemWH getSize(elem);
    
start cursorXY(e);
    
startRect extend({}, rect);
    
swidth sheight srect false;

    if (
e.target == tagimg) {
      
action 1;
    } else if (
e.target == tagfaded || e.target == elem) {
      
action 2;
    } else if (
e.target == preview50 || e.target == preview100) {
      
action e.target;
    } else {
      
each(taghandles, function(i) {
        if (
e.target == this) {
          
action i;
          var 
start[0] - elemXY[0], start[1] - elemXY[1];
          var 
vh = [i.charAt(0), (i.length 1) ? i.charAt(1) : i.charAt(0)];
          
start[0] = rect.left + (vh[1] == 'w' rect.width);
          
start[1] = rect.top + (vh[0] == 'n' rect.height);
          
adjX start[0] - x;
          
adjY start[1] - y;
        }
      });
    }
    if (
action) {
      if (
opts.onStartopts.onStart();
      if (
action != && action != preview50 && action != preview100) {
        
each(taghandles, function() {
          
setStyle(this'opacity'0.7);
        });
      }
      
show(bg);
      
updateCursor();
      
removeEvent(elem'mousedown'mouseDown);
      
addEvent(bodyNode'mouseup dragend'mouseUp);
      
addEvent(bodyNode'mousemove'mouseMove);
      return 
cancelEvent(e);
    }
  }

  var 
mouseMove = function(e) {
    if (
window.getSelection) {
      var 
sel window.getSelection();
      if (
sel.removeAllRangessel.removeAllRanges();
    }
    var 
cursorXY(e);
    if (
action == 1) {
      var 
nx startRect.left + (c[0] - start[0]);
      var 
ny startRect.top + (c[1] - start[1]);
      
nx mmin(width rect.widthmmax(0nx));
      
ny mmin(height rect.heightmmax(0ny));
      
showRect(extend(rect, {leftnxtopny}));
    } else if (
action == 2) {
      if (
mabs(c[0] - start[0]) > && mabs(c[1] - start[1]) > 3) {
        
action 3;
        
updateCursor();
        
elemXY getXY(elem);
        
elemWH getSize(elem);
        
start[0] -= elemXY[0]; start[1] -= elemXY[1];
        
show(tagframetagfaded);
        
each(taghandles, function() { show(this); setStyle(this'opacity'0.7); });
      }
    } else if (
action == preview50 || action == preview100) {
      var 
= (action == preview50) ? 50 100;
      var 
nx startRect.left mfloor((c[0] - start[0]) * rect.width s);
      var 
ny startRect.top mfloor((c[1] - start[1]) * rect.height s);
      
nx mmin(width rect.widthmmax(0nx));
      
ny mmin(height rect.heightmmax(0ny));
      
showRect(extend(rect, {leftnxtopny}));
    } else if (
action.length) {
      var 
xy adjustPos(c[0] + adjXc[1] + adjY);
      
c[0] = xy[0]; c[1] = xy[1];
      var 
dx c[0] - start[0], dy c[1] - start[1];
      if (!
dx && !dy) return cancelEvent(e);

      var 
nx rect.leftny rect.topnw rect.widthnh rect.height;

      var 
ver 0hor 0// Where are we moving
      
if (action.length == 2) {
        
ver = (action.charAt(0) == 'n') ? -1;
        
hor = (action.charAt(1) == 'w') ? -1;
      } else {
        
ver = (action == 'n' ? -: (action == 's' 0));
        
hor = (action == 'w' ? -: (action == 'e' 0));
      }
      if (
ver && (nh msign(ver) * dy minh 2)) { // If we change verti direction
        
ver = -ver;
        
start[1] = rect.top + (ver rect.height 0);
        
dy c[1] - start[1];
      }
      if (
hor && (nw msign(hor) * dx minw 2)) { // If we change horiz direction
        
hor = -hor;
        
start[0] = rect.left + (hor rect.width 0);
        
dx c[0] - start[0];
      }
      
vsign ver msign(ver) : 0;
      
hsign hor msign(hor) : 0;

      if (
mina && (nw hsign dx) < (nh vsign dy) * mina) { // min and max aspect
        
if (hor) {
          
dx hsign mceil((nh vsign dy) * mina nw);
        } else {
          
dy vsign mfloor(nw mina nh);
        }
      }
      if (
maxa && (nw hsign dx) > (nh vsign dy) * maxa) {
        if (
ver) {
          
dy vsign mceil((nw hsign dx) / maxa nh);
        } else {
          
dx hsign mfloor(nh maxa nw);
        }
      }
      if (
ver) {
        
nh += msign(ver) * dy;
        if (
nh minh) { // If trying to get less, than minimum
          
ny -= (ver 0) ? : (minh nh dy);
          
nh minh;
        } else {
          
ny += (ver 0) ? dy;
        }
      }
      if (
hor) {
        
nw += msign(hor) * dx;
        if (
nw minw) { // If trying to get less, than minimum
          
nx -= (hor 0) ? : (minw nw dx);
          
nw minw;
        } else {
          
nx += (hor 0) ? dx;
        }
      }
      var 
corx 0cory 0corax 0coray 0;
      if (
nx 0) { // What is the amount of correction
        
corx nx;
        
nx 0;
      } else if (
nw width nx) {
        
corx width nx nw;
      }
      if (
corx) {
        
nw += corx;
        if (
mina && nw mina nh) { // min and max aspect (width / height)
          
coray mfloor(nw mina) - nh;
          
nh += coray;
          
ny -= (ver 0) ? coray;
        }
      }
      if (
ny 0) { // What is the amount of correction
        
cory ny;
        
ny 0;
      } else if (
nh height ny) {
        
cory height ny nh;
      }
      if (
cory) {
        
nh += cory;
        if (
maxa && nw maxa nh) { // min and max aspect (width / height)
          
corax mfloor(nh maxa) - nw;
          
nw += corax;
          
nx -= (hor 0) ? corax;
        }
      }

      
showRect({leftnxtopnywidthnwheightnh});

      
start[0] = rect.left + (hor rect.width 0);
      
start[1] = rect.top + (ver rect.height 0);

      
ver = (ver 's' : (ver 'n' ''));
      
hor = (hor 'e' : (hor 'w' ''));
      if (
action != ver hor) {
        
action ver hor;
        
updateCursor();
      }
    }
    if (
action == 3) {
      
c[0] -= elemXY[0];
      
c[1] -= elemXY[1];
      
c[0] = mmin(widthmmax(0c[0]));
      
c[1] = mmin(heightmmax(0c[1]));
      
updateCursor((msign((start[0] - c[0]) * (start[1] - c[1]) * (0.5 rot 2)) > 'nw' 'ne') + '-resize');
      
showRect({leftstart[0] > c[0] ? c[0] : start[0], topstart[1] > c[1] ? c[1] : start[1], widthmabs(start[0] - c[0]), heightmabs(start[1] - c[1])}, true);
    }
    return 
cancelEvent(e);
  }

  var 
mouseUp = function(e) {
    
elemXY getXY(elem);
    
elemWH getSize(elem);
    var 
cursorXY(e), t;
    if (
action == 2) {
      
c[0] -= elemXY[0];
      
c[1] -= elemXY[1];
      var 
mmin(width defwmmax(0c[0] - defw2));
      var 
mmin(height defhmmax(0c[1] - defh2));
      
showRect({leftxtopywidthdefwheightdefh});
    } else if (
action == 3) {
      
c[0] -= elemXY[0];
      
c[1] -= elemXY[1];
      if (
c[0] > start[0]) {
        
c[0]; c[0] = start[0]; start[0] = t;
      }
      if (
c[1] > start[1]) {
        
c[1]; c[1] = start[1]; start[1] = t;
      }
      var 
start[0] - c[0], start[1] - c[1];
      if (
c[0] < 0) {
        
+= c[0];
        
c[0] = 0;
      }
      if (
c[1] < 0) {
        
+= c[1];
        
c[1] = 0;
      }
      
mmin(wwidth c[0]); mmin(hheight c[1]);
      if (
mina && mina) { // min and max aspect (width / height)
        
var mceil(mina) - wd2 intval(2), corxcory;
        
c[0] -= d2;
        
+= d;

        
corx = (c[0] < c[0] : 0);
        
c[0] -= corx;
        if (
c[0] + corx width) {
          
corx width c[0];
        }
        if (
corx) {
          
cory mfloor(corx mina);
          
+= corx;
          
c[1] -= intval(cory 2);
          
+= cory;
        }
      } else if (
maxa && maxa) {
        var 
mceil(maxa) - hd2 intval(2), corxcory;
        
c[1] -= d2;
        
+= d;

        
cory = (c[1] < c[1] : 0);
        
c[1] -= cory;
        if (
c[1] + cory height) {
          
cory height c[1];
        }
        if (
cory) {
          
corx mfloor(cory maxa);
          
+= cory;
          
c[0] -= intval(corx 2);
          
+= corx;
        }
      }
      if (
minw) {
        var 
minw wd2 intval(2);
        
c[0] -= d2;
        
+= d;

        
c[0] = mmin(width wmmax(0c[0]));
      }
      if (
minh) {
        var 
minh hd2 intval(2);
        
c[1] -= d2;
        
minh;

        
c[1] = mmin(height hmmax(0c[1]));
      }
      
showRect({leftc[0], topc[1], widthwheighth});
    }
    
show(tagframetagfaded);
    
each(taghandles, function() {
      
fadeTo(this2000.3);
    });
    
hide(bg);
    
action 0;

    
removeEvent(bodyNode'mousemove'mouseMove);
    
removeEvent(bodyNode'mouseup'mouseUp);
    
removeEvent(bodyNode'dragend'mouseUp);

    if (
opts.onFinishopts.onFinish();

    return 
cancelEvent(e);
  };

  (function() {
    
width img.width;
    
height img.height;

    if (!
width || !height) {
      if (++
inittries 50setTimeout(arguments.callee100);
      return;
    }
    var 
getSize(elem);
    
width s[0]; height s[1];

    
node.style.position 'relative';

    
addX elem.offsetLeft;
    
addY elem.offsetTop;

    
defw mmin(widthdefw); defw2 intval(defw 2);
    
defh mmin(heightdefh); defh2 intval(defh 2);
    
minw mmin(minwdefw); minh mmin(minhdefh);
    if (
mina && minw minh mina) { // min and max aspect (width / height)
      
minw mceil(minh mina);
    } else if (
maxa && minw minh maxa) {
      
minh mceil(minw maxa);
    }
    if (
square) {
      if (
opts.preview50) {
        
preview50 ge(opts.preview50).appendChild(ce('img', {srcelem.src}));
        
addEvent(preview50'mousedown'mouseDown);
      }
      if (
opts.preview100) {
        
preview100 ge(opts.preview100).appendChild(ce('img', {srcelem.src}));
        
addEvent(preview100'mousedown'mouseDown);
      }
    }

    
bg bodyNode.appendChild(ce('div', {className'tag_bg fixed'}));
    
addEvent(window'resize'winResize);
    
winResize();

    
elem.style.zIndex zstart 20;

    
tagframe node.appendChild(ce('div', {
      
className'tag_frame',
      
innerHTML'<img src="' elem.src '" style="width: ' width 'px; height: ' height 'px;" />'
    
}, {
      
cursor 'move',
      
zIndex zstart 40
    
}));
    
tagimg tagframe.firstChild;
    
tagfaded node.appendChild(ce('div', {className'tag_faded'}, {
      
cursor 'crosshair',
      
left   addX,
      
top    addY,
      
width  width,
      
height height,
      
zIndex zstart 30
    
}));

    
each(['nw''n''ne''w''e''sw''s''se'], function() {
      var 
this.toString();
      if (
opts.square && s.length 2) return;
      
taghandles[s] = node.appendChild(ce('div', {className'tag_frame_handle ' s}, {
        
cursor '-resize',
        
zIndex zstart 50
      
}));
    });

    
addEvent(node'mousedown'mouseDown);

    if (
square && opts.crop) {
      var 
opts.crop.split(',');
      for (var 
03; ++i) {
        
d[i] = intval(d[i]);
      }
      if (
d[2] < minw) {
        
d[2] = minw;
      }
      
opts.rect = {leftd[0], topd[1], widthd[2], heightd[2]};
    }

    if (
opts.rect) {
      
showRect(opts.rect);
      
show(tagfadedtagframe);
      
each(taghandles, function() { show(this); });
    } else {
      
elem.style.cursor 'crosshair';
      
addEvent(elem'mousedown'mouseDown);
    }
  })();

  return {
    
destroy: function() {
      
cleanElems(nodeelemtagframetagfadedpreview50preview100);
      
bodyNode.removeChild(bg);
      
node.removeChild(tagframe);
      
node.removeChild(tagfaded);
      
each(['nw''n''ne''w''e''sw''s''se'], function() {
        var 
this.toString();
        if (
taghandles[s]) {
          
node.removeChild(taghandles[s]);
        }
      });
      
elem.style.cursor 'default';
      
removeEvent(elem'mousedown'mouseDown);
      
removeEvent(window'resize'winResize);
      
each(taghandles, function() { cleanElems(this); });
    },
    
reset: function() {
      
rect = {};
      
hide(tagfadedtagframe);
      
each(taghandles, function() { hide(this); });
      
elem.style.cursor 'crosshair';
      
removeEvent(elem'mousedown'mouseDown);
      
addEvent(elem'mousedown'mouseDown);
    },
    
resize: function(wh) {
      if (!
swidth) {
        
swidth width;
        
sheight height;
        
srect = clone(rect);
      }
      var 
cx swidthcy sheight;
      
width w;
      
height h;
      
defw mmin(widthdefw); defw2 intval(defw 2);
      
defh mmin(heightdefh); defh2 intval(defh 2);
      
minw mmin(minwdefw); minh mmin(minhdefh);
      if (
mina && minw minh mina) { // min and max aspect (width / height)
        
minw mceil(minh mina);
      } else if (
maxa && minw minh maxa) {
        
minh mceil(minw maxa);
      }
      
addX elem.offsetLeft;
      
addY elem.offsetTop;

      
setStyle(tagfaded, {leftaddXtopaddYwidthwheighth});
      
setStyle(tagimg, {widthwheighth});
      if (
rect.width) {
        
rect.left mfloor(cx srect.left);
        
rect.width mfloor(cx srect.width);
        
rect.top mfloor(cy srect.top);
        
rect.height mfloor(cy srect.height);
        if (
rect.width minw) {
          
rect.width minw;
        }
        if (
rect.height minh) {
          
rect.height minh;
        }
        
showRect(rect);
      }
    },
    
rotate: function(c) {
      if (
2) {
        var 
tmp mina;
        
mina maxa;
        
maxa tmp;
        
tmp minw;
        
minw minh;
        
minh tmp;
        if (
rect.width) {
          if (
rect.width minw) {
            
rect.left mmax(0rect.left mfloor((minw rect.width) / 2));
            
rect.width minw;
          }
          if (
rect.height minh) {
            
rect.top mmax(0rect.top mfloor((minh rect.height) / 2));
            
rect.height minh;
          }
          if (
rect.width rect.height mina) {
            
rect.height mfloor(rect.width mina);
          }
          if (
rect.width rect.height maxa) {
            
rect.width mfloor(rect.height maxa);
          }
          
showRect(rect);
        }
      }
      
rot = (rot c) % 4;
      
each(taghandles, function(i) { this.style.cursor cursorAct(i) + '-resize'; });
    },
    
result: function() {
      var 
widthheight;
      switch (
rot) {
        case 
1: return [rect.top rect.heightrect.leftrect.heightrect.width];
        case 
2: return [rect.left rect.widthrect.top rect.heightrect.widthrect.height];
        case 
3: return [rect.toprect.left rect.widthrect.heightrect.width];
        default: return [
rect.leftrect.toprect.widthrect.height];
      }
    }
  }
}

try{
stManager.done('tagger.js');}catch(e){}
?>
Онлайн: 0
Реклама