mirror of
https://github.com/apache/cloudstack.git
synced 2025-11-03 04:12:31 +01:00
Update jquery and related libraries (#3069)
* Update jquery, jquery ui, jquery validate and flot to current versions update jquery to 3.3.1 update jqueryui to 1.12.1 update jquery validate to 1.17.0 update jquery flot to 0.8.3 * Replace deprecated removed jquery functions * Fix initial tab content loading in detailView * Fix logout for new jquery version * Fix tooltip detail displaying for new JQuery version * Fix view all trigger in detailView for new JQuery version * Fix breadcrumb click event handler for JQuery update * Fix displaying of preselected zone in instanceWizard for new jQuery verion
This commit is contained in:
parent
ac73e7e671
commit
093ab722b3
@ -102,7 +102,7 @@
|
||||
<p><translate key="message.select.a.zone"/></p>
|
||||
<div class="select-area">
|
||||
<div class="desc"></div>
|
||||
<select name="zoneid" class="required">
|
||||
<select name="zoneid" class="required" required>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -74,14 +74,15 @@
|
||||
// if it's "transparent"
|
||||
$.color.extract = function (elem, css) {
|
||||
var c;
|
||||
|
||||
do {
|
||||
c = elem.css(css).toLowerCase();
|
||||
// keep going until we find an element that has color, or
|
||||
// we hit the body
|
||||
// we hit the body or root (have no parent)
|
||||
if (c != '' && c != 'transparent')
|
||||
break;
|
||||
elem = elem.parent();
|
||||
} while (!$.nodeName(elem.get(0), "body"));
|
||||
} while (elem.length && !$.nodeName(elem.get(0), "body"));
|
||||
|
||||
// catch Safari's way of signalling transparent
|
||||
if (c == "rgba(0, 0, 0, 0)")
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
/*
|
||||
Flot plugin for showing crosshairs, thin lines, when the mouse hovers
|
||||
over the plot.
|
||||
/* Flot plugin for showing crosshairs when the mouse hovers over the plot.
|
||||
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
The plugin supports these options:
|
||||
|
||||
crosshair: {
|
||||
mode: null or "x" or "y" or "xy"
|
||||
@ -8,22 +11,21 @@ over the plot.
|
||||
lineWidth: number
|
||||
}
|
||||
|
||||
Set the mode to one of "x", "y" or "xy". The "x" mode enables a
|
||||
vertical crosshair that lets you trace the values on the x axis, "y"
|
||||
enables a horizontal crosshair and "xy" enables them both. "color" is
|
||||
the color of the crosshair (default is "rgba(170, 0, 0, 0.80)"),
|
||||
"lineWidth" is the width of the drawn lines (default is 1).
|
||||
Set the mode to one of "x", "y" or "xy". The "x" mode enables a vertical
|
||||
crosshair that lets you trace the values on the x axis, "y" enables a
|
||||
horizontal crosshair and "xy" enables them both. "color" is the color of the
|
||||
crosshair (default is "rgba(170, 0, 0, 0.80)"), "lineWidth" is the width of
|
||||
the drawn lines (default is 1).
|
||||
|
||||
The plugin also adds four public methods:
|
||||
|
||||
- setCrosshair( pos )
|
||||
|
||||
Set the position of the crosshair. Note that this is cleared if
|
||||
the user moves the mouse. "pos" is in coordinates of the plot and
|
||||
should be on the form { x: xpos, y: ypos } (you can use x2/x3/...
|
||||
if you're using multiple axes), which is coincidentally the same
|
||||
format as what you get from a "plothover" event. If "pos" is null,
|
||||
the crosshair is cleared.
|
||||
Set the position of the crosshair. Note that this is cleared if the user
|
||||
moves the mouse. "pos" is in coordinates of the plot and should be on the
|
||||
form { x: xpos, y: ypos } (you can use x2/x3/... if you're using multiple
|
||||
axes), which is coincidentally the same format as what you get from a
|
||||
"plothover" event. If "pos" is null, the crosshair is cleared.
|
||||
|
||||
- clearCrosshair()
|
||||
|
||||
@ -31,18 +33,21 @@ The plugin also adds four public methods:
|
||||
|
||||
- lockCrosshair(pos)
|
||||
|
||||
Cause the crosshair to lock to the current location, no longer
|
||||
updating if the user moves the mouse. Optionally supply a position
|
||||
(passed on to setCrosshair()) to move it to.
|
||||
Cause the crosshair to lock to the current location, no longer updating if
|
||||
the user moves the mouse. Optionally supply a position (passed on to
|
||||
setCrosshair()) to move it to.
|
||||
|
||||
Example usage:
|
||||
|
||||
var myFlot = $.plot( $("#graph"), ..., { crosshair: { mode: "x" } } };
|
||||
$("#graph").bind( "plothover", function ( evt, position, item ) {
|
||||
if ( item ) {
|
||||
// Lock the crosshair to the data point being hovered
|
||||
myFlot.lockCrosshair({ x: item.datapoint[0], y: item.datapoint[1] });
|
||||
}
|
||||
else {
|
||||
myFlot.lockCrosshair({
|
||||
x: item.datapoint[ 0 ],
|
||||
y: item.datapoint[ 1 ]
|
||||
});
|
||||
} else {
|
||||
// Return normal crosshair operation
|
||||
myFlot.unlockCrosshair();
|
||||
}
|
||||
@ -84,11 +89,11 @@ The plugin also adds four public methods:
|
||||
if (pos)
|
||||
plot.setCrosshair(pos);
|
||||
crosshair.locked = true;
|
||||
}
|
||||
};
|
||||
|
||||
plot.unlockCrosshair = function unlockCrosshair() {
|
||||
crosshair.locked = false;
|
||||
}
|
||||
};
|
||||
|
||||
function onMouseOut(e) {
|
||||
if (crosshair.locked)
|
||||
@ -134,18 +139,22 @@ The plugin also adds four public methods:
|
||||
ctx.translate(plotOffset.left, plotOffset.top);
|
||||
|
||||
if (crosshair.x != -1) {
|
||||
var adj = plot.getOptions().crosshair.lineWidth % 2 ? 0.5 : 0;
|
||||
|
||||
ctx.strokeStyle = c.color;
|
||||
ctx.lineWidth = c.lineWidth;
|
||||
ctx.lineJoin = "round";
|
||||
|
||||
ctx.beginPath();
|
||||
if (c.mode.indexOf("x") != -1) {
|
||||
ctx.moveTo(crosshair.x, 0);
|
||||
ctx.lineTo(crosshair.x, plot.height());
|
||||
var drawX = Math.floor(crosshair.x) + adj;
|
||||
ctx.moveTo(drawX, 0);
|
||||
ctx.lineTo(drawX, plot.height());
|
||||
}
|
||||
if (c.mode.indexOf("y") != -1) {
|
||||
ctx.moveTo(0, crosshair.y);
|
||||
ctx.lineTo(plot.width(), crosshair.y);
|
||||
var drawY = Math.floor(crosshair.y) + adj;
|
||||
ctx.moveTo(0, drawY);
|
||||
ctx.lineTo(plot.width(), drawY);
|
||||
}
|
||||
ctx.stroke();
|
||||
}
|
||||
|
||||
@ -1,64 +1,75 @@
|
||||
/*
|
||||
Flot plugin for computing bottoms for filled line and bar charts.
|
||||
/* Flot plugin for computing bottoms for filled line and bar charts.
|
||||
|
||||
The case: you've got two series that you want to fill the area
|
||||
between. In Flot terms, you need to use one as the fill bottom of the
|
||||
other. You can specify the bottom of each data point as the third
|
||||
coordinate manually, or you can use this plugin to compute it for you.
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
In order to name the other series, you need to give it an id, like this
|
||||
The case: you've got two series that you want to fill the area between. In Flot
|
||||
terms, you need to use one as the fill bottom of the other. You can specify the
|
||||
bottom of each data point as the third coordinate manually, or you can use this
|
||||
plugin to compute it for you.
|
||||
|
||||
In order to name the other series, you need to give it an id, like this:
|
||||
|
||||
var dataset = [
|
||||
{ data: [ ... ], id: "foo" } , // use default bottom
|
||||
{ data: [ ... ], fillBetween: "foo" }, // use first dataset as bottom
|
||||
];
|
||||
|
||||
$.plot($("#placeholder"), dataset, { line: { show: true, fill: true }});
|
||||
$.plot($("#placeholder"), dataset, { lines: { show: true, fill: true }});
|
||||
|
||||
As a convenience, if the id given is a number that doesn't appear as
|
||||
an id in the series, it is interpreted as the index in the array
|
||||
instead (so fillBetween: 0 can also mean the first series).
|
||||
As a convenience, if the id given is a number that doesn't appear as an id in
|
||||
the series, it is interpreted as the index in the array instead (so fillBetween:
|
||||
0 can also mean the first series).
|
||||
|
||||
Internally, the plugin modifies the datapoints in each series. For line series,
|
||||
extra data points might be inserted through interpolation. Note that at points
|
||||
where the bottom line is not defined (due to a null point or start/end of line),
|
||||
the current line will show a gap too. The algorithm comes from the
|
||||
jquery.flot.stack.js plugin, possibly some code could be shared.
|
||||
|
||||
Internally, the plugin modifies the datapoints in each series. For
|
||||
line series, extra data points might be inserted through
|
||||
interpolation. Note that at points where the bottom line is not
|
||||
defined (due to a null point or start/end of line), the current line
|
||||
will show a gap too. The algorithm comes from the jquery.flot.stack.js
|
||||
plugin, possibly some code could be shared.
|
||||
*/
|
||||
|
||||
(function ( $ ) {
|
||||
|
||||
var options = {
|
||||
series: { fillBetween: null } // or number
|
||||
series: {
|
||||
fillBetween: null // or number
|
||||
}
|
||||
};
|
||||
|
||||
function init( plot ) {
|
||||
|
||||
function findBottomSeries( s, allseries ) {
|
||||
|
||||
var i;
|
||||
|
||||
for ( i = 0; i < allseries.length; ++i ) {
|
||||
if (allseries[i].id == s.fillBetween)
|
||||
if ( allseries[ i ].id === s.fillBetween ) {
|
||||
return allseries[ i ];
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof s.fillBetween == "number") {
|
||||
i = s.fillBetween;
|
||||
|
||||
if (i < 0 || i >= allseries.length)
|
||||
if ( typeof s.fillBetween === "number" ) {
|
||||
if ( s.fillBetween < 0 || s.fillBetween >= allseries.length ) {
|
||||
return null;
|
||||
|
||||
return allseries[i];
|
||||
}
|
||||
return allseries[ s.fillBetween ];
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function computeFillBottoms( plot, s, datapoints ) {
|
||||
if (s.fillBetween == null)
|
||||
|
||||
if ( s.fillBetween == null ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var other = findBottomSeries( s, plot.getData() );
|
||||
if (!other)
|
||||
|
||||
if ( !other ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var ps = datapoints.pointsize,
|
||||
points = datapoints.points,
|
||||
@ -70,81 +81,109 @@ plugin, possibly some code could be shared.
|
||||
withbottom = ps > 2 && datapoints.format[2].y,
|
||||
withsteps = withlines && s.lines.steps,
|
||||
fromgap = true,
|
||||
i = 0, j = 0, l;
|
||||
i = 0,
|
||||
j = 0,
|
||||
l, m;
|
||||
|
||||
while ( true ) {
|
||||
if (i >= points.length)
|
||||
|
||||
if ( i >= points.length ) {
|
||||
break;
|
||||
}
|
||||
|
||||
l = newpoints.length;
|
||||
|
||||
if ( points[ i ] == null ) {
|
||||
|
||||
// copy gaps
|
||||
for (m = 0; m < ps; ++m)
|
||||
|
||||
for ( m = 0; m < ps; ++m ) {
|
||||
newpoints.push( points[ i + m ] );
|
||||
i += ps;
|
||||
}
|
||||
else if (j >= otherpoints.length) {
|
||||
|
||||
i += ps;
|
||||
|
||||
} else if ( j >= otherpoints.length ) {
|
||||
|
||||
// for lines, we can't use the rest of the points
|
||||
|
||||
if ( !withlines ) {
|
||||
for (m = 0; m < ps; ++m)
|
||||
for ( m = 0; m < ps; ++m ) {
|
||||
newpoints.push( points[ i + m ] );
|
||||
}
|
||||
i += ps;
|
||||
}
|
||||
else if (otherpoints[j] == null) {
|
||||
|
||||
i += ps;
|
||||
|
||||
} else if ( otherpoints[ j ] == null ) {
|
||||
|
||||
// oops, got a gap
|
||||
for (m = 0; m < ps; ++m)
|
||||
|
||||
for ( m = 0; m < ps; ++m ) {
|
||||
newpoints.push( null );
|
||||
}
|
||||
|
||||
fromgap = true;
|
||||
j += otherps;
|
||||
}
|
||||
else {
|
||||
|
||||
} else {
|
||||
|
||||
// cases where we actually got two points
|
||||
|
||||
px = points[ i ];
|
||||
py = points[ i + 1 ];
|
||||
qx = otherpoints[ j ];
|
||||
qy = otherpoints[ j + 1 ];
|
||||
bottom = 0;
|
||||
|
||||
if (px == qx) {
|
||||
for (m = 0; m < ps; ++m)
|
||||
if ( px === qx ) {
|
||||
|
||||
for ( m = 0; m < ps; ++m ) {
|
||||
newpoints.push( points[ i + m ] );
|
||||
}
|
||||
|
||||
//newpoints[ l + 1 ] += qy;
|
||||
bottom = qy;
|
||||
|
||||
i += ps;
|
||||
j += otherps;
|
||||
}
|
||||
else if (px > qx) {
|
||||
|
||||
} else if ( px > qx ) {
|
||||
|
||||
// we got past point below, might need to
|
||||
// insert interpolated extra point
|
||||
|
||||
if ( withlines && i > 0 && points[ i - ps ] != null ) {
|
||||
intery = py + ( points[ i - ps + 1 ] - py ) * ( qx - px ) / ( points[ i - ps ] - px );
|
||||
newpoints.push( qx );
|
||||
newpoints.push(intery)
|
||||
for (m = 2; m < ps; ++m)
|
||||
newpoints.push( intery );
|
||||
for ( m = 2; m < ps; ++m ) {
|
||||
newpoints.push( points[ i + m ] );
|
||||
}
|
||||
bottom = qy;
|
||||
}
|
||||
|
||||
j += otherps;
|
||||
}
|
||||
else { // px < qx
|
||||
if (fromgap && withlines) {
|
||||
|
||||
} else { // px < qx
|
||||
|
||||
// if we come from a gap, we just skip this point
|
||||
|
||||
if ( fromgap && withlines ) {
|
||||
i += ps;
|
||||
continue;
|
||||
}
|
||||
|
||||
for (m = 0; m < ps; ++m)
|
||||
for ( m = 0; m < ps; ++m ) {
|
||||
newpoints.push( points[ i + m ] );
|
||||
}
|
||||
|
||||
// we might be able to interpolate a point below,
|
||||
// this can give us a better y
|
||||
if (withlines && j > 0 && otherpoints[j - otherps] != null)
|
||||
|
||||
if ( withlines && j > 0 && otherpoints[ j - otherps ] != null ) {
|
||||
bottom = qy + ( otherpoints[ j - otherps + 1 ] - qy ) * ( px - qx ) / ( otherpoints[ j - otherps ] - qx );
|
||||
}
|
||||
|
||||
//newpoints[l + 1] += bottom;
|
||||
|
||||
@ -153,17 +192,20 @@ plugin, possibly some code could be shared.
|
||||
|
||||
fromgap = false;
|
||||
|
||||
if (l != newpoints.length && withbottom)
|
||||
if ( l !== newpoints.length && withbottom ) {
|
||||
newpoints[ l + 2 ] = bottom;
|
||||
}
|
||||
}
|
||||
|
||||
// maintain the line steps invariant
|
||||
if (withsteps && l != newpoints.length && l > 0
|
||||
&& newpoints[l] != null
|
||||
&& newpoints[l] != newpoints[l - ps]
|
||||
&& newpoints[l + 1] != newpoints[l - ps + 1]) {
|
||||
for (m = 0; m < ps; ++m)
|
||||
|
||||
if ( withsteps && l !== newpoints.length && l > 0 &&
|
||||
newpoints[ l ] !== null &&
|
||||
newpoints[ l ] !== newpoints[ l - ps ] &&
|
||||
newpoints[ l + 1 ] !== newpoints[ l - ps + 1 ] ) {
|
||||
for (m = 0; m < ps; ++m) {
|
||||
newpoints[ l + ps + m ] = newpoints[ l + m ];
|
||||
}
|
||||
newpoints[ l + 1 ] = newpoints[ l - ps + 1 ];
|
||||
}
|
||||
}
|
||||
@ -177,7 +219,8 @@ plugin, possibly some code could be shared.
|
||||
$.plot.plugins.push({
|
||||
init: init,
|
||||
options: options,
|
||||
name: 'fillbetween',
|
||||
version: '1.0'
|
||||
name: "fillbetween",
|
||||
version: "1.0"
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
|
||||
@ -1,28 +1,29 @@
|
||||
/*
|
||||
Flot plugin for plotting images, e.g. useful for putting ticks on a
|
||||
prerendered complex visualization.
|
||||
/* Flot plugin for plotting images.
|
||||
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
The data syntax is [ [ image, x1, y1, x2, y2 ], ... ] where (x1, y1) and
|
||||
(x2, y2) are where you intend the two opposite corners of the image to
|
||||
end up in the plot. Image must be a fully loaded Javascript image (you
|
||||
can make one with new Image()). If the image is not complete, it's
|
||||
skipped when plotting.
|
||||
(x2, y2) are where you intend the two opposite corners of the image to end up
|
||||
in the plot. Image must be a fully loaded Javascript image (you can make one
|
||||
with new Image()). If the image is not complete, it's skipped when plotting.
|
||||
|
||||
There are two helpers included for retrieving images. The easiest work
|
||||
the way that you put in URLs instead of images in the data (like
|
||||
["myimage.png", 0, 0, 10, 10]), then call $.plot.image.loadData(data,
|
||||
options, callback) where data and options are the same as you pass in
|
||||
to $.plot. This loads the images, replaces the URLs in the data with
|
||||
the corresponding images and calls "callback" when all images are
|
||||
loaded (or failed loading). In the callback, you can then call $.plot
|
||||
with the data set. See the included example.
|
||||
There are two helpers included for retrieving images. The easiest work the way
|
||||
that you put in URLs instead of images in the data, like this:
|
||||
|
||||
A more low-level helper, $.plot.image.load(urls, callback) is also
|
||||
included. Given a list of URLs, it calls callback with an object
|
||||
mapping from URL to Image object when all images are loaded or have
|
||||
failed loading.
|
||||
[ "myimage.png", 0, 0, 10, 10 ]
|
||||
|
||||
Options for the plugin are
|
||||
Then call $.plot.image.loadData( data, options, callback ) where data and
|
||||
options are the same as you pass in to $.plot. This loads the images, replaces
|
||||
the URLs in the data with the corresponding images and calls "callback" when
|
||||
all images are loaded (or failed loading). In the callback, you can then call
|
||||
$.plot with the data set. See the included example.
|
||||
|
||||
A more low-level helper, $.plot.image.load(urls, callback) is also included.
|
||||
Given a list of URLs, it calls callback with an object mapping from URL to
|
||||
Image object when all images are loaded or have failed loading.
|
||||
|
||||
The plugin supports these options:
|
||||
|
||||
series: {
|
||||
images: {
|
||||
@ -32,20 +33,22 @@ Options for the plugin are
|
||||
}
|
||||
}
|
||||
|
||||
which can be specified for a specific series
|
||||
They can be specified for a specific series:
|
||||
|
||||
$.plot($("#placeholder"), [{ data: [ ... ], images: { ... } ])
|
||||
$.plot( $("#placeholder"), [{
|
||||
data: [ ... ],
|
||||
images: { ... }
|
||||
])
|
||||
|
||||
Note that because the data format is different from usual data points,
|
||||
you can't use images with anything else in a specific data series.
|
||||
Note that because the data format is different from usual data points, you
|
||||
can't use images with anything else in a specific data series.
|
||||
|
||||
Setting "anchor" to "center" causes the pixels in the image to be
|
||||
anchored at the corner pixel centers inside of at the pixel corners,
|
||||
effectively letting half a pixel stick out to each side in the plot.
|
||||
Setting "anchor" to "center" causes the pixels in the image to be anchored at
|
||||
the corner pixel centers inside of at the pixel corners, effectively letting
|
||||
half a pixel stick out to each side in the plot.
|
||||
|
||||
|
||||
A possible future direction could be support for tiling for large
|
||||
images (like Google Maps).
|
||||
A possible future direction could be support for tiling for large images (like
|
||||
Google Maps).
|
||||
|
||||
*/
|
||||
|
||||
@ -110,7 +113,7 @@ images (like Google Maps).
|
||||
|
||||
$('<img />').load(handler).error(handler).attr('src', url);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
function drawSeries(plot, ctx, series) {
|
||||
var plotOffset = plot.getPlotOffset();
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,13 +1,14 @@
|
||||
/*
|
||||
Flot plugin for adding panning and zooming capabilities to a plot.
|
||||
/* Flot plugin for adding the ability to pan and zoom the plot.
|
||||
|
||||
The default behaviour is double click and scrollwheel up/down to zoom
|
||||
in, drag to pan. The plugin defines plot.zoom({ center }),
|
||||
plot.zoomOut() and plot.pan(offset) so you easily can add custom
|
||||
controls. It also fires a "plotpan" and "plotzoom" event when
|
||||
something happens, useful for synchronizing plots.
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
Options:
|
||||
The default behaviour is double click and scrollwheel up/down to zoom in, drag
|
||||
to pan. The plugin defines plot.zoom({ center }), plot.zoomOut() and
|
||||
plot.pan( offset ) so you easily can add custom controls. It also fires
|
||||
"plotpan" and "plotzoom" events, useful for synchronizing plots.
|
||||
|
||||
The plugin supports these options:
|
||||
|
||||
zoom: {
|
||||
interactive: false
|
||||
@ -27,30 +28,30 @@ Options:
|
||||
}
|
||||
|
||||
"interactive" enables the built-in drag/click behaviour. If you enable
|
||||
interactive for pan, then you'll have a basic plot that supports
|
||||
moving around; the same for zoom.
|
||||
interactive for pan, then you'll have a basic plot that supports moving
|
||||
around; the same for zoom.
|
||||
|
||||
"amount" specifies the default amount to zoom in (so 1.5 = 150%)
|
||||
relative to the current viewport.
|
||||
"amount" specifies the default amount to zoom in (so 1.5 = 150%) relative to
|
||||
the current viewport.
|
||||
|
||||
"cursor" is a standard CSS mouse cursor string used for visual
|
||||
feedback to the user when dragging.
|
||||
"cursor" is a standard CSS mouse cursor string used for visual feedback to the
|
||||
user when dragging.
|
||||
|
||||
"frameRate" specifies the maximum number of times per second the plot
|
||||
will update itself while the user is panning around on it (set to null
|
||||
to disable intermediate pans, the plot will then not update until the
|
||||
mouse button is released).
|
||||
"frameRate" specifies the maximum number of times per second the plot will
|
||||
update itself while the user is panning around on it (set to null to disable
|
||||
intermediate pans, the plot will then not update until the mouse button is
|
||||
released).
|
||||
|
||||
"zoomRange" is the interval in which zooming can happen, e.g. with
|
||||
zoomRange: [1, 100] the zoom will never scale the axis so that the
|
||||
difference between min and max is smaller than 1 or larger than 100.
|
||||
You can set either end to null to ignore, e.g. [1, null]. If you set
|
||||
zoomRange to false, zooming on that axis will be disabled.
|
||||
"zoomRange" is the interval in which zooming can happen, e.g. with zoomRange:
|
||||
[1, 100] the zoom will never scale the axis so that the difference between min
|
||||
and max is smaller than 1 or larger than 100. You can set either end to null
|
||||
to ignore, e.g. [1, null]. If you set zoomRange to false, zooming on that axis
|
||||
will be disabled.
|
||||
|
||||
"panRange" confines the panning to stay within a range, e.g. with
|
||||
panRange: [-10, 20] panning stops at -10 in one end and at 20 in the
|
||||
other. Either can be null, e.g. [-10, null]. If you set
|
||||
panRange to false, panning on that axis will be disabled.
|
||||
"panRange" confines the panning to stay within a range, e.g. with panRange:
|
||||
[-10, 20] panning stops at -10 in one end and at 20 in the other. Either can
|
||||
be null, e.g. [-10, null]. If you set panRange to false, panning on that axis
|
||||
will be disabled.
|
||||
|
||||
Example API usage:
|
||||
|
||||
@ -68,18 +69,16 @@ Example API usage:
|
||||
// pan 100 pixels to the left and 20 down
|
||||
plot.pan({ left: -100, top: 20 })
|
||||
|
||||
Here, "center" specifies where the center of the zooming should
|
||||
happen. Note that this is defined in pixel space, not the space of the
|
||||
data points (you can use the p2c helpers on the axes in Flot to help
|
||||
you convert between these).
|
||||
Here, "center" specifies where the center of the zooming should happen. Note
|
||||
that this is defined in pixel space, not the space of the data points (you can
|
||||
use the p2c helpers on the axes in Flot to help you convert between these).
|
||||
|
||||
"amount" is the amount to zoom the viewport relative to the current
|
||||
range, so 1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is
|
||||
70% (zoom out). You can set the default in the options.
|
||||
"amount" is the amount to zoom the viewport relative to the current range, so
|
||||
1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is 70% (zoom out). You
|
||||
can set the default in the options.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
// First two dependencies, jquery.event.drag.js and
|
||||
// jquery.mousewheel.js, we put them inline here to save people the
|
||||
// effort of downloading them.
|
||||
@ -88,21 +87,20 @@ range, so 1 is 100% (i.e. no change), 1.5 is 150% (zoom in), 0.7 is
|
||||
jquery.event.drag.js ~ v1.5 ~ Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
|
||||
Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-LICENSE.txt
|
||||
*/
|
||||
(function(E){E.fn.drag=function(L,K,J){if(K){this.bind("dragstart",L)}if(J){this.bind("dragend",J)}return !L?this.trigger("drag"):this.bind("drag",K?K:L)};var A=E.event,B=A.special,F=B.drag={not:":input",distance:0,which:1,dragging:false,setup:function(J){J=E.extend({distance:F.distance,which:F.which,not:F.not},J||{});J.distance=I(J.distance);A.add(this,"mousedown",H,J);if(this.attachEvent){this.attachEvent("ondragstart",D)}},teardown:function(){A.remove(this,"mousedown",H);if(this===F.dragging){F.dragging=F.proxy=false}G(this,true);if(this.detachEvent){this.detachEvent("ondragstart",D)}}};B.dragstart=B.dragend={setup:function(){},teardown:function(){}};function H(L){var K=this,J,M=L.data||{};if(M.elem){K=L.dragTarget=M.elem;L.dragProxy=F.proxy||K;L.cursorOffsetX=M.pageX-M.left;L.cursorOffsetY=M.pageY-M.top;L.offsetX=L.pageX-L.cursorOffsetX;L.offsetY=L.pageY-L.cursorOffsetY}else{if(F.dragging||(M.which>0&&L.which!=M.which)||E(L.target).is(M.not)){return }}switch(L.type){case"mousedown":E.extend(M,E(K).offset(),{elem:K,target:L.target,pageX:L.pageX,pageY:L.pageY});A.add(document,"mousemove mouseup",H,M);G(K,false);F.dragging=null;return false;case !F.dragging&&"mousemove":if(I(L.pageX-M.pageX)+I(L.pageY-M.pageY)<M.distance){break}L.target=M.target;J=C(L,"dragstart",K);if(J!==false){F.dragging=K;F.proxy=L.dragProxy=E(J||K)[0]}case"mousemove":if(F.dragging){J=C(L,"drag",K);if(B.drop){B.drop.allowed=(J!==false);B.drop.handler(L)}if(J!==false){break}L.type="mouseup"}case"mouseup":A.remove(document,"mousemove mouseup",H);if(F.dragging){if(B.drop){B.drop.handler(L)}C(L,"dragend",K)}G(K,true);F.dragging=F.proxy=M.elem=false;break}return true}function C(M,K,L){M.type=K;var J=E.event.handle.call(L,M);return J===false?false:J||M.result}function I(J){return Math.pow(J,2)}function D(){return(F.dragging===false)}function G(K,J){if(!K){return }K.unselectable=J?"off":"on";K.onselectstart=function(){return J};if(K.style){K.style.MozUserSelect=J?"":"none"}}})(jQuery);
|
||||
|
||||
(function(a){function e(h){var k,j=this,l=h.data||{};if(l.elem)j=h.dragTarget=l.elem,h.dragProxy=d.proxy||j,h.cursorOffsetX=l.pageX-l.left,h.cursorOffsetY=l.pageY-l.top,h.offsetX=h.pageX-h.cursorOffsetX,h.offsetY=h.pageY-h.cursorOffsetY;else if(d.dragging||l.which>0&&h.which!=l.which||a(h.target).is(l.not))return;switch(h.type){case"mousedown":return a.extend(l,a(j).offset(),{elem:j,target:h.target,pageX:h.pageX,pageY:h.pageY}),b.add(document,"mousemove mouseup",e,l),i(j,!1),d.dragging=null,!1;case!d.dragging&&"mousemove":if(g(h.pageX-l.pageX)+g(h.pageY-l.pageY)<l.distance)break;h.target=l.target,k=f(h,"dragstart",j),k!==!1&&(d.dragging=j,d.proxy=h.dragProxy=a(k||j)[0]);case"mousemove":if(d.dragging){if(k=f(h,"drag",j),c.drop&&(c.drop.allowed=k!==!1,c.drop.handler(h)),k!==!1)break;h.type="mouseup"}case"mouseup":b.remove(document,"mousemove mouseup",e),d.dragging&&(c.drop&&c.drop.handler(h),f(h,"dragend",j)),i(j,!0),d.dragging=d.proxy=l.elem=!1}return!0}function f(b,c,d){b.type=c;var e=a.event.dispatch.call(d,b);return e===!1?!1:e||b.result}function g(a){return Math.pow(a,2)}function h(){return d.dragging===!1}function i(a,b){a&&(a.unselectable=b?"off":"on",a.onselectstart=function(){return b},a.style&&(a.style.MozUserSelect=b?"":"none"))}a.fn.drag=function(a,b,c){return b&&this.bind("dragstart",a),c&&this.bind("dragend",c),a?this.bind("drag",b?b:a):this.trigger("drag")};var b=a.event,c=b.special,d=c.drag={not:":input",distance:0,which:1,dragging:!1,setup:function(c){c=a.extend({distance:d.distance,which:d.which,not:d.not},c||{}),c.distance=g(c.distance),b.add(this,"mousedown",e,c),this.attachEvent&&this.attachEvent("ondragstart",h)},teardown:function(){b.remove(this,"mousedown",e),this===d.dragging&&(d.dragging=d.proxy=!1),i(this,!0),this.detachEvent&&this.detachEvent("ondragstart",h)}};c.dragstart=c.dragend={setup:function(){},teardown:function(){}}})(jQuery);
|
||||
|
||||
/* jquery.mousewheel.min.js
|
||||
* Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
|
||||
* Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
|
||||
* and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
|
||||
* Copyright (c) 2011 Brandon Aaron (http://brandonaaron.net)
|
||||
* Licensed under the MIT License (LICENSE.txt).
|
||||
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
|
||||
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
|
||||
* Thanks to: Seamus Leahy for adding deltaX and deltaY
|
||||
*
|
||||
* Version: 3.0.2
|
||||
* Version: 3.0.6
|
||||
*
|
||||
* Requires: 1.2.2+
|
||||
*/
|
||||
(function(c){var a=["DOMMouseScroll","mousewheel"];c.event.special.mousewheel={setup:function(){if(this.addEventListener){for(var d=a.length;d;){this.addEventListener(a[--d],b,false)}}else{this.onmousewheel=b}},teardown:function(){if(this.removeEventListener){for(var d=a.length;d;){this.removeEventListener(a[--d],b,false)}}else{this.onmousewheel=null}}};c.fn.extend({mousewheel:function(d){return d?this.bind("mousewheel",d):this.trigger("mousewheel")},unmousewheel:function(d){return this.unbind("mousewheel",d)}});function b(f){var d=[].slice.call(arguments,1),g=0,e=true;f=c.event.fix(f||window.event);f.type="mousewheel";if(f.wheelDelta){g=f.wheelDelta/120}if(f.detail){g=-f.detail/3}d.unshift(f,g);return c.event.handle.apply(this,d)}})(jQuery);
|
||||
(function(d){function e(a){var b=a||window.event,c=[].slice.call(arguments,1),f=0,e=0,g=0,a=d.event.fix(b);a.type="mousewheel";b.wheelDelta&&(f=b.wheelDelta/120);b.detail&&(f=-b.detail/3);g=f;void 0!==b.axis&&b.axis===b.HORIZONTAL_AXIS&&(g=0,e=-1*f);void 0!==b.wheelDeltaY&&(g=b.wheelDeltaY/120);void 0!==b.wheelDeltaX&&(e=-1*b.wheelDeltaX/120);c.unshift(a,f,e,g);return(d.event.dispatch||d.event.handle).apply(this,c)}var c=["DOMMouseScroll","mousewheel"];if(d.event.fixHooks)for(var h=c.length;h;)d.event.fixHooks[c[--h]]=d.event.mouseHooks;d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=c.length;a;)this.addEventListener(c[--a],e,!1);else this.onmousewheel=e},teardown:function(){if(this.removeEventListener)for(var a=c.length;a;)this.removeEventListener(c[--a],e,!1);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
|
||||
|
||||
|
||||
|
||||
@ -137,6 +135,7 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L
|
||||
}
|
||||
|
||||
function onMouseWheel(e, delta) {
|
||||
e.preventDefault();
|
||||
onZoomClick(e, delta < 0);
|
||||
return false;
|
||||
}
|
||||
@ -200,11 +199,11 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L
|
||||
args = {};
|
||||
|
||||
if (!args.amount)
|
||||
args.amount = plot.getOptions().zoom.amount
|
||||
args.amount = plot.getOptions().zoom.amount;
|
||||
|
||||
args.amount = 1 / args.amount;
|
||||
plot.zoom(args);
|
||||
}
|
||||
};
|
||||
|
||||
plot.zoom = function (args) {
|
||||
if (!args)
|
||||
@ -234,7 +233,8 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L
|
||||
var opts = axis.options,
|
||||
min = minmax[axis.direction].min,
|
||||
max = minmax[axis.direction].max,
|
||||
zr = opts.zoomRange;
|
||||
zr = opts.zoomRange,
|
||||
pr = opts.panRange;
|
||||
|
||||
if (zr === false) // no zooming on this axis
|
||||
return;
|
||||
@ -248,10 +248,20 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L
|
||||
max = tmp;
|
||||
}
|
||||
|
||||
//Check that we are in panRange
|
||||
if (pr) {
|
||||
if (pr[0] != null && min < pr[0]) {
|
||||
min = pr[0];
|
||||
}
|
||||
if (pr[1] != null && max > pr[1]) {
|
||||
max = pr[1];
|
||||
}
|
||||
}
|
||||
|
||||
var range = max - min;
|
||||
if (zr &&
|
||||
((zr[0] != null && range < zr[0]) ||
|
||||
(zr[1] != null && range > zr[1])))
|
||||
((zr[0] != null && range < zr[0] && amount >1) ||
|
||||
(zr[1] != null && range > zr[1] && amount <1)))
|
||||
return;
|
||||
|
||||
opts.min = min;
|
||||
@ -262,8 +272,8 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L
|
||||
plot.draw();
|
||||
|
||||
if (!args.preventEvent)
|
||||
plot.getPlaceholder().trigger("plotzoom", [ plot ]);
|
||||
}
|
||||
plot.getPlaceholder().trigger("plotzoom", [ plot, args ]);
|
||||
};
|
||||
|
||||
plot.pan = function (args) {
|
||||
var delta = {
|
||||
@ -310,8 +320,8 @@ Licensed under the MIT License ~ http://threedubmedia.googlecode.com/files/MIT-L
|
||||
plot.draw();
|
||||
|
||||
if (!args.preventEvent)
|
||||
plot.getPlaceholder().trigger("plotpan", [ plot ]);
|
||||
}
|
||||
plot.getPlaceholder().trigger("plotpan", [ plot, args ]);
|
||||
};
|
||||
|
||||
function shutdown(plot, eventHolder) {
|
||||
eventHolder.unbind(plot.getOptions().zoom.trigger, onZoomClick);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,16 @@
|
||||
/*
|
||||
Flot plugin for automatically redrawing plots when the placeholder
|
||||
size changes, e.g. on window resizes.
|
||||
/* Flot plugin for automatically redrawing plots as the placeholder resizes.
|
||||
|
||||
It works by listening for changes on the placeholder div (through the
|
||||
jQuery resize event plugin) - if the size changes, it will redraw the
|
||||
plot.
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
It works by listening for changes on the placeholder div (through the jQuery
|
||||
resize event plugin) - if the size changes, it will redraw the plot.
|
||||
|
||||
There are no options. If you need to disable the plugin for some plots, you
|
||||
can just fix the size of their placeholders.
|
||||
|
||||
There are no options. If you need to disable the plugin for some
|
||||
plots, you can just fix the size of their placeholders.
|
||||
*/
|
||||
|
||||
|
||||
/* Inline dependency:
|
||||
* jQuery resize event - v1.1 - 3/14/2010
|
||||
* http://benalman.com/projects/jquery-resize-plugin/
|
||||
@ -19,8 +19,7 @@ plots, you can just fix the size of their placeholders.
|
||||
* Dual licensed under the MIT and GPL licenses.
|
||||
* http://benalman.com/about/license/
|
||||
*/
|
||||
(function($,h,c){var a=$([]),e=$.resize=$.extend($.resize,{}),i,k="setTimeout",j="resize",d=j+"-special-event",b="delay",f="throttleWindow";e[b]=250;e[f]=true;$.event.special[j]={setup:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.add(l);$.data(this,d,{w:l.width(),h:l.height()});if(a.length===1){g()}},teardown:function(){if(!e[f]&&this[k]){return false}var l=$(this);a=a.not(l);l.removeData(d);if(!a.length){clearTimeout(i)}},add:function(l){if(!e[f]&&this[k]){return false}var n;function m(s,o,p){var q=$(this),r=$.data(this,d);r.w=o!==c?o:q.width();r.h=p!==c?p:q.height();n.apply(this,arguments)}if($.isFunction(l)){n=l;return m}else{n=l.handler;l.handler=m}}};function g(){i=h[k](function(){a.each(function(){var n=$(this),m=n.width(),l=n.height(),o=$.data(this,d);if(m!==o.w||l!==o.h){n.trigger(j,[o.w=m,o.h=l])}});g()},e[b])}})(jQuery,this);
|
||||
|
||||
(function($,e,t){"$:nomunge";var i=[],n=$.resize=$.extend($.resize,{}),a,r=false,s="setTimeout",u="resize",m=u+"-special-event",o="pendingDelay",l="activeDelay",f="throttleWindow";n[o]=200;n[l]=20;n[f]=true;$.event.special[u]={setup:function(){if(!n[f]&&this[s]){return false}var e=$(this);i.push(this);e.data(m,{w:e.width(),h:e.height()});if(i.length===1){a=t;h()}},teardown:function(){if(!n[f]&&this[s]){return false}var e=$(this);for(var t=i.length-1;t>=0;t--){if(i[t]==this){i.splice(t,1);break}}e.removeData(m);if(!i.length){if(r){cancelAnimationFrame(a)}else{clearTimeout(a)}a=null}},add:function(e){if(!n[f]&&this[s]){return false}var i;function a(e,n,a){var r=$(this),s=r.data(m)||{};s.w=n!==t?n:r.width();s.h=a!==t?a:r.height();i.apply(this,arguments)}if($.isFunction(e)){i=e;return a}else{i=e.handler;e.handler=a}}};function h(t){if(r===true){r=t||1}for(var s=i.length-1;s>=0;s--){var l=$(i[s]);if(l[0]==e||l.is(":visible")){var f=l.width(),c=l.height(),d=l.data(m);if(d&&(f!==d.w||c!==d.h)){l.trigger(u,[d.w=f,d.h=c]);r=t||true}}else{d=l.data(m);d.w=0;d.h=0}}if(a!==null){if(r&&(t==null||t-r<1e3)){a=e.requestAnimationFrame(h)}else{a=setTimeout(h,n[o]);r=false}}}if(!e.requestAnimationFrame){e.requestAnimationFrame=function(){return e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(t,i){return e.setTimeout(function(){t((new Date).getTime())},n[l])}}()}if(!e.cancelAnimationFrame){e.cancelAnimationFrame=function(){return e.webkitCancelRequestAnimationFrame||e.mozCancelRequestAnimationFrame||e.oCancelRequestAnimationFrame||e.msCancelRequestAnimationFrame||clearTimeout}()}})(jQuery,this);
|
||||
|
||||
(function ($) {
|
||||
var options = { }; // no options
|
||||
|
||||
@ -1,24 +1,37 @@
|
||||
/*
|
||||
Flot plugin for selecting regions.
|
||||
/* Flot plugin for selecting regions of a plot.
|
||||
|
||||
The plugin defines the following options:
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
The plugin supports these options:
|
||||
|
||||
selection: {
|
||||
mode: null or "x" or "y" or "xy",
|
||||
color: color
|
||||
color: color,
|
||||
shape: "round" or "miter" or "bevel",
|
||||
minSize: number of pixels
|
||||
}
|
||||
|
||||
Selection support is enabled by setting the mode to one of "x", "y" or
|
||||
"xy". In "x" mode, the user will only be able to specify the x range,
|
||||
similarly for "y" mode. For "xy", the selection becomes a rectangle
|
||||
where both ranges can be specified. "color" is color of the selection
|
||||
(if you need to change the color later on, you can get to it with
|
||||
plot.getOptions().selection.color).
|
||||
Selection support is enabled by setting the mode to one of "x", "y" or "xy".
|
||||
In "x" mode, the user will only be able to specify the x range, similarly for
|
||||
"y" mode. For "xy", the selection becomes a rectangle where both ranges can be
|
||||
specified. "color" is color of the selection (if you need to change the color
|
||||
later on, you can get to it with plot.getOptions().selection.color). "shape"
|
||||
is the shape of the corners of the selection.
|
||||
|
||||
When selection support is enabled, a "plotselected" event will be
|
||||
emitted on the DOM element you passed into the plot function. The
|
||||
event handler gets a parameter with the ranges selected on the axes,
|
||||
like this:
|
||||
"minSize" is the minimum size a selection can be in pixels. This value can
|
||||
be customized to determine the smallest size a selection can be and still
|
||||
have the selection rectangle be displayed. When customizing this value, the
|
||||
fact that it refers to pixels, not axis units must be taken into account.
|
||||
Thus, for example, if there is a bar graph in time mode with BarWidth set to 1
|
||||
minute, setting "minSize" to 1 will not make the minimum selection size 1
|
||||
minute, but rather 1 pixel. Note also that setting "minSize" to 0 will prevent
|
||||
"plotunselected" events from being fired when the user clicks the mouse without
|
||||
dragging.
|
||||
|
||||
When selection support is enabled, a "plotselected" event will be emitted on
|
||||
the DOM element you passed into the plot function. The event handler gets a
|
||||
parameter with the ranges selected on the axes, like this:
|
||||
|
||||
placeholder.bind( "plotselected", function( event, ranges ) {
|
||||
alert("You selected " + ranges.xaxis.from + " to " + ranges.xaxis.to)
|
||||
@ -26,32 +39,32 @@ like this:
|
||||
// x2axis, x3axis, ...
|
||||
});
|
||||
|
||||
The "plotselected" event is only fired when the user has finished
|
||||
making the selection. A "plotselecting" event is fired during the
|
||||
process with the same parameters as the "plotselected" event, in case
|
||||
you want to know what's happening while it's happening,
|
||||
The "plotselected" event is only fired when the user has finished making the
|
||||
selection. A "plotselecting" event is fired during the process with the same
|
||||
parameters as the "plotselected" event, in case you want to know what's
|
||||
happening while it's happening,
|
||||
|
||||
A "plotunselected" event with no arguments is emitted when the user
|
||||
clicks the mouse to remove the selection.
|
||||
A "plotunselected" event with no arguments is emitted when the user clicks the
|
||||
mouse to remove the selection. As stated above, setting "minSize" to 0 will
|
||||
destroy this behavior.
|
||||
|
||||
The plugin allso adds the following methods to the plot object:
|
||||
|
||||
- setSelection( ranges, preventEvent )
|
||||
|
||||
Set the selection rectangle. The passed in ranges is on the same
|
||||
form as returned in the "plotselected" event. If the selection mode
|
||||
is "x", you should put in either an xaxis range, if the mode is "y"
|
||||
you need to put in an yaxis range and both xaxis and yaxis if the
|
||||
selection mode is "xy", like this:
|
||||
Set the selection rectangle. The passed in ranges is on the same form as
|
||||
returned in the "plotselected" event. If the selection mode is "x", you
|
||||
should put in either an xaxis range, if the mode is "y" you need to put in
|
||||
an yaxis range and both xaxis and yaxis if the selection mode is "xy", like
|
||||
this:
|
||||
|
||||
setSelection({ xaxis: { from: 0, to: 10 }, yaxis: { from: 40, to: 60 } });
|
||||
|
||||
setSelection will trigger the "plotselected" event when called. If
|
||||
you don't want that to happen, e.g. if you're inside a
|
||||
"plotselected" handler, pass true as the second parameter. If you
|
||||
are using multiple axes, you can specify the ranges on any of those,
|
||||
e.g. as x2axis/x3axis/... instead of xaxis, the plugin picks the
|
||||
first one it sees.
|
||||
setSelection will trigger the "plotselected" event when called. If you don't
|
||||
want that to happen, e.g. if you're inside a "plotselected" handler, pass
|
||||
true as the second parameter. If you are using multiple axes, you can
|
||||
specify the ranges on any of those, e.g. as x2axis/x3axis/... instead of
|
||||
xaxis, the plugin picks the first one it sees.
|
||||
|
||||
- clearSelection( preventEvent )
|
||||
|
||||
@ -60,9 +73,8 @@ The plugin allso adds the following methods to the plot object:
|
||||
|
||||
- getSelection()
|
||||
|
||||
Returns the current selection in the same format as the
|
||||
"plotselected" event. If there's currently no selection, the
|
||||
function returns null.
|
||||
Returns the current selection in the same format as the "plotselected"
|
||||
event. If there's currently no selection, the function returns null.
|
||||
|
||||
*/
|
||||
|
||||
@ -147,6 +159,8 @@ The plugin allso adds the following methods to the plot object:
|
||||
if (!selectionIsSane())
|
||||
return null;
|
||||
|
||||
if (!selection.show) return null;
|
||||
|
||||
var r = {}, c1 = selection.first, c2 = selection.second;
|
||||
$.each(plot.getAxes(), function (name, axis) {
|
||||
if (axis.used) {
|
||||
@ -274,7 +288,7 @@ The plugin allso adds the following methods to the plot object:
|
||||
}
|
||||
|
||||
function selectionIsSane() {
|
||||
var minSize = 5;
|
||||
var minSize = plot.getOptions().selection.minSize;
|
||||
return Math.abs(selection.second.x - selection.first.x) >= minSize &&
|
||||
Math.abs(selection.second.y - selection.first.y) >= minSize;
|
||||
}
|
||||
@ -305,13 +319,13 @@ The plugin allso adds the following methods to the plot object:
|
||||
|
||||
ctx.strokeStyle = c.scale('a', 0.8).toString();
|
||||
ctx.lineWidth = 1;
|
||||
ctx.lineJoin = "round";
|
||||
ctx.lineJoin = o.selection.shape;
|
||||
ctx.fillStyle = c.scale('a', 0.4).toString();
|
||||
|
||||
var x = Math.min(selection.first.x, selection.second.x),
|
||||
y = Math.min(selection.first.y, selection.second.y),
|
||||
w = Math.abs(selection.second.x - selection.first.x),
|
||||
h = Math.abs(selection.second.y - selection.first.y);
|
||||
var x = Math.min(selection.first.x, selection.second.x) + 0.5,
|
||||
y = Math.min(selection.first.y, selection.second.y) + 0.5,
|
||||
w = Math.abs(selection.second.x - selection.first.x) - 1,
|
||||
h = Math.abs(selection.second.y - selection.first.y) - 1;
|
||||
|
||||
ctx.fillRect(x, y, w, h);
|
||||
ctx.strokeRect(x, y, w, h);
|
||||
@ -335,7 +349,9 @@ The plugin allso adds the following methods to the plot object:
|
||||
options: {
|
||||
selection: {
|
||||
mode: null, // one of null, "x", "y" or "xy"
|
||||
color: "#e8cfac"
|
||||
color: "#e8cfac",
|
||||
shape: "round", // one of "round", "miter", or "bevel"
|
||||
minSize: 5 // minimum number of pixels
|
||||
}
|
||||
},
|
||||
name: 'selection',
|
||||
|
||||
@ -1,34 +1,38 @@
|
||||
/*
|
||||
Flot plugin for stacking data sets, i.e. putting them on top of each
|
||||
other, for accumulative graphs.
|
||||
/* Flot plugin for stacking data sets rather than overlyaing them.
|
||||
|
||||
The plugin assumes the data is sorted on x (or y if stacking
|
||||
horizontally). For line charts, it is assumed that if a line has an
|
||||
undefined gap (from a null point), then the line above it should have
|
||||
the same gap - insert zeros instead of "null" if you want another
|
||||
behaviour. This also holds for the start and end of the chart. Note
|
||||
that stacking a mix of positive and negative values in most instances
|
||||
doesn't make sense (so it looks weird).
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
Two or more series are stacked when their "stack" attribute is set to
|
||||
the same key (which can be any number or string or just "true"). To
|
||||
specify the default stack, you can set
|
||||
The plugin assumes the data is sorted on x (or y if stacking horizontally).
|
||||
For line charts, it is assumed that if a line has an undefined gap (from a
|
||||
null point), then the line above it should have the same gap - insert zeros
|
||||
instead of "null" if you want another behaviour. This also holds for the start
|
||||
and end of the chart. Note that stacking a mix of positive and negative values
|
||||
in most instances doesn't make sense (so it looks weird).
|
||||
|
||||
Two or more series are stacked when their "stack" attribute is set to the same
|
||||
key (which can be any number or string or just "true"). To specify the default
|
||||
stack, you can set the stack option like this:
|
||||
|
||||
series: {
|
||||
stack: null or true or key (number/string)
|
||||
stack: null/false, true, or a key (number/string)
|
||||
}
|
||||
|
||||
or specify it for a specific series
|
||||
You can also specify it for a single series, like this:
|
||||
|
||||
$.plot($("#placeholder"), [{ data: [ ... ], stack: true }])
|
||||
$.plot( $("#placeholder"), [{
|
||||
data: [ ... ],
|
||||
stack: true
|
||||
}])
|
||||
|
||||
The stacking order is determined by the order of the data series in
|
||||
the array (later series end up on top of the previous).
|
||||
The stacking order is determined by the order of the data series in the array
|
||||
(later series end up on top of the previous).
|
||||
|
||||
Internally, the plugin modifies the datapoints in each series, adding an
|
||||
offset to the y value. For line series, extra data points are inserted through
|
||||
interpolation. If there's a second y value, it's also adjusted (e.g for bar
|
||||
charts or filled areas).
|
||||
|
||||
Internally, the plugin modifies the datapoints in each series, adding
|
||||
an offset to the y value. For line series, extra data points are
|
||||
inserted through interpolation. If there's a second y value, it's also
|
||||
adjusted (e.g for bar charts or filled areas).
|
||||
*/
|
||||
|
||||
(function ($) {
|
||||
@ -38,7 +42,7 @@ adjusted (e.g for bar charts or filled areas).
|
||||
|
||||
function init(plot) {
|
||||
function findMatchingSeries(s, allseries) {
|
||||
var res = null
|
||||
var res = null;
|
||||
for (var i = 0; i < allseries.length; ++i) {
|
||||
if (s == allseries[i])
|
||||
break;
|
||||
@ -51,7 +55,7 @@ adjusted (e.g for bar charts or filled areas).
|
||||
}
|
||||
|
||||
function stackData(plot, s, datapoints) {
|
||||
if (s.stack == null)
|
||||
if (s.stack == null || s.stack === false)
|
||||
return;
|
||||
|
||||
var other = findMatchingSeries(s, plot.getData());
|
||||
@ -71,7 +75,7 @@ adjusted (e.g for bar charts or filled areas).
|
||||
fromgap = true,
|
||||
keyOffset = horizontal ? 1 : 0,
|
||||
accumulateOffset = horizontal ? 0 : 1,
|
||||
i = 0, j = 0, l;
|
||||
i = 0, j = 0, l, m;
|
||||
|
||||
while (true) {
|
||||
if (i >= points.length)
|
||||
|
||||
@ -1,8 +1,9 @@
|
||||
/*
|
||||
Flot plugin that adds some extra symbols for plotting points.
|
||||
/* Flot plugin that adds some extra symbols for plotting points.
|
||||
|
||||
The symbols are accessed as strings through the standard symbol
|
||||
choice:
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
The symbols are accessed as strings through the standard symbol options:
|
||||
|
||||
series: {
|
||||
points: {
|
||||
@ -51,7 +52,7 @@ choice:
|
||||
ctx.moveTo(x - size, y + size);
|
||||
ctx.lineTo(x + size, y - size);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
var s = series.points.symbol;
|
||||
if (handlers[s])
|
||||
|
||||
@ -1,6 +1,9 @@
|
||||
/*
|
||||
Flot plugin for thresholding data. Controlled through the option
|
||||
"threshold" in either the global series options
|
||||
/* Flot plugin for thresholding data.
|
||||
|
||||
Copyright (c) 2007-2014 IOLA and Ole Laursen.
|
||||
Licensed under the MIT license.
|
||||
|
||||
The plugin supports these options:
|
||||
|
||||
series: {
|
||||
threshold: {
|
||||
@ -9,18 +12,34 @@ Flot plugin for thresholding data. Controlled through the option
|
||||
}
|
||||
}
|
||||
|
||||
or in a specific series
|
||||
It can also be applied to a single series, like this:
|
||||
|
||||
$.plot($("#placeholder"), [{ data: [ ... ], threshold: { ... }}])
|
||||
$.plot( $("#placeholder"), [{
|
||||
data: [ ... ],
|
||||
threshold: { ... }
|
||||
}])
|
||||
|
||||
The data points below "below" are drawn with the specified color. This
|
||||
makes it easy to mark points below 0, e.g. for budget data.
|
||||
An array can be passed for multiple thresholding, like this:
|
||||
|
||||
threshold: [{
|
||||
below: number1
|
||||
color: color1
|
||||
},{
|
||||
below: number2
|
||||
color: color2
|
||||
}]
|
||||
|
||||
These multiple threshold objects can be passed in any order since they are
|
||||
sorted by the processing function.
|
||||
|
||||
The data points below "below" are drawn with the specified color. This makes
|
||||
it easy to mark points below 0, e.g. for budget data.
|
||||
|
||||
Internally, the plugin works by splitting the data into two series, above and
|
||||
below the threshold. The extra series below the threshold will have its label
|
||||
cleared and the special "originSeries" attribute set to the original series.
|
||||
You may need to check for this in hover events.
|
||||
|
||||
Internally, the plugin works by splitting the data into two series,
|
||||
above and below the threshold. The extra series below the threshold
|
||||
will have its label cleared and the special "originSeries" attribute
|
||||
set to the original series. You may need to check for this in hover
|
||||
events.
|
||||
*/
|
||||
|
||||
(function ($) {
|
||||
@ -29,29 +48,26 @@ events.
|
||||
};
|
||||
|
||||
function init(plot) {
|
||||
function thresholdData(plot, s, datapoints) {
|
||||
if (!s.threshold)
|
||||
return;
|
||||
|
||||
function thresholdData(plot, s, datapoints, below, color) {
|
||||
var ps = datapoints.pointsize, i, x, y, p, prevp,
|
||||
thresholded = $.extend({}, s); // note: shallow copy
|
||||
|
||||
thresholded.datapoints = { points: [], pointsize: ps };
|
||||
thresholded.datapoints = { points: [], pointsize: ps, format: datapoints.format };
|
||||
thresholded.label = null;
|
||||
thresholded.color = s.threshold.color;
|
||||
thresholded.color = color;
|
||||
thresholded.threshold = null;
|
||||
thresholded.originSeries = s;
|
||||
thresholded.data = [];
|
||||
|
||||
var below = s.threshold.below,
|
||||
origpoints = datapoints.points,
|
||||
var origpoints = datapoints.points,
|
||||
addCrossingPoints = s.lines.show;
|
||||
|
||||
threspoints = [];
|
||||
newpoints = [];
|
||||
var threspoints = [];
|
||||
var newpoints = [];
|
||||
var m;
|
||||
|
||||
for (i = 0; i < origpoints.length; i += ps) {
|
||||
x = origpoints[i]
|
||||
x = origpoints[i];
|
||||
y = origpoints[i + 1];
|
||||
|
||||
prevp = p;
|
||||
@ -62,7 +78,7 @@ events.
|
||||
|
||||
if (addCrossingPoints && prevp != p && x != null
|
||||
&& i > 0 && origpoints[i - ps] != null) {
|
||||
var interx = (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]) * (below - y) + x;
|
||||
var interx = x + (below - y) * (x - origpoints[i - ps]) / (y - origpoints[i - ps + 1]);
|
||||
prevp.push(interx);
|
||||
prevp.push(below);
|
||||
for (m = 2; m < ps; ++m)
|
||||
@ -80,24 +96,47 @@ events.
|
||||
|
||||
p.push(x);
|
||||
p.push(y);
|
||||
for (m = 2; m < ps; ++m)
|
||||
p.push(origpoints[i + m]);
|
||||
}
|
||||
|
||||
datapoints.points = newpoints;
|
||||
thresholded.datapoints.points = threspoints;
|
||||
|
||||
if (thresholded.datapoints.points.length > 0)
|
||||
plot.getData().push(thresholded);
|
||||
if (thresholded.datapoints.points.length > 0) {
|
||||
var origIndex = $.inArray(s, plot.getData());
|
||||
// Insert newly-generated series right after original one (to prevent it from becoming top-most)
|
||||
plot.getData().splice(origIndex + 1, 0, thresholded);
|
||||
}
|
||||
|
||||
// FIXME: there are probably some edge cases left in bars
|
||||
}
|
||||
|
||||
plot.hooks.processDatapoints.push(thresholdData);
|
||||
function processThresholds(plot, s, datapoints) {
|
||||
if (!s.threshold)
|
||||
return;
|
||||
|
||||
if (s.threshold instanceof Array) {
|
||||
s.threshold.sort(function(a, b) {
|
||||
return a.below - b.below;
|
||||
});
|
||||
|
||||
$(s.threshold).each(function(i, th) {
|
||||
thresholdData(plot, s, datapoints, th.below, th.color);
|
||||
});
|
||||
}
|
||||
else {
|
||||
thresholdData(plot, s, datapoints, s.threshold.below, s.threshold.color);
|
||||
}
|
||||
}
|
||||
|
||||
plot.hooks.processDatapoints.push(processThresholds);
|
||||
}
|
||||
|
||||
$.plot.plugins.push({
|
||||
init: init,
|
||||
options: options,
|
||||
name: 'threshold',
|
||||
version: '1.0'
|
||||
version: '1.2'
|
||||
});
|
||||
})(jQuery);
|
||||
|
||||
11587
ui/lib/jquery-ui/js/jquery-ui.js
vendored
Executable file → Normal file
11587
ui/lib/jquery-ui/js/jquery-ui.js
vendored
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
17154
ui/lib/jquery.js
vendored
17154
ui/lib/jquery.js
vendored
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,16 @@
|
||||
/*!
|
||||
* jQuery Validation Plugin v1.13.0
|
||||
* jQuery Validation Plugin v1.17.0
|
||||
*
|
||||
* http://jqueryvalidation.org/
|
||||
* https://jqueryvalidation.org/
|
||||
*
|
||||
* Copyright (c) 2014 Jörn Zaefferer
|
||||
* Copyright (c) 2017 Jörn Zaefferer
|
||||
* Released under the MIT license
|
||||
*/
|
||||
(function( factory ) {
|
||||
if ( typeof define === "function" && define.amd ) {
|
||||
define( ["jquery", "./jquery.validate"], factory );
|
||||
} else if (typeof module === "object" && module.exports) {
|
||||
module.exports = factory( require( "jquery" ) );
|
||||
} else {
|
||||
factory( jQuery );
|
||||
}
|
||||
@ -17,9 +19,11 @@
|
||||
( function() {
|
||||
|
||||
function stripHtml( value ) {
|
||||
// remove html tags and space chars
|
||||
|
||||
// Remove html tags and space chars
|
||||
return value.replace( /<.[^<>]*?>/g, " " ).replace( / | /gi, " " )
|
||||
// remove punctuation
|
||||
|
||||
// Remove punctuation
|
||||
.replace( /[.(),;:!?%#$'\"_+=\/\-“”’]*/g, "" );
|
||||
}
|
||||
|
||||
@ -41,10 +45,11 @@
|
||||
|
||||
// Accept a value from a file input based on a required mimetype
|
||||
$.validator.addMethod( "accept", function( value, element, param ) {
|
||||
|
||||
// Split mime on commas in case we have multiple types we can accept
|
||||
var typeParam = typeof param === "string" ? param.replace(/\s/g, "").replace(/,/g, "|") : "image/*",
|
||||
var typeParam = typeof param === "string" ? param.replace( /\s/g, "" ) : "image/*",
|
||||
optionalValue = this.optional( element ),
|
||||
i, file;
|
||||
i, file, regex;
|
||||
|
||||
// Element is optional
|
||||
if ( optionalValue ) {
|
||||
@ -52,16 +57,23 @@ $.validator.addMethod("accept", function(value, element, param) {
|
||||
}
|
||||
|
||||
if ( $( element ).attr( "type" ) === "file" ) {
|
||||
// If we are using a wildcard, make it regex friendly
|
||||
typeParam = typeParam.replace(/\*/g, ".*");
|
||||
|
||||
// Escape string to be used in the regex
|
||||
// see: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex
|
||||
// Escape also "/*" as "/.*" as a wildcard
|
||||
typeParam = typeParam
|
||||
.replace( /[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g, "\\$&" )
|
||||
.replace( /,/g, "|" )
|
||||
.replace( /\/\*/g, "/.*" );
|
||||
|
||||
// Check if the element has a FileList before checking each file
|
||||
if ( element.files && element.files.length ) {
|
||||
regex = new RegExp( ".?(" + typeParam + ")$", "i" );
|
||||
for ( i = 0; i < element.files.length; i++ ) {
|
||||
file = element.files[ i ];
|
||||
|
||||
// Grab the mimetype from the loaded file, verify it matches
|
||||
if (!file.type.match(new RegExp( ".?(" + typeParam + ")$", "i"))) {
|
||||
if ( !file.type.match( regex ) ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -90,8 +102,9 @@ $.validator.addMethod("bankaccountNL", function(value, element) {
|
||||
if ( !( /^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test( value ) ) ) {
|
||||
return false;
|
||||
}
|
||||
// now '11 check'
|
||||
var account = value.replace(/ /g, ""), // remove spaces
|
||||
|
||||
// Now '11 check'
|
||||
var account = value.replace( / /g, "" ), // Remove spaces
|
||||
sum = 0,
|
||||
len = account.length,
|
||||
pos, factor, digit;
|
||||
@ -114,49 +127,37 @@ $.validator.addMethod("bankorgiroaccountNL", function(value, element) {
|
||||
*
|
||||
* BIC pattern: BBBBCCLLbbb (8 or 11 characters long; bbb is optional)
|
||||
*
|
||||
* Validation is case-insensitive. Please make sure to normalize input yourself.
|
||||
*
|
||||
* BIC definition in detail:
|
||||
* - First 4 characters - bank code (only letters)
|
||||
* - Next 2 characters - ISO 3166-1 alpha-2 country code (only letters)
|
||||
* - Next 2 characters - location code (letters and digits)
|
||||
* a. shall not start with '0' or '1'
|
||||
* b. second character must be a letter ('O' is not allowed) or one of the following digits ('0' for test (therefore not allowed), '1' for passive participant and '2' for active participant)
|
||||
* b. second character must be a letter ('O' is not allowed) or digit ('0' for test (therefore not allowed), '1' denoting passive participant, '2' typically reverse-billing)
|
||||
* - Last 3 characters - branch code, optional (shall not start with 'X' except in case of 'XXX' for primary office) (letters and digits)
|
||||
*/
|
||||
$.validator.addMethod( "bic", function( value, element ) {
|
||||
return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value );
|
||||
return this.optional( element ) || /^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test( value.toUpperCase() );
|
||||
}, "Please specify a valid BIC code" );
|
||||
|
||||
/*
|
||||
* Código de identificación fiscal ( CIF ) is the tax identification code for Spanish legal entities
|
||||
* Further rules can be found in Spanish on http://es.wikipedia.org/wiki/C%C3%B3digo_de_identificaci%C3%B3n_fiscal
|
||||
*/
|
||||
$.validator.addMethod( "cifES", function( value ) {
|
||||
"use strict";
|
||||
|
||||
var num = [],
|
||||
controlDigit, sum, i, count, tmp, secondDigit;
|
||||
|
||||
value = value.toUpperCase();
|
||||
|
||||
// Quick format test
|
||||
if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for ( i = 0; i < 9; i++ ) {
|
||||
num[ i ] = parseInt( value.charAt( i ), 10 );
|
||||
}
|
||||
|
||||
// Algorithm for checking CIF codes
|
||||
sum = num[ 2 ] + num[ 4 ] + num[ 6 ];
|
||||
for ( count = 1; count < 8; count += 2 ) {
|
||||
tmp = ( 2 * num[ count ] ).toString();
|
||||
secondDigit = tmp.charAt( 1 );
|
||||
|
||||
sum += parseInt( tmp.charAt( 0 ), 10 ) + ( secondDigit === "" ? 0 : parseInt( secondDigit, 10 ) );
|
||||
}
|
||||
|
||||
/* The first (position 1) is a letter following the following criteria:
|
||||
*
|
||||
* Spanish CIF structure:
|
||||
*
|
||||
* [ T ][ P ][ P ][ N ][ N ][ N ][ N ][ N ][ C ]
|
||||
*
|
||||
* Where:
|
||||
*
|
||||
* T: 1 character. Kind of Organization Letter: [ABCDEFGHJKLMNPQRSUVW]
|
||||
* P: 2 characters. Province.
|
||||
* N: 5 characters. Secuencial Number within the province.
|
||||
* C: 1 character. Control Digit: [0-9A-J].
|
||||
*
|
||||
* [ T ]: Kind of Organizations. Possible values:
|
||||
*
|
||||
* A. Corporations
|
||||
* B. LLCs
|
||||
* C. General partnerships
|
||||
@ -176,18 +177,187 @@ $.validator.addMethod( "cifES", function( value ) {
|
||||
* S. Organs of State Administration and regions
|
||||
* V. Agrarian Transformation
|
||||
* W. Permanent establishments of non-resident in Spain
|
||||
*
|
||||
* [ C ]: Control Digit. It can be a number or a letter depending on T value:
|
||||
* [ T ] --> [ C ]
|
||||
* ------ ----------
|
||||
* A Number
|
||||
* B Number
|
||||
* E Number
|
||||
* H Number
|
||||
* K Letter
|
||||
* P Letter
|
||||
* Q Letter
|
||||
* S Letter
|
||||
*
|
||||
*/
|
||||
if ( /^[ABCDEFGHJNPQRSUVW]{1}/.test( value ) ) {
|
||||
sum += "";
|
||||
controlDigit = 10 - parseInt( sum.charAt( sum.length - 1 ), 10 );
|
||||
value += controlDigit;
|
||||
return ( num[ 8 ].toString() === String.fromCharCode( 64 + controlDigit ) || num[ 8 ].toString() === value.charAt( value.length - 1 ) );
|
||||
$.validator.addMethod( "cifES", function( value, element ) {
|
||||
"use strict";
|
||||
|
||||
if ( this.optional( element ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
var cifRegEx = new RegExp( /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi );
|
||||
var letter = value.substring( 0, 1 ), // [ T ]
|
||||
number = value.substring( 1, 8 ), // [ P ][ P ][ N ][ N ][ N ][ N ][ N ]
|
||||
control = value.substring( 8, 9 ), // [ C ]
|
||||
all_sum = 0,
|
||||
even_sum = 0,
|
||||
odd_sum = 0,
|
||||
i, n,
|
||||
control_digit,
|
||||
control_letter;
|
||||
|
||||
function isOdd( n ) {
|
||||
return n % 2 === 0;
|
||||
}
|
||||
|
||||
// Quick format test
|
||||
if ( value.length !== 9 || !cifRegEx.test( value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for ( i = 0; i < number.length; i++ ) {
|
||||
n = parseInt( number[ i ], 10 );
|
||||
|
||||
// Odd positions
|
||||
if ( isOdd( i ) ) {
|
||||
|
||||
// Odd positions are multiplied first.
|
||||
n *= 2;
|
||||
|
||||
// If the multiplication is bigger than 10 we need to adjust
|
||||
odd_sum += n < 10 ? n : n - 9;
|
||||
|
||||
// Even positions
|
||||
// Just sum them
|
||||
} else {
|
||||
even_sum += n;
|
||||
}
|
||||
}
|
||||
|
||||
all_sum = even_sum + odd_sum;
|
||||
control_digit = ( 10 - ( all_sum ).toString().substr( -1 ) ).toString();
|
||||
control_digit = parseInt( control_digit, 10 ) > 9 ? "0" : control_digit;
|
||||
control_letter = "JABCDEFGHI".substr( control_digit, 1 ).toString();
|
||||
|
||||
// Control must be a digit
|
||||
if ( letter.match( /[ABEH]/ ) ) {
|
||||
return control === control_digit;
|
||||
|
||||
// Control must be a letter
|
||||
} else if ( letter.match( /[KPQS]/ ) ) {
|
||||
return control === control_letter;
|
||||
}
|
||||
|
||||
// Can be either
|
||||
return control === control_digit || control === control_letter;
|
||||
|
||||
}, "Please specify a valid CIF number." );
|
||||
|
||||
/*
|
||||
* Brazillian CPF number (Cadastrado de Pessoas Físicas) is the equivalent of a Brazilian tax registration number.
|
||||
* CPF numbers have 11 digits in total: 9 numbers followed by 2 check numbers that are being used for validation.
|
||||
*/
|
||||
$.validator.addMethod( "cpfBR", function( value ) {
|
||||
|
||||
// Removing special characters from value
|
||||
value = value.replace( /([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g, "" );
|
||||
|
||||
// Checking value to have 11 digits only
|
||||
if ( value.length !== 11 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var sum = 0,
|
||||
firstCN, secondCN, checkResult, i;
|
||||
|
||||
firstCN = parseInt( value.substring( 9, 10 ), 10 );
|
||||
secondCN = parseInt( value.substring( 10, 11 ), 10 );
|
||||
|
||||
checkResult = function( sum, cn ) {
|
||||
var result = ( sum * 10 ) % 11;
|
||||
if ( ( result === 10 ) || ( result === 11 ) ) {
|
||||
result = 0;
|
||||
}
|
||||
return ( result === cn );
|
||||
};
|
||||
|
||||
// Checking for dump data
|
||||
if ( value === "" ||
|
||||
value === "00000000000" ||
|
||||
value === "11111111111" ||
|
||||
value === "22222222222" ||
|
||||
value === "33333333333" ||
|
||||
value === "44444444444" ||
|
||||
value === "55555555555" ||
|
||||
value === "66666666666" ||
|
||||
value === "77777777777" ||
|
||||
value === "88888888888" ||
|
||||
value === "99999999999"
|
||||
) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Step 1 - using first Check Number:
|
||||
for ( i = 1; i <= 9; i++ ) {
|
||||
sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 11 - i );
|
||||
}
|
||||
|
||||
// If first Check Number (CN) is valid, move to Step 2 - using second Check Number:
|
||||
if ( checkResult( sum, firstCN ) ) {
|
||||
sum = 0;
|
||||
for ( i = 1; i <= 10; i++ ) {
|
||||
sum = sum + parseInt( value.substring( i - 1, i ), 10 ) * ( 12 - i );
|
||||
}
|
||||
return checkResult( sum, secondCN );
|
||||
}
|
||||
return false;
|
||||
|
||||
}, "Please specify a valid CPF number" );
|
||||
|
||||
// https://jqueryvalidation.org/creditcard-method/
|
||||
// based on https://en.wikipedia.org/wiki/Luhn_algorithm
|
||||
$.validator.addMethod( "creditcard", function( value, element ) {
|
||||
if ( this.optional( element ) ) {
|
||||
return "dependency-mismatch";
|
||||
}
|
||||
|
||||
// Accept only spaces, digits and dashes
|
||||
if ( /[^0-9 \-]+/.test( value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var nCheck = 0,
|
||||
nDigit = 0,
|
||||
bEven = false,
|
||||
n, cDigit;
|
||||
|
||||
value = value.replace( /\D/g, "" );
|
||||
|
||||
// Basing min and max length on
|
||||
// https://developer.ean.com/general_info/Valid_Credit_Card_Types
|
||||
if ( value.length < 13 || value.length > 19 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for ( n = value.length - 1; n >= 0; n-- ) {
|
||||
cDigit = value.charAt( n );
|
||||
nDigit = parseInt( cDigit, 10 );
|
||||
if ( bEven ) {
|
||||
if ( ( nDigit *= 2 ) > 9 ) {
|
||||
nDigit -= 9;
|
||||
}
|
||||
}
|
||||
|
||||
nCheck += nDigit;
|
||||
bEven = !bEven;
|
||||
}
|
||||
|
||||
return ( nCheck % 10 ) === 0;
|
||||
}, "Please enter a valid credit card number." );
|
||||
|
||||
/* NOTICE: Modified version of Castle.Components.Validator.CreditCardValidator
|
||||
* Redistributed under the the Apache License 2.0 at http://www.apache.org/licenses/LICENSE-2.0
|
||||
* Valid Types: mastercard, visa, amex, dinersclub, enroute, discover, jcb, unknown, all (overrides all other settings)
|
||||
@ -228,31 +398,31 @@ $.validator.addMethod("creditcardtypes", function(value, element, param) {
|
||||
if ( param.all ) {
|
||||
validTypes = 0x0001 | 0x0002 | 0x0004 | 0x0008 | 0x0010 | 0x0020 | 0x0040 | 0x0080;
|
||||
}
|
||||
if (validTypes & 0x0001 && /^(5[12345])/.test(value)) { //mastercard
|
||||
if ( validTypes & 0x0001 && /^(5[12345])/.test( value ) ) { // Mastercard
|
||||
return value.length === 16;
|
||||
}
|
||||
if (validTypes & 0x0002 && /^(4)/.test(value)) { //visa
|
||||
if ( validTypes & 0x0002 && /^(4)/.test( value ) ) { // Visa
|
||||
return value.length === 16;
|
||||
}
|
||||
if (validTypes & 0x0004 && /^(3[47])/.test(value)) { //amex
|
||||
if ( validTypes & 0x0004 && /^(3[47])/.test( value ) ) { // Amex
|
||||
return value.length === 15;
|
||||
}
|
||||
if (validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test(value)) { //dinersclub
|
||||
if ( validTypes & 0x0008 && /^(3(0[012345]|[68]))/.test( value ) ) { // Dinersclub
|
||||
return value.length === 14;
|
||||
}
|
||||
if (validTypes & 0x0010 && /^(2(014|149))/.test(value)) { //enroute
|
||||
if ( validTypes & 0x0010 && /^(2(014|149))/.test( value ) ) { // Enroute
|
||||
return value.length === 15;
|
||||
}
|
||||
if (validTypes & 0x0020 && /^(6011)/.test(value)) { //discover
|
||||
if ( validTypes & 0x0020 && /^(6011)/.test( value ) ) { // Discover
|
||||
return value.length === 16;
|
||||
}
|
||||
if (validTypes & 0x0040 && /^(3)/.test(value)) { //jcb
|
||||
if ( validTypes & 0x0040 && /^(3)/.test( value ) ) { // Jcb
|
||||
return value.length === 16;
|
||||
}
|
||||
if (validTypes & 0x0040 && /^(2131|1800)/.test(value)) { //jcb
|
||||
if ( validTypes & 0x0040 && /^(2131|1800)/.test( value ) ) { // Jcb
|
||||
return value.length === 15;
|
||||
}
|
||||
if (validTypes & 0x0080) { //unknown
|
||||
if ( validTypes & 0x0080 ) { // Unknown
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -302,7 +472,7 @@ $.validator.addMethod("currency", function(value, element, param) {
|
||||
|
||||
$.validator.addMethod( "dateFA", function( value, element ) {
|
||||
return this.optional( element ) || /^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test( value );
|
||||
}, "Please enter a correct date");
|
||||
}, $.validator.messages.date );
|
||||
|
||||
/**
|
||||
* Return true, if the value is a valid date, also making this formal check dd/mm/yyyy.
|
||||
@ -332,7 +502,7 @@ $.validator.addMethod("dateITA", function(value, element) {
|
||||
gg = parseInt( adata[ 0 ], 10 );
|
||||
mm = parseInt( adata[ 1 ], 10 );
|
||||
aaaa = parseInt( adata[ 2 ], 10 );
|
||||
xdata = new Date(aaaa, mm - 1, gg, 12, 0, 0, 0);
|
||||
xdata = new Date( Date.UTC( aaaa, mm - 1, gg, 12, 0, 0, 0 ) );
|
||||
if ( ( xdata.getUTCFullYear() === aaaa ) && ( xdata.getUTCMonth() === mm - 1 ) && ( xdata.getUTCDate() === gg ) ) {
|
||||
check = true;
|
||||
} else {
|
||||
@ -342,16 +512,16 @@ $.validator.addMethod("dateITA", function(value, element) {
|
||||
check = false;
|
||||
}
|
||||
return this.optional( element ) || check;
|
||||
}, "Please enter a correct date");
|
||||
}, $.validator.messages.date );
|
||||
|
||||
$.validator.addMethod( "dateNL", function( value, element ) {
|
||||
return this.optional( element ) || /^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test( value );
|
||||
}, "Please enter a correct date");
|
||||
}, $.validator.messages.date );
|
||||
|
||||
// Older "accept" file extension method. Old docs: http://docs.jquery.com/Plugins/Validation/Methods/accept
|
||||
$.validator.addMethod( "extension", function( value, element, param ) {
|
||||
param = typeof param === "string" ? param.replace( /,/g, "|" ) : "png|jpe?g|gif";
|
||||
return this.optional(element) || value.match(new RegExp(".(" + param + ")$", "i"));
|
||||
return this.optional( element ) || value.match( new RegExp( "\\.(" + param + ")$", "i" ) );
|
||||
}, $.validator.format( "Please enter a value with a valid extension." ) );
|
||||
|
||||
/**
|
||||
@ -364,14 +534,17 @@ $.validator.addMethod("giroaccountNL", function(value, element) {
|
||||
/**
|
||||
* IBAN is the international bank account number.
|
||||
* It has a country - specific format, that is checked here too
|
||||
*
|
||||
* Validation is case-insensitive. Please make sure to normalize input yourself.
|
||||
*/
|
||||
$.validator.addMethod( "iban", function( value, element ) {
|
||||
// some quick simple tests to prevent needless work
|
||||
|
||||
// Some quick simple tests to prevent needless work
|
||||
if ( this.optional( element ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// remove spaces and to upper case
|
||||
// Remove spaces and to upper case
|
||||
var iban = value.replace( / /g, "" ).toUpperCase(),
|
||||
ibancheckdigits = "",
|
||||
leadingZeroes = true,
|
||||
@ -379,11 +552,17 @@ $.validator.addMethod("iban", function(value, element) {
|
||||
cOperator = "",
|
||||
countrycode, ibancheck, charAt, cChar, bbanpattern, bbancountrypatterns, ibanregexp, i, p;
|
||||
|
||||
if (!(/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(iban))) {
|
||||
// Check for IBAN code length.
|
||||
// It contains:
|
||||
// country code ISO 3166-1 - two letters,
|
||||
// two check digits,
|
||||
// Basic Bank Account Number (BBAN) - up to 30 chars
|
||||
var minimalIBANlength = 5;
|
||||
if ( iban.length < minimalIBANlength ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// check the country code and find the country specific format
|
||||
// Check the country code and find the country specific format
|
||||
countrycode = iban.substring( 0, 2 );
|
||||
bbancountrypatterns = {
|
||||
"AL": "\\d{8}[\\dA-Z]{16}",
|
||||
@ -453,6 +632,7 @@ $.validator.addMethod("iban", function(value, element) {
|
||||
};
|
||||
|
||||
bbanpattern = bbancountrypatterns[ countrycode ];
|
||||
|
||||
// As new countries will start using IBAN in the
|
||||
// future, we only check if the countrycode is known.
|
||||
// This prevents false negatives, while almost all
|
||||
@ -463,11 +643,11 @@ $.validator.addMethod("iban", function(value, element) {
|
||||
if ( typeof bbanpattern !== "undefined" ) {
|
||||
ibanregexp = new RegExp( "^[A-Z]{2}\\d{2}" + bbanpattern + "$", "" );
|
||||
if ( !( ibanregexp.test( iban ) ) ) {
|
||||
return false; // invalid country specific format
|
||||
return false; // Invalid country specific format
|
||||
}
|
||||
}
|
||||
|
||||
// now check the checksum, first convert to digits
|
||||
// Now check the checksum, first convert to digits
|
||||
ibancheck = iban.substring( 4, iban.length ) + iban.substring( 0, 4 );
|
||||
for ( i = 0; i < ibancheck.length; i++ ) {
|
||||
charAt = ibancheck.charAt( i );
|
||||
@ -479,7 +659,7 @@ $.validator.addMethod("iban", function(value, element) {
|
||||
}
|
||||
}
|
||||
|
||||
// calculate the result of: ibancheckdigits % 97
|
||||
// Calculate the result of: ibancheckdigits % 97
|
||||
for ( p = 0; p < ibancheckdigits.length; p++ ) {
|
||||
cChar = ibancheckdigits.charAt( p );
|
||||
cOperator = "" + cRest + "" + cChar;
|
||||
@ -497,22 +677,9 @@ $.validator.addMethod("ipv4", function(value, element) {
|
||||
}, "Please enter a valid IP v4 address." );
|
||||
|
||||
$.validator.addMethod( "ipv6", function( value, element ) {
|
||||
if (value == '::')
|
||||
return true;
|
||||
|
||||
return this.optional( element ) || /^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test( value );
|
||||
}, "Please enter a valid IP v6 address." );
|
||||
|
||||
$.validator.addMethod("ipv46address", function(value, element) {
|
||||
if (this.optional(element) && value.length == 0)
|
||||
return true;
|
||||
|
||||
if ($.validator.methods.ipv4.call(this, value, element) || $.validator.methods.ipv6.call(this, value, element))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}, "Please enter a valid IPv4/IPv6 address.");
|
||||
|
||||
$.validator.addMethod( "lettersonly", function( value, element ) {
|
||||
return this.optional( element ) || /^[a-z]+$/i.test( value );
|
||||
}, "Letters only please" );
|
||||
@ -539,47 +706,60 @@ $.validator.addMethod("mobileUK", function(phone_number, element) {
|
||||
phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/ );
|
||||
}, "Please specify a valid mobile number" );
|
||||
|
||||
$.validator.addMethod( "netmask", function( value, element ) {
|
||||
return this.optional( element ) || /^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test( value );
|
||||
}, "Please enter a valid netmask." );
|
||||
|
||||
/*
|
||||
* The número de identidad de extranjero ( NIE )is a code used to identify the non-nationals in Spain
|
||||
* The NIE (Número de Identificación de Extranjero) is a Spanish tax identification number assigned by the Spanish
|
||||
* authorities to any foreigner.
|
||||
*
|
||||
* The NIE is the equivalent of a Spaniards Número de Identificación Fiscal (NIF) which serves as a fiscal
|
||||
* identification number. The CIF number (Certificado de Identificación Fiscal) is equivalent to the NIF, but applies to
|
||||
* companies rather than individuals. The NIE consists of an 'X' or 'Y' followed by 7 or 8 digits then another letter.
|
||||
*/
|
||||
$.validator.addMethod( "nieES", function( value ) {
|
||||
$.validator.addMethod( "nieES", function( value, element ) {
|
||||
"use strict";
|
||||
|
||||
value = value.toUpperCase();
|
||||
if ( this.optional( element ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// Basic format test
|
||||
if ( !value.match( "((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)" ) ) {
|
||||
var nieRegEx = new RegExp( /^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi );
|
||||
var validChars = "TRWAGMYFPDXBNJZSQVHLCKET",
|
||||
letter = value.substr( value.length - 1 ).toUpperCase(),
|
||||
number;
|
||||
|
||||
value = value.toString().toUpperCase();
|
||||
|
||||
// Quick format test
|
||||
if ( value.length > 10 || value.length < 9 || !nieRegEx.test( value ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Test NIE
|
||||
//T
|
||||
if ( /^[T]{1}/.test( value ) ) {
|
||||
return ( value[ 8 ] === /^[T]{1}[A-Z0-9]{8}$/.test( value ) );
|
||||
}
|
||||
// X means same number
|
||||
// Y means number + 10000000
|
||||
// Z means number + 20000000
|
||||
value = value.replace( /^[X]/, "0" )
|
||||
.replace( /^[Y]/, "1" )
|
||||
.replace( /^[Z]/, "2" );
|
||||
|
||||
//XYZ
|
||||
if ( /^[XYZ]{1}/.test( value ) ) {
|
||||
return (
|
||||
value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt(
|
||||
value.replace( "X", "0" )
|
||||
.replace( "Y", "1" )
|
||||
.replace( "Z", "2" )
|
||||
.substring( 0, 8 ) % 23
|
||||
)
|
||||
);
|
||||
}
|
||||
number = value.length === 9 ? value.substr( 0, 8 ) : value.substr( 0, 9 );
|
||||
|
||||
return false;
|
||||
return validChars.charAt( parseInt( number, 10 ) % 23 ) === letter;
|
||||
|
||||
}, "Please specify a valid NIE number." );
|
||||
|
||||
/*
|
||||
* The Número de Identificación Fiscal ( NIF ) is the way tax identification used in Spain for individuals
|
||||
*/
|
||||
$.validator.addMethod( "nifES", function( value ) {
|
||||
$.validator.addMethod( "nifES", function( value, element ) {
|
||||
"use strict";
|
||||
|
||||
if ( this.optional( element ) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
value = value.toUpperCase();
|
||||
|
||||
// Basic format test
|
||||
@ -591,15 +771,43 @@ $.validator.addMethod( "nifES", function( value ) {
|
||||
if ( /^[0-9]{8}[A-Z]{1}$/.test( value ) ) {
|
||||
return ( "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 0 ) % 23 ) === value.charAt( 8 ) );
|
||||
}
|
||||
|
||||
// Test specials NIF (starts with K, L or M)
|
||||
if ( /^[KLM]{1}/.test( value ) ) {
|
||||
return ( value[ 8 ] === String.fromCharCode( 64 ) );
|
||||
return ( value[ 8 ] === "TRWAGMYFPDXBNJZSQVHLCKE".charAt( value.substring( 8, 1 ) % 23 ) );
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
}, "Please specify a valid NIF number." );
|
||||
|
||||
/*
|
||||
* Numer identyfikacji podatkowej ( NIP ) is the way tax identification used in Poland for companies
|
||||
*/
|
||||
$.validator.addMethod( "nipPL", function( value ) {
|
||||
"use strict";
|
||||
|
||||
value = value.replace( /[^0-9]/g, "" );
|
||||
|
||||
if ( value.length !== 10 ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var arrSteps = [ 6, 5, 7, 2, 3, 4, 5, 6, 7 ];
|
||||
var intSum = 0;
|
||||
for ( var i = 0; i < 9; i++ ) {
|
||||
intSum += arrSteps[ i ] * value[ i ];
|
||||
}
|
||||
var int2 = intSum % 11;
|
||||
var intControlNr = ( int2 === 10 ) ? 0 : int2;
|
||||
|
||||
return ( intControlNr === parseInt( value[ 9 ], 10 ) );
|
||||
}, "Please specify a valid NIP number." );
|
||||
|
||||
$.validator.addMethod( "notEqualTo", function( value, element, param ) {
|
||||
return this.optional( element ) || !$.validator.methods.equalTo.call( this, value, element, param );
|
||||
}, "Please enter a different value, values must not be the same." );
|
||||
|
||||
$.validator.addMethod( "nowhitespace", function( value, element ) {
|
||||
return this.optional( element ) || /^\S+$/i.test( value );
|
||||
}, "No white space please" );
|
||||
@ -622,7 +830,7 @@ $.validator.addMethod("pattern", function(value, element, param) {
|
||||
return true;
|
||||
}
|
||||
if ( typeof param === "string" ) {
|
||||
param = new RegExp(param);
|
||||
param = new RegExp( "^(?:" + param + ")$" );
|
||||
}
|
||||
return param.test( value );
|
||||
}, "Invalid format." );
|
||||
@ -634,6 +842,22 @@ $.validator.addMethod("phoneNL", function(value, element) {
|
||||
return this.optional( element ) || /^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test( value );
|
||||
}, "Please specify a valid phone number." );
|
||||
|
||||
/* For UK phone functions, do the following server side processing:
|
||||
* Compare original input with this RegEx pattern:
|
||||
* ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
|
||||
* Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
|
||||
* Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
|
||||
* A number of very detailed GB telephone number RegEx patterns can also be found at:
|
||||
* http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
|
||||
*/
|
||||
|
||||
// Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
|
||||
$.validator.addMethod( "phonesUK", function( phone_number, element ) {
|
||||
phone_number = phone_number.replace( /\(|\)|\s+|-/g, "" );
|
||||
return this.optional( element ) || phone_number.length > 9 &&
|
||||
phone_number.match( /^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/ );
|
||||
}, "Please specify a valid uk phone number" );
|
||||
|
||||
/* For UK phone functions, do the following server side processing:
|
||||
* Compare original input with this RegEx pattern:
|
||||
* ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
|
||||
@ -649,7 +873,7 @@ $.validator.addMethod("phoneUK", function(phone_number, element) {
|
||||
}, "Please specify a valid phone number" );
|
||||
|
||||
/**
|
||||
* matches US phone number format
|
||||
* Matches US phone number format
|
||||
*
|
||||
* where the area code may not start with 1 and the prefix may not start with 1
|
||||
* allows '-' or ' ' as a separator and allows parens around area code
|
||||
@ -670,20 +894,17 @@ $.validator.addMethod("phoneUS", function(phone_number, element) {
|
||||
phone_number.match( /^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/ );
|
||||
}, "Please specify a valid phone number" );
|
||||
|
||||
/* For UK phone functions, do the following server side processing:
|
||||
* Compare original input with this RegEx pattern:
|
||||
* ^\(?(?:(?:00\)?[\s\-]?\(?|\+)(44)\)?[\s\-]?\(?(?:0\)?[\s\-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d\-]+)$
|
||||
* Extract $1 and set $prefix to '+44<space>' if $1 is '44', otherwise set $prefix to '0'
|
||||
* Extract $2 and remove hyphens, spaces and parentheses. Phone number is combined $prefix and $2.
|
||||
* A number of very detailed GB telephone number RegEx patterns can also be found at:
|
||||
* http://www.aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers
|
||||
/*
|
||||
* Valida CEPs do brasileiros:
|
||||
*
|
||||
* Formatos aceitos:
|
||||
* 99999-999
|
||||
* 99.999-999
|
||||
* 99999999
|
||||
*/
|
||||
//Matches UK landline + mobile, accepting only 01-3 for landline or 07 for mobile to exclude many premium numbers
|
||||
$.validator.addMethod("phonesUK", function(phone_number, element) {
|
||||
phone_number = phone_number.replace(/\(|\)|\s+|-/g, "");
|
||||
return this.optional(element) || phone_number.length > 9 &&
|
||||
phone_number.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/);
|
||||
}, "Please specify a valid uk phone number");
|
||||
$.validator.addMethod( "postalcodeBR", function( cep_value, element ) {
|
||||
return this.optional( element ) || /^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test( cep_value );
|
||||
}, "Informe um CEP válido." );
|
||||
|
||||
/**
|
||||
* Matches a valid Canadian Postal Code
|
||||
@ -699,7 +920,7 @@ $.validator.addMethod("phonesUK", function(phone_number, element) {
|
||||
* @cat Plugins/Validate/Methods
|
||||
*/
|
||||
$.validator.addMethod( "postalCodeCA", function( value, element ) {
|
||||
return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test( value );
|
||||
return this.optional( element ) || /^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test( value );
|
||||
}, "Please specify a valid postal code" );
|
||||
|
||||
/* Matches Italian postcode (CAP) */
|
||||
@ -831,11 +1052,8 @@ $.validator.addMethod("skip_or_fill_minimum", function(value, element, options)
|
||||
* includeMilitary: true
|
||||
* }
|
||||
*
|
||||
*
|
||||
*
|
||||
*/
|
||||
|
||||
jQuery.validator.addMethod("stateUS", function(value, element, options) {
|
||||
$.validator.addMethod( "stateUS", function( value, element, options ) {
|
||||
var isDefault = typeof options === "undefined",
|
||||
caseSensitive = ( isDefault || typeof options.caseSensitive === "undefined" ) ? false : options.caseSensitive,
|
||||
includeTerritories = ( isDefault || typeof options.includeTerritories === "undefined" ) ? false : options.includeTerritories,
|
||||
@ -854,8 +1072,7 @@ jQuery.validator.addMethod("stateUS", function(value, element, options) {
|
||||
|
||||
regex = caseSensitive ? new RegExp( regex ) : new RegExp( regex, "i" );
|
||||
return this.optional( element ) || regex.test( value );
|
||||
},
|
||||
"Please specify a valid state");
|
||||
}, "Please specify a valid state" );
|
||||
|
||||
// TODO check if value starts with <, otherwise don't try stripping anything
|
||||
$.validator.addMethod( "strippedminlength", function( value, element, param ) {
|
||||
@ -863,14 +1080,14 @@ $.validator.addMethod("strippedminlength", function(value, element, param) {
|
||||
}, $.validator.format( "Please enter at least {0} characters" ) );
|
||||
|
||||
$.validator.addMethod( "time", function( value, element ) {
|
||||
return this.optional(element) || /^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(value);
|
||||
return this.optional( element ) || /^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test( value );
|
||||
}, "Please enter a valid time, between 00:00 and 23:59" );
|
||||
|
||||
$.validator.addMethod( "time12h", function( value, element ) {
|
||||
return this.optional( element ) || /^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test( value );
|
||||
}, "Please enter a valid time in 12-hour am/pm format" );
|
||||
|
||||
// same as url, but TLD is optional
|
||||
// Same as url, but TLD is optional
|
||||
$.validator.addMethod( "url2", function( value, element ) {
|
||||
return this.optional( element ) || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test( value );
|
||||
}, $.validator.messages.url );
|
||||
@ -937,5 +1154,5 @@ $.validator.addMethod("zipcodeUS", function(value, element) {
|
||||
$.validator.addMethod( "ziprange", function( value, element ) {
|
||||
return this.optional( element ) || /^90[2-5]\d\{2\}-\d{4}$/.test( value );
|
||||
}, "Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx" );
|
||||
|
||||
return $;
|
||||
}));
|
||||
816
ui/lib/jquery.validate.js
vendored
816
ui/lib/jquery.validate.js
vendored
File diff suppressed because it is too large
Load Diff
@ -384,7 +384,7 @@
|
||||
args.complete($chart);
|
||||
}
|
||||
|
||||
if ($chart.find('.connector-line.highlighted').size()) {
|
||||
if ($chart.find('.connector-line.highlighted').length) {
|
||||
$info.appendTo($chart).append(
|
||||
$('<span>').addClass('color-key'),
|
||||
$('<span>').html('= Contains a public network')
|
||||
|
||||
@ -450,7 +450,7 @@
|
||||
});
|
||||
|
||||
// Logout action
|
||||
$('#user-options a').live('click', function() {
|
||||
$(document).on('click', '#user-options a', function() {
|
||||
loginArgs.logoutAction({
|
||||
context: cloudStack.context
|
||||
});
|
||||
|
||||
@ -2445,7 +2445,7 @@
|
||||
var $tierSelect = $(".ui-dialog-content").find('.tier-select select');
|
||||
|
||||
// if $tierSelect is not initialized, return; tierSelect() will refresh listView and come back here later
|
||||
if ($tierSelect.size() == 0) {
|
||||
if ($tierSelect.length == 0) {
|
||||
args.response.success({
|
||||
data: null
|
||||
});
|
||||
|
||||
@ -761,7 +761,7 @@ var addGuestNetworkDialog = {
|
||||
} else { //domain-specific
|
||||
array1.push("&acltype=domain");
|
||||
|
||||
if ($form.find('.form-item[rel=subdomainaccess]:visible input:checked').size())
|
||||
if ($form.find('.form-item[rel=subdomainaccess]:visible input:checked').length)
|
||||
array1.push("&subdomainaccess=true");
|
||||
else
|
||||
array1.push("&subdomainaccess=false");
|
||||
|
||||
@ -94,7 +94,7 @@
|
||||
|
||||
$wizard.click(function(event) {
|
||||
var $target = $(event.target);
|
||||
if ($target.closest('button.next').size()) {
|
||||
if ($target.closest('button.next').length) {
|
||||
$form.validate();
|
||||
if ($form.valid()) {
|
||||
completeAction();
|
||||
@ -104,7 +104,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
if ($target.closest('button.cancel').size()) {
|
||||
if ($target.closest('button.cancel').length) {
|
||||
close();
|
||||
return false;
|
||||
}
|
||||
@ -112,14 +112,14 @@
|
||||
|
||||
if (ldapStatus) {
|
||||
var $table = $wizard.find('.ldap-account-choice tbody');
|
||||
$("#label_ldap_group_name").live("keypress", function(event) {
|
||||
$("#label_ldap_group_name").on("keypress", function(event) {
|
||||
if ($table.find("#tr-groupname-message").length === 0) {
|
||||
$("<tr id='tr-groupname-message'>").appendTo($table).append("<td colspan=\"4\">"+_l('message.ldap.group.import')+"</td>");
|
||||
}
|
||||
$table.find("tr").hide();
|
||||
$table.find("#tr-groupname-message").show();
|
||||
});
|
||||
$("#label_ldap_group_name").live("blur", function(event) {
|
||||
$("#label_ldap_group_name").on("blur", function(event) {
|
||||
if (!$(this).val()) {
|
||||
$table.find("tr").show();
|
||||
$table.find("#tr-groupname-message").hide();
|
||||
|
||||
@ -85,7 +85,7 @@
|
||||
|
||||
if (!$dataList.find(
|
||||
'input[type=radio]:checked, input[type=checkbox]:checked'
|
||||
).size()) {
|
||||
).length) {
|
||||
cloudStack.dialog.notice({
|
||||
message: _l('message.select.instance')
|
||||
});
|
||||
|
||||
@ -60,12 +60,12 @@
|
||||
data['new-network-ip'] = $form.find('.new-network .select.advanced .specify-ip input[type=text]').val();
|
||||
|
||||
// Handle multi-disk service offerings
|
||||
if ($form.find('.multi-disk-select-container').size()) {
|
||||
if ($form.find('.multi-disk-select-container').length) {
|
||||
data['disk-offerings-multi'] = [];
|
||||
|
||||
var $diskGroups = $form.find('.disk-select-group');
|
||||
var $selectedDisks = $.grep($diskGroups, function (diskGroup) {
|
||||
return $(diskGroup).find('input[type=checkbox]:checked').size();
|
||||
return $(diskGroup).find('input[type=checkbox]:checked').length;
|
||||
});
|
||||
|
||||
$selectedDisks.map(function (disk) {
|
||||
@ -86,7 +86,7 @@
|
||||
success: function(args) {
|
||||
var $listView = $('.list-view.instances');
|
||||
|
||||
if ($listView.size()) {
|
||||
if ($listView.length) {
|
||||
var $loading = $('.list-view.instances').listView('prependItem', {
|
||||
data: [{
|
||||
name: data.displayname ? data.displayname : _l('label.new.vm'),
|
||||
@ -104,7 +104,7 @@
|
||||
listViewArgs.complete({
|
||||
_custom: args._custom,
|
||||
messageArgs: cloudStack.serializeForm($form),
|
||||
$item: $listView.size() ? $loading : $('<div>')
|
||||
$item: $listView.length ? $loading : $('<div>')
|
||||
});
|
||||
|
||||
close();
|
||||
@ -158,17 +158,17 @@
|
||||
|
||||
var $checkedOtherSelect = $otherSelects.filter(function() {
|
||||
return $(this).not('.single-select') &&
|
||||
$(this).find('input[type=checkbox]:checked').size() &&
|
||||
$(this).find('input[type=radio]:checked').size();
|
||||
$(this).find('input[type=checkbox]:checked').length &&
|
||||
$(this).find('input[type=radio]:checked').length;
|
||||
});
|
||||
|
||||
if (!$checkedOtherSelect.size() &&
|
||||
!$('.new-network:visible input[type=radio]:checked').size()) {
|
||||
if (!$checkedOtherSelect.length &&
|
||||
!$('.new-network:visible input[type=radio]:checked').length) {
|
||||
$(this).closest('.select').find('input[type=radio]').click();
|
||||
}
|
||||
}
|
||||
|
||||
if ((!$otherSelects.size()) &&
|
||||
if ((!$otherSelects.length) &&
|
||||
$newNetwork.find('input[type=checkbox]').is(':unchecked')) {
|
||||
// Set as default
|
||||
$(this).closest('.select').find('input[type=radio]').click();
|
||||
@ -268,10 +268,9 @@
|
||||
|
||||
var dataGenerators = {
|
||||
setup: function($step, formData) {
|
||||
var originalValues = function(formData) {
|
||||
$step.find('select').val(
|
||||
formData.zoneid
|
||||
);
|
||||
var originalValues = function(formData, initialValue) {
|
||||
var selectedValue = formData.zoneid || initialValue;
|
||||
$step.find('select').val(selectedValue);
|
||||
|
||||
$step.find('input[type=radio]').filter(function() {
|
||||
return $(this).val() == formData['select-template'];
|
||||
@ -282,7 +281,11 @@
|
||||
response: {
|
||||
success: function(args) {
|
||||
// Zones
|
||||
$(args.data.zones).each(function() {
|
||||
var initialValue = '';
|
||||
$(args.data.zones).each(function( index ) {
|
||||
if(index == 0){
|
||||
initialValue = this.id;
|
||||
}
|
||||
$step.find('.select-zone select').append(
|
||||
$('<option>')
|
||||
.attr({
|
||||
@ -293,7 +296,7 @@
|
||||
);
|
||||
});
|
||||
|
||||
originalValues(formData);
|
||||
originalValues(formData, initialValue);
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -309,7 +312,7 @@
|
||||
return $(this).val() == formData.templateid;
|
||||
});
|
||||
|
||||
if (!$selected.size()) {
|
||||
if (!$selected.length) {
|
||||
$inputs.filter(':first').click();
|
||||
} else {
|
||||
$selected.click();
|
||||
@ -541,7 +544,7 @@
|
||||
return $(this).val() == formData.diskofferingid;
|
||||
}).click();
|
||||
|
||||
if (!$targetInput.size()) {
|
||||
if (!$targetInput.length) {
|
||||
$step.find('input[type=radio]:visible').filter(':first').click();
|
||||
}
|
||||
};
|
||||
@ -620,7 +623,7 @@
|
||||
$group.toggleClass('selected');
|
||||
$group.find('.select:first input[type=radio]').click();
|
||||
|
||||
if (!$multiDiskSelect.find('input[type=checkbox]:checked').size()) {
|
||||
if (!$multiDiskSelect.find('input[type=checkbox]:checked').length) {
|
||||
$step.find('.no-thanks input[type=radio]').click();
|
||||
} else {
|
||||
$step.find('.no-thanks input[type=radio]').attr('checked', false);
|
||||
@ -655,10 +658,10 @@
|
||||
var item = $.grep(args.data.diskOfferings, function(elem) {
|
||||
return elem.id == val;
|
||||
})[0];
|
||||
var isMultiDisk = $step.find('.multi-disk-select').size();
|
||||
var isMultiDisk = $step.find('.multi-disk-select').length;
|
||||
|
||||
// Uncheck any multi-select groups
|
||||
if ($target.closest('.no-thanks').size() && isMultiDisk) {
|
||||
if ($target.closest('.no-thanks').length && isMultiDisk) {
|
||||
$step.find('.disk-select-group input[type=checkbox]:checked').click();
|
||||
$(this).attr('checked', true);
|
||||
|
||||
@ -881,7 +884,7 @@
|
||||
var $checkbox = $step.find('.new-network input[type=checkbox]');
|
||||
var $newNetwork = $checkbox.closest('.new-network');
|
||||
|
||||
if ($step.find('.select.my-networks .select-container .select:visible').size()) {
|
||||
if ($step.find('.select.my-networks .select-container .select:visible').length) {
|
||||
$checkbox.attr('checked', false);
|
||||
$newNetwork.addClass('unselected');
|
||||
} else {
|
||||
@ -1023,7 +1026,7 @@
|
||||
);
|
||||
|
||||
// Cleanup
|
||||
if ($select.closest('.new-network').size()) {
|
||||
if ($select.closest('.new-network').length) {
|
||||
$select.find('.advanced-options, .specify-ip').remove();
|
||||
}
|
||||
|
||||
@ -1077,10 +1080,10 @@
|
||||
fieldName = $input.html();
|
||||
} else if ($input.is('input[type=radio]')) {
|
||||
// Choosen New network as default
|
||||
if ($input.parents('div.new-network').size()) {
|
||||
if ($input.parents('div.new-network').length) {
|
||||
fieldName = $input.closest('div.new-network').find('input[name="new-network-name"]').val();
|
||||
// Choosen Network from existed
|
||||
} else if ($input.parents('div.my-networks').size()) {
|
||||
} else if ($input.parents('div.my-networks').length) {
|
||||
fieldName = $input.closest('div.select').find('.select-desc .name').html();
|
||||
} else {
|
||||
fieldName = $input.parent().find('.select-desc .name').html();
|
||||
@ -1124,7 +1127,7 @@
|
||||
var targetIndex = index - 1;
|
||||
|
||||
if (index <= 1) targetIndex = 0;
|
||||
if (targetIndex == $steps.size()) {
|
||||
if (targetIndex == $steps.length) {
|
||||
completeAction();
|
||||
return;
|
||||
}
|
||||
@ -1182,7 +1185,7 @@
|
||||
}).fadeOut('slow');
|
||||
|
||||
setTimeout(function() {
|
||||
if (!$targetStep.find('input[type=radio]:checked').size()) {
|
||||
if (!$targetStep.find('input[type=radio]:checked').length) {
|
||||
$targetStep.find('input[type=radio]:first').click();
|
||||
}
|
||||
}, 50);
|
||||
@ -1194,10 +1197,10 @@
|
||||
var $activeStep = $form.find('.step:visible');
|
||||
|
||||
// Next button
|
||||
if ($target.closest('div.button.next').size()) {
|
||||
if ($target.closest('div.button.next').length) {
|
||||
//step 2 - select template/ISO
|
||||
if($activeStep.hasClass('select-iso')) {
|
||||
if ($activeStep.find('.content:visible input:checked').size() == 0) {
|
||||
if ($activeStep.find('.content:visible input:checked').length == 0) {
|
||||
cloudStack.dialog.notice({
|
||||
message: 'message.step.1.continue'
|
||||
});
|
||||
@ -1210,7 +1213,7 @@
|
||||
}
|
||||
|
||||
//step 6 - select network
|
||||
if ($activeStep.find('.wizard-step-conditional.select-network:visible').size() > 0) {
|
||||
if ($activeStep.find('.wizard-step-conditional.select-network:visible').length > 0) {
|
||||
var data = $activeStep.data('my-networks');
|
||||
|
||||
if (!data) {
|
||||
@ -1219,7 +1222,7 @@
|
||||
)['my-networks']);
|
||||
}
|
||||
|
||||
if ($activeStep.find('input[type=checkbox]:checked').size() == 0) { //if no checkbox is checked
|
||||
if ($activeStep.find('input[type=checkbox]:checked').length == 0) { //if no checkbox is checked
|
||||
cloudStack.dialog.notice({
|
||||
message: 'message.step.4.continue'
|
||||
});
|
||||
@ -1234,7 +1237,7 @@
|
||||
if (advSGFilter == 0) { //when total number of selected sg networks is 0, then 'Select Security Group' is skipped, go to step 6 directly
|
||||
showStep(6);
|
||||
} else { //when total number of selected sg networks > 0
|
||||
if ($activeStep.find('input[type=checkbox]:checked').size() > 1) { //when total number of selected networks > 1
|
||||
if ($activeStep.find('input[type=checkbox]:checked').length > 1) { //when total number of selected networks > 1
|
||||
cloudStack.dialog.notice({
|
||||
message: "Can't create a vm with multiple networks one of which is Security Group enabled"
|
||||
});
|
||||
@ -1246,7 +1249,7 @@
|
||||
|
||||
//step 6 - review (spcifiy displyname, group as well)
|
||||
if ($activeStep.hasClass('review')) {
|
||||
if ($activeStep.find('input[name=displayname]').size() > 0 && $activeStep.find('input[name=displayname]').val().length > 0) {
|
||||
if ($activeStep.find('input[name=displayname]').length > 0 && $activeStep.find('input[name=displayname]').val().length > 0) {
|
||||
//validate
|
||||
var b = cloudStack.validate.vmHostName($activeStep.find('input[name=displayname]').val());
|
||||
if (b == false)
|
||||
@ -1255,7 +1258,7 @@
|
||||
}
|
||||
|
||||
if (!$form.valid()) {
|
||||
if ($form.find('input.error:visible, select.error:visible').size()) {
|
||||
if ($form.find('input.error:visible, select.error:visible').length) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -1270,7 +1273,7 @@
|
||||
}
|
||||
|
||||
// Previous button
|
||||
if ($target.closest('div.button.previous').size()) {
|
||||
if ($target.closest('div.button.previous').length) {
|
||||
var $step = $steps.filter(':visible');
|
||||
var $networkStep = $steps.filter('.network');
|
||||
var index = $step.index();
|
||||
@ -1278,10 +1281,10 @@
|
||||
$networkStep.removeClass('next-use-security-groups');
|
||||
|
||||
if (index) {
|
||||
if (index == $steps.size() - 1 && $networkStep.hasClass('next-use-security-groups')) {
|
||||
if (index == $steps.length - 1 && $networkStep.hasClass('next-use-security-groups')) {
|
||||
showStep(5);
|
||||
} else if ($activeStep.find('.select-security-group:visible').size() &&
|
||||
$activeStep.find('.select-network.no-add-network').size()) {
|
||||
} else if ($activeStep.find('.select-security-group:visible').length &&
|
||||
$activeStep.find('.select-network.no-add-network').length) {
|
||||
showStep(5);
|
||||
} else {
|
||||
showStep(index);
|
||||
@ -1292,14 +1295,14 @@
|
||||
}
|
||||
|
||||
// Close button
|
||||
if ($target.closest('div.button.cancel').size()) {
|
||||
if ($target.closest('div.button.cancel').length) {
|
||||
close();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Edit link
|
||||
if ($target.closest('div.edit').size()) {
|
||||
if ($target.closest('div.edit').length) {
|
||||
var $edit = $target.closest('div.edit');
|
||||
|
||||
showStep($edit.find('a').attr('href'));
|
||||
|
||||
@ -71,7 +71,7 @@
|
||||
return $dashboard
|
||||
.click(function(event) {
|
||||
var $target = $(event.target);
|
||||
if ($target.closest('[view-all-target]').size()) {
|
||||
if ($target.closest('[view-all-target]').length) {
|
||||
var targetID = $target.closest('[view-all-target]').attr('view-all-target');
|
||||
args.$browser.cloudBrowser('addPanel', {
|
||||
title: $target.closest('[view-all-title]').attr('view-all-title'),
|
||||
|
||||
@ -54,7 +54,7 @@
|
||||
$plugin.click(function() {
|
||||
var $mainSection = $('#navigation ul li').filter('.' + plugin.id);
|
||||
|
||||
if ($mainSection.size()) {
|
||||
if ($mainSection.length) {
|
||||
$mainSection.click();
|
||||
|
||||
return;
|
||||
|
||||
@ -275,7 +275,7 @@
|
||||
var $management = $panel.find('.management');
|
||||
var $managementInvite = $panel.find('.management-invite');
|
||||
|
||||
if ($management.size()) {
|
||||
if ($management.length) {
|
||||
$management.children().remove();
|
||||
$management.append(pageElems.userManagement({
|
||||
context: cloudStack.context
|
||||
@ -284,7 +284,7 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
if ($managementInvite.size()) {
|
||||
if ($managementInvite.length) {
|
||||
$managementInvite.children().remove();
|
||||
$managementInvite.append(pageElems.userManagement({
|
||||
context: cloudStack.context,
|
||||
@ -635,7 +635,7 @@
|
||||
|
||||
// Initial load
|
||||
loadData(function() {
|
||||
if (!$list.find('li').size()) {
|
||||
if (!$list.find('li').length) {
|
||||
cloudStack.dialog.notice({
|
||||
message: isAdmin() || isDomainAdmin() || g_userProjectsEnabled ? _l('message.no.projects') : _l('message.no.projects.adminOnly')
|
||||
}).closest('.ui-dialog');
|
||||
|
||||
@ -117,7 +117,7 @@
|
||||
return $(this).index() == index;
|
||||
});
|
||||
|
||||
if ($tr.size() && $tr.hasClass('active')) {
|
||||
if ($tr.length && $tr.hasClass('active')) {
|
||||
$(this).addClass('disabled ui-state-disabled');
|
||||
} else {
|
||||
$(this).removeClass('disabled ui-state-disabled');
|
||||
@ -126,7 +126,7 @@
|
||||
if ($(this).is('.ui-tabs-selected.ui-state-disabled')) {
|
||||
$snapshots.find('form').show();
|
||||
|
||||
if ($snapshots.find('li.ui-state-disabled').size() == $snapshots.find('li').size()) {
|
||||
if ($snapshots.find('li.ui-state-disabled').length == $snapshots.find('li').length) {
|
||||
$snapshots.find('form').hide();
|
||||
} else {
|
||||
$snapshots.find('li:not(.ui-state-disabled):first a').click();
|
||||
|
||||
@ -96,7 +96,7 @@
|
||||
var $li = $target.closest('li');
|
||||
var region, url;
|
||||
|
||||
if ($li.size() && !$li.hasClass('active')) {
|
||||
if ($li.length && !$li.hasClass('active')) {
|
||||
region = $li.data('region-data');
|
||||
url = region.endpoint;
|
||||
id = region.id;
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
|
||||
if (!$uploadVolume.find(
|
||||
'input[type=radio]:checked, input[type=checkbox]:checked'
|
||||
).size()) {
|
||||
).length) {
|
||||
cloudStack.dialog.notice({
|
||||
message: _l('message.select.instance')
|
||||
});
|
||||
|
||||
@ -409,7 +409,7 @@
|
||||
|
||||
// Title shows tier details
|
||||
$title.click(function() {
|
||||
if ($browser && $browser.size()) { // Fix null exception, if add tier returns error
|
||||
if ($browser && $browser.length) { // Fix null exception, if add tier returns error
|
||||
$browser.cloudBrowser('addPanel', {
|
||||
title: name,
|
||||
maximizeIfSelected: true,
|
||||
@ -545,7 +545,7 @@
|
||||
);
|
||||
|
||||
var showAddTierDialog = function() {
|
||||
if ($(this).find('.loading-overlay').size()) {
|
||||
if ($(this).find('.loading-overlay').length) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@ -22,7 +22,7 @@
|
||||
if (!options) options = {};
|
||||
|
||||
var $forms = $wizard.find('form').filter(function() {
|
||||
return !options.all ? !$(this).closest('.multi-edit').size() : true;
|
||||
return !options.all ? !$(this).closest('.multi-edit').length : true;
|
||||
});
|
||||
var $physicalNetworkItems = $wizard.find(
|
||||
'.steps .setup-physical-network .select-container.multi'
|
||||
@ -33,7 +33,7 @@
|
||||
'.steps .setup-storage-traffic .data-body .data-item');
|
||||
var groupedForms = {};
|
||||
|
||||
if ($physicalNetworkItems.find('li.traffic-type-draggable.storage').size()) {
|
||||
if ($physicalNetworkItems.find('li.traffic-type-draggable.storage').length) {
|
||||
$wizard.find('li.conditional.storage-traffic').show();
|
||||
} else {
|
||||
$wizard.find('li.conditional.storage-traffic').hide();
|
||||
@ -93,7 +93,7 @@
|
||||
// Traffic type configuration data
|
||||
trafficTypeConfiguration: trafficTypeConfiguration,
|
||||
|
||||
guestConfiguration: $guestForm.size() ? cloudStack.serializeForm($guestForm) : null
|
||||
guestConfiguration: $guestForm.length ? cloudStack.serializeForm($guestForm) : null
|
||||
};
|
||||
}
|
||||
);
|
||||
@ -172,7 +172,7 @@
|
||||
*/
|
||||
var customValidation = {
|
||||
networkRanges: function($form) {
|
||||
if ($form.closest('.multi-edit').find('.data-item').size()) {
|
||||
if ($form.closest('.multi-edit').find('.data-item').length) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -184,7 +184,7 @@
|
||||
|
||||
physicalNetworks: function($form) {
|
||||
var $enabledPhysicalNetworks = $form.filter(':not(.disabled)').filter(function() {
|
||||
return $(this).find('.traffic-type-draggable').size();
|
||||
return $(this).find('.traffic-type-draggable').length;
|
||||
});
|
||||
var $trafficTypes = $enabledPhysicalNetworks.find('.traffic-type-draggable');
|
||||
var $configuredTrafficTypes = $trafficTypes.filter(function() {
|
||||
@ -193,8 +193,8 @@
|
||||
return ($trafficType.data('traffic-type-data') != null);
|
||||
});
|
||||
|
||||
if ($enabledPhysicalNetworks.size() > 1 &&
|
||||
$configuredTrafficTypes.size() != $trafficTypes.size()) {
|
||||
if ($enabledPhysicalNetworks.length > 1 &&
|
||||
$configuredTrafficTypes.length != $trafficTypes.length) {
|
||||
cloudStack.dialog.notice({
|
||||
message: _l('message.configure.all.traffic.types')
|
||||
});
|
||||
@ -215,9 +215,9 @@
|
||||
var $physicalNetworks = $step.find('.select-container.multi');
|
||||
var isCustomValidated;
|
||||
|
||||
if ($multiEditForm.size()) {
|
||||
if ($multiEditForm.length) {
|
||||
isCustomValidated = customValidation.networkRanges($multiEditForm);
|
||||
} else if ($physicalNetworks.size()) {
|
||||
} else if ($physicalNetworks.length) {
|
||||
isCustomValidated = customValidation.physicalNetworks($physicalNetworks);
|
||||
} else {
|
||||
isCustomValidated = true;
|
||||
@ -240,7 +240,7 @@
|
||||
var $existingPhysicalNetworks = physicalNetwork.getNetworks($wizard);
|
||||
|
||||
// Initialize physical networks
|
||||
if (!$existingPhysicalNetworks.size()) {
|
||||
if (!$existingPhysicalNetworks.length) {
|
||||
physicalNetwork.add($wizard);
|
||||
} else if (!isAdvancedNetwork($wizard)) {
|
||||
$existingPhysicalNetworks.filter(':first').siblings().each(function() {
|
||||
@ -459,12 +459,12 @@
|
||||
return $(this).attr('traffic-type-id') == trafficTypeID;
|
||||
});
|
||||
|
||||
if (physicalNetwork.isTrafficTypeClone($trafficType) && !$container.closest('.select-container.multi').size()) {
|
||||
if (physicalNetwork.isTrafficTypeClone($trafficType) && !$container.closest('.select-container.multi').length) {
|
||||
// Get traffic type from original container
|
||||
return $trafficType.filter(function() {
|
||||
return $(this).closest(
|
||||
physicalNetwork.getOriginalTrafficContainer($trafficType)
|
||||
).size();
|
||||
).length;
|
||||
});
|
||||
}
|
||||
|
||||
@ -516,10 +516,10 @@
|
||||
var $trafficType = physicalNetwork.getTrafficType(trafficTypeID, $container);
|
||||
var $dropArea = $physicalNetwork.find('.drop-container ul');
|
||||
|
||||
if ($physicalNetwork.find('.traffic-type-draggable[traffic-type-id=' + trafficTypeID + ']').size()) return false;
|
||||
if ($physicalNetwork.find('.traffic-type-draggable[traffic-type-id=' + trafficTypeID + ']').length) return false;
|
||||
|
||||
if (physicalNetwork.isTrafficTypeClone($trafficType)) {
|
||||
if (!physicalNetwork.getTrafficType(trafficTypeID, $physicalNetwork).size()) {
|
||||
if (!physicalNetwork.getTrafficType(trafficTypeID, $physicalNetwork).length) {
|
||||
$trafficType = $trafficType.clone()
|
||||
.removeClass('disabled')
|
||||
.appendTo($dropArea)
|
||||
@ -563,7 +563,7 @@
|
||||
);
|
||||
|
||||
if (physicalNetwork.isTrafficTypeClone($trafficType) &&
|
||||
$physicalNetworks.find('.traffic-type-draggable[traffic-type-id=' + trafficTypeID + ']').size() > 1) {
|
||||
$physicalNetworks.find('.traffic-type-draggable[traffic-type-id=' + trafficTypeID + ']').length > 1) {
|
||||
$trafficType.remove();
|
||||
}
|
||||
}
|
||||
@ -580,10 +580,10 @@
|
||||
return false;
|
||||
|
||||
var $emptyContainers = $containers.filter(function() {
|
||||
return !$(this).find('li').size();
|
||||
return !$(this).find('li').length;
|
||||
});
|
||||
|
||||
return !$emptyContainers.size() ? $containers.size() : false;
|
||||
return !$emptyContainers.length ? $containers.length : false;
|
||||
},
|
||||
|
||||
/**
|
||||
@ -598,7 +598,7 @@
|
||||
$allPhysicalNetworks.each(function() {
|
||||
var $ul = $(this).find('.drop-container ul');
|
||||
|
||||
if (!$(this).find('li').size()) {
|
||||
if (!$(this).find('li').length) {
|
||||
$(this).addClass('disabled');
|
||||
$ul.fadeOut();
|
||||
} else {
|
||||
@ -609,8 +609,8 @@
|
||||
|
||||
$containers.each(function() {
|
||||
var $currentContainer = $(this);
|
||||
if (!$currentContainer.find('li').size() &&
|
||||
$containers.size() > containerTotal) {
|
||||
if (!$currentContainer.find('li').length &&
|
||||
$containers.length > containerTotal) {
|
||||
$currentContainer.remove();
|
||||
}
|
||||
});
|
||||
@ -753,7 +753,7 @@
|
||||
|
||||
$ul.addClass('active');
|
||||
|
||||
if (!$ul.find('li').size()) {
|
||||
if (!$ul.find('li').length) {
|
||||
$(this).closest('.select-container.multi').removeClass('disabled');
|
||||
$ul.fadeIn();
|
||||
}
|
||||
@ -772,7 +772,7 @@
|
||||
var trafficTypeData = ui.draggable.data('traffic-type-data');
|
||||
|
||||
if (trafficTypeID == 'guest' &&
|
||||
ui.draggable.closest('.select-container.multi').size()) {
|
||||
ui.draggable.closest('.select-container.multi').length) {
|
||||
ui.draggable.remove();
|
||||
}
|
||||
|
||||
@ -880,7 +880,7 @@
|
||||
|
||||
// Only use networks w/ guest traffic type
|
||||
$physicalNetworks = $physicalNetworks.filter(function() {
|
||||
return $(this).find('li.guest').size();
|
||||
return $(this).find('li.guest').length;
|
||||
|
||||
return true;
|
||||
});
|
||||
@ -1101,7 +1101,7 @@
|
||||
var targetIndex = index - 1;
|
||||
|
||||
if (index <= 1) targetIndex = 0;
|
||||
if (targetIndex == $steps.size()) {
|
||||
if (targetIndex == $steps.length) {
|
||||
completeAction();
|
||||
}
|
||||
|
||||
@ -1130,7 +1130,7 @@
|
||||
}
|
||||
|
||||
if (formID) {
|
||||
if (!$targetStep.find('form').size()) {
|
||||
if (!$targetStep.find('form').length) {
|
||||
makeForm(args, formID, formState).appendTo($targetStep.find('.content.input-area .select-container'));
|
||||
|
||||
setTimeout(function() {
|
||||
@ -1185,7 +1185,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
if ($uiCustom.size()) {
|
||||
if ($uiCustom.length) {
|
||||
$uiCustom.each(function() {
|
||||
var $item = $(this);
|
||||
var id = $item.attr('ui-custom');
|
||||
@ -1210,7 +1210,7 @@
|
||||
$nextButton.removeClass('final post-launch');
|
||||
|
||||
// Show launch button if last step
|
||||
if ($targetStep.index() == $steps.size() - 1 || options.nextStep) {
|
||||
if ($targetStep.index() == $steps.length - 1 || options.nextStep) {
|
||||
$nextButton.find('span').html(options.nextStep ? _l('label.save.changes') : _l('label.launch.zone'));
|
||||
$nextButton.addClass('final');
|
||||
|
||||
@ -1225,7 +1225,7 @@
|
||||
}).toggleClass('active');
|
||||
|
||||
setTimeout(function() {
|
||||
if (!$targetStep.find('input[type=radio]:checked').size()) {
|
||||
if (!$targetStep.find('input[type=radio]:checked').length) {
|
||||
$targetStep.find('input[type=radio]:first').click();
|
||||
}
|
||||
}, 50);
|
||||
@ -1329,25 +1329,25 @@
|
||||
}
|
||||
|
||||
// Next button
|
||||
if ($target.closest('div.button.next').size()) {
|
||||
if ($target.closest('div.button.next').length) {
|
||||
var $step = $steps.filter(':visible');
|
||||
// Validation
|
||||
var $form = $('form:visible').filter(function() {
|
||||
// Don't include multi-edit (validation happens separately)
|
||||
return !$(this).closest('.multi-edit').size();
|
||||
return !$(this).closest('.multi-edit').length;
|
||||
});
|
||||
|
||||
// Handle validation for custom UI components
|
||||
var isCustomValidated = checkCustomValidation($step);
|
||||
if (($form.size() && !$form.valid()) || !isCustomValidated) {
|
||||
if (($form && $form.find('.error:visible').size()) || !isCustomValidated)
|
||||
if (($form.length && !$form.valid()) || !isCustomValidated) {
|
||||
if (($form && $form.find('.error:visible').length) || !isCustomValidated)
|
||||
return false;
|
||||
}
|
||||
|
||||
//when hypervisor is BareMetal (begin)
|
||||
var data = getData($wizard);
|
||||
if (('zone' in data) && (data.zone.hypervisor == 'BareMetal')) {
|
||||
if ($('.zone-wizard:visible').find('#add_zone_guest_traffic_desc:visible').size() > 0) { //$steps.filter(':visible').index() == 6
|
||||
if ($('.zone-wizard:visible').find('#add_zone_guest_traffic_desc:visible').length > 0) { //$steps.filter(':visible').index() == 6
|
||||
showStep('launch');
|
||||
completeAction();
|
||||
return false;
|
||||
@ -1355,10 +1355,10 @@
|
||||
}
|
||||
//when hypervisor is BareMetal (end)
|
||||
|
||||
if (!$target.closest('.button.next.final').size())
|
||||
if (!$target.closest('.button.next.final').length)
|
||||
showStep($steps.filter(':visible').index() + 2);
|
||||
else {
|
||||
if ($target.closest('.button.next.final.post-launch').size()) {
|
||||
if ($target.closest('.button.next.final.post-launch').length) {
|
||||
showStep('launch');
|
||||
}
|
||||
|
||||
@ -1369,21 +1369,21 @@
|
||||
}
|
||||
|
||||
// Previous button
|
||||
if ($target.closest('div.button.previous').size()) {
|
||||
if ($target.closest('div.button.previous').length) {
|
||||
showStep($steps.filter(':visible').index(), true);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Close button
|
||||
if ($target.closest('div.button.cancel').size()) {
|
||||
if ($target.closest('div.button.cancel').length) {
|
||||
close();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// Edit link
|
||||
if ($target.closest('div.edit').size()) {
|
||||
if ($target.closest('div.edit').length) {
|
||||
var $edit = $target.closest('div.edit');
|
||||
|
||||
showStep($edit.find('a').attr('href'));
|
||||
@ -1395,7 +1395,7 @@
|
||||
var $editTrafficTypeButton = $target.closest('.drop-container .traffic-type-draggable .edit-traffic-type');
|
||||
var $trafficType = $editTrafficTypeButton.closest('.traffic-type-draggable');
|
||||
|
||||
if ($editTrafficTypeButton.size()) {
|
||||
if ($editTrafficTypeButton.length) {
|
||||
physicalNetwork.editTrafficTypeDialog($trafficType);
|
||||
|
||||
return false;
|
||||
|
||||
@ -181,7 +181,7 @@
|
||||
}).join(',')
|
||||
);
|
||||
|
||||
if ($target.closest('.select.project-view').size()) {
|
||||
if ($target.closest('.select.project-view').length) {
|
||||
$('#cloudStack3-container').addClass('project-view');
|
||||
$projectSwitcher.addClass('alt');
|
||||
$projectSwitcher.find('.select.project-view').addClass('active')
|
||||
@ -404,9 +404,9 @@
|
||||
function checkHoveredLabel($target) {
|
||||
var $multiWizard = $('div.ui-dialog div.multi-wizard');
|
||||
if (($target.is('label[for]') && !$target.parents('body.login')) ||
|
||||
($multiWizard.size() &&
|
||||
($target.is('.multi-wizard label') && $target.prev('input[type="radio"],input[type="checkbox"]').size()) ||
|
||||
($target.is('.multi-wizard .select-desc div.name') && $target.parent('div.select-desc').prev('input[type="radio"],input[type="checkbox"]').size())
|
||||
($multiWizard.length &&
|
||||
($target.is('.multi-wizard label') && $target.prev('input[type="radio"],input[type="checkbox"]').length) ||
|
||||
($target.is('.multi-wizard .select-desc div.name') && $target.parent('div.select-desc').prev('input[type="radio"],input[type="checkbox"]').length)
|
||||
))
|
||||
return true;
|
||||
|
||||
@ -419,7 +419,7 @@
|
||||
if (checkHoveredLabel($target)) {
|
||||
$target.addClass('label-hovered');
|
||||
}
|
||||
if ($target.closest('#user, #user-options').size()) {
|
||||
if ($target.closest('#user, #user-options').length) {
|
||||
return false;
|
||||
} else $('#user-options').hide();
|
||||
|
||||
@ -441,19 +441,19 @@
|
||||
var $multiWizard = $('div.ui-dialog div.multi-wizard');
|
||||
|
||||
// Wizard: trigger click event for input when click it label
|
||||
if ($multiWizard.size()) {
|
||||
if ($target.is('.multi-wizard label') && $target.prev('input[type="radio"],input[type="checkbox"]').size()) {
|
||||
if ($multiWizard.length) {
|
||||
if ($target.is('.multi-wizard label') && $target.prev('input[type="radio"],input[type="checkbox"]').length) {
|
||||
$target.prev('input').trigger('click');
|
||||
}
|
||||
if ($target.is('.multi-wizard .select-desc div.name') && $target.parent('div.select-desc').prev('input[type="radio"],input[type="checkbox"]').size()) {
|
||||
if ($target.is('.multi-wizard .select-desc div.name') && $target.parent('div.select-desc').prev('input[type="radio"],input[type="checkbox"]').length) {
|
||||
$target.parent('div.select-desc').prev('input').trigger('click');
|
||||
}
|
||||
}
|
||||
|
||||
if (!$container.size()) return true;
|
||||
if (!$container.length) return true;
|
||||
|
||||
// Navigation items
|
||||
if ($target.closest('li.navigation-item').size() && $target.closest('#navigation').size()) {
|
||||
if ($target.closest('li.navigation-item').length && $target.closest('#navigation').length) {
|
||||
var $navItem = $target.closest('li.navigation-item');
|
||||
|
||||
if ($navItem.is('.disabled')) return false;
|
||||
@ -463,7 +463,7 @@
|
||||
}
|
||||
|
||||
// Browser expand
|
||||
if ($target.hasClass('control expand') && $target.closest('div.panel div.toolbar').size()) {
|
||||
if ($target.hasClass('control expand') && $target.closest('div.panel div.toolbar').length) {
|
||||
$browser.cloudBrowser('toggleMaximizePanel', {
|
||||
panel: $target.closest('div.panel')
|
||||
});
|
||||
@ -478,7 +478,7 @@
|
||||
}
|
||||
|
||||
// User options
|
||||
if ($target.closest('#user div.icon.options').size()) {
|
||||
if ($target.closest('#user div.icon.options').length) {
|
||||
$('#user-options').toggle();
|
||||
|
||||
return false;
|
||||
|
||||
@ -382,7 +382,7 @@
|
||||
|
||||
// Make sure all data is loaded to pass to select fn
|
||||
dependsOnLoaded = $.inArray(
|
||||
true, $dependsOn.map(function(index, item) { return $(item).find('option').size() ? true : false; })
|
||||
true, $dependsOn.map(function(index, item) { return $(item).find('option').length ? true : false; })
|
||||
) > -1;
|
||||
|
||||
if (!dependsOnLoaded) {
|
||||
@ -776,7 +776,7 @@
|
||||
|
||||
if (!$formContainer.find('form').valid()) {
|
||||
// Ignore hidden field validation
|
||||
if ($formContainer.find('input.error:visible, select.error:visible').size()) {
|
||||
if ($formContainer.find('input.error:visible, select.error:visible').length) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -970,7 +970,7 @@
|
||||
click: function() {
|
||||
if (!$listView.find(
|
||||
'input[type=radio]:checked, input[type=checkbox]:checked'
|
||||
).size()) {
|
||||
).length) {
|
||||
cloudStack.dialog.notice({
|
||||
message: _l('message.select.instance')
|
||||
});
|
||||
|
||||
@ -41,7 +41,7 @@
|
||||
var data, elem;
|
||||
|
||||
$elem = $target.closest('.cloudStack-elem.' + widget);
|
||||
if (!$elem.size())
|
||||
if (!$elem.length)
|
||||
return true;
|
||||
|
||||
$widget = $('.cloudStack-widget.' + widget);
|
||||
|
||||
@ -95,7 +95,7 @@
|
||||
*/
|
||||
width: function($container, options) {
|
||||
options = options ? options : {};
|
||||
var width = $container.find('div.panel').size() < 1 || !options.partial ?
|
||||
var width = $container.find('div.panel').length < 1 || !options.partial ?
|
||||
$container.width() : $container.width() - $container.width() / 4;
|
||||
|
||||
return width;
|
||||
@ -105,7 +105,7 @@
|
||||
* Get left position
|
||||
*/
|
||||
position: function($container, options) {
|
||||
return $container.find('div.panel').size() <= 1 || !options.partial ?
|
||||
return $container.find('div.panel').length <= 1 || !options.partial ?
|
||||
0 : _panel.width($container, options) - _panel.width($container, options) / 1.5;
|
||||
},
|
||||
|
||||
@ -340,7 +340,7 @@
|
||||
}
|
||||
});
|
||||
|
||||
$('#breadcrumbs li').live('click', cloudStack.ui.event.bind(
|
||||
$(document).on('click', '#breadcrumbs li', cloudStack.ui.event.bind(
|
||||
'cloudBrowser', {
|
||||
'breadcrumb': function($target, $browser, data) {
|
||||
|
||||
|
||||
@ -228,9 +228,9 @@
|
||||
$tbody.width($thead.width());
|
||||
}
|
||||
|
||||
if ($ths.size() > $tds.size()) {
|
||||
if ($ths.length > $tds.length) {
|
||||
$ths.width(
|
||||
$table.width() / $ths.size()
|
||||
$table.width() / $ths.length
|
||||
);
|
||||
return false;
|
||||
}
|
||||
@ -281,7 +281,7 @@
|
||||
|
||||
var init = function() {
|
||||
var noSelect = options && options.noSelect == true ? true : false;
|
||||
if (!$table.closest('div.data-table').size() && !$table.hasClass('no-split')) {
|
||||
if (!$table.closest('div.data-table').length && !$table.hasClass('no-split')) {
|
||||
reattachTable();
|
||||
$table.find('tbody').closest('table').addClass('body');
|
||||
}
|
||||
@ -304,7 +304,7 @@
|
||||
$table.bind('click', function(event) {
|
||||
var $tr = $(event.target).closest('tr');
|
||||
|
||||
if (!$tr.size() || noSelect) return true;
|
||||
if (!$tr.length || noSelect) return true;
|
||||
var rowIndex = $tr.index();
|
||||
|
||||
toggleSelectRow(rowIndex);
|
||||
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
var $listView = $row.closest('.list-view');
|
||||
|
||||
if (!$listView.parents('html').size()) return;
|
||||
if (!$listView.parents('html').length) return;
|
||||
|
||||
var $newRow;
|
||||
var jsonObj = $row.data('json-obj');
|
||||
@ -56,6 +56,15 @@
|
||||
}
|
||||
};
|
||||
|
||||
var tabEvents = {
|
||||
create: function(event, ui) {
|
||||
manageTabsContent(event, ui);
|
||||
},
|
||||
activate: function(event, ui) {
|
||||
manageTabsContent(event, ui);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Available UI actions to perform for buttons
|
||||
*/
|
||||
@ -114,7 +123,7 @@
|
||||
}
|
||||
).appendTo($detailView);
|
||||
|
||||
$detailView.tabs();
|
||||
$detailView.tabs(tabEvents);
|
||||
};
|
||||
|
||||
var performAction = function(data, options) {
|
||||
@ -172,7 +181,7 @@
|
||||
viewArgs.onActionComplete();
|
||||
}
|
||||
|
||||
if (!$detailView.parents('html').size()) {
|
||||
if (!$detailView.parents('html').length) {
|
||||
replaceListViewItem(null, args.data, {
|
||||
$row: $row
|
||||
});
|
||||
@ -222,7 +231,7 @@
|
||||
cloudStack.ui.notifications.add(
|
||||
notification,
|
||||
function(args2) { //name parameter as "args2" instead of "args" to avoid override "args" from success: function(args) {
|
||||
if ($detailView.parents('html').size()) {
|
||||
if ($detailView.parents('html').length) {
|
||||
$loading.remove();
|
||||
|
||||
if (!noRefresh && !viewArgs.compact) {
|
||||
@ -376,7 +385,7 @@
|
||||
var $tbody = $row.closest('tbody');
|
||||
|
||||
$row.remove();
|
||||
if (!$tbody.find('tr').size()) {
|
||||
if (!$tbody.find('tr').length) {
|
||||
$("<tr>").addClass('empty').append(
|
||||
$("<td>").html(_l('label.no.data'))
|
||||
).appendTo($tbody);
|
||||
@ -413,7 +422,7 @@
|
||||
var $tbody = $row.closest('tbody');
|
||||
|
||||
$row.remove();
|
||||
if (!$tbody.find('tr').size()) {
|
||||
if (!$tbody.find('tr').length) {
|
||||
$("<tr>").addClass('empty').append(
|
||||
$("<td>").html(_l('label.no.data'))
|
||||
).appendTo($tbody);
|
||||
@ -439,11 +448,11 @@
|
||||
$detailView.addClass('edit-mode');
|
||||
var token_value = "";
|
||||
|
||||
if ($detailView.find('.button.done').size()) return false;
|
||||
if ($detailView.find('.button.done').length) return false;
|
||||
|
||||
// Convert value TDs
|
||||
var $inputs = $detailView.find('input, select, textarea').filter(function() {
|
||||
return !$(this).closest('.tagger').size() && !$(this).attr('type') == 'submit';
|
||||
return !$(this).closest('.tagger').length && !$(this).attr('type') == 'submit';
|
||||
});
|
||||
var action = args.actions[args.actionName];
|
||||
var id = $detailView.data('view-args').id;
|
||||
@ -476,7 +485,7 @@
|
||||
var $token;
|
||||
var tags_value = "";
|
||||
$inputs.each(function() {
|
||||
if ($(this).closest('.tagger').size()) return true;
|
||||
if ($(this).closest('.tagger').length) return true;
|
||||
|
||||
var $input = $(this);
|
||||
var $value = $input.closest('td.value span');
|
||||
@ -525,9 +534,9 @@
|
||||
|
||||
// Remove Edit form
|
||||
var $form = $detailView.find('form').filter(function() {
|
||||
return !$(this).closest('.tagger').size();
|
||||
return !$(this).closest('.tagger').length;
|
||||
});
|
||||
if ($form.size()) {
|
||||
if ($form.length) {
|
||||
var $mainGroups = $form.find('div.main-groups').detach();
|
||||
$form.parent('div').append($mainGroups);
|
||||
$form.remove();
|
||||
@ -539,7 +548,7 @@
|
||||
// Put in original values
|
||||
var cancelEdits = function($inputs, $editButton) {
|
||||
$inputs.each(function() {
|
||||
if ($(this).closest('.tagger').size()) return true;
|
||||
if ($(this).closest('.tagger').length) return true;
|
||||
|
||||
var $input = $(this);
|
||||
var $value = $input.closest('td.value span');
|
||||
@ -561,7 +570,7 @@
|
||||
};
|
||||
|
||||
var applyEdits = function($inputs, $editButton) {
|
||||
if ($inputs.size()) {
|
||||
if ($inputs.length) {
|
||||
$inputs.animate({
|
||||
opacity: 0.5
|
||||
}, 500);
|
||||
@ -634,16 +643,16 @@
|
||||
|
||||
$editButton.click(function() {
|
||||
var $inputs = $detailView.find('input, select, textarea').filter(function() {
|
||||
return !$(this).closest('.tagger').size();
|
||||
return !$(this).closest('.tagger').length;
|
||||
});
|
||||
var $form = $detailView.find('form').filter(function() {
|
||||
return !$(this).closest('.tagger').size();
|
||||
return !$(this).closest('.tagger').length;
|
||||
});
|
||||
|
||||
if ($(this).hasClass('done')) {
|
||||
if (!$form.valid()) {
|
||||
// Ignore hidden field validation
|
||||
if ($form.find('input.error:visible, select.error:visible').size()) {
|
||||
if ($form.find('input.error:visible, select.error:visible').length) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -796,7 +805,7 @@
|
||||
return true;
|
||||
});
|
||||
|
||||
if ($detailView.find('td.value span:data(detail-view-is-editable)').size()) {
|
||||
if ($detailView.find('td.value span:data(detail-view-is-editable)').length) {
|
||||
var $detailsEdit = $detailView.find('div.main-groups').detach(),
|
||||
$detailsEditForm = $('<form>').append($detailsEdit);
|
||||
|
||||
@ -805,7 +814,7 @@
|
||||
|
||||
// Setup form validation
|
||||
var $form = $detailView.find('form').filter(function() {
|
||||
return !$(this).closest('.tagger').size();
|
||||
return !$(this).closest('.tagger').length;
|
||||
});
|
||||
$form.validate();
|
||||
$form.find('input, select').each(function() {
|
||||
@ -976,7 +985,7 @@
|
||||
});
|
||||
|
||||
var $actionButtons = $actions.find('div.action:not(.text)');
|
||||
if ($actionButtons.size() == 1)
|
||||
if ($actionButtons.length == 1)
|
||||
$actionButtons.addClass('single');
|
||||
else {
|
||||
$actionButtons.filter(':first').addClass('first');
|
||||
@ -1180,7 +1189,7 @@
|
||||
context: context
|
||||
}) : true
|
||||
) : true;
|
||||
if ($actions && ($actions.find('div.action').size() || (detailViewArgs.viewAll && showViewAll))) {
|
||||
if ($actions && ($actions.find('div.action').length || (detailViewArgs.viewAll && showViewAll))) {
|
||||
$actions.prependTo($firstRow.closest('div.detail-group').closest('.details'));
|
||||
}
|
||||
if (detailViewArgs.viewAll && showViewAll) {
|
||||
@ -1559,12 +1568,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
$detailView.tabs({
|
||||
$detailView.tabs(
|
||||
$.extend(true, {}, tabEvents, {
|
||||
select: function() {
|
||||
// Cleanup old tab content
|
||||
$detailView.find('.detail-group').children().remove();
|
||||
}
|
||||
});
|
||||
}}
|
||||
)
|
||||
);
|
||||
|
||||
return $detailView;
|
||||
};
|
||||
@ -1588,16 +1599,13 @@
|
||||
return true;
|
||||
};
|
||||
|
||||
$(document).bind('tabscreate',manageTabsContent);
|
||||
$(document).bind('tabsactivate',manageTabsContent);
|
||||
|
||||
// View all links
|
||||
$('a').live('click', function(event) {
|
||||
$(document).on('click', 'a', function(event) {
|
||||
var $target = $(event.target);
|
||||
var $viewAll = $target.closest('td.view-all a');
|
||||
var viewAllArgs;
|
||||
|
||||
if ($target.closest('div.detail-view').size() && $target.closest('td.view-all a').size()) {
|
||||
if ($target.closest('div.detail-view').length && $target.closest('td.view-all a').length) {
|
||||
viewAllArgs = $viewAll.data('detail-view-link-view-all');
|
||||
viewAll(
|
||||
viewAllArgs.custom ?
|
||||
@ -1625,7 +1633,7 @@
|
||||
var $target = $(event.target);
|
||||
|
||||
// Refresh
|
||||
if ($target.closest('div.toolbar div.refresh').size()) {
|
||||
if ($target.closest('div.toolbar div.refresh').length) {
|
||||
loadTabContent(
|
||||
$target.closest('div.detail-view').find('div.detail-group:visible'),
|
||||
$target.closest('div.detail-view').data('view-args'),
|
||||
@ -1636,8 +1644,8 @@
|
||||
}
|
||||
|
||||
// Detail action
|
||||
if ($target.closest('div.detail-view [detail-action], div.detail-view .action.text').size() &&
|
||||
!$target.closest('.list-view').size()) {
|
||||
if ($target.closest('div.detail-view [detail-action], div.detail-view .action.text').length &&
|
||||
!$target.closest('.list-view').length) {
|
||||
var $action = $target.closest('.action').find('[detail-action]');
|
||||
var actionName = $action.attr('detail-action');
|
||||
var actionCallback = $action.data('detail-view-action-callback');
|
||||
|
||||
@ -294,7 +294,7 @@
|
||||
}
|
||||
|
||||
if (needsRefresh) {
|
||||
if ($listView.closest('.detail-view').size()) {
|
||||
if ($listView.closest('.detail-view').length) {
|
||||
$('.detail-view:last .button.refresh').click();
|
||||
} else {
|
||||
$loading.remove();
|
||||
@ -375,7 +375,7 @@
|
||||
}
|
||||
|
||||
if (needsRefresh) {
|
||||
if (!$listView.closest('.detail-view').size()) {
|
||||
if (!$listView.closest('.detail-view').length) {
|
||||
$loading.remove();
|
||||
}
|
||||
}
|
||||
@ -1148,7 +1148,7 @@
|
||||
|
||||
if (!(data && data.length)) {
|
||||
$listView.data('end-of-table', true);
|
||||
if (!$tbody.find('tr').size()) {
|
||||
if (!$tbody.find('tr').length) {
|
||||
return [
|
||||
$('<tr>').addClass('empty last').append(
|
||||
$('<td>').html(_l('label.no.data'))
|
||||
@ -1186,8 +1186,8 @@
|
||||
.addClass('multiSelectCheckbox')
|
||||
.click(function() {
|
||||
var checked = $(this).is(':checked');
|
||||
var numRows = $(this).parents('tbody').find('input.multiSelectCheckbox').size();
|
||||
var numRowsChecked = $(this).parents('tbody').find('input.multiSelectCheckbox:checked').size();
|
||||
var numRows = $(this).parents('tbody').find('input.multiSelectCheckbox').length;
|
||||
var numRowsChecked = $(this).parents('tbody').find('input.multiSelectCheckbox:checked').length;
|
||||
var enabled = checked || (numRowsChecked > 0);
|
||||
|
||||
toggleMultiSelectActions($td.closest('.list-view'), enabled);
|
||||
@ -1326,7 +1326,7 @@
|
||||
true, {},
|
||||
$tr.closest('.list-view').data('view-args').context
|
||||
);
|
||||
var rowIndex = $tr.closest('tbody').find('tr').size() - ($tr.index());
|
||||
var rowIndex = $tr.closest('tbody').find('tr').length - ($tr.index());
|
||||
|
||||
context[viewArgs.activeSection] = $tr.data('json-obj');
|
||||
|
||||
@ -1630,11 +1630,11 @@
|
||||
position: 'absolute',
|
||||
left: $quickView.offset().left + $quickView.outerWidth() - $quickViewTooltip.width() - 2*(parseInt($quickView.css('border-left-width')) + parseInt($quickView.css('border-right-width'))),
|
||||
top: $quickView.offset().top,
|
||||
zIndex: $tr.closest('.panel').zIndex() + 1
|
||||
zIndex: $tr.closest('.panel').css("zIndex") + 1
|
||||
});
|
||||
|
||||
$quickViewTooltip.mouseleave(function() {
|
||||
if (!$('.overlay:visible').size()) {
|
||||
if (!$('.overlay:visible').length) {
|
||||
$quickViewTooltip.remove();
|
||||
}
|
||||
});
|
||||
@ -1662,7 +1662,7 @@
|
||||
$('<td>')
|
||||
.addClass('loading icon')
|
||||
.attr({
|
||||
'colspan': $table.find('th').size()
|
||||
'colspan': $table.find('th').length
|
||||
})
|
||||
);
|
||||
|
||||
@ -1830,7 +1830,7 @@
|
||||
|
||||
// Clear out any existing list view
|
||||
var $existingListView = $container.find('div.list-view');
|
||||
if ($existingListView.size()) {
|
||||
if ($existingListView.length) {
|
||||
$existingListView.remove();
|
||||
}
|
||||
|
||||
@ -1884,7 +1884,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
if ($switcher && $switcher.find('option').size() == 1) {
|
||||
if ($switcher && $switcher.find('option').length == 1) {
|
||||
listViewData = args.sections[
|
||||
$switcher.find('select').val()
|
||||
].listView;
|
||||
@ -2018,7 +2018,7 @@
|
||||
var code = (event.keyCode ? event.keyCode : event.which);
|
||||
var $input = $listView.find('input:focus');
|
||||
|
||||
if ($input.size() && $input.hasClass('edit') && code === 13) {
|
||||
if ($input.length && $input.hasClass('edit') && code === 13) {
|
||||
uiActions.edit($input.closest('tr'), {
|
||||
callback: listViewData.actions.edit.action
|
||||
});
|
||||
@ -2078,7 +2078,7 @@
|
||||
return true;
|
||||
});
|
||||
$listView.find('select').bind('change', function(event) {
|
||||
if ($(event.target).closest('.section-select').size()) return true;
|
||||
if ($(event.target).closest('.section-select').length) return true;
|
||||
if ((event.type == 'click' ||
|
||||
event.type == 'mouseup') &&
|
||||
($(event.target).is('select') ||
|
||||
@ -2124,7 +2124,7 @@
|
||||
};
|
||||
|
||||
$listView.find('.advanced-search .icon').bind('click', function(event) {
|
||||
if ($listView.find('.advanced-search .form-container:visible').size()) {
|
||||
if ($listView.find('.advanced-search .form-container:visible').length) {
|
||||
closeAdvancedSearch();
|
||||
|
||||
return false;
|
||||
@ -2181,7 +2181,7 @@
|
||||
listView = args.sections[args.activeSection].listView;
|
||||
}
|
||||
if (listView && listView.disableInfiniteScrolling) return false;
|
||||
if ($listView.find('tr.last, td.loading:visible').size()) return false;
|
||||
if ($listView.find('tr.last, td.loading:visible').length) return false;
|
||||
|
||||
clearTimeout(infScrollTimer);
|
||||
infScrollTimer = setTimeout(function() {
|
||||
@ -2246,12 +2246,12 @@
|
||||
var id = $target.closest('tr').data('list-view-item-id');
|
||||
var jsonObj = $target.closest('tr').data('jsonObj');
|
||||
var detailViewArgs;
|
||||
var detailViewPresent = ($target.closest('div.data-table tr td.first').size() &&
|
||||
listViewData.detailView && !$target.closest('div.edit').size()) && !listViewData.detailView.noPanelView;
|
||||
var detailViewPresent = ($target.closest('div.data-table tr td.first').length &&
|
||||
listViewData.detailView && !$target.closest('div.edit').length) && !listViewData.detailView.noPanelView;
|
||||
var uiCustom = args.uiCustom == true ? true : false;
|
||||
|
||||
// Click on first item will trigger detail view (if present)
|
||||
if (detailViewPresent && !uiCustom && !$target.closest('.empty, .loading').size()) {
|
||||
if (detailViewPresent && !uiCustom && !$target.closest('.empty, .loading').length) {
|
||||
var $loading = $('<div>').addClass('loading-overlay');
|
||||
$target.closest('div.data-table').prepend($loading); //overlay the whole listView, so users can't click another row until click-handling for this row is done (e.g. API response is back)
|
||||
|
||||
@ -2317,9 +2317,9 @@
|
||||
|
||||
// Action icons
|
||||
if (!$target.closest('td.actions').hasClass('reorder') &&
|
||||
($target.closest('td.actions').size() ||
|
||||
$target.closest('.action.add').size() ||
|
||||
$target.closest('.action.main-action').size())) {
|
||||
($target.closest('td.actions').length ||
|
||||
$target.closest('.action.add').length ||
|
||||
$target.closest('.action.main-action').length)) {
|
||||
var actionID = $target.closest('.action').data('list-view-action-id');
|
||||
var $tr;
|
||||
|
||||
@ -2327,8 +2327,8 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($target.closest('.action.add').size() ||
|
||||
$target.closest('.action.main-action:not(.multiSelectAction)').size()) {
|
||||
if ($target.closest('.action.add').length ||
|
||||
$target.closest('.action.main-action:not(.multiSelectAction)').length) {
|
||||
$tr = $target.closest('div.list-view').find('tr:first'); // Dummy row
|
||||
} else {
|
||||
if (listViewData.actions[actionID].isMultiSelectAction) {
|
||||
@ -2360,7 +2360,7 @@
|
||||
}
|
||||
|
||||
// Section switcher
|
||||
if ($target.is('a') && $target.closest('div.section-switcher').size()) {
|
||||
if ($target.is('a') && $target.closest('div.section-switcher').length) {
|
||||
makeListView($container, args, $target.data('list-view-section-id'));
|
||||
|
||||
return false;
|
||||
@ -2460,7 +2460,7 @@
|
||||
|
||||
if (preFilter) {
|
||||
$selectedVMs = $listView.find('tbody tr').filter(function() {
|
||||
return $(this).find('td.multiselect input[type=checkbox]:checked').size()
|
||||
return $(this).find('td.multiselect input[type=checkbox]:checked').length
|
||||
});
|
||||
context[$listView.data('view-args').activeSection] = $selectedVMs.map(function(index, item) {
|
||||
return $(item).data('json-obj');
|
||||
|
||||
@ -229,7 +229,7 @@
|
||||
$td.append($select);
|
||||
}
|
||||
else {
|
||||
var matchingValue = $matchingOption.size() ?
|
||||
var matchingValue = $matchingOption.length ?
|
||||
$matchingOption.html() : data[fieldName];
|
||||
|
||||
$td.append($('<span>').html(_s(matchingValue)));
|
||||
@ -243,7 +243,7 @@
|
||||
|
||||
var $subItems = $td.closest('.data-item').find('.expandable-listing tr');
|
||||
|
||||
if ($subItems.size()) {
|
||||
if ($subItems.length) {
|
||||
context.subItemData = $subItems.map(function() {
|
||||
return $(this).data('json-obj');
|
||||
});
|
||||
@ -598,7 +598,7 @@
|
||||
text: _l('label.apply'),
|
||||
'class': 'ok',
|
||||
click: function() {
|
||||
if (!$listView.find('input[type=radio]:checked, input[type=checkbox]:checked').size()) {
|
||||
if (!$listView.find('input[type=radio]:checked, input[type=checkbox]:checked').length) {
|
||||
cloudStack.dialog.notice({
|
||||
message: _l('message.select.item')
|
||||
});
|
||||
@ -660,7 +660,7 @@
|
||||
);
|
||||
|
||||
$multi.find('.data tr').filter(function() {
|
||||
return !$(this).closest('.expandable-listing').size();
|
||||
return !$(this).closest('.expandable-listing').length;
|
||||
}).each(function() {
|
||||
var $tr = $(this);
|
||||
|
||||
@ -929,8 +929,8 @@
|
||||
$loading.prependTo($multi);
|
||||
reorder.moveDrag.action({
|
||||
targetIndex: ui.item.index(),
|
||||
nextItem: ui.item.next().size() ? ui.item.next().data('json-obj') : null,
|
||||
prevItem: ui.item.prev().size() ? ui.item.prev().data('json-obj') : null,
|
||||
nextItem: ui.item.next().length ? ui.item.next().data('json-obj') : null,
|
||||
prevItem: ui.item.prev().length ? ui.item.prev().data('json-obj') : null,
|
||||
context: $.extend(true, {}, context, {
|
||||
// Passes all rules, so that each index can be updated
|
||||
multiRule: [ui.item.data('json-obj')]
|
||||
@ -1121,7 +1121,7 @@
|
||||
$addVM.bind('click', function() {
|
||||
// Validate form first
|
||||
if (!$multiForm.valid()) {
|
||||
if ($multiForm.find('input.error:visible').size()) {
|
||||
if ($multiForm.find('input.error:visible').length) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -145,8 +145,8 @@
|
||||
resetTotal: function($popup) {
|
||||
var $total = $popup.data('notifications-attach-to').find('div.total span');
|
||||
var $items = $popup.find('ul li');
|
||||
var total = $items.size();
|
||||
var completed = $items.filter(':not(.pending)').size();
|
||||
var total = $items.length;
|
||||
var completed = $items.filter(':not(.pending)').length;
|
||||
var newTotal = total - completed;
|
||||
|
||||
if (newTotal < 0) newTotal = completed;
|
||||
@ -331,7 +331,7 @@
|
||||
var $attachTo, $popup;
|
||||
|
||||
// Notifications header area
|
||||
if ($target.closest('.notifications').size()) {
|
||||
if ($target.closest('.notifications').length) {
|
||||
$attachTo = $target.closest('.notifications');
|
||||
$popup = $attachTo.data('notifications-popup');
|
||||
notifications.popup.show($popup, $attachTo);
|
||||
@ -352,11 +352,11 @@
|
||||
}
|
||||
|
||||
// Popup
|
||||
if ($target.closest('div.notification-box').size()) {
|
||||
if ($target.closest('div.notification-box').length) {
|
||||
$popup = $target.closest('div.notification-box');
|
||||
|
||||
// Clear list
|
||||
if ($target.closest('.button.clear-list').size()) {
|
||||
if ($target.closest('.button.clear-list').length) {
|
||||
notifications.clear($popup);
|
||||
}
|
||||
|
||||
@ -379,7 +379,7 @@
|
||||
$(window).resize(function(event) {
|
||||
var $popup = $('div.notification-box:visible');
|
||||
|
||||
if ($popup.size())
|
||||
if ($popup.length)
|
||||
notifications.popup.reposition($popup, $popup.data('notifications-attach-to'));
|
||||
});
|
||||
})(window.jQuery, window.cloudStack, window._l);
|
||||
|
||||
@ -165,7 +165,7 @@
|
||||
|
||||
// Fix overlay
|
||||
setTimeout(function() {
|
||||
$('.tooltip-box').zIndex($(':ui-dialog').zIndex() + 10);
|
||||
$('.tooltip-box').css( "zIndex", $(':ui-dialog').css("zIndex") + 10);
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
@ -103,7 +103,7 @@
|
||||
var $li = $target.closest('li');
|
||||
|
||||
if ($target.is('li div.expand') && $li.data('tree-view-item-obj')) {
|
||||
if ($li.find('ul').size()) {
|
||||
if ($li.find('ul').length) {
|
||||
$li.find('ul').remove();
|
||||
$li.removeClass('expanded');
|
||||
|
||||
@ -128,7 +128,7 @@
|
||||
$treeView.find('li .name').removeClass('selected');
|
||||
$target.addClass('selected');
|
||||
|
||||
if ($browser && $browser.size()) {
|
||||
if ($browser && $browser.length) {
|
||||
$browser.cloudBrowser('addPanel', {
|
||||
partial: true,
|
||||
title: $target.html(),
|
||||
|
||||
@ -1430,7 +1430,7 @@
|
||||
args.response.success({
|
||||
data: items
|
||||
});
|
||||
if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.add').size() === 0){
|
||||
if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.add').length === 0){
|
||||
var $addAclRuleDivButton = jQuery('<div>').addClass('button add');
|
||||
var $spanAddAclRuleButtonMessage = jQuery('<span>').html(_l('label.add.ACL'));
|
||||
|
||||
@ -1474,7 +1474,7 @@
|
||||
});
|
||||
jQuery('#details-tab-aclRules').siblings('div.toolbar').append($addAclRuleDivButton);
|
||||
}
|
||||
if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.export').size() === 0){
|
||||
if(jQuery('#details-tab-aclRules').siblings('div.toolbar').children('div.export').length === 0){
|
||||
var $exportAclsDivButton = jQuery('<div>').addClass('button export');
|
||||
var $linkExportAclRulesButtonMessage = jQuery('<a>').html(_l('label.acl.export'));
|
||||
|
||||
|
||||
@ -43,11 +43,11 @@
|
||||
var $toolbar = $listView.find('> .toolbar');
|
||||
var $table = $listView.find('> .data-table');
|
||||
|
||||
equal($listView.size(), 1, 'List view present');
|
||||
equal($toolbar.size(), 1, 'Toolbar present');
|
||||
equal($table.size(), 1, 'Data table div present');
|
||||
equal($table.find('> .fixed-header table thead tr').size(), 1, 'Fixed header present');
|
||||
equal($table.find('> table.body tbody').size(), 1, 'Body table present');
|
||||
equal($listView.length, 1, 'List view present');
|
||||
equal($toolbar.length, 1, 'Toolbar present');
|
||||
equal($table.length, 1, 'Data table div present');
|
||||
equal($table.find('> .fixed-header table thead tr').length, 1, 'Fixed header present');
|
||||
equal($table.find('> table.body tbody').length, 1, 'Body table present');
|
||||
});
|
||||
|
||||
test('Fields: basic', function() {
|
||||
@ -60,7 +60,7 @@
|
||||
});
|
||||
var $fields = $listView.find('.fixed-header table thead tr th');
|
||||
|
||||
equal($fields.size(), 1, 'Column present');
|
||||
equal($fields.length, 1, 'Column present');
|
||||
ok($fields.hasClass('fieldA'), 'Has ID as classname');
|
||||
equal($fields.html(), 'TestFieldA', 'Has correct label');
|
||||
});
|
||||
@ -82,7 +82,7 @@
|
||||
$.each(testFields, function(k, v) {
|
||||
var $field = $fields.filter('.' + k);
|
||||
|
||||
equal($field.size(), 1, k + '-> Column present');
|
||||
equal($field.length, 1, k + '-> Column present');
|
||||
equal($field.html(), v.label, k + '-> Has correct label');
|
||||
});
|
||||
});
|
||||
@ -90,8 +90,8 @@
|
||||
test('Data loading state', function() {
|
||||
var $listView = listView();
|
||||
|
||||
equal($listView.find('table.body tr.loading').size(), 1, 'Row has loading state');
|
||||
equal($listView.find('table.body tr.loading td.loading.icon').size(), 1, 'Row cell has loading icon');
|
||||
equal($listView.find('table.body tr.loading').length, 1, 'Row has loading state');
|
||||
equal($listView.find('table.body tr.loading td.loading.icon').length, 1, 'Row cell has loading icon');
|
||||
});
|
||||
|
||||
asyncTest('Data provider: basic', function() {
|
||||
@ -111,7 +111,7 @@
|
||||
}
|
||||
});
|
||||
|
||||
equal($listView.find('.data-table table.body tbody tr.empty td').size(), 1, 'Body table has empty table row');
|
||||
equal($listView.find('.data-table table.body tbody tr.empty td').length, 1, 'Body table has empty table row');
|
||||
equal($listView.find('.data-table table.body tbody tr.empty td').html(), 'label.no.data', 'Empty contents notice displayed');
|
||||
});
|
||||
|
||||
@ -134,8 +134,8 @@
|
||||
}
|
||||
});
|
||||
|
||||
equal($listView.find('table.body tbody tr').size(), 1, 'Body table has table row');
|
||||
equal($listView.find('table.body tbody tr td').size(), 2, 'Body table has table cells');
|
||||
equal($listView.find('table.body tbody tr').length, 1, 'Body table has table row');
|
||||
equal($listView.find('table.body tbody tr td').length, 2, 'Body table has table cells');
|
||||
equal($listView.find('table.body tbody tr td.fieldA > span').html(), 'FieldDataA', 'FieldDataA content present');
|
||||
equal($listView.find('table.body tbody tr td.fieldB > span').html(), 'FieldDataB', 'FieldDataB content present');
|
||||
});
|
||||
@ -163,7 +163,7 @@
|
||||
}
|
||||
});
|
||||
|
||||
equal($listView.find('table.body tbody tr').size(), 3, 'Body table has correct # of table rows');
|
||||
equal($listView.find('table.body tbody tr').length, 3, 'Body table has correct # of table rows');
|
||||
|
||||
$(testData).map(function(index, data) {
|
||||
var $tr = $listView.find('table.body tbody tr').filter(function() {
|
||||
@ -198,9 +198,9 @@
|
||||
}
|
||||
});
|
||||
|
||||
equal($listView.find('table tr th').size(), 2, 'Correct number of header columns present');
|
||||
equal($listView.find('table.body tbody tr td').size(), 2, 'Correct number of data body columns present');
|
||||
ok(!$listView.find('table.body tbody td.fieldHidden').size(), 'Hidden field not present');
|
||||
equal($listView.find('table tr th').length, 2, 'Correct number of header columns present');
|
||||
equal($listView.find('table.body tbody tr td').length, 2, 'Correct number of data body columns present');
|
||||
ok(!$listView.find('table.body tbody td.fieldHidden').length, 'Hidden field not present');
|
||||
});
|
||||
|
||||
test('Filter dropdown', function() {
|
||||
@ -229,7 +229,7 @@
|
||||
var $filters = $listView.find('.filters select');
|
||||
|
||||
var testFilterDropdownContent = function() {
|
||||
equal($filters.find('option').size(), 2, 'Correct # of filters present');
|
||||
equal($filters.find('option').length, 2, 'Correct # of filters present');
|
||||
equal($filters.find('option:first').html(), 'FilterOnLabel', 'Filter on label present');
|
||||
equal($filters.find('option:last').html(), 'FilterOffLabel', 'Filter off label present');
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user