Imported Upstream version 0.6.24+dfsg1
This commit is contained in:
1276
share/pnp/media/js/jquery-ui-timepicker-addon.js
vendored
Normal file
1276
share/pnp/media/js/jquery-ui-timepicker-addon.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
558
share/pnp/media/js/jquery.cluetip.js
Normal file
558
share/pnp/media/js/jquery.cluetip.js
Normal file
@@ -0,0 +1,558 @@
|
||||
/*
|
||||
* jQuery clueTip plugin
|
||||
* Version 1.0.3 (May 29, 2009)
|
||||
* @requires jQuery v1.2.6+
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
*
|
||||
* Full list of options/settings can be found at the bottom of this file and at http://plugins.learningjquery.com/cluetip/
|
||||
*
|
||||
* Examples can be found at http://plugins.learningjquery.com/cluetip/demo/
|
||||
*
|
||||
*/
|
||||
|
||||
;(function($) {
|
||||
$.cluetip = {version: '1.0.3'};
|
||||
var $cluetip, $cluetipInner, $cluetipOuter, $cluetipTitle, $cluetipArrows, $cluetipWait, $dropShadow, imgCount;
|
||||
$.fn.cluetip = function(js, options) {
|
||||
if (typeof js == 'object') {
|
||||
options = js;
|
||||
js = null;
|
||||
}
|
||||
if (js == 'destroy') {
|
||||
return this.unbind('.cluetip');
|
||||
}
|
||||
return this.each(function(index) {
|
||||
var link = this, $this = $(this);
|
||||
|
||||
// support metadata plugin (v1.0 and 2.0)
|
||||
var opts = $.extend(true, {}, $.fn.cluetip.defaults, options || {}, $.metadata ? $this.metadata() : $.meta ? $this.data() : {});
|
||||
|
||||
// start out with no contents (for ajax activation)
|
||||
var cluetipContents = false;
|
||||
var cluezIndex = +opts.cluezIndex;
|
||||
$this.data('thisInfo', {title: link.title, zIndex: cluezIndex});
|
||||
var isActive = false, closeOnDelay = 0;
|
||||
|
||||
// create the cluetip divs
|
||||
if (!$('#cluetip').length) {
|
||||
$(['<div id="cluetip">',
|
||||
'<div id="cluetip-outer">',
|
||||
'<h3 id="cluetip-title"></h3>',
|
||||
'<div id="cluetip-inner"></div>',
|
||||
'</div>',
|
||||
'<div id="cluetip-extra"></div>',
|
||||
'<div id="cluetip-arrows" class="cluetip-arrows"></div>',
|
||||
'</div>'].join(''))
|
||||
[insertionType](insertionElement).hide();
|
||||
|
||||
$cluetip = $('#cluetip').css({position: 'absolute'});
|
||||
$cluetipOuter = $('#cluetip-outer').css({position: 'relative', zIndex: cluezIndex});
|
||||
$cluetipInner = $('#cluetip-inner');
|
||||
$cluetipTitle = $('#cluetip-title');
|
||||
$cluetipArrows = $('#cluetip-arrows');
|
||||
$cluetipWait = $('<div id="cluetip-waitimage"></div>')
|
||||
.css({position: 'absolute'}).insertBefore($cluetip).hide();
|
||||
}
|
||||
var dropShadowSteps = (opts.dropShadow) ? +opts.dropShadowSteps : 0;
|
||||
if (!$dropShadow) {
|
||||
$dropShadow = $([]);
|
||||
for (var i=0; i < dropShadowSteps; i++) {
|
||||
$dropShadow = $dropShadow.add($('<div></div>').css({zIndex: cluezIndex-1, opacity:.1, top: 1+i, left: 1+i}));
|
||||
};
|
||||
$dropShadow.css({position: 'absolute', backgroundColor: '#000'})
|
||||
.prependTo($cluetip);
|
||||
}
|
||||
var tipAttribute = $this.attr(opts.attribute), ctClass = opts.cluetipClass;
|
||||
if (!tipAttribute && !opts.splitTitle && !js) return true;
|
||||
// if hideLocal is set to true, on DOM ready hide the local content that will be displayed in the clueTip
|
||||
if (opts.local && opts.localPrefix) {tipAttribute = opts.localPrefix + tipAttribute;}
|
||||
if (opts.local && opts.hideLocal) { $(tipAttribute + ':first').hide(); }
|
||||
var tOffset = parseInt(opts.topOffset, 10), lOffset = parseInt(opts.leftOffset, 10);
|
||||
// vertical measurement variables
|
||||
var tipHeight, wHeight,
|
||||
defHeight = isNaN(parseInt(opts.height, 10)) ? 'auto' : (/\D/g).test(opts.height) ? opts.height : opts.height + 'px';
|
||||
var sTop, linkTop, posY, tipY, mouseY, baseline;
|
||||
// horizontal measurement variables
|
||||
var tipInnerWidth = parseInt(opts.width, 10) || 275,
|
||||
tipWidth = tipInnerWidth + (parseInt($cluetip.css('paddingLeft'),10)||0) + (parseInt($cluetip.css('paddingRight'),10)||0) + dropShadowSteps,
|
||||
linkWidth = this.offsetWidth,
|
||||
linkLeft, posX, tipX, mouseX, winWidth;
|
||||
|
||||
// parse the title
|
||||
var tipParts;
|
||||
var tipTitle = (opts.attribute != 'title') ? $this.attr(opts.titleAttribute) : '';
|
||||
if (opts.splitTitle) {
|
||||
if(tipTitle == undefined) {tipTitle = '';}
|
||||
tipParts = tipTitle.split(opts.splitTitle);
|
||||
tipTitle = tipParts.shift();
|
||||
}
|
||||
if (opts.escapeTitle) {
|
||||
tipTitle = tipTitle.replace(/&/g,'&').replace(/>/g,'>').replace(/</g,'<');
|
||||
}
|
||||
|
||||
var localContent;
|
||||
|
||||
/***************************************
|
||||
* ACTIVATION
|
||||
****************************************/
|
||||
|
||||
//activate clueTip
|
||||
var activate = function(event) {
|
||||
if (!opts.onActivate($this)) {
|
||||
return false;
|
||||
}
|
||||
isActive = true;
|
||||
$cluetip.removeClass().css({width: tipInnerWidth});
|
||||
if (tipAttribute == $this.attr('href')) {
|
||||
$this.css('cursor', opts.cursor);
|
||||
}
|
||||
if (opts.hoverClass) {
|
||||
$this.addClass(opts.hoverClass);
|
||||
}
|
||||
linkTop = posY = $this.offset().top;
|
||||
linkLeft = $this.offset().left;
|
||||
mouseX = event.pageX;
|
||||
mouseY = event.pageY;
|
||||
if (link.tagName.toLowerCase() != 'area') {
|
||||
sTop = $(document).scrollTop();
|
||||
winWidth = $(window).width();
|
||||
}
|
||||
// position clueTip horizontally
|
||||
if (opts.positionBy == 'fixed') {
|
||||
posX = linkWidth + linkLeft + lOffset;
|
||||
$cluetip.css({left: posX});
|
||||
} else {
|
||||
posX = (linkWidth > linkLeft && linkLeft > tipWidth)
|
||||
|| linkLeft + linkWidth + tipWidth + lOffset > winWidth
|
||||
? linkLeft - tipWidth - lOffset
|
||||
: linkWidth + linkLeft + lOffset;
|
||||
if (link.tagName.toLowerCase() == 'area' || opts.positionBy == 'mouse' || linkWidth + tipWidth > winWidth) { // position by mouse
|
||||
if (mouseX + 20 + tipWidth > winWidth) {
|
||||
$cluetip.addClass(' cluetip-' + ctClass);
|
||||
posX = (mouseX - tipWidth - lOffset) >= 0 ? mouseX - tipWidth - lOffset - parseInt($cluetip.css('marginLeft'),10) + parseInt($cluetipInner.css('marginRight'),10) : mouseX - (tipWidth/2);
|
||||
} else {
|
||||
posX = mouseX + lOffset;
|
||||
}
|
||||
}
|
||||
var pY = posX < 0 ? event.pageY + tOffset : event.pageY;
|
||||
$cluetip.css({
|
||||
left: (posX > 0 && opts.positionBy != 'bottomTop') ? posX : (mouseX + (tipWidth/2) > winWidth) ? winWidth/2 - tipWidth/2 : Math.max(mouseX - (tipWidth/2),0),
|
||||
zIndex: $this.data('thisInfo').zIndex
|
||||
});
|
||||
$cluetipArrows.css({zIndex: $this.data('thisInfo').zIndex+1});
|
||||
}
|
||||
wHeight = $(window).height();
|
||||
|
||||
/***************************************
|
||||
* load a string from cluetip method's first argument
|
||||
***************************************/
|
||||
if (js) {
|
||||
if (typeof js == 'function') {
|
||||
js = js(link);
|
||||
}
|
||||
$cluetipInner.html(js);
|
||||
cluetipShow(pY);
|
||||
}
|
||||
/***************************************
|
||||
* load the title attribute only (or user-selected attribute).
|
||||
* clueTip title is the string before the first delimiter
|
||||
* subsequent delimiters place clueTip body text on separate lines
|
||||
***************************************/
|
||||
|
||||
else if (tipParts) {
|
||||
var tpl = tipParts.length;
|
||||
$cluetipInner.html(tipParts[0]);
|
||||
if (tpl > 1) {
|
||||
for (var i=1; i < tpl; i++){
|
||||
$cluetipInner.append('<div class="split-body">' + tipParts[i] + '</div>');
|
||||
}
|
||||
}
|
||||
cluetipShow(pY);
|
||||
}
|
||||
/***************************************
|
||||
* load external file via ajax
|
||||
***************************************/
|
||||
|
||||
else if (!opts.local && tipAttribute.indexOf('#') != 0) {
|
||||
if (/\.(jpe?g|tiff?|gif|png)$/i.test(tipAttribute)) {
|
||||
$cluetipInner.html('<img src="' + tipAttribute + '" alt="' + tipTitle + '" />');
|
||||
cluetipShow(pY);
|
||||
} else if (cluetipContents && opts.ajaxCache) {
|
||||
$cluetipInner.html(cluetipContents);
|
||||
cluetipShow(pY);
|
||||
} else {
|
||||
var optionBeforeSend = opts.ajaxSettings.beforeSend,
|
||||
optionError = opts.ajaxSettings.error,
|
||||
optionSuccess = opts.ajaxSettings.success,
|
||||
optionComplete = opts.ajaxSettings.complete;
|
||||
var ajaxSettings = {
|
||||
cache: false, // force requested page not to be cached by browser
|
||||
url: tipAttribute,
|
||||
beforeSend: function(xhr) {
|
||||
if (optionBeforeSend) {optionBeforeSend.call(link, xhr, $cluetip, $cluetipInner);}
|
||||
$cluetipOuter.children().empty();
|
||||
if (opts.waitImage) {
|
||||
$cluetipWait
|
||||
.css({top: mouseY+20, left: mouseX+20, zIndex: $this.data('thisInfo').zIndex-1})
|
||||
.show();
|
||||
}
|
||||
},
|
||||
error: function(xhr, textStatus) {
|
||||
if (isActive) {
|
||||
if (optionError) {
|
||||
optionError.call(link, xhr, textStatus, $cluetip, $cluetipInner);
|
||||
} else {
|
||||
$cluetipInner.html('<i>sorry, the contents could not be loaded</i>');
|
||||
}
|
||||
}
|
||||
},
|
||||
success: function(data, textStatus) {
|
||||
cluetipContents = opts.ajaxProcess.call(link, data);
|
||||
if (isActive) {
|
||||
if (optionSuccess) {optionSuccess.call(link, data, textStatus, $cluetip, $cluetipInner);}
|
||||
$cluetipInner.html(cluetipContents);
|
||||
}
|
||||
},
|
||||
complete: function(xhr, textStatus) {
|
||||
if (optionComplete) {optionComplete.call(link, xhr, textStatus, $cluetip, $cluetipInner);}
|
||||
imgCount = $('#cluetip-inner img').length;
|
||||
if (imgCount && !$.browser.opera) {
|
||||
$('#cluetip-inner img').bind('load error', function() {
|
||||
imgCount--;
|
||||
if (imgCount<1) {
|
||||
$cluetipWait.hide();
|
||||
if (isActive) cluetipShow(pY);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$cluetipWait.hide();
|
||||
if (isActive) { cluetipShow(pY); }
|
||||
}
|
||||
}
|
||||
};
|
||||
var ajaxMergedSettings = $.extend(true, {}, opts.ajaxSettings, ajaxSettings);
|
||||
|
||||
$.ajax(ajaxMergedSettings);
|
||||
}
|
||||
|
||||
/***************************************
|
||||
* load an element from the same page
|
||||
***************************************/
|
||||
} else if (opts.local) {
|
||||
|
||||
var $localContent = $(tipAttribute + (/#\S+$/.test(tipAttribute) ? '' : ':eq(' + index + ')')).clone(true).show();
|
||||
$cluetipInner.html($localContent);
|
||||
cluetipShow(pY);
|
||||
}
|
||||
};
|
||||
|
||||
// get dimensions and options for cluetip and prepare it to be shown
|
||||
var cluetipShow = function(bpY) {
|
||||
$cluetip.addClass('cluetip-' + ctClass);
|
||||
if (opts.truncate) {
|
||||
var $truncloaded = $cluetipInner.text().slice(0,opts.truncate) + '...';
|
||||
$cluetipInner.html($truncloaded);
|
||||
}
|
||||
function doNothing() {}; //empty function
|
||||
|
||||
tipTitle ? $cluetipTitle.show().html(tipTitle) : (opts.showTitle) ? $cluetipTitle.show().html(' ') : $cluetipTitle.hide();
|
||||
if (opts.sticky) {
|
||||
var $closeLink = $('<div id="cluetip-close"><a href="#">' + opts.closeText + '</a></div>');
|
||||
(opts.closePosition == 'bottom') ? $closeLink.appendTo($cluetipInner) : (opts.closePosition == 'title') ? $closeLink.prependTo($cluetipTitle) : $closeLink.prependTo($cluetipInner);
|
||||
$closeLink.bind('click.cluetip', function() {
|
||||
cluetipClose();
|
||||
return false;
|
||||
});
|
||||
if (opts.mouseOutClose) {
|
||||
if ($.fn.hoverIntent && opts.hoverIntent) {
|
||||
$cluetip.hoverIntent({
|
||||
over: doNothing,
|
||||
timeout: opts.hoverIntent.timeout,
|
||||
out: function() { $closeLink.trigger('click.cluetip'); }
|
||||
});
|
||||
} else {
|
||||
$cluetip.hover(doNothing,
|
||||
function() {$closeLink.trigger('click.cluetip'); });
|
||||
}
|
||||
} else {
|
||||
$cluetip.unbind('mouseout');
|
||||
}
|
||||
}
|
||||
// now that content is loaded, finish the positioning
|
||||
var direction = '';
|
||||
$cluetipOuter.css({zIndex: $this.data('thisInfo').zIndex, overflow: defHeight == 'auto' ? 'visible' : 'auto', height: defHeight});
|
||||
tipHeight = defHeight == 'auto' ? Math.max($cluetip.outerHeight(),$cluetip.height()) : parseInt(defHeight,10);
|
||||
tipY = posY;
|
||||
baseline = sTop + wHeight;
|
||||
if (opts.positionBy == 'fixed') {
|
||||
tipY = posY - opts.dropShadowSteps + tOffset;
|
||||
} else if ( (posX < mouseX && Math.max(posX, 0) + tipWidth > mouseX) || opts.positionBy == 'bottomTop') {
|
||||
if (posY + tipHeight + tOffset > baseline && mouseY - sTop > tipHeight + tOffset) {
|
||||
tipY = mouseY - tipHeight - tOffset;
|
||||
direction = 'top';
|
||||
} else {
|
||||
tipY = mouseY + tOffset;
|
||||
direction = 'bottom';
|
||||
}
|
||||
} else if ( posY + tipHeight + tOffset > baseline ) {
|
||||
tipY = (tipHeight >= wHeight) ? sTop : baseline - tipHeight - tOffset;
|
||||
} else if ($this.css('display') == 'block' || link.tagName.toLowerCase() == 'area' || opts.positionBy == "mouse") {
|
||||
tipY = bpY - tOffset;
|
||||
} else {
|
||||
tipY = posY - opts.dropShadowSteps;
|
||||
}
|
||||
if (direction == '') {
|
||||
posX < linkLeft ? direction = 'left' : direction = 'right';
|
||||
}
|
||||
$cluetip.css({top: tipY + 'px'}).removeClass().addClass('clue-' + direction + '-' + ctClass).addClass(' cluetip-' + ctClass);
|
||||
if (opts.arrows) { // set up arrow positioning to align with element
|
||||
var bgY = (posY - tipY - opts.dropShadowSteps);
|
||||
$cluetipArrows.css({top: (/(left|right)/.test(direction) && posX >=0 && bgY > 0) ? bgY + 'px' : /(left|right)/.test(direction) ? 0 : ''}).show();
|
||||
} else {
|
||||
$cluetipArrows.hide();
|
||||
}
|
||||
|
||||
// (first hide, then) ***SHOW THE CLUETIP***
|
||||
$dropShadow.hide();
|
||||
$cluetip.hide()[opts.fx.open](opts.fx.open != 'show' && opts.fx.openSpeed);
|
||||
if (opts.dropShadow) { $dropShadow.css({height: tipHeight, width: tipInnerWidth, zIndex: $this.data('thisInfo').zIndex-1}).show(); }
|
||||
if ($.fn.bgiframe) { $cluetip.bgiframe(); }
|
||||
// delayed close (not fully tested)
|
||||
if (opts.delayedClose > 0) {
|
||||
closeOnDelay = setTimeout(cluetipClose, opts.delayedClose);
|
||||
}
|
||||
// trigger the optional onShow function
|
||||
opts.onShow.call(link, $cluetip, $cluetipInner);
|
||||
};
|
||||
|
||||
/***************************************
|
||||
=INACTIVATION
|
||||
-------------------------------------- */
|
||||
var inactivate = function(event) {
|
||||
isActive = false;
|
||||
$cluetipWait.hide();
|
||||
if (!opts.sticky || (/click|toggle/).test(opts.activation) ) {
|
||||
cluetipClose();
|
||||
clearTimeout(closeOnDelay);
|
||||
};
|
||||
if (opts.hoverClass) {
|
||||
$this.removeClass(opts.hoverClass);
|
||||
}
|
||||
};
|
||||
// close cluetip and reset some things
|
||||
var cluetipClose = function() {
|
||||
$cluetipOuter
|
||||
.parent().hide().removeClass();
|
||||
opts.onHide.call(link, $cluetip, $cluetipInner);
|
||||
$this.removeClass('cluetip-clicked');
|
||||
if (tipTitle) {
|
||||
$this.attr(opts.titleAttribute, tipTitle);
|
||||
}
|
||||
$this.css('cursor','');
|
||||
if (opts.arrows) $cluetipArrows.css({top: ''});
|
||||
};
|
||||
|
||||
$(document).bind('hideCluetip', function(e) {
|
||||
cluetipClose();
|
||||
});
|
||||
/***************************************
|
||||
=BIND EVENTS
|
||||
-------------------------------------- */
|
||||
// activate by click
|
||||
if ( (/click|toggle/).test(opts.activation) ) {
|
||||
$this.bind('click.cluetip', function(event) {
|
||||
if ($cluetip.is(':hidden') || !$this.is('.cluetip-clicked')) {
|
||||
activate(event);
|
||||
$('.cluetip-clicked').removeClass('cluetip-clicked');
|
||||
$this.addClass('cluetip-clicked');
|
||||
} else {
|
||||
inactivate(event);
|
||||
}
|
||||
this.blur();
|
||||
return false;
|
||||
});
|
||||
// activate by focus; inactivate by blur
|
||||
} else if (opts.activation == 'focus') {
|
||||
$this.bind('focus.cluetip', function(event) {
|
||||
activate(event);
|
||||
});
|
||||
$this.bind('blur.cluetip', function(event) {
|
||||
inactivate(event);
|
||||
});
|
||||
// activate by hover
|
||||
// clicking is returned false if cluetip url is same as href url
|
||||
} else {
|
||||
$this.bind('click.cluetip', function() {
|
||||
if ($this.attr('href') && $this.attr('href') == tipAttribute && !opts.clickThrough) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
//set up mouse tracking
|
||||
var mouseTracks = function(evt) {
|
||||
if (opts.tracking == true) {
|
||||
var trackX = posX - evt.pageX;
|
||||
var trackY = tipY ? tipY - evt.pageY : posY - evt.pageY;
|
||||
$this.bind('mousemove.cluetip', function(evt) {
|
||||
$cluetip.css({left: evt.pageX + trackX, top: evt.pageY + trackY });
|
||||
});
|
||||
}
|
||||
};
|
||||
if ($.fn.hoverIntent && opts.hoverIntent) {
|
||||
$this.hoverIntent({
|
||||
sensitivity: opts.hoverIntent.sensitivity,
|
||||
interval: opts.hoverIntent.interval,
|
||||
over: function(event) {
|
||||
activate(event);
|
||||
mouseTracks(event);
|
||||
},
|
||||
timeout: opts.hoverIntent.timeout,
|
||||
out: function(event) {inactivate(event); $this.unbind('mousemove.cluetip');}
|
||||
});
|
||||
} else {
|
||||
$this.bind('mouseenter.cluetip', function(event) {
|
||||
activate(event);
|
||||
mouseTracks(event);
|
||||
})
|
||||
.bind('mouseleave.cluetip', function(event) {
|
||||
inactivate(event);
|
||||
$this.unbind('mousemove.cluetip');
|
||||
});
|
||||
}
|
||||
// remove default title tooltip on hover
|
||||
$this.bind('mouseenter.cluetip', function(event) {
|
||||
$this.attr('title','');
|
||||
})
|
||||
.bind('mouseleave.cluetip', function(event) {
|
||||
$this.attr('title', $this.data('thisInfo').title);
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/*
|
||||
* options for clueTip
|
||||
*
|
||||
* each one can be explicitly overridden by changing its value.
|
||||
* for example: $.fn.cluetip.defaults.width = 200;
|
||||
* would change the default width for all clueTips to 200.
|
||||
*
|
||||
* each one can also be overridden by passing an options map to the cluetip method.
|
||||
* for example: $('a.example').cluetip({width: 200});
|
||||
* would change the default width to 200 for clueTips invoked by a link with class of "example"
|
||||
*
|
||||
*/
|
||||
|
||||
$.fn.cluetip.defaults = { // set up default options
|
||||
width: 275, // The width of the clueTip
|
||||
height: 'auto', // The height of the clueTip
|
||||
cluezIndex: 97, // Sets the z-index style property of the clueTip
|
||||
positionBy: 'auto', // Sets the type of positioning: 'auto', 'mouse','bottomTop', 'fixed'
|
||||
topOffset: 15, // Number of px to offset clueTip from top of invoking element
|
||||
leftOffset: 15, // Number of px to offset clueTip from left of invoking element
|
||||
local: false, // Whether to use content from the same page for the clueTip's body
|
||||
localPrefix: null, // string to be prepended to the tip attribute if local is true
|
||||
hideLocal: true, // If local option is set to true, this determines whether local content
|
||||
// to be shown in clueTip should be hidden at its original location
|
||||
attribute: 'rel', // the attribute to be used for fetching the clueTip's body content
|
||||
titleAttribute: 'title', // the attribute to be used for fetching the clueTip's title
|
||||
splitTitle: '', // A character used to split the title attribute into the clueTip title and divs
|
||||
// within the clueTip body. more info below [6]
|
||||
escapeTitle: false, // whether to html escape the title attribute
|
||||
showTitle: true, // show title bar of the clueTip, even if title attribute not set
|
||||
cluetipClass: 'default',// class added to outermost clueTip div in the form of 'cluetip-' + clueTipClass.
|
||||
hoverClass: '', // class applied to the invoking element onmouseover and removed onmouseout
|
||||
waitImage: true, // whether to show a "loading" img, which is set in jquery.cluetip.css
|
||||
cursor: 'help',
|
||||
arrows: false, // if true, displays arrow on appropriate side of clueTip
|
||||
dropShadow: true, // set to false if you don't want the drop-shadow effect on the clueTip
|
||||
dropShadowSteps: 6, // adjusts the size of the drop shadow
|
||||
sticky: false, // keep visible until manually closed
|
||||
mouseOutClose: false, // close when clueTip is moused out
|
||||
activation: 'hover', // set to 'click' to force user to click to show clueTip
|
||||
// set to 'focus' to show on focus of a form element and hide on blur
|
||||
clickThrough: false, // if true, and activation is not 'click', then clicking on link will take user to the link's href,
|
||||
// even if href and tipAttribute are equal
|
||||
tracking: false, // if true, clueTip will track mouse movement (experimental)
|
||||
delayedClose: 0, // close clueTip on a timed delay (experimental)
|
||||
closePosition: 'top', // location of close text for sticky cluetips; can be 'top' or 'bottom' or 'title'
|
||||
closeText: 'Close', // text (or HTML) to to be clicked to close sticky clueTips
|
||||
truncate: 0, // number of characters to truncate clueTip's contents. if 0, no truncation occurs
|
||||
|
||||
// effect and speed for opening clueTips
|
||||
fx: {
|
||||
open: 'show', // can be 'show' or 'slideDown' or 'fadeIn'
|
||||
openSpeed: ''
|
||||
},
|
||||
|
||||
// settings for when hoverIntent plugin is used
|
||||
hoverIntent: {
|
||||
sensitivity: 3,
|
||||
interval: 50,
|
||||
timeout: 0
|
||||
},
|
||||
|
||||
// short-circuit function to run just before clueTip is shown.
|
||||
onActivate: function(e) {return true;},
|
||||
|
||||
// function to run just after clueTip is shown.
|
||||
onShow: function(ct, ci){},
|
||||
// function to run just after clueTip is hidden.
|
||||
onHide: function(ct, ci){},
|
||||
// whether to cache results of ajax request to avoid unnecessary hits to server
|
||||
ajaxCache: true,
|
||||
|
||||
// process data retrieved via xhr before it's displayed
|
||||
ajaxProcess: function(data) {
|
||||
data = data.replace(/<(script|style|title)[^<]+<\/(script|style|title)>/gm, '').replace(/<(link|meta)[^>]+>/g,'');
|
||||
return data;
|
||||
},
|
||||
|
||||
// can pass in standard $.ajax() parameters. Callback functions, such as beforeSend,
|
||||
// will be queued first within the default callbacks.
|
||||
// The only exception is error, which overrides the default
|
||||
ajaxSettings: {
|
||||
// error: function(ct, ci) { /* override default error callback */ }
|
||||
// beforeSend: function(ct, ci) { /* called first within default beforeSend callback }
|
||||
dataType: 'html'
|
||||
},
|
||||
debug: false
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Global defaults for clueTips. Apply to all calls to the clueTip plugin.
|
||||
*
|
||||
* @example $.cluetip.setup({
|
||||
* insertionType: 'prependTo',
|
||||
* insertionElement: '#container'
|
||||
* });
|
||||
*
|
||||
* @property
|
||||
* @name $.cluetip.setup
|
||||
* @type Map
|
||||
* @cat Plugins/tooltip
|
||||
* @option String insertionType: Default is 'appendTo'. Determines the method to be used for inserting the clueTip into the DOM. Permitted values are 'appendTo', 'prependTo', 'insertBefore', and 'insertAfter'
|
||||
* @option String insertionElement: Default is 'body'. Determines which element in the DOM the plugin will reference when inserting the clueTip.
|
||||
*
|
||||
*/
|
||||
|
||||
var insertionType = 'appendTo', insertionElement = 'body';
|
||||
|
||||
$.cluetip.setup = function(options) {
|
||||
if (options && options.insertionType && (options.insertionType).match(/appendTo|prependTo|insertBefore|insertAfter/)) {
|
||||
insertionType = options.insertionType;
|
||||
}
|
||||
if (options && options.insertionElement) {
|
||||
insertionElement = options.insertionElement;
|
||||
}
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
14
share/pnp/media/js/jquery.imgareaselect.Debian.txt
Normal file
14
share/pnp/media/js/jquery.imgareaselect.Debian.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* imgAreaSelect jQuery plugin
|
||||
* version 0.9.10
|
||||
*
|
||||
* Copyright (c) 2008-2013 Michal Wojciechowski (odyniec.net)
|
||||
*
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* http://odyniec.net/projects/imgareaselect/
|
||||
*
|
||||
* Added to the DFSG tarball by
|
||||
* Markus Frosch <markus@lazyfrosch.de>
|
||||
*/
|
||||
730
share/pnp/media/js/jquery.imgareaselect.js
Normal file
730
share/pnp/media/js/jquery.imgareaselect.js
Normal file
@@ -0,0 +1,730 @@
|
||||
/*
|
||||
* imgAreaSelect jQuery plugin
|
||||
* version 0.9.10
|
||||
*
|
||||
* Copyright (c) 2008-2013 Michal Wojciechowski (odyniec.net)
|
||||
*
|
||||
* Dual licensed under the MIT (MIT-LICENSE.txt)
|
||||
* and GPL (GPL-LICENSE.txt) licenses.
|
||||
*
|
||||
* http://odyniec.net/projects/imgareaselect/
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
|
||||
var abs = Math.abs,
|
||||
max = Math.max,
|
||||
min = Math.min,
|
||||
round = Math.round;
|
||||
|
||||
function div() {
|
||||
return $('<div/>');
|
||||
}
|
||||
|
||||
$.imgAreaSelect = function (img, options) {
|
||||
var
|
||||
|
||||
$img = $(img),
|
||||
|
||||
imgLoaded,
|
||||
|
||||
$box = div(),
|
||||
$area = div(),
|
||||
$border = div().add(div()).add(div()).add(div()),
|
||||
$outer = div().add(div()).add(div()).add(div()),
|
||||
$handles = $([]),
|
||||
|
||||
$areaOpera,
|
||||
|
||||
left, top,
|
||||
|
||||
imgOfs = { left: 0, top: 0 },
|
||||
|
||||
imgWidth, imgHeight,
|
||||
|
||||
$parent,
|
||||
|
||||
parOfs = { left: 0, top: 0 },
|
||||
|
||||
zIndex = 0,
|
||||
|
||||
position = 'absolute',
|
||||
|
||||
startX, startY,
|
||||
|
||||
scaleX, scaleY,
|
||||
|
||||
resize,
|
||||
|
||||
minWidth, minHeight, maxWidth, maxHeight,
|
||||
|
||||
aspectRatio,
|
||||
|
||||
shown,
|
||||
|
||||
x1, y1, x2, y2,
|
||||
|
||||
selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 },
|
||||
|
||||
docElem = document.documentElement,
|
||||
|
||||
ua = navigator.userAgent,
|
||||
|
||||
$p, d, i, o, w, h, adjusted;
|
||||
|
||||
function viewX(x) {
|
||||
return x + imgOfs.left - parOfs.left;
|
||||
}
|
||||
|
||||
function viewY(y) {
|
||||
return y + imgOfs.top - parOfs.top;
|
||||
}
|
||||
|
||||
function selX(x) {
|
||||
return x - imgOfs.left + parOfs.left;
|
||||
}
|
||||
|
||||
function selY(y) {
|
||||
return y - imgOfs.top + parOfs.top;
|
||||
}
|
||||
|
||||
function evX(event) {
|
||||
return event.pageX - parOfs.left;
|
||||
}
|
||||
|
||||
function evY(event) {
|
||||
return event.pageY - parOfs.top;
|
||||
}
|
||||
|
||||
function getSelection(noScale) {
|
||||
var sx = noScale || scaleX, sy = noScale || scaleY;
|
||||
|
||||
return { x1: round(selection.x1 * sx),
|
||||
y1: round(selection.y1 * sy),
|
||||
x2: round(selection.x2 * sx),
|
||||
y2: round(selection.y2 * sy),
|
||||
width: round(selection.x2 * sx) - round(selection.x1 * sx),
|
||||
height: round(selection.y2 * sy) - round(selection.y1 * sy) };
|
||||
}
|
||||
|
||||
function setSelection(x1, y1, x2, y2, noScale) {
|
||||
var sx = noScale || scaleX, sy = noScale || scaleY;
|
||||
|
||||
selection = {
|
||||
x1: round(x1 / sx || 0),
|
||||
y1: round(y1 / sy || 0),
|
||||
x2: round(x2 / sx || 0),
|
||||
y2: round(y2 / sy || 0)
|
||||
};
|
||||
|
||||
selection.width = selection.x2 - selection.x1;
|
||||
selection.height = selection.y2 - selection.y1;
|
||||
}
|
||||
|
||||
function adjust() {
|
||||
if (!imgLoaded || !$img.width())
|
||||
return;
|
||||
|
||||
imgOfs = { left: round($img.offset().left), top: round($img.offset().top) };
|
||||
|
||||
imgWidth = $img.innerWidth();
|
||||
imgHeight = $img.innerHeight();
|
||||
|
||||
imgOfs.top += ($img.outerHeight() - imgHeight) >> 1;
|
||||
imgOfs.left += ($img.outerWidth() - imgWidth) >> 1;
|
||||
|
||||
minWidth = round(options.minWidth / scaleX) || 0;
|
||||
minHeight = round(options.minHeight / scaleY) || 0;
|
||||
maxWidth = round(min(options.maxWidth / scaleX || 1<<24, imgWidth));
|
||||
maxHeight = round(min(options.maxHeight / scaleY || 1<<24, imgHeight));
|
||||
|
||||
if ($().jquery == '1.3.2' && position == 'fixed' &&
|
||||
!docElem['getBoundingClientRect'])
|
||||
{
|
||||
imgOfs.top += max(document.body.scrollTop, docElem.scrollTop);
|
||||
imgOfs.left += max(document.body.scrollLeft, docElem.scrollLeft);
|
||||
}
|
||||
|
||||
parOfs = /absolute|relative/.test($parent.css('position')) ?
|
||||
{ left: round($parent.offset().left) - $parent.scrollLeft(),
|
||||
top: round($parent.offset().top) - $parent.scrollTop() } :
|
||||
position == 'fixed' ?
|
||||
{ left: $(document).scrollLeft(), top: $(document).scrollTop() } :
|
||||
{ left: 0, top: 0 };
|
||||
|
||||
left = viewX(0);
|
||||
top = viewY(0);
|
||||
|
||||
if (selection.x2 > imgWidth || selection.y2 > imgHeight)
|
||||
doResize();
|
||||
}
|
||||
|
||||
function update(resetKeyPress) {
|
||||
if (!shown) return;
|
||||
|
||||
$box.css({ left: viewX(selection.x1), top: viewY(selection.y1) })
|
||||
.add($area).width(w = selection.width).height(h = selection.height);
|
||||
|
||||
$area.add($border).add($handles).css({ left: 0, top: 0 });
|
||||
|
||||
$border
|
||||
.width(max(w - $border.outerWidth() + $border.innerWidth(), 0))
|
||||
.height(max(h - $border.outerHeight() + $border.innerHeight(), 0));
|
||||
|
||||
$($outer[0]).css({ left: left, top: top,
|
||||
width: selection.x1, height: imgHeight });
|
||||
$($outer[1]).css({ left: left + selection.x1, top: top,
|
||||
width: w, height: selection.y1 });
|
||||
$($outer[2]).css({ left: left + selection.x2, top: top,
|
||||
width: imgWidth - selection.x2, height: imgHeight });
|
||||
$($outer[3]).css({ left: left + selection.x1, top: top + selection.y2,
|
||||
width: w, height: imgHeight - selection.y2 });
|
||||
|
||||
w -= $handles.outerWidth();
|
||||
h -= $handles.outerHeight();
|
||||
|
||||
switch ($handles.length) {
|
||||
case 8:
|
||||
$($handles[4]).css({ left: w >> 1 });
|
||||
$($handles[5]).css({ left: w, top: h >> 1 });
|
||||
$($handles[6]).css({ left: w >> 1, top: h });
|
||||
$($handles[7]).css({ top: h >> 1 });
|
||||
case 4:
|
||||
$handles.slice(1,3).css({ left: w });
|
||||
$handles.slice(2,4).css({ top: h });
|
||||
}
|
||||
|
||||
if (resetKeyPress !== false) {
|
||||
if ($.imgAreaSelect.onKeyPress != docKeyPress)
|
||||
$(document).unbind($.imgAreaSelect.keyPress,
|
||||
$.imgAreaSelect.onKeyPress);
|
||||
|
||||
if (options.keys)
|
||||
$(document)[$.imgAreaSelect.keyPress](
|
||||
$.imgAreaSelect.onKeyPress = docKeyPress);
|
||||
}
|
||||
|
||||
if (msie && $border.outerWidth() - $border.innerWidth() == 2) {
|
||||
$border.css('margin', 0);
|
||||
setTimeout(function () { $border.css('margin', 'auto'); }, 0);
|
||||
}
|
||||
}
|
||||
|
||||
function doUpdate(resetKeyPress) {
|
||||
adjust();
|
||||
update(resetKeyPress);
|
||||
x1 = viewX(selection.x1); y1 = viewY(selection.y1);
|
||||
x2 = viewX(selection.x2); y2 = viewY(selection.y2);
|
||||
}
|
||||
|
||||
function hide($elem, fn) {
|
||||
options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide();
|
||||
|
||||
}
|
||||
|
||||
function areaMouseMove(event) {
|
||||
var x = selX(evX(event)) - selection.x1,
|
||||
y = selY(evY(event)) - selection.y1;
|
||||
|
||||
if (!adjusted) {
|
||||
adjust();
|
||||
adjusted = true;
|
||||
|
||||
$box.one('mouseout', function () { adjusted = false; });
|
||||
}
|
||||
|
||||
resize = '';
|
||||
|
||||
if (options.resizable) {
|
||||
if (y <= options.resizeMargin)
|
||||
resize = 'n';
|
||||
else if (y >= selection.height - options.resizeMargin)
|
||||
resize = 's';
|
||||
if (x <= options.resizeMargin)
|
||||
resize += 'w';
|
||||
else if (x >= selection.width - options.resizeMargin)
|
||||
resize += 'e';
|
||||
}
|
||||
|
||||
$box.css('cursor', resize ? resize + '-resize' :
|
||||
options.movable ? 'move' : '');
|
||||
if ($areaOpera)
|
||||
$areaOpera.toggle();
|
||||
}
|
||||
|
||||
function docMouseUp(event) {
|
||||
$('body').css('cursor', '');
|
||||
if (options.autoHide || selection.width * selection.height == 0)
|
||||
hide($box.add($outer), function () { $(this).hide(); });
|
||||
|
||||
$(document).unbind('mousemove', selectingMouseMove);
|
||||
$box.mousemove(areaMouseMove);
|
||||
|
||||
options.onSelectEnd(img, getSelection());
|
||||
}
|
||||
|
||||
function areaMouseDown(event) {
|
||||
if (event.which != 1) return false;
|
||||
|
||||
adjust();
|
||||
|
||||
if (resize) {
|
||||
$('body').css('cursor', resize + '-resize');
|
||||
|
||||
x1 = viewX(selection[/w/.test(resize) ? 'x2' : 'x1']);
|
||||
y1 = viewY(selection[/n/.test(resize) ? 'y2' : 'y1']);
|
||||
|
||||
$(document).mousemove(selectingMouseMove)
|
||||
.one('mouseup', docMouseUp);
|
||||
$box.unbind('mousemove', areaMouseMove);
|
||||
}
|
||||
else if (options.movable) {
|
||||
startX = left + selection.x1 - evX(event);
|
||||
startY = top + selection.y1 - evY(event);
|
||||
|
||||
$box.unbind('mousemove', areaMouseMove);
|
||||
|
||||
$(document).mousemove(movingMouseMove)
|
||||
.one('mouseup', function () {
|
||||
options.onSelectEnd(img, getSelection());
|
||||
|
||||
$(document).unbind('mousemove', movingMouseMove);
|
||||
$box.mousemove(areaMouseMove);
|
||||
});
|
||||
}
|
||||
else
|
||||
$img.mousedown(event);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function fixAspectRatio(xFirst) {
|
||||
if (aspectRatio)
|
||||
if (xFirst) {
|
||||
x2 = max(left, min(left + imgWidth,
|
||||
x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1)));
|
||||
|
||||
y2 = round(max(top, min(top + imgHeight,
|
||||
y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1))));
|
||||
x2 = round(x2);
|
||||
}
|
||||
else {
|
||||
y2 = max(top, min(top + imgHeight,
|
||||
y1 + abs(x2 - x1) / aspectRatio * (y2 > y1 || -1)));
|
||||
x2 = round(max(left, min(left + imgWidth,
|
||||
x1 + abs(y2 - y1) * aspectRatio * (x2 > x1 || -1))));
|
||||
y2 = round(y2);
|
||||
}
|
||||
}
|
||||
|
||||
function doResize() {
|
||||
x1 = min(x1, left + imgWidth);
|
||||
y1 = min(y1, top + imgHeight);
|
||||
|
||||
if (abs(x2 - x1) < minWidth) {
|
||||
x2 = x1 - minWidth * (x2 < x1 || -1);
|
||||
|
||||
if (x2 < left)
|
||||
x1 = left + minWidth;
|
||||
else if (x2 > left + imgWidth)
|
||||
x1 = left + imgWidth - minWidth;
|
||||
}
|
||||
|
||||
if (abs(y2 - y1) < minHeight) {
|
||||
y2 = y1 - minHeight * (y2 < y1 || -1);
|
||||
|
||||
if (y2 < top)
|
||||
y1 = top + minHeight;
|
||||
else if (y2 > top + imgHeight)
|
||||
y1 = top + imgHeight - minHeight;
|
||||
}
|
||||
|
||||
x2 = max(left, min(x2, left + imgWidth));
|
||||
y2 = max(top, min(y2, top + imgHeight));
|
||||
|
||||
fixAspectRatio(abs(x2 - x1) < abs(y2 - y1) * aspectRatio);
|
||||
|
||||
if (abs(x2 - x1) > maxWidth) {
|
||||
x2 = x1 - maxWidth * (x2 < x1 || -1);
|
||||
fixAspectRatio();
|
||||
}
|
||||
|
||||
if (abs(y2 - y1) > maxHeight) {
|
||||
y2 = y1 - maxHeight * (y2 < y1 || -1);
|
||||
fixAspectRatio(true);
|
||||
}
|
||||
|
||||
selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)),
|
||||
y1: selY(min(y1, y2)), y2: selY(max(y1, y2)),
|
||||
width: abs(x2 - x1), height: abs(y2 - y1) };
|
||||
|
||||
update();
|
||||
|
||||
options.onSelectChange(img, getSelection());
|
||||
}
|
||||
|
||||
function selectingMouseMove(event) {
|
||||
x2 = /w|e|^$/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2);
|
||||
y2 = /n|s|^$/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2);
|
||||
|
||||
doResize();
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
function doMove(newX1, newY1) {
|
||||
x2 = (x1 = newX1) + selection.width;
|
||||
y2 = (y1 = newY1) + selection.height;
|
||||
|
||||
$.extend(selection, { x1: selX(x1), y1: selY(y1), x2: selX(x2),
|
||||
y2: selY(y2) });
|
||||
|
||||
update();
|
||||
|
||||
options.onSelectChange(img, getSelection());
|
||||
}
|
||||
|
||||
function movingMouseMove(event) {
|
||||
x1 = max(left, min(startX + evX(event), left + imgWidth - selection.width));
|
||||
y1 = max(top, min(startY + evY(event), top + imgHeight - selection.height));
|
||||
|
||||
doMove(x1, y1);
|
||||
|
||||
event.preventDefault();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function startSelection() {
|
||||
$(document).unbind('mousemove', startSelection);
|
||||
adjust();
|
||||
|
||||
x2 = x1;
|
||||
y2 = y1;
|
||||
|
||||
doResize();
|
||||
|
||||
resize = '';
|
||||
|
||||
if (!$outer.is(':visible'))
|
||||
$box.add($outer).hide().fadeIn(options.fadeSpeed||0);
|
||||
|
||||
shown = true;
|
||||
|
||||
$(document).unbind('mouseup', cancelSelection)
|
||||
.mousemove(selectingMouseMove).one('mouseup', docMouseUp);
|
||||
$box.unbind('mousemove', areaMouseMove);
|
||||
|
||||
options.onSelectStart(img, getSelection());
|
||||
}
|
||||
|
||||
function cancelSelection() {
|
||||
$(document).unbind('mousemove', startSelection)
|
||||
.unbind('mouseup', cancelSelection);
|
||||
hide($box.add($outer));
|
||||
|
||||
setSelection(selX(x1), selY(y1), selX(x1), selY(y1));
|
||||
|
||||
if (!(this instanceof $.imgAreaSelect)) {
|
||||
options.onSelectChange(img, getSelection());
|
||||
options.onSelectEnd(img, getSelection());
|
||||
}
|
||||
}
|
||||
|
||||
function imgMouseDown(event) {
|
||||
if (event.which != 1 || $outer.is(':animated')) return false;
|
||||
|
||||
adjust();
|
||||
startX = x1 = evX(event);
|
||||
startY = y1 = evY(event);
|
||||
|
||||
$(document).mousemove(startSelection).mouseup(cancelSelection);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
function windowResize() {
|
||||
doUpdate(false);
|
||||
}
|
||||
|
||||
function imgLoad() {
|
||||
imgLoaded = true;
|
||||
|
||||
setOptions(options = $.extend({
|
||||
classPrefix: 'imgareaselect',
|
||||
movable: true,
|
||||
parent: 'body',
|
||||
resizable: true,
|
||||
resizeMargin: 10,
|
||||
onInit: function () {},
|
||||
onSelectStart: function () {},
|
||||
onSelectChange: function () {},
|
||||
onSelectEnd: function () {}
|
||||
}, options));
|
||||
|
||||
$box.add($outer).css({ visibility: '' });
|
||||
|
||||
if (options.show) {
|
||||
shown = true;
|
||||
adjust();
|
||||
update();
|
||||
$box.add($outer).hide().fadeIn(options.fadeSpeed||0);
|
||||
}
|
||||
|
||||
setTimeout(function () { options.onInit(img, getSelection()); }, 0);
|
||||
}
|
||||
|
||||
var docKeyPress = function(event) {
|
||||
var k = options.keys, d, t, key = event.keyCode;
|
||||
|
||||
d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt :
|
||||
!isNaN(k.ctrl) && event.ctrlKey ? k.ctrl :
|
||||
!isNaN(k.shift) && event.shiftKey ? k.shift :
|
||||
!isNaN(k.arrows) ? k.arrows : 10;
|
||||
|
||||
if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) ||
|
||||
(k.ctrl == 'resize' && event.ctrlKey) ||
|
||||
(k.alt == 'resize' && (event.altKey || event.originalEvent.altKey)))
|
||||
{
|
||||
switch (key) {
|
||||
case 37:
|
||||
d = -d;
|
||||
case 39:
|
||||
t = max(x1, x2);
|
||||
x1 = min(x1, x2);
|
||||
x2 = max(t + d, x1);
|
||||
fixAspectRatio();
|
||||
break;
|
||||
case 38:
|
||||
d = -d;
|
||||
case 40:
|
||||
t = max(y1, y2);
|
||||
y1 = min(y1, y2);
|
||||
y2 = max(t + d, y1);
|
||||
fixAspectRatio(true);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
doResize();
|
||||
}
|
||||
else {
|
||||
x1 = min(x1, x2);
|
||||
y1 = min(y1, y2);
|
||||
|
||||
switch (key) {
|
||||
case 37:
|
||||
doMove(max(x1 - d, left), y1);
|
||||
break;
|
||||
case 38:
|
||||
doMove(x1, max(y1 - d, top));
|
||||
break;
|
||||
case 39:
|
||||
doMove(x1 + min(d, imgWidth - selX(x2)), y1);
|
||||
break;
|
||||
case 40:
|
||||
doMove(x1, y1 + min(d, imgHeight - selY(y2)));
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
function styleOptions($elem, props) {
|
||||
for (var option in props)
|
||||
if (options[option] !== undefined)
|
||||
$elem.css(props[option], options[option]);
|
||||
}
|
||||
|
||||
function setOptions(newOptions) {
|
||||
if (newOptions.parent)
|
||||
($parent = $(newOptions.parent)).append($box.add($outer));
|
||||
|
||||
$.extend(options, newOptions);
|
||||
|
||||
adjust();
|
||||
|
||||
if (newOptions.handles != null) {
|
||||
$handles.remove();
|
||||
$handles = $([]);
|
||||
|
||||
i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0;
|
||||
|
||||
while (i--)
|
||||
$handles = $handles.add(div());
|
||||
|
||||
$handles.addClass(options.classPrefix + '-handle').css({
|
||||
position: 'absolute',
|
||||
fontSize: 0,
|
||||
zIndex: zIndex + 1 || 1
|
||||
});
|
||||
|
||||
if (!parseInt($handles.css('width')) >= 0)
|
||||
$handles.width(5).height(5);
|
||||
|
||||
if (o = options.borderWidth)
|
||||
$handles.css({ borderWidth: o, borderStyle: 'solid' });
|
||||
|
||||
styleOptions($handles, { borderColor1: 'border-color',
|
||||
borderColor2: 'background-color',
|
||||
borderOpacity: 'opacity' });
|
||||
}
|
||||
|
||||
scaleX = options.imageWidth / imgWidth || 1;
|
||||
scaleY = options.imageHeight / imgHeight || 1;
|
||||
|
||||
if (newOptions.x1 != null) {
|
||||
setSelection(newOptions.x1, newOptions.y1, newOptions.x2,
|
||||
newOptions.y2);
|
||||
newOptions.show = !newOptions.hide;
|
||||
}
|
||||
|
||||
if (newOptions.keys)
|
||||
options.keys = $.extend({ shift: 1, ctrl: 'resize' },
|
||||
newOptions.keys);
|
||||
|
||||
$outer.addClass(options.classPrefix + '-outer');
|
||||
$area.addClass(options.classPrefix + '-selection');
|
||||
for (i = 0; i++ < 4;)
|
||||
$($border[i-1]).addClass(options.classPrefix + '-border' + i);
|
||||
|
||||
styleOptions($area, { selectionColor: 'background-color',
|
||||
selectionOpacity: 'opacity' });
|
||||
styleOptions($border, { borderOpacity: 'opacity',
|
||||
borderWidth: 'border-width' });
|
||||
styleOptions($outer, { outerColor: 'background-color',
|
||||
outerOpacity: 'opacity' });
|
||||
if (o = options.borderColor1)
|
||||
$($border[0]).css({ borderStyle: 'solid', borderColor: o });
|
||||
if (o = options.borderColor2)
|
||||
$($border[1]).css({ borderStyle: 'dashed', borderColor: o });
|
||||
|
||||
$box.append($area.add($border).add($areaOpera)).append($handles);
|
||||
|
||||
if (msie) {
|
||||
if (o = ($outer.css('filter')||'').match(/opacity=(\d+)/))
|
||||
$outer.css('opacity', o[1]/100);
|
||||
if (o = ($border.css('filter')||'').match(/opacity=(\d+)/))
|
||||
$border.css('opacity', o[1]/100);
|
||||
}
|
||||
|
||||
if (newOptions.hide)
|
||||
hide($box.add($outer));
|
||||
else if (newOptions.show && imgLoaded) {
|
||||
shown = true;
|
||||
$box.add($outer).fadeIn(options.fadeSpeed||0);
|
||||
doUpdate();
|
||||
}
|
||||
|
||||
aspectRatio = (d = (options.aspectRatio || '').split(/:/))[0] / d[1];
|
||||
|
||||
$img.add($outer).unbind('mousedown', imgMouseDown);
|
||||
|
||||
if (options.disable || options.enable === false) {
|
||||
$box.unbind('mousemove', areaMouseMove).unbind('mousedown', areaMouseDown);
|
||||
$(window).unbind('resize', windowResize);
|
||||
}
|
||||
else {
|
||||
if (options.enable || options.disable === false) {
|
||||
if (options.resizable || options.movable)
|
||||
$box.mousemove(areaMouseMove).mousedown(areaMouseDown);
|
||||
|
||||
$(window).resize(windowResize);
|
||||
}
|
||||
|
||||
if (!options.persistent)
|
||||
$img.add($outer).mousedown(imgMouseDown);
|
||||
}
|
||||
|
||||
options.enable = options.disable = undefined;
|
||||
}
|
||||
|
||||
this.remove = function () {
|
||||
setOptions({ disable: true });
|
||||
$box.add($outer).remove();
|
||||
};
|
||||
|
||||
this.getOptions = function () { return options; };
|
||||
|
||||
this.setOptions = setOptions;
|
||||
|
||||
this.getSelection = getSelection;
|
||||
|
||||
this.setSelection = setSelection;
|
||||
|
||||
this.cancelSelection = cancelSelection;
|
||||
|
||||
this.update = doUpdate;
|
||||
|
||||
var msie = (/msie ([\w.]+)/i.exec(ua)||[])[1],
|
||||
opera = /opera/i.test(ua),
|
||||
safari = /webkit/i.test(ua) && !/chrome/i.test(ua);
|
||||
|
||||
$p = $img;
|
||||
|
||||
while ($p.length) {
|
||||
zIndex = max(zIndex,
|
||||
!isNaN($p.css('z-index')) ? $p.css('z-index') : zIndex);
|
||||
if ($p.css('position') == 'fixed')
|
||||
position = 'fixed';
|
||||
|
||||
$p = $p.parent(':not(body)');
|
||||
}
|
||||
|
||||
zIndex = options.zIndex || zIndex;
|
||||
|
||||
if (msie)
|
||||
$img.attr('unselectable', 'on');
|
||||
|
||||
$.imgAreaSelect.keyPress = msie || safari ? 'keydown' : 'keypress';
|
||||
|
||||
if (opera)
|
||||
|
||||
$areaOpera = div().css({ width: '100%', height: '100%',
|
||||
position: 'absolute', zIndex: zIndex + 2 || 2 });
|
||||
|
||||
$box.add($outer).css({ visibility: 'hidden', position: position,
|
||||
overflow: 'hidden', zIndex: zIndex || '0' });
|
||||
$box.css({ zIndex: zIndex + 2 || 2 });
|
||||
$area.add($border).css({ position: 'absolute', fontSize: 0 });
|
||||
|
||||
img.complete || img.readyState == 'complete' || !$img.is('img') ?
|
||||
imgLoad() : $img.one('load', imgLoad);
|
||||
|
||||
if (!imgLoaded && msie && msie >= 7)
|
||||
img.src = img.src;
|
||||
};
|
||||
|
||||
$.fn.imgAreaSelect = function (options) {
|
||||
options = options || {};
|
||||
|
||||
this.each(function () {
|
||||
if ($(this).data('imgAreaSelect')) {
|
||||
if (options.remove) {
|
||||
$(this).data('imgAreaSelect').remove();
|
||||
$(this).removeData('imgAreaSelect');
|
||||
}
|
||||
else
|
||||
$(this).data('imgAreaSelect').setOptions(options);
|
||||
}
|
||||
else if (!options.remove) {
|
||||
if (options.enable === undefined && options.disable === undefined)
|
||||
options.enable = true;
|
||||
|
||||
$(this).data('imgAreaSelect', new $.imgAreaSelect(this, options));
|
||||
}
|
||||
});
|
||||
|
||||
if (options.instance)
|
||||
return $(this).data('imgAreaSelect');
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
Reference in New Issue
Block a user