diff options
author | Ian Moore <ian.moore@fireeye.com> | 2015-07-29 12:12:26 -0400 |
---|---|---|
committer | Ian Moore <ian.moore@fireeye.com> | 2015-07-29 12:12:26 -0400 |
commit | 83e0bc0d26bd88925053ac3a6cc84edf7236f18e (patch) | |
tree | 18ac7e2f300934ba12dcdc20531b2de6813ffde9 /js | |
parent | 76a645369fd0dc61bca879ec5f083464d62a7369 (diff) | |
download | phpvirtualbox-83e0bc0d26bd88925053ac3a6cc84edf7236f18e.zip phpvirtualbox-83e0bc0d26bd88925053ac3a6cc84edf7236f18e.tar.gz phpvirtualbox-83e0bc0d26bd88925053ac3a6cc84edf7236f18e.tar.bz2 |
Move source tree up one level
Diffstat (limited to 'js')
-rw-r--r-- | js/canvasimages.js | 648 | ||||
-rw-r--r-- | js/chooser.js | 2445 | ||||
-rw-r--r-- | js/datamediator.js | 471 | ||||
-rw-r--r-- | js/dialogs.js | 1725 | ||||
-rw-r--r-- | js/eventlistener.js | 250 | ||||
-rw-r--r-- | js/jquery-1.11.2.min.js | 4 | ||||
-rw-r--r-- | js/jquery-ui-1.11.4.min.js | 13 | ||||
-rw-r--r-- | js/jquery.jec-1.3.1.js | 861 | ||||
-rw-r--r-- | js/jquery.projectPlugins.js | 972 | ||||
-rw-r--r-- | js/jquery.scrollTo-min.js | 11 | ||||
-rw-r--r-- | js/jquery.tipped-2.1b.min.js | 31 | ||||
-rw-r--r-- | js/phpvirtualbox.js | 4992 | ||||
-rw-r--r-- | js/utils.js | 1375 |
13 files changed, 13798 insertions, 0 deletions
diff --git a/js/canvasimages.js b/js/canvasimages.js new file mode 100644 index 0000000..eba4279 --- /dev/null +++ b/js/canvasimages.js @@ -0,0 +1,648 @@ +/**
+ * @fileOverview HTML5 canvas image functions
+ * @author Ian Moore (imoore76 at yahoo dot com)
+ * @version $Id: canvasimages.js 591 2015-04-11 22:40:47Z imoore76 $
+ * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
+ */
+
+/**
+ * Returns true if broswer supports canvas
+ * @return {Boolean} true if broswer supports canvas
+ */
+var __vboxIsCanvasSupported = null; // cached
+var isCanvasSupported = function(){
+ if(__vboxIsCanvasSupported === null) {
+ try {
+ var elem = document.createElement('canvas');
+ __vboxIsCanvasSupported = !!(elem && elem.getContext && elem.getContext('2d'));
+ } catch (err) {
+ __vboxIsCanvasSupported = false;
+ }
+ }
+ return __vboxIsCanvasSupported;
+};
+
+var __vboxPreviewCanvasCache = [];
+function vboxDrawPreviewCanvas(can, imageObj, text, width, height) {
+
+ var screenMargin = 7;
+ var margin = 10;
+
+ var resizeToImage = (imageObj && (imageObj.width == width));
+
+ // Height / width comes from direct image values
+ if(imageObj && resizeToImage) {
+
+ height = imageObj.height;
+ width = imageObj.width;
+
+ // Set height while maintaining aspect ratio
+ } else if (imageObj) {
+
+ height = imageObj.height * (width/imageObj.width);
+ }
+
+ // Margins are added to width
+ height += ((margin+screenMargin)*2);
+ width += ((margin+screenMargin)*2);
+
+ // Does canvas still exist?
+ // VM selection can change while this function is running
+ // in which case the canvas goes away
+ if(!can) return;
+
+ // Set canvas values
+ can.height = height;
+ can.width = width;
+
+ var ctx = can.getContext('2d');
+
+
+ // Clear the canvas
+ ctx.clearRect(0,0,width,height);
+
+ ctx.save();
+
+ // Draw and cache monitor image if it is not present
+ if(!__vboxPreviewCanvasCache[width+'x'+height]) {
+
+ var cachedCanvas = document.createElement('canvas');
+
+ cachedCanvas.width = width;
+ cachedCanvas.height = height;
+
+ var cachedCtx = cachedCanvas.getContext('2d');
+
+ cachedCtx.beginPath();
+ cachedCtx.strokeStyle = "#000000";
+ cachedCtx.lineWidth = 0.3;
+ cachedCtx.lineCap = 'butt';
+
+ cachedCtx.moveTo(margin*2,margin);
+
+ // top and top right
+ cachedCtx.lineTo(width-(margin*2), margin);
+ cachedCtx.arcTo(width-margin, margin, width-margin,margin*2, margin);
+
+ // Side and bottom right
+ cachedCtx.lineTo(width-margin, height-(margin*2));
+ cachedCtx.arcTo(width-margin, height-margin, width-(margin*2), height-margin, margin);
+
+ // bottom and bottom left
+ cachedCtx.lineTo(margin*2, height-margin);
+ cachedCtx.arcTo(margin, height-margin, margin, height-(margin*2), margin);
+
+ // Left line and top left
+ cachedCtx.lineTo(margin, margin*2);
+ cachedCtx.arcTo(margin, margin, margin * 2, margin, margin);
+
+ cachedCtx.closePath();
+ cachedCtx.save();
+ cachedCtx.shadowOffsetX = 5;
+ cachedCtx.shadowOffsetY = 5;
+ cachedCtx.shadowBlur = 4;
+ cachedCtx.shadowColor = "rgba(30, 30, 30, 0.2)";
+
+
+ var grad = cachedCtx.createLinearGradient(0, margin, 0, height);
+ grad.addColorStop(0, "rgb(200,200,200)");
+ grad.addColorStop(0.4, "rgb(100,100,100)");
+ grad.addColorStop(0.5, "rgb(66,66,66)");
+ grad.addColorStop(0.7, "rgb(100,100,100)");
+ grad.addColorStop(1, "rgb(200,200,200)");
+
+ cachedCtx.fillStyle = grad;
+
+ cachedCtx.fill();
+
+ // Redraw so that shadow is seen on all sides
+ cachedCtx.shadowOffsetX = -5;
+ cachedCtx.shadowOffsetY = -5;
+ cachedCtx.fill();
+ cachedCtx.restore();
+ cachedCtx.fillRect(margin+screenMargin,margin+screenMargin,width-(margin*2)-(screenMargin*2),height-(margin*2)-(screenMargin*2));
+ cachedCtx.stroke();
+ cachedCtx.restore();
+
+ var cvs = document.createElement('canvas');
+
+ /* Gloss */
+ var rectX = 0;
+ var rectY = 0;
+ var rectWidth = width-(margin+screenMargin)*2;
+ var rectHeight = height-(margin+screenMargin)*2;
+
+ cvs.width = rectWidth;
+ cvs.height = rectHeight;
+
+ var ctxBlur = cvs.getContext('2d');
+ ctxBlur.beginPath();
+ ctxBlur.lineWidth = 1;
+ ctxBlur.strokeStyle = "#000000";
+ ctxBlur.moveTo(rectX,rectY);
+ ctxBlur.lineTo(rectWidth, rectY);
+ ctxBlur.lineTo(rectWidth,rectHeight*1.0/3.0);
+ ctxBlur.bezierCurveTo(rectX+rectWidth / 2.0, rectY + rectHeight * 1.0/3.0,
+ rectX+rectWidth / 2.0, rectY + rectHeight * 2.0/3.0,
+ rectX, rectY + rectHeight * 2.0/3.0);
+ ctxBlur.closePath();
+ ctxBlur.fillStyle="rgba(255,255,255,0.3)";
+ ctxBlur.fill();
+
+ stackBlurCanvasRGBA( cvs, 0, 0, rectWidth, rectHeight, 17 );
+
+ ctx.drawImage(cvs, margin+screenMargin, margin+screenMargin, rectWidth, rectHeight);
+
+ __vboxPreviewCanvasCache[width+'x'+height] = {
+ 'monitor' : cachedCanvas,
+ 'gloss' : cvs
+ };
+
+ }
+
+ // Draw cached monitor canvas
+ ctx.drawImage(__vboxPreviewCanvasCache[width+'x'+height]['monitor'], 0, 0, width, height);
+
+ /* Screenshot */
+ if(imageObj) {
+
+ ctx.drawImage(imageObj, 0, 0, imageObj.width, imageObj.height, (margin+screenMargin), (margin+screenMargin), width-(margin*2)-(screenMargin*2),height-(margin*2)-(screenMargin*2));
+ }
+
+ // Draw cached gloss canvas
+ ctx.drawImage(__vboxPreviewCanvasCache[width+'x'+height]['gloss'], 0, 0, width, height);
+
+ /* Text */
+ if(!imageObj) {
+
+ txtCan = document.createElement('canvas');
+ txtCan.width = width-(margin+screenMargin)*2;
+ txtCan.height = height-(margin+screenMargin)*2;
+
+ fitTextToCanvas(txtCan, text, 18);
+
+ ctx.drawImage(txtCan, (margin+screenMargin), (margin+screenMargin));
+
+ }
+
+
+ return;
+}
+
+
+/* HELPERS */
+
+/**
+ * Fit text to a canvas element
+ *
+ * @author Ian Moore
+ */
+var fitTextToCanvas = function(can, text, fontSize) {
+
+ var lineHeightOffset = 1.4;
+ var lineHeight = fontSize * lineHeightOffset;
+ var minFontSize = 10;
+ var padding = 2;
+
+ var words = text.split(" ");
+
+ var maxWidth = can.width;
+ var maxHeight = can.height;
+ var context = can.getContext('2d');
+ context.moveTo(0,0);
+
+
+ var wrapTextLines = function() {
+
+ context.font = "bold " + fontSize + "pt Arial";
+
+ var line = '';
+ var lines = [];
+
+ for (var n = 0; n < words.length; n++) {
+
+ var testLine = line + (line.length ? ' ' : '') + words[n];
+
+ if((context.measureText(testLine).width + padding) > maxWidth) {
+
+ // Only one word is too big
+ if(testLine.indexOf(' ') == -1) {
+
+ if(fontSize > minFontSize) {
+ fontSize *= 0.9;
+ return wrapTextLines();
+ }
+ line = testLine;
+
+ } else {
+ lines[lines.length] = line;
+ line = words[n];
+ }
+
+ } else {
+
+ line = testLine;
+
+ }
+
+ }
+ if(line.length) {
+ if((context.measureText(line).width + padding) > maxWidth && fontSize > minFontSize) {
+ fontSize *= 0.9;
+ return wrapTextLines();
+ }
+ lines[lines.length] = line;
+ }
+ return lines;
+
+ };
+
+ // Initial wrap
+ lines = wrapTextLines();
+
+ // Since text will be aligned to the bottom, we subtract
+ // one lineheight addition because it will be off the
+ // visible canvas and should not be included in calculations
+ while(((lines.length * lineHeight)-(lineHeight-fontSize) > maxHeight) && fontSize > minFontSize) {
+ fontSize *= 0.9;
+ lines = wrapTextLines();
+ lineHeight = fontSize * lineHeightOffset;
+ }
+
+ context.fillStyle = "#ffffff";
+ context.textAlign = "center";
+ context.textBaseline = 'alphabetic';
+ context.strokeStyle = "#ff0000";
+
+ var totalHeight = Math.round((lines.length * lineHeight)-(lineHeight-fontSize));
+
+ for(var i = 0; i < lines.length; i++) {
+ /*
+ Uncomment to debug line heights
+
+ context.moveTo(0, (maxHeight/2)-(totalHeight/2)+(lineHeight*i));
+ context.lineTo(maxWidth, (maxHeight/2)-(totalHeight/2)+(lineHeight*i));
+ context.stroke();
+ context.moveTo(0, (maxHeight/2)-(totalHeight/2)+(lineHeight*i)+lineHeight);
+ context.lineTo(maxWidth, (maxHeight/2)-(totalHeight/2)+(lineHeight*i)+lineHeight);
+ context.stroke();
+ */
+ context.fillText(lines[i],(maxWidth/2),(maxHeight/2)-(totalHeight/2)+(lineHeight*i)+lineHeight-(lineHeight-fontSize));
+ }
+ return can;
+
+};
+
+/*
+
+StackBlur - a fast almost Gaussian Blur For Canvas
+
+Version: 0.5
+Author: Mario Klingemann
+Contact: mario@quasimondo.com
+Website: http://www.quasimondo.com/StackBlurForCanvas
+Twitter: @quasimondo
+
+In case you find this class useful - especially in commercial projects -
+I am not totally unhappy for a small donation to my PayPal account
+mario@quasimondo.de
+
+Or support me on flattr:
+https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript
+
+Copyright (c) 2010 Mario Klingemann
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+var mul_table = [
+ 512,512,456,512,328,456,335,512,405,328,271,456,388,335,292,512,
+ 454,405,364,328,298,271,496,456,420,388,360,335,312,292,273,512,
+ 482,454,428,405,383,364,345,328,312,298,284,271,259,496,475,456,
+ 437,420,404,388,374,360,347,335,323,312,302,292,282,273,265,512,
+ 497,482,468,454,441,428,417,405,394,383,373,364,354,345,337,328,
+ 320,312,305,298,291,284,278,271,265,259,507,496,485,475,465,456,
+ 446,437,428,420,412,404,396,388,381,374,367,360,354,347,341,335,
+ 329,323,318,312,307,302,297,292,287,282,278,273,269,265,261,512,
+ 505,497,489,482,475,468,461,454,447,441,435,428,422,417,411,405,
+ 399,394,389,383,378,373,368,364,359,354,350,345,341,337,332,328,
+ 324,320,316,312,309,305,301,298,294,291,287,284,281,278,274,271,
+ 268,265,262,259,257,507,501,496,491,485,480,475,470,465,460,456,
+ 451,446,442,437,433,428,424,420,416,412,408,404,400,396,392,388,
+ 385,381,377,374,370,367,363,360,357,354,350,347,344,341,338,335,
+ 332,329,326,323,320,318,315,312,310,307,304,302,299,297,294,292,
+ 289,287,285,282,280,278,275,273,271,269,267,265,263,261,259];
+
+
+var shg_table = [
+ 9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17,
+ 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19,
+ 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20,
+ 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
+ 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
+ 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
+ 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+ 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24 ];
+
+var stackBlurCanvasRGBA = function( canvas, top_x, top_y, width, height, radius )
+{
+ if ( isNaN(radius) || radius < 1 ) return;
+ radius |= 0;
+
+ //var canvas = document.getElementById( id );
+ var context = canvas.getContext("2d");
+ var imageData;
+
+ try {
+ try {
+ imageData = context.getImageData( top_x, top_y, width, height );
+ } catch(e) {
+
+ // NOTE: this part is supposedly only needed if you want to work with local files
+ // so it might be okay to remove the whole try/catch block and just use
+ // imageData = context.getImageData( top_x, top_y, width, height );
+ try {
+ netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
+ imageData = context.getImageData( top_x, top_y, width, height );
+ } catch(e) {
+ alert("Cannot access local image");
+ throw new Error("unable to access local image data: " + e);
+ return;
+ }
+ }
+ } catch(e) {
+ alert("Cannot access image");
+ throw new Error("unable to access image data: " + e);
+ }
+
+ var pixels = imageData.data;
+
+ var x, y, i, p, yp, yi, yw, r_sum, g_sum, b_sum, a_sum,
+ r_out_sum, g_out_sum, b_out_sum, a_out_sum,
+ r_in_sum, g_in_sum, b_in_sum, a_in_sum,
+ pr, pg, pb, pa, rbs;
+
+ var div = radius + radius + 1;
+ var widthMinus1 = width - 1;
+ var heightMinus1 = height - 1;
+ var radiusPlus1 = radius + 1;
+ var sumFactor = radiusPlus1 * ( radiusPlus1 + 1 ) / 2;
+
+ var stackStart = new BlurStack();
+ var stack = stackStart;
+ for ( i = 1; i < div; i++ )
+ {
+ stack = stack.next = new BlurStack();
+ if ( i == radiusPlus1 ) var stackEnd = stack;
+ }
+ stack.next = stackStart;
+ var stackIn = null;
+ var stackOut = null;
+
+ yw = yi = 0;
+
+ var mul_sum = mul_table[radius];
+ var shg_sum = shg_table[radius];
+
+ for ( y = 0; y < height; y++ )
+ {
+ r_in_sum = g_in_sum = b_in_sum = a_in_sum = r_sum = g_sum = b_sum = a_sum = 0;
+
+ r_out_sum = radiusPlus1 * ( pr = pixels[yi] );
+ g_out_sum = radiusPlus1 * ( pg = pixels[yi+1] );
+ b_out_sum = radiusPlus1 * ( pb = pixels[yi+2] );
+ a_out_sum = radiusPlus1 * ( pa = pixels[yi+3] );
+
+ r_sum += sumFactor * pr;
+ g_sum += sumFactor * pg;
+ b_sum += sumFactor * pb;
+ a_sum += sumFactor * pa;
+
+ stack = stackStart;
+
+ for( i = 0; i < radiusPlus1; i++ )
+ {
+ stack.r = pr;
+ stack.g = pg;
+ stack.b = pb;
+ stack.a = pa;
+ stack = stack.next;
+ }
+
+ for( i = 1; i < radiusPlus1; i++ )
+ {
+ p = yi + (( widthMinus1 < i ? widthMinus1 : i ) << 2 );
+ r_sum += ( stack.r = ( pr = pixels[p])) * ( rbs = radiusPlus1 - i );
+ g_sum += ( stack.g = ( pg = pixels[p+1])) * rbs;
+ b_sum += ( stack.b = ( pb = pixels[p+2])) * rbs;
+ a_sum += ( stack.a = ( pa = pixels[p+3])) * rbs;
+
+ r_in_sum += pr;
+ g_in_sum += pg;
+ b_in_sum += pb;
+ a_in_sum += pa;
+
+ stack = stack.next;
+ }
+
+
+ stackIn = stackStart;
+ stackOut = stackEnd;
+ for ( x = 0; x < width; x++ )
+ {
+ pixels[yi+3] = pa = (a_sum * mul_sum) >> shg_sum;
+ if ( pa != 0 )
+ {
+ pa = 255 / pa;
+ pixels[yi] = ((r_sum * mul_sum) >> shg_sum) * pa;
+ pixels[yi+1] = ((g_sum * mul_sum) >> shg_sum) * pa;
+ pixels[yi+2] = ((b_sum * mul_sum) >> shg_sum) * pa;
+ } else {
+ pixels[yi] = pixels[yi+1] = pixels[yi+2] = 0;
+ }
+
+ r_sum -= r_out_sum;
+ g_sum -= g_out_sum;
+ b_sum -= b_out_sum;
+ a_sum -= a_out_sum;
+
+ r_out_sum -= stackIn.r;
+ g_out_sum -= stackIn.g;
+ b_out_sum -= stackIn.b;
+ a_out_sum -= stackIn.a;
+
+ p = ( yw + ( ( p = x + radius + 1 ) < widthMinus1 ? p : widthMinus1 ) ) << 2;
+
+ r_in_sum += ( stackIn.r = pixels[p]);
+ g_in_sum += ( stackIn.g = pixels[p+1]);
+ b_in_sum += ( stackIn.b = pixels[p+2]);
+ a_in_sum += ( stackIn.a = pixels[p+3]);
+
+ r_sum += r_in_sum;
+ g_sum += g_in_sum;
+ b_sum += b_in_sum;
+ a_sum += a_in_sum;
+
+ stackIn = stackIn.next;
+
+ r_out_sum += ( pr = stackOut.r );
+ g_out_sum += ( pg = stackOut.g );
+ b_out_sum += ( pb = stackOut.b );
+ a_out_sum += ( pa = stackOut.a );
+
+ r_in_sum -= pr;
+ g_in_sum -= pg;
+ b_in_sum -= pb;
+ a_in_sum -= pa;
+
+ stackOut = stackOut.next;
+
+ yi += 4;
+ }
+ yw += width;
+ }
+
+
+ for ( x = 0; x < width; x++ )
+ {
+ g_in_sum = b_in_sum = a_in_sum = r_in_sum = g_sum = b_sum = a_sum = r_sum = 0;
+
+ yi = x << 2;
+ r_out_sum = radiusPlus1 * ( pr = pixels[yi]);
+ g_out_sum = radiusPlus1 * ( pg = pixels[yi+1]);
+ b_out_sum = radiusPlus1 * ( pb = pixels[yi+2]);
+ a_out_sum = radiusPlus1 * ( pa = pixels[yi+3]);
+
+ r_sum += sumFactor * pr;
+ g_sum += sumFactor * pg;
+ b_sum += sumFactor * pb;
+ a_sum += sumFactor * pa;
+
+ stack = stackStart;
+
+ for( i = 0; i < radiusPlus1; i++ )
+ {
+ stack.r = pr;
+ stack.g = pg;
+ stack.b = pb;
+ stack.a = pa;
+ stack = stack.next;
+ }
+
+ yp = width;
+
+ for( i = 1; i <= radius; i++ )
+ {
+ yi = ( yp + x ) << 2;
+
+ r_sum += ( stack.r = ( pr = pixels[yi])) * ( rbs = radiusPlus1 - i );
+ g_sum += ( stack.g = ( pg = pixels[yi+1])) * rbs;
+ b_sum += ( stack.b = ( pb = pixels[yi+2])) * rbs;
+ a_sum += ( stack.a = ( pa = pixels[yi+3])) * rbs;
+
+ r_in_sum += pr;
+ g_in_sum += pg;
+ b_in_sum += pb;
+ a_in_sum += pa;
+
+ stack = stack.next;
+
+ if( i < heightMinus1 )
+ {
+ yp += width;
+ }
+ }
+
+ yi = x;
+ stackIn = stackStart;
+ stackOut = stackEnd;
+ for ( y = 0; y < height; y++ )
+ {
+ p = yi << 2;
+ pixels[p+3] = pa = (a_sum * mul_sum) >> shg_sum;
+ if ( pa > 0 )
+ {
+ pa = 255 / pa;
+ pixels[p] = ((r_sum * mul_sum) >> shg_sum ) * pa;
+ pixels[p+1] = ((g_sum * mul_sum) >> shg_sum ) * pa;
+ pixels[p+2] = ((b_sum * mul_sum) >> shg_sum ) * pa;
+ } else {
+ pixels[p] = pixels[p+1] = pixels[p+2] = 0;
+ }
+
+ r_sum -= r_out_sum;
+ g_sum -= g_out_sum;
+ b_sum -= b_out_sum;
+ a_sum -= a_out_sum;
+
+ r_out_sum -= stackIn.r;
+ g_out_sum -= stackIn.g;
+ b_out_sum -= stackIn.b;
+ a_out_sum -= stackIn.a;
+
+ p = ( x + (( ( p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1 ) * width )) << 2;
+
+ r_sum += ( r_in_sum += ( stackIn.r = pixels[p]));
+ g_sum += ( g_in_sum += ( stackIn.g = pixels[p+1]));
+ b_sum += ( b_in_sum += ( stackIn.b = pixels[p+2]));
+ a_sum += ( a_in_sum += ( stackIn.a = pixels[p+3]));
+
+ stackIn = stackIn.next;
+
+ r_out_sum += ( pr = stackOut.r );
+ g_out_sum += ( pg = stackOut.g );
+ b_out_sum += ( pb = stackOut.b );
+ a_out_sum += ( pa = stackOut.a );
+
+ r_in_sum -= pr;
+ g_in_sum -= pg;
+ b_in_sum -= pb;
+ a_in_sum -= pa;
+
+ stackOut = stackOut.next;
+
+ yi += width;
+ }
+ }
+
+ context.putImageData( imageData, top_x, top_y );
+
+};
+
+
+
+var BlurStack = function()
+{
+ this.r = 0;
+ this.g = 0;
+ this.b = 0;
+ this.a = 0;
+ this.next = null;
+};
diff --git a/js/chooser.js b/js/chooser.js new file mode 100644 index 0000000..dcdc8e0 --- /dev/null +++ b/js/chooser.js @@ -0,0 +1,2445 @@ +/**
+ *
+ * @fileOverview Chooser (vm list) singleton. Provides vboxChooser
+ * @author Ian Moore (imoore76 at yahoo dot com)
+ * @version $Id: chooser.js 591 2015-04-11 22:40:47Z imoore76 $
+ * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
+ *
+ */
+
+/**
+ * Chooser selection mode constants
+ */
+var vboxSelectionModeNone = 0;
+var vboxSelectionModeSingleVM = 1;
+var vboxSelectionModeMultiVM = 2;
+var vboxSelectionModeSingleGroup = 3;
+
+
+/**
+ * @namespace vboxChooser
+ *
+ * Draws machine selection chooser and controls selection list
+ * @see js/eventlistener.js
+ */
+var vboxChooser = {
+
+ // VM list
+ vms : {},
+
+ // VM tool tip
+ _vmToolTip : '<nobr>%1<br></nobr><nobr>%2 since %3</nobr><br><nobr>Session %4</nobr>',
+
+ // Anchor element
+ _anchorid : null,
+ _anchor : null,
+
+ /* Internal list of all unique selected items */
+ _selectedList : [],
+
+ /* List of unique selected VMs */
+ selectedVMs : [],
+
+ /* Holds group definitions */
+ _groupDefs : [],
+
+ /* selection mode can be
+
+ var vboxSelectionModeNone = 0,
+ var vboxSelectionModeSingleVM = 1,
+ var vboxSelectionModeMultiVM = 2,
+ var vboxSelectionModeSingleGroup = 3,
+ */
+ selectionMode : vboxSelectionModeNone,
+
+ /* Check phpVirtualBox version and VirtualBox
+ * version compatibility.
+ */
+ _versionChecked : false,
+
+ /* Some items are not editable while vmGroup
+ * definitions are being written
+ */
+ _editable : true,
+
+ /* Context menus */
+ _vmContextMenuObj : null,
+ _vmGroupContextMenuObj : null,
+
+ /* Holds history of showing only single groups */
+ _showOnlyGroupHistory : [],
+
+ /* Group definition extra value key */
+ _groupDefinitionKey : '',
+
+ /* Whether chooser is in compact mode or not */
+ _compact : false,
+
+ /**
+ * Set anchor id to draw to
+ */
+ setAnchorId : function(aid) {
+ vboxChooser._anchorid = aid;
+ vboxChooser._anchor = $('#'+aid);
+
+ vboxChooser._anchor.html("<div id='vboxChooserSpinner' style='text-align: center'><div><img src='images/spinner.gif' /></div></div>");
+
+ vboxChooser._anchor.hover(function(){
+ $(this).addClass('vboxChooserDropTargetHoverRoot');
+ },function() {
+ $(this).removeClass('vboxChooserDropTargetHoverRoot');
+ });
+
+ $(window).resize(function(){
+
+ // Get anchor id and add / remove class
+ var w = parseInt($(vboxChooser._anchor).innerWidth());
+ if(w < 120) {
+ $(vboxChooser._anchor).addClass('vboxChooserMini');
+ vboxChooser._compact = true;
+ } else {
+ $(vboxChooser._anchor).removeClass('vboxChooserMini');
+ vboxChooser._compact = false;
+ }
+
+ vboxChooser._resizeElements(true);
+
+ });
+ },
+
+ /**
+ * Set context menus
+ *
+ */
+ setContextMenu : function(target, menuitems) {
+
+ switch(target) {
+
+ // Group menu
+ case 'group':
+ vboxChooser._vmGroupContextMenuObj = new vboxMenu(vboxChooser._anchorid+'vmgroups',null,menuitems);
+ vboxChooser._vmGroupContextMenuObj.update();
+ break;
+
+ // VM Menu
+ case 'vm':
+ vboxChooser._vmContextMenuObj = new vboxMenu(vboxChooser._anchorid+'vms',null,menuitems);
+ vboxChooser._vmContextMenuObj.update();
+ break;
+
+ // Main list menu
+ case 'anchor':
+
+ var vboxChooserPaneMenu = new vboxMenu(vboxChooser._anchorid+'Pane',null,menuitems);
+ $('#'+vboxChooser._anchorid).parent().contextMenu({
+ menu: vboxChooserPaneMenu.menuId()
+ },
+ vboxChooserPaneMenu.menuClickCallback
+ );
+
+ break;
+
+ default:
+ vboxAlert('vboxChooser::setContextMenu: unknown context menu type (' + target + ')');
+ }
+ },
+
+ /*
+ * Return true if a selected VM is in the given state
+ */
+ isSelectedInState : function(state) {
+
+ for(var i = 0; i < vboxChooser.selectedVMs.length; i++) {
+ if(vboxVMStates['is'+state](vboxVMDataMediator.getVMData(vboxChooser.selectedVMs[i])))
+ return true;
+ }
+ return false;
+
+ },
+
+ /**
+ * Return true if the passed VM is selected
+ */
+ isVMSelected : function(vmid) {
+ return (jQuery.inArray(vmid,vboxChooser.selectedVMs) > -1);
+ },
+
+ /**
+ * Return selected VM data in array
+ */
+ getSelectedVMsData : function() {
+
+ var vms = [];
+ for(var i = 0; i < vboxChooser.selectedVMs.length; i++) {
+ vms[vms.length] = vboxVMDataMediator.getVMData(vboxChooser.selectedVMs[i]);
+ }
+ return vms;
+ },
+
+ /**
+ * Triggered when selection list has changed
+ */
+ selectionListChanged : function(selectionList) {
+
+ if(!selectionList) selectionList = [];
+
+ selectionMode = vboxSelectionModeNone;
+
+ // Hold unique selected VMs
+ var vmListUnique = {};
+ for(var i = 0; i < selectionList.length; i++) {
+ if(selectionList[i].type == 'group') {
+ vboxChooser.getGroupElement(selectionList[i].groupPath, true).find('table.vboxChooserVM:not(.ui-draggable-dragging)').each(function(idx,elm){
+ if(elm) {
+ var vmid = $(elm).data('vmid');
+ if(vmid)
+ vmListUnique[vmid] = vmid;
+ }
+ });
+ switch(selectionMode) {
+ case vboxSelectionModeSingleGroup:
+ case vboxSelectionModeSingleVM:
+ selectionMode = vboxSelectionModeMultiVM;
+ break;
+ case vboxSelectionModeNone:
+ selectionMode = vboxSelectionModeSingleGroup;
+ }
+ } else {
+ switch(selectionMode) {
+ case vboxSelectionModeNone:
+ selectionMode = vboxSelectionModeSingleVM;
+ break;
+ default:
+ selectionMode = vboxSelectionModeMultiVM;
+ }
+
+ vmListUnique[selectionList[i].id] = selectionList[i].id;
+ }
+ }
+
+ // Change selection list
+ var selectedVMs = [];
+ for(var i in vmListUnique) {
+ selectedVMs[selectedVMs.length] = i;
+ }
+
+ vboxChooser.selectedVMs = selectedVMs;
+
+ // If there is only one unique vm selected,
+ // selection mode becomes single VM if the
+ // current selection mode is not singleGroup
+ if(vboxChooser.selectedVMs.length == 1 && selectionMode != vboxSelectionModeSingleGroup)
+ selectionMode = vboxSelectionModeSingleVM;
+
+ vboxChooser.selectionMode = selectionMode;
+
+ vboxChooser._selectedList = selectionList;
+
+ $('#vboxPane').trigger('vmSelectionListChanged',[vboxChooser]);
+
+
+ },
+
+ /**
+ * Return the single selected VM's id if
+ * only one vm is selected. Else null.
+ */
+ getSingleSelectedId : function() {
+ if(vboxChooser.selectedVMs.length == 1) {
+ return vboxChooser.selectedVMs[0];
+ }
+ return null;
+ },
+
+ /*
+ * Return a single vm if only one is selected.
+ * Else null.
+ */
+ getSingleSelected : function() {
+ if(vboxChooser.selectedVMs.length == 1) {
+ return vboxVMDataMediator.getVMData(vboxChooser.selectedVMs[0]);
+ }
+ return null;
+ },
+
+ /*
+ * Update list of VMs from data received
+ * from ajax query
+ */
+ updateList : function(vmlist) {
+
+ // We were stopped before the request returned data
+ if(!vboxChooser._running) return;
+
+
+ // No list? Something is wrong
+ if(!vmlist) {
+
+ phpVirtualBoxFailure();
+
+ vboxChooser.stop();
+ vboxChooser._anchor.children().remove();
+ return;
+ }
+
+ // Remove spinner
+ vboxChooser._anchor.children().remove();
+
+ // Render host
+ vboxChooser._anchor.append(vboxChooser.vmHTML(
+ {
+ 'id':'host',
+ 'state':'Hosting',
+ 'owner':'',
+ 'name':$('#vboxPane').data('vboxConfig').name,
+ 'OSTypeId':'VirtualBox_Host'
+ }
+ ));
+
+ // Render root group
+ vboxChooser._anchor.append(vboxChooser.groupHTML("/"));
+
+ // Enforce VM ownership
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership && !$('#vboxPane').data('vboxSession').admin) {
+ vmlist = jQuery.grep(vmlist,function(vm,i){
+ return (vm.owner == $('#vboxPane').data('vboxSession').user);
+ });
+ }
+
+ var groups = [];
+ // Each item in list
+ for(var i = 0; i < vmlist.length; i++) {
+ // Update
+ vboxChooser.updateVMElement(vmlist[i], true);
+ groups = groups.concat(vmlist[i].groups);
+ }
+
+ // Sort groups
+ var groupsSorted = {};
+ for(var i = 0; i < groups.length; i++) {
+ if(groupsSorted[groups[i]]) continue;
+ groupsSorted[groups[i]] = true;
+ var gElm = vboxChooser.getGroupElement(groups[i], true);
+ if(gElm[0]) vboxChooser.sortGroup(gElm);
+ }
+
+ // compose group definitions
+ vboxChooser.composeGroupDef();
+
+ // Set initial resize
+ vboxChooser._initialResize = true;
+ vboxChooser._resizeElements(true);
+
+ },
+
+ /*
+ * Save collapsed group list
+ */
+ _collapsedGroups : [],
+ _saveCollapsedGroups : function(){
+
+ // Write out collapsed group list
+ var cGroupList = [];
+ vboxChooser._anchor.find('div.vboxVMGroupCollapsed:not(.ui-draggable-dragging)').each(function(idx,elm) {
+ cGroupList[cGroupList.length] = $(elm).data('vmGroupPath');
+ });
+
+ var groupListKey = $('#vboxPane').data('vboxConfig').key+'-collapsedGroups';
+ vboxSetLocalDataItem(groupListKey, cGroupList.join(','), true);
+
+ // Cache instead of using local storage
+ vboxChooser._collapsedGroups = cGroupList;
+ },
+
+ /*
+ * Return true if group is collapsed
+ */
+ _isGroupCollapsed : function(gpath) {
+ return(jQuery.inArray(gpath,vboxChooser._collapsedGroups) > -1);
+ },
+
+ /*
+ * Resize group and VM titles
+ */
+ _scrollbarWidth : 0,
+ _scrollbarWasVisible: false,
+ _initialResize: false,
+ _resizeElements : function(forceResize) {
+
+ // Haven't completed our initial resizing yet
+ if(!vboxChooser._initialResize) {
+ return;
+ }
+
+ var sbVisible = (vboxChooser._anchor.get(0).scrollHeight > vboxChooser._anchor.height());
+
+ // Nothing changed since resize
+ if(!forceResize && (sbVisible == vboxChooser._scrollbarWasVisible)) {
+ return;
+ }
+
+ vboxChooser._scrollbarWasVisible = sbVisible;
+
+ var groupTitleWidth = vboxChooser._anchor.width() - (vboxChooser._compact ? 22 : 32) - (sbVisible ? vboxChooser._scrollbarWidth : 0);
+ var vmTitleWidth = groupTitleWidth - (vboxChooser._compact ? -12 : 18); // (2px padding on .vboxChooserGroupVMs +
+ // 2px border on table + 4px margin on icon) * 2
+ var groupLevelOffset = (vboxChooser._compact ? 8 : 8); // (2px margin + 2px border) * 2
+
+
+ // Now that we have sizes, we can inject styles
+ $('#vboxChooserStyle').empty().remove();
+
+ var styleRules = [];
+ var path = ['div.vboxChooserGroupRootLevel'];
+
+ // Special case for root level VM list
+ styleRules[styleRules.length] = 'div.vboxChooserGroupRootLevel > div.vboxChooserGroupVMs table.vboxChooserVM div.vboxFitToContainer { width: ' + vmTitleWidth + 'px; }';
+
+ // Special case for group header when only showing one group
+ styleRules[styleRules.length] = 'div.vboxChooserGroupShowOnly.vboxChooserGroupRootLevel > div.vboxChooserGroupHeader span.vboxChooserGroupName { max-width: ' + (groupTitleWidth - 4) + 'px; }';
+
+ // Bottom group resize bars
+ styleRules[styleRules.length] = 'div.vboxChooserGroupRootLevel > div.vboxChooserDropTargetBottom { width: ' + (groupTitleWidth) + 30 + 'px; }';
+
+ for(var i = 1; i < 11; i++) {
+
+ // Group titles at this level
+ styleRules[styleRules.length] = path.join(' > ') + ' > div.vboxChooserGroup > div.vboxChooserGroupHeader span.vboxChooserGroupName { max-width: ' + (groupTitleWidth - (i*groupLevelOffset)) + 'px; }';
+
+ // VM titles at this level
+ styleRules[styleRules.length] = path.join(' > ') + ' > div.vboxChooserGroup > div.vboxChooserGroupVMs table.vboxChooserVM div.vboxFitToContainer { width: ' + (vmTitleWidth - (i*(groupLevelOffset))) + 'px; }';
+
+ // Bottom group resize bars
+ styleRules[styleRules.length] = path.join(' > ') +' > div.vboxChooserGroup > div.vboxChooserDropTargetBottom { width: ' + (groupTitleWidth + 30 - (i*groupLevelOffset)) + 'px; }';
+
+ path[path.length] = 'div.vboxChooserGroup';
+ }
+
+ // Style for minified vmlist
+ if(vboxChooser._compact) {
+ // Title moves left
+ styleRules[styleRules.length] = 'div.vboxChooserGroup > div.vboxChooserGroupVMs table.vboxChooserVM div.vboxVMName { position: relative; left: -20px; }';
+ // Icon moves down
+ styleRules[styleRules.length] = 'div.vboxChooserGroup > div.vboxChooserGroupVMs table.vboxChooserVM img.vboxVMIcon { position: relative; top: 8px; }';
+ // State text goes away
+ styleRules[styleRules.length] = 'div.vboxChooserGroup > div.vboxChooserGroupVMs table.vboxChooserVM span.vboxVMState { display: none; }';
+ // Less padding
+ styleRules[styleRules.length] = 'div.vboxChooserGroup > div.vboxChooserGroupVMs table.vboxChooserVM td { padding: 0px; }';
+ // Some group header items and drop targets go away
+ styleRules[styleRules.length] = 'div.vboxChooserGroup > div.vboxChooserGroupHeader > .vboxChooserGroupNameArrowCollapse, #' +vboxChooser._anchorid + ' div.vboxChooserGroup .vboxChooserDropTarget { display: none; }';
+ styleRules[styleRules.length] = 'div.vboxChooserGroup { overflow: hidden; }';
+ // host
+ styleRules[styleRules.length] = '#vboxChooserVMHost .vboxVMState { display: none; }';
+ // group header
+ styleRules[styleRules.length] = 'div.vboxChooserGroup div.vboxChooserGroupHeader { height: auto; padding: 2px; }';
+
+ }
+ $('head').append('<style type="text/css" id="vboxChooserStyle">#'+vboxChooser._anchorid + ' ' + styleRules.join("\n#"+vboxChooser._anchorid + " ") + '</style>');
+
+ },
+
+ /*
+ * Get group element by path
+ */
+ getGroupElement : function(gpath, noCreate) {
+
+ if(!gpath) gpath = '/';
+ var gnames = gpath.split('/');
+ var groot = vboxChooser._anchor.children('div.vboxChooserGroup:not(.ui-draggable-dragging)');
+ for(var i = 1; i < gnames.length; i++) {
+
+ if(!gnames[i]) continue;
+
+ var group = groot.children('div.vboxChooserGroup:not(.ui-draggable-dragging)').children('div.vboxChooserGroupIdentifier[title="'+gnames[i]+'"]').parent();
+
+ // If it does not exist, create it
+ if(!group[0]) {
+
+ if(noCreate) return null;
+
+ var gpath = '/';
+ for(var a = 1; a <= i; a++) {
+ gpath = gpath + '/' + gnames[a];
+ }
+ gpath = gpath.replace('//','/');
+
+ vboxChooser.groupHTML(gpath).insertBefore(groot.children('div.vboxChooserGroupVMs'));
+
+ vboxChooser.sortGroup(groot);
+
+ // Resize chooser elements
+ vboxChooser._initialResize = true;
+ vboxChooser._resizeElements();
+
+ groot = groot.children('div.vboxChooserGroup:not(.ui-draggable-dragging)').children('div.vboxChooserGroupIdentifier[title="'+gnames[i]+'"]').parent();
+
+ } else {
+ groot = group;
+ }
+
+ }
+ return groot;
+ },
+
+ /*
+ *
+ * Update VM elements
+ *
+ */
+ updateVMElement : function(vmUpdate, newVM) {
+
+ // Not running.. don't do anything
+ if(!vboxChooser._running) return;
+
+ // Stale event after vm was removed
+ if(!vmUpdate) return;
+
+ // New VM
+ if(newVM) {
+
+ // New VM.. add it to groups..
+ if(!vmUpdate.groups || vmUpdate.groups.length == 0)
+ vmUpdate.groups = ['/'];
+
+ for(var i = 0; i < vmUpdate.groups.length; i++) {
+ var gElm = $(vboxChooser.getGroupElement(vmUpdate.groups[i]));
+ vboxChooser.vmHTML(vmUpdate).appendTo(
+ gElm.children('div.vboxChooserGroupVMs')
+ );
+ }
+
+ // Existing VM. Replace existing elements
+ } else {
+
+ $('#'+vboxChooser._anchorid).find('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmUpdate.id).each(function(i,elm){
+
+ var newHTML = vboxChooser.vmHTML(vmUpdate);
+ if($(elm).hasClass('vboxListItemSelected')) {
+ $(newHTML).addClass('vboxListItemSelected').removeClass('vboxHover');
+ }
+ $(elm).children().replaceWith(newHTML.children());
+ });
+
+ }
+
+ },
+
+
+ /*
+ * Returns true if there are VMs with ID vmid that are not selected
+ */
+ vmHasUnselectedCopy : function (vmid) {
+ return ($(vboxChooser._anchor).find('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmid+':not(.vboxListItemSelected)').length > 0);
+ },
+
+ /*
+ * Remove selected VMs from the list and rewrite group definitions
+ * this assumes that there are other copies of these VMs that are not
+ * selected.
+ */
+ removeVMs : function(vmids) {
+
+ for(var i = 0; i < vmids.length; i++) {
+ $(vboxChooser._anchor).find('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmids[i]+'.vboxListItemSelected').remove();
+ }
+
+ // Update selection list
+ vboxChooser._selectedList = vboxChooser._selectedList.filter(function(v){
+ return (v.type == 'group' || (jQuery.inArray(v.id, vmids) == -1));
+ });
+
+ // Tell interface that selection list has changed
+ vboxChooser.selectionListChanged(vboxChooser._selectedList);
+
+ // compose and save group definitions
+ vboxChooser.composeGroupDef(true);
+
+
+ // Possible resize needed
+ vboxChooser._resizeElements(true);
+
+ },
+
+ /*
+ * Generate HTML from VM definition
+ */
+ vmHTML : function (vmn) {
+
+ var tbl = $('<table />').attr({'class':'vboxChooserItem-'+vboxChooser._anchorid+'-'+vmn.id + " vboxChooserVM"})
+ .on('mousedown',vboxChooser.selectItem)
+ .hoverClass('vboxHover').data('vmid',vmn.id);
+
+
+ // Drag-and-drop functionality
+ /////////////////////////////////
+ if(vmn.id != 'host' && $('#vboxPane').data('vboxSession').admin) {
+
+ $(tbl).draggable({'cursorAt':{left: -10, top: -10},'helper':function(){
+ return $(this).clone().css({'width':($(this).width()+2)+'px','display':'inline','background':'#fff','border-color':'#69f'}).removeClass('vboxHover');
+
+ // drag start
+ },'start':function(e) {
+
+ if(!vboxChooser._editable) return false;
+
+ $(vboxChooser._anchor).disableSelection();
+ vboxChooser._dragging = vmn.id;
+ $(vboxChooser._anchor).find('table.vboxHover').removeClass('vboxHover');
+
+ // drag stop
+ },'stop':function(e) {
+ vboxChooser.vmDropped(e, $(this));
+ }});
+ }
+
+ // Functionality to drop above / below VM
+ /////////////////////////////////////////////
+ var td = $('<td />').attr({'colspan':'2'}).addClass('vboxChooserDropTarget vboxDropTargetTop');
+ if(vmn.id != 'host') {
+ td.hover(function(){
+ if(vboxChooser._dragging && vboxChooser._dragging != vmn.id)
+ $(this).addClass('vboxChooserDropTargetHover');
+ },function(){
+ $(this).removeClass('vboxChooserDropTargetHover');
+ }
+ );
+ }
+ $('<tr />').append(td).appendTo(tbl);
+
+
+
+ // VM OS type icon
+ var tr = $('<tr />');
+ if($('#vboxPane').data('vboxConfig').enableCustomIcons && vmn.customIcon) {
+ $('<td />').attr({'rowspan':'2'}).html("<img src='" + vmn.customIcon + "' class='vboxVMIcon' />").appendTo(tr);
+ } else {
+ $('<td />').attr({'rowspan':'2'}).html("<img src='images/vbox/" + vboxGuestOSTypeIcon(vmn.OSTypeId) + "' class='vboxVMIcon" + (vmn.id == 'host' ? " vboxHostIcon" : "") + "' />").appendTo(tr);
+ }
+
+
+ // VM Name
+ var td = $('<td />').attr({'class':'vboxVMTitle'});
+
+ // Host will have HTML in name and unique id
+ if(vmn.id == 'host') {
+
+ $(tbl).attr('id', 'vboxChooserVMHost');
+
+ // Check for multiple server config
+ if($('#vboxPane').data('vboxConfig').servers.length) {
+
+ // If there are multiple servers configured, setup menu
+ if(!$('#vboxServerMenu')[0]) {
+ var servers = $('#vboxPane').data('vboxConfig').servers;
+ var ul = $('<ul />').attr({'id':'vboxServerMenu','style':'display: none','class':'contextMenu'});
+ for(var i = 0; i < servers.length; i++) {
+ $('<li />').html("<a href='#" + $('<div />').html(servers[i].name).text() + "' style='background-image: url(images/vbox/OSE/VirtualBox_16px.png);'>"+$('<div />').html(servers[i].name).text()+"</a>").appendTo(ul);
+ }
+ $('#vboxPane').append(ul);
+ }
+
+ var span = $('<span />').attr({'class':'vboxServerLink'}).text('('+$('#vboxPane').data('vboxConfig').name+')').contextMenu({
+ menu: 'vboxServerMenu',
+ button: 0,
+ mode: 'menu'
+ },
+ function(a) {
+
+ if(a == $('#vboxPane').data('vboxConfig').name) return;
+
+ // Show loading screen
+ var l = new vboxLoader();
+ l.showLoading();
+
+ // Empty selection list
+ vboxChooser.selectionListChanged();
+
+
+ // Unsubscribe from events
+ $.when(vboxEventListener.stop()).done(function() {
+
+ // Expire data mediator data
+ vboxVMDataMediator.expireAll();
+
+ // Trigger host change
+ vboxSetCookie("vboxServer",a);
+ $('#vboxPane').trigger('hostChange',[a]);
+
+ }).always(function(){
+
+ // remove loading screen
+ l.removeLoading();
+
+ });
+
+
+ }
+ );
+ $(td).html('<span class="vboxVMName">VirtualBox</span> ').append(span);
+ } else {
+ $(td).html('<span class="vboxVMName">VirtualBox</span> ('+vmn.name+')');
+ }
+
+ // Not rendering host
+ } else {
+
+ $(td).append('<div class="vboxFitToContainer vboxVMName"><span class="vboxVMName">'+$('<span />').text(vmn.name).html()+'</span>'+ (vmn.currentSnapshotName ? '<span class="vboxVMChooserSnapshotName"> (' + $('<span />').text(vmn.currentSnapshotName).html() + ')</span>' : '')+'</div>');
+
+
+ // Table gets tool tips
+ tip = trans(vboxChooser._vmToolTip, 'UIVMListView').replace('%1',('<b>'+$('<span />')
+ .text(vmn.name).html()+'</b>'+(vmn.currentSnapshotName ? ' (' + $('<span />')
+ .text(vmn.currentSnapshotName).html() + ')' : '')))
+ .replace('%2',trans(vboxVMStates.convert(vmn.state),'VBoxGlobal'))
+ .replace('%3',vboxDateTimeString(vmn.lastStateChange))
+ .replace('%4',trans(vmn.sessionState,'VBoxGlobal').toLowerCase());
+
+ $(tbl).tipped({'source':tip,'position':'mouse','delay':1500});
+ }
+
+ $(tr).append(td).appendTo(tbl);
+
+ // VM state row
+ var tr = $('<tr />');
+ var td = $('<td />').attr({'class':(vmn.id != 'host' && vmn.sessionState != 'Unlocked' ? 'vboxVMSessionOpen' : '')});
+
+ // Add VirtualBox version if hosting
+ if(vmn.id == 'host') {
+
+ $(td).html("<div class='vboxFitToContainer vboxVMState'><img src='images/vbox/" + vboxMachineStateIcon(vmn.state) +"' /><span class='vboxVMState'>" + trans(vboxVMStates.convert(vmn.state),'VBoxGlobal') + ' - ' + $('#vboxPane').data('vboxConfig').version.string+'</span></div>');
+
+ // Check for version mismatches?
+ if(!vboxChooser._versionChecked) {
+ vboxChooser._versionChecked = true;
+ var vStr = $('#vboxPane').data('vboxConfig').phpvboxver.substring(0,$('#vboxPane').data('vboxConfig').phpvboxver.indexOf('-'));
+ var vers = $('#vboxPane').data('vboxConfig').version.string.replace('_OSE','').split('.');
+ if(vers[0]+'.'+vers[1] != vStr) {
+ vboxAlert('This version of phpVirtualBox ('+$('#vboxPane').data('vboxConfig').phpvboxver+') is incompatible with VirtualBox ' + $('#vboxPane').data('vboxConfig').version.string + ". You probably need to <a href='http://sourceforge.net/projects/phpvirtualbox/files/' target=_blank>download the latest phpVirtualBox " + vers[0]+'.'+vers[1] + "-x</a>.<p>See the Versioning section below the file list in the link for more information</p>",{'width':'auto'});
+ }
+ }
+ } else {
+ $(td).html("<div class='vboxFitToContainer vboxVMState'><img src='images/vbox/" + vboxMachineStateIcon(vmn.state) +"' /><span class='vboxVMState'>" + trans(vboxVMStates.convert(vmn.state),'VBoxGlobal') + '</span></div>');
+ }
+
+ $(tr).append(td).appendTo(tbl);
+
+ // Droppable targets
+ var td = $('<td />').attr({'colspan':'2'}).addClass('vboxChooserDropTarget vboxDropTargetBottom');
+ if(vmn.id != 'host') {
+ td.hover(function(){
+ if(vboxChooser._dragging && vboxChooser._dragging != vmn.id)
+ $(this).addClass('vboxChooserDropTargetHover');
+ },function(){
+ $(this).removeClass('vboxChooserDropTargetHover');
+ }
+ );
+ }
+ $('<tr />').addClass('vboxChooserDropTarget').css({'height':'4px'}).append(td).appendTo(tbl);
+
+
+ // Context menus?
+ if(vboxChooser._vmContextMenuObj) {
+
+ $(tbl).contextMenu({
+ menu: vboxChooser._vmContextMenuObj.menuId(),
+ menusetup : function(el) {
+ if(!$(el).hasClass('vboxListItemSelected')) $(el).trigger('click');
+ }
+ },function(act,el,pos,d,e){
+ vboxChooser._vmContextMenuObj.menuClickCallback(act);
+ });
+
+ // Open settings on dblclick
+ $(tbl).dblclick(function(){
+ if(vboxChooser._vmContextMenuObj.menuItems['settings'].enabled())
+ vboxChooser._vmContextMenuObj.menuItems['settings'].click();
+ });
+ }
+
+ return tbl;
+
+ },
+
+
+ /*
+ * VM Group Dropped
+ */
+ vmGroupDropped : function(e, droppedGroup) {
+
+
+ $(vboxChooser._anchor).enableSelection();
+
+
+ var vmGroupPath = vboxChooser._draggingGroup;
+ vboxChooser._draggingGroup = false;
+ $(droppedGroup).removeClass('vboxHover');
+
+ if(!vboxChooser._editable) return false;
+
+ // Cannot drag a group that contains a VM without
+ // an unlocked session state if it will modify VM
+ // Groups
+ var sessionLocked = false;
+ if($(droppedGroup).find('td.vboxVMSessionOpen')[0])
+ sessionLocked=true;
+
+
+ // Check for above/below group first
+ var dropTarget = vboxChooser._anchor.find('div.vboxChooserDropTargetHover').first();
+ if(dropTarget[0]) {
+
+ // Make sure that this wasn't dropped onto a sub-group or itself
+ if(
+ !dropTarget.closest('div.vboxChooserGroup')[0]
+ ||
+ vmGroupPath == dropTarget.closest('div.vboxChooserGroup').data('vmGroupPath')
+ ||
+ dropTarget.closest('div.vboxChooserGroup').data('vmGroupPath').indexOf(vmGroupPath + '/') == 0
+ ) {
+ return;
+ }
+
+
+ // If we are not still in the same group, check for name conflict
+ var currParentGroupPath = $(droppedGroup).closest('div.vboxChooserGroup').parent().closest('div.vboxChooserGroup').data('vmGroupPath');
+
+ if(dropTarget.closest('div.vboxChooserGroup').parent().closest('div.vboxChooserGroup').data('vmGroupPath') != currParentGroupPath) {
+
+ // Do not allow to be dragged into another group
+ // if there is a Vm with a locked session in this one
+ if(sessionLocked && !$('#vboxPane').data('vboxConfig')['phpVboxGroups']) return;
+
+ // Make sure there are no conflicts
+ var groupName = $(droppedGroup).children('div.vboxChooserGroupIdentifier').attr('title');
+ var newGroupName = groupName;
+
+
+ var i = 2;
+ while(vboxChooser.groupNameConflicts(dropTarget.closest('div.vboxChooserGroup').parent(), newGroupName)) {
+ newGroupName = groupName + ' (' + (i++) + ')';
+ }
+
+ $(droppedGroup).children('div.vboxChooserGroupIdentifier').attr({'title':newGroupName})
+ .siblings('div.vboxChooserGroupHeader')
+ .children('span.vboxChooserGroupName').text(newGroupName);
+
+ }
+
+ // Insert before or insert after?
+ if(dropTarget.hasClass('vboxDropTargetTop')) {
+ $(droppedGroup).detach().insertBefore(dropTarget.closest('div.vboxChooserGroup'));
+ } else {
+ $(droppedGroup).detach().insertAfter(dropTarget.closest('div.vboxChooserGroup'));
+ }
+
+
+ // Dropped onto a group or main VM list
+ } else {
+
+ // Will not do this if this group contains
+ // a VM with a locked session
+ if(sessionLocked && !$('#vboxPane').data('vboxConfig')['phpVboxGroups']) return;
+
+ var dropTarget = vboxChooser._anchor.find('div.vboxHover').first();
+
+
+ // Dropped onto a group
+ if(dropTarget[0] && dropTarget.parent().hasClass('vboxChooserGroup')) {
+
+ dropTarget = dropTarget.parent();
+
+ // Make sure that this wasn't dropped onto a sub-group or itself
+ if(
+ vmGroupPath == dropTarget.data('vmGroupPath')
+ ||
+ dropTarget.closest('div.vboxChooserGroup').data('vmGroupPath').indexOf(vmGroupPath + '/') == 0
+ ) {
+ return;
+ }
+
+ // Dropped onto main vm list
+ } else if($(vboxChooser._anchor).find('div.vboxGroupHover').length == 0 && $(vboxChooser._anchor).hasClass('vboxChooserDropTargetHoverRoot')) {
+
+ dropTarget = null;
+
+ // Only showing one group?
+ if(vboxChooser._showOnlyGroupHistory.length > 0) {
+ dropTarget = $(vboxChooser._showOnlyGroupHistory[vboxChooser._showOnlyGroupHistory.length-1]);
+ }
+
+ if(!$(dropTarget)[0])
+ dropTarget = vboxChooser._anchor.children('div.vboxChooserGroup');
+
+ } else {
+ return;
+ }
+
+ // Make sure there are no conflicts
+ var newElm = $(droppedGroup).detach();
+ var groupName = $(droppedGroup).children('div.vboxChooserGroupIdentifier').attr('title');
+ var newGroupName = groupName;
+
+ var i = 2;
+ while(vboxChooser.groupNameConflicts(dropTarget, newGroupName, $(newElm).data('vmGroupPath'))) {
+ newGroupName = groupName + ' (' + (i++) + ')';
+ }
+
+ $(newElm)
+ .children('div.vboxChooserGroupIdentifier').attr({'title':newGroupName})
+ .siblings('div.vboxChooserGroupHeader')
+ .children('span.vboxChooserGroupName').text(newGroupName);
+ $(newElm).insertBefore(dropTarget.children('div.vboxChooserGroupVMs'));
+
+ }
+
+ // vmGroup dropped - compose and save group definitions
+ vboxChooser.composeGroupDef(true);
+
+ // Hide group info
+ vboxChooser._anchor.find('div.vboxChooserGroupHeader').trigger('mouseout');
+
+ // Resize chooser elements
+ vboxChooser._resizeElements();
+
+ vboxChooser.selectionListChanged(vboxChooser._selectedList);
+
+ },
+
+ /*
+ * VM dropped
+ */
+ vmDropped : function (e, droppedVM){
+
+
+ $(vboxChooser._anchor).enableSelection();
+ vboxChooser._dragging = null;
+
+ if(!vboxChooser._editable) return false;
+
+ // Cannot drag if this VM's session is not open
+ var thisSessionLocked = false;
+ var vmData = vboxVMDataMediator.getVMData($(droppedVM).data('vmid'));
+
+ if(vmData.sessionState != 'Unlocked')
+ thisSessionLocked = true;
+
+
+
+ // Where was this dropped?
+ var dropTarget = $('#'+vboxChooser._anchorid).find('td.vboxChooserDropTargetHover');
+
+ // Dropped above / below a VM
+ if(dropTarget[0]) {
+
+ // Dropped from another group into this one,
+ // but this group already has this VM
+ if((dropTarget.closest('table').closest('div.vboxChooserGroup').data('vmGroupPath') != $(droppedVM).closest('div.vboxChooserGroup').data('vmGroupPath'))
+ && dropTarget.closest('table').siblings('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+$(droppedVM).data('vmid'))[0]) {
+ return true;
+ }
+
+ // If session of this VM is locked, don't allow it to be
+ // dragged out of current group
+ if(thisSessionLocked && !$('#vboxPane').data('vboxConfig')['phpVboxGroups'] && ($(droppedVM).closest('div.vboxChooserGroup').data('vmGroupPath') != dropTarget.closest('div.vboxChooserGroup').data('vmGroupPath'))) {
+ return
+ }
+
+ // Get VM from target's parent table
+ if(dropTarget.hasClass('vboxDropTargetTop')) {
+ if(!e.ctrlKey && !e.metaKey) {
+ $(droppedVM).detach().insertBefore($(dropTarget).closest('table'));
+ } else {
+ // Copy
+ if($(dropTarget).closest('table').parent().children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmData.id)[0])
+ return;
+ vboxChooser.vmHTML(vmData).insertBefore($(dropTarget).closest('table'));
+ }
+ } else {
+ if(!e.ctrlKey && !e.metaKey) {
+ $(droppedVM).detach().insertAfter($(dropTarget).closest('table'));
+ } else {
+ // Copy - Don't allow if it already exists
+ if($(dropTarget).closest('table').parent().children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmData.id)[0])
+ return;
+ vboxChooser.vmHTML(vmData).insertAfter($(dropTarget).closest('table'));
+ }
+ }
+
+ // Not dropped above / below vm
+ } else {
+
+ // Don't allow this if sessoin is locked
+ if(thisSessionLocked && !$('#vboxPane').data('vboxConfig')['phpVboxGroups']) return;
+
+ // Dropped ON a vm?
+ dropTarget = $('#'+vboxChooser._anchorid).find('table.vboxHover:not(.ui-draggable-dragging)').first();
+ if($(dropTarget).data('vmid')) {
+
+ // Create a group?
+ dropTarget = $('#'+vboxChooser._anchorid).find('table.vboxHover').first();
+
+ // Nothing to do. Not dropped on valid target
+ if(!dropTarget[0] || ($(dropTarget).data('vmid') == $(droppedVM).data('vmid'))) return true;
+
+ // Dont' allow this if target VM's session is locked
+ if($(dropTarget).find('td.vboxVMSessionOpen')[0])
+ return;
+
+ // Where to drop vboxChooser..
+ var p = dropTarget.closest('div.vboxChooserGroup').children('div.vboxChooserGroupVMs');
+ // assume root?
+ if(!p[0]) p = vboxChooser._anchor.children('div.vboxChooserGroupVMs');
+
+ // Determine group name
+ var gname = trans('New group','UIGChooserModel');
+ var tgname = gname;
+
+ var i = 2;
+ while(vboxChooser.groupNameConflicts($(p).parent(), tgname)) {
+ tgname = gname + ' ' + (i++);
+ }
+
+
+ // New position is below target
+ var ghtml = vboxChooser.groupHTML(String(dropTarget.closest('div.vboxChooserGroup').data('vmGroupPath')+'/'+tgname).replace('//','/'));
+
+ if(!e.ctrlKey && !e.metaKey) {
+ ghtml.children('div.vboxChooserGroupVMs').append($(droppedVM).detach());
+ } else {
+ ghtml.children('div.vboxChooserGroupVMs').append(vboxChooser.vmHTML(vmData));
+ }
+ ghtml.children('div.vboxChooserGroupVMs').append(dropTarget.detach());
+
+ ghtml.insertBefore(p);
+
+ // Dropped in the main VM list or group header?
+ } else {
+
+ dropTarget = $(vboxChooser._anchor).find('div.vboxHover').first();
+ if(dropTarget[0] && dropTarget.hasClass('vboxChooserGroupHeader')) {
+
+ // Group already has this dragging VM?
+ if(dropTarget.siblings('div.vboxChooserGroupVMs').children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+$(droppedVM).data('vmid'))[0]) {
+ return;
+ }
+
+ if(!e.ctrlKey && !e.metaKey)
+ $(droppedVM).detach().appendTo(dropTarget.siblings('div.vboxChooserGroupVMs').first());
+ else
+ vboxChooser.vmHTML(vmData).appendTo(dropTarget.siblings('div.vboxChooserGroupVMs').first());
+
+ // Main VM list
+ } else if($(vboxChooser._anchor).find('div.vboxGroupHover').length == 0 && $(vboxChooser._anchor).hasClass('vboxChooserDropTargetHoverRoot')) {
+
+ dropTarget = null;
+
+ // Only showing one group?
+ if(vboxChooser._showOnlyGroupHistory.length > 0) {
+ dropTarget = $(vboxChooser._showOnlyGroupHistory[vboxChooser._showOnlyGroupHistory.length-1]);
+ }
+
+ if(!$(dropTarget)[0])
+ dropTarget = vboxChooser._anchor.children('div.vboxChooserGroup');
+
+ // Already in this list?
+ if(dropTarget.children('div.vboxChooserGroupVMs').children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+$(droppedVM).data('vmid'))[0]) {
+ return true;
+ }
+
+ if(!e.ctrlKey && !e.metaKey) {
+ $(droppedVM).detach().appendTo(dropTarget.children('div.vboxChooserGroupVMs').first());
+ } else {
+ vboxChooser.vmHTML(vmData).appendTo(dropTarget.children('div.vboxChooserGroupVMs').first());
+ }
+
+ }
+ }
+
+ }
+
+ // vm dropped - compose and save group definitions
+ vboxChooser.composeGroupDef(true);
+
+ // Resize chooser elements
+ vboxChooser._resizeElements();
+
+ vboxChooser.selectionListChanged(vboxChooser._selectedList);
+
+ },
+
+ /*
+ * Group selected items into a new group
+ */
+ groupSelectedItems : function() {
+
+ // Get all group paths to determine new group target
+ var groupPaths = {};
+ vboxChooser._anchor.find('div.vboxVMGroupSelected').closest('div.vboxChooserGroup').each(function(idx,elm) {
+ groupPaths[$(elm).data('vmGroupPath')] = 1;
+ });
+ vboxChooser._anchor.find('table.vboxListItemSelected').closest('div.vboxChooserGroup').each(function(idx,elm) {
+ groupPaths[$(elm).data('vmGroupPath')] = 1;
+ });
+
+ // The group clsest to the root group will be the target
+ var groupPathTarget = null;
+ for(var i in groupPaths) {
+
+ if(typeof(i) != 'string') continue;
+
+ // Already at root group. Nothing to do
+ if(groupPathTarget == '/') break;
+
+ // No target set yet or equal targets, or this group is the root
+ if(!groupPathTarget || groupPathTarget == i || i == '/') {
+ groupPathTarget = i;
+ continue;
+ }
+
+ var t1 = groupPathTarget.split("/");
+ var t2 = i.split("/");
+ for(var i = 0; i < Math.min(t1.length,t2.length); i++) {
+ if(t1[i] != t2[i]) {
+ groupPathTarget = '';
+ for(var a = 0; a < i; a++) {
+ groupPathTarget += "/" + t1[a];
+ }
+ groupPathTarget = groupPathTarget.replace('//','/');
+ break;
+ }
+ }
+
+
+ }
+
+ var target = vboxChooser.getGroupElement(groupPathTarget, true);
+
+ if(!$(target)[0]) return;
+
+ // Determine group name
+ var gname = trans('New group','UIGChooserModel');
+ var tgname = gname;
+
+ var i = 2;
+ while(vboxChooser.groupNameConflicts($(target), tgname)) {
+ tgname = gname + ' ' + (i++);
+ }
+
+ var gHTML = vboxChooser.groupHTML('/'+tgname);
+
+ // Append group and vm elements
+ vboxChooser._anchor.find('div.vboxVMGroupSelected').detach().insertAfter(gHTML.children('div.vboxChooserGroupHeader'));
+ vboxChooser._anchor.find('table.vboxListItemSelected').detach().appendTo(gHTML.children('div.vboxChooserGroupVMs'));
+
+ gHTML.insertBefore($(target).children('div.vboxChooserGroupVMs'));
+
+ // group selected items,
+ // Compose and save group definitions
+ vboxChooser.composeGroupDef(true);
+
+ // Resize chooser elements
+ vboxChooser._resizeElements();
+
+
+
+ },
+
+ /**
+ * Compose group data from GUI and optionally save it
+ *
+ * @param save - save group definitions to vbox
+ */
+ composeGroupDef : function(save) {
+
+ var allGroups = [];
+ var groupsResolved = false;
+
+ // Keep looping through group definitions until
+ // there are no groups removed
+ while(!groupsResolved) {
+
+ allGroups = [];
+ groupsResolved = true;
+
+ vboxChooser._anchor.find('div.vboxChooserGroup:not(.ui-draggable-dragging)').each(function(idx,elm) {
+
+ // Group element was removed
+ if(!$(elm)[0]) return;
+
+ // Compose group path
+ var myPath = $(elm).children('div.vboxChooserGroupIdentifier').attr('title');
+ if(!myPath) myPath = '/';
+ $(elm).parents('div.vboxChooserGroup:not(.ui-draggable-dragging)').each(function(idx2,elm2){
+ var pName = $(elm2).children('div.vboxChooserGroupIdentifier').attr('title');
+ if(!pName) pName = '/';
+ myPath = String(pName + '/' + myPath).replace('//','/');
+ });
+
+ // Groups
+ var gList = [];
+ $(elm).children('div.vboxChooserGroup:not(.ui-draggable-dragging)').each(function(idx2,elm2){
+
+ // If this group is selected, we'll have to update its path
+ // in the selection list
+ var selected = $(elm2).hasClass('vboxVMGroupSelected');
+ var oldPath = $(elm2).data('vmGroupPath');
+ var newPath = String(myPath + '/' + $(elm2).children('div.vboxChooserGroupIdentifier').attr('title')).replace('//','/');
+
+ gList[gList.length] = $(elm2).children('div.vboxChooserGroupIdentifier').attr('title');
+
+ // set / correct group path data
+ $(elm2).data('vmGroupPath', newPath);
+
+ // Group's path changed?
+ if(selected && (oldPath != newPath)) {
+ for(var i = 0; i < vboxChooser._selectedList.length; i++) {
+ if(vboxChooser._selectedList[i].type == 'group' && vboxChooser._selectedList[i].groupPath == oldPath) {
+ vboxChooser._selectedList[i].groupPath = String(myPath + '/' + $(elm2).children('div.vboxChooserGroupIdentifier').attr('title')).replace('//','/');
+ break;
+ }
+ }
+ }
+
+ });
+
+ // VMs
+ var vmList = [];
+ $(elm).children('div.vboxChooserGroupVMs').children('table.vboxChooserVM:not(.ui-draggable-dragging)').each(function(idx3,elm3){
+ vmList[vmList.length] = $(elm3).data('vmid');
+ });
+
+ // Skip and remove if there are no VMs or subgroups
+ // And it is not the parent group
+ if(gList.length + vmList.length == 0 && !$(elm).hasClass('vboxChooserGroupRoot')) {
+
+ // remove from selected list?
+ if(elm && $(elm).hasClass('vboxVMGroupSelected')) {
+
+ var myPath = $(elm).data('vmGroupPath');
+ // Deselect item
+ vboxChooser._selectedList = vboxChooser._selectedList.filter(function(v){
+ return (v.type != 'group' || (v.groupPath != myPath));
+ });
+ }
+ $(elm).empty().remove();
+ groupsResolved = false;
+ return false;
+ }
+
+ // append to all groups list
+ gorder = [];
+ if(gList.length) gorder[0] = 'go='+gList.join(',go=');
+ if(vmList.length) gorder[gorder.length] = 'm='+vmList.join(',m=');
+ allGroups[allGroups.length] = {
+ path: $(elm).data('vmGroupPath'),
+ order: gorder.join(',')
+ };
+
+ // Update counts span
+ $(elm).children('div.vboxChooserGroupVMs').css({'display':(vmList.length || $(elm).data('vmGroupPath') == '/' ? '' : 'none')})
+ .siblings('div.vboxChooserGroupHeader')
+ .each(function(hidx,header) {
+
+ var staticTip = '<strong>'+$(header).siblings('div.vboxChooserGroupIdentifier').attr('title')+'</strong>'+
+ (gList.length ? ('<br />' + trans('%n group(s)','UIGChooserItemGroup',gList.length).replace('%n',gList.length)) : '') +
+ (vmList.length ? ('<br />' + trans('%n machine(s)','UIGChooserItemGroup',vmList.length).replace('%n',vmList.length)) : '');
+
+ $(header).tipped({'source':function() {
+
+ // find number of running VMs
+ var runningVMs = 0;
+
+ if(vmList.length) {
+ $(header).siblings('div.vboxChooserGroupVMs').find('td.vboxVMSessionOpen').each(function(idx,elm3) {
+ if(vboxVMStates.isRunning(vboxVMDataMediator.getVMData($(elm3).closest('table').data('vmid'))))
+ runningVMs++;
+ });
+ }
+
+ return staticTip + (runningVMs > 0 ? ' ' + trans('(%n running)','UIGChooserItemGroup',runningVMs).replace('%n', runningVMs) : '');
+ }
+ ,'position':'mouse','delay':1500});
+ })
+ .children('span.vboxChooserGroupInfo')
+ .children('span.vboxChooserGroupCounts').html(
+ (gList.length ? ('<span style="background-image:url(images/vbox/group_abstract_16px.png);" />'+gList.length) : '') +
+ (vmList.length ? ('<span style="background-image:url(images/vbox/machine_abstract_16px.png);" />'+vmList.length) : '')
+ );
+ });
+
+ }
+
+ // Save GUI group definition?
+ if(!save) return;
+
+
+ // Tell the interface we're about to save groups
+ vboxChooser._editable = false;
+ $('#vboxPane').trigger('vmGroupDefsSaving');
+
+ vboxChooser._groupDefs = allGroups;
+
+ // Save machine groups and trigger change
+ var vms = [];
+ var vmList = vboxVMDataMediator.getVMList();
+ for(var i = 0; i < vmList.length; i++) {
+
+ if(!vmList[i] || vmList[i].id == 'host') continue;
+
+ /* If a VM's groups have changed, add it to the list */
+ var eGroups = vmList[i].groups;
+ var nGroups = vboxChooser.getGroupsForVM(vmList[i].id);
+
+ if($(nGroups).not(eGroups).length || $(eGroups).not(nGroups).length) {
+
+ vms[vms.length] = {
+ 'id' : vmList[i].id,
+ 'groups' : nGroups
+ };
+ }
+ }
+
+ // Save machines groups?
+ if(vms.length) {
+
+ // Reload VMs and group definitions
+ var reloadAll = function() {
+
+ var ml = new vboxLoader();
+ ml.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+ ml.add('vboxGroupDefinitionsGet',function(d){vboxChooser._groupDefs = d.responseData;});
+
+ // Reload VM list and group definitions, something went wrong
+ ml.onLoad = function() {
+
+ // Stop vmlist from refreshing..
+ vboxChooser.stop();
+
+ // reset selections
+ $('#vboxPane').trigger('vmSelectionListChanged',[vboxChooser]);
+
+ // ask for new one
+ vboxChooser.start();
+ };
+ ml.run();
+ };
+
+ $.when(vboxAjaxRequest('machinesSaveGroups',{'vms':vms})).done(function(res){
+
+ if(res.responseData.errored) {
+ reloadAll();
+ vboxChooser._editable = true;
+ $('#vboxPane').trigger('vmGroupDefsSaved');
+ } else {
+ $.when(vboxAjaxRequest('vboxGroupDefinitionsSet',{'groupDefinitions':allGroups})).always(function(){
+ vboxChooser._editable = true;
+ $('#vboxPane').trigger('vmGroupDefsSaved');
+ });
+ }
+
+ }).fail(reloadAll);
+
+ } else {
+ $.when(vboxAjaxRequest('vboxGroupDefinitionsSet',{'groupDefinitions':allGroups})).always(function(){
+ vboxChooser._editable = true;
+ $('#vboxPane').trigger('vmGroupDefsSaved');
+ });
+ }
+
+
+ return allGroups;
+
+ },
+
+ /*
+ * Return a list of groups that VM is a member of
+ */
+ getGroupsForVM : function(vmid) {
+ var gPathList = [];
+ vboxChooser._anchor.find('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmid+':not(.ui-draggable-dragging)').each(function(idx,elm){
+ var gParent = $(elm).closest('div.vboxChooserGroup');
+ if(!gParent.hasClass('ui-draggable-dragging'))
+ gPathList[gPathList.length] = gParent.data('vmGroupPath');
+ });
+ return gPathList;
+ },
+
+ /*
+ * Determine whether or not a group name conflicts
+ * with another group in parent
+ */
+ groupNameConflicts : function(parentGroup, name, ignoreGroupAtPath) {
+ var found = false;
+ parentGroup.children('div.vboxChooserGroup:not(.ui-draggable-dragging)').children('div.vboxChooserGroupIdentifier[title="'+name+'"]').parent().each(function(i,elm){
+
+ if(ignoreGroupAtPath && (ignoreGroupAtPath == $(elm).data('vmGroupPath')))
+ return true;
+
+ found=true;
+ return false;
+ });
+ return found;
+ },
+
+ /*
+ * Ungroup selected group
+ */
+ unGroupSelectedGroup : function() {
+
+ var target = $(vboxChooser.getSelectedGroupElements()[0]).siblings('div.vboxChooserGroupVMs');
+
+ // Groups
+ // - ignore group at path we are currently ungrouping
+ var ignoreGroup = $(vboxChooser.getSelectedGroupElements()[0]).data('vmGroupPath');
+ $(vboxChooser.getSelectedGroupElements()[0]).children('div.vboxChooserGroup').each(function(i,elm) {
+
+ // Make sure there are no conflicts
+ var newElm = $(elm).detach();
+ var groupName = $(elm).children('div.vboxChooserGroupIdentifier').attr('title');
+ var newGroupName = groupName;
+
+ var i = 2;
+ while(vboxChooser.groupNameConflicts($(target).parent(), newGroupName, ignoreGroup)) {
+ newGroupName = groupName + ' (' + (i++) + ')';
+ }
+
+ $(newElm).children('div.vboxChooserGroupIdentifier').attr({'title':newGroupName})
+ .siblings('div.vboxChooserGroupHeader')
+ .children('span.vboxChooserGroupName').text(newGroupName);
+
+ $(newElm).insertBefore(target);
+
+ });
+
+ // VMs
+ $(vboxChooser.getSelectedGroupElements()[0]).children('div.vboxChooserGroupVMs').children().each(function(i,elm){
+ $(elm).detach();
+ if(!target.children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+$(elm).data('vmid'))[0])
+ target.append(elm);
+ });
+
+
+ // ungroup selected items
+ // compose and save group definitions
+ vboxChooser.composeGroupDef(true);
+
+ // Resize chooser elements
+ vboxChooser._resizeElements();
+
+ vboxChooser.selectionListChanged();
+
+
+ },
+
+ /*
+ * Sort group sub-elements based on VirtualBox
+ * group definitions
+ */
+ sortGroup : function(gElm) {
+
+ // Find group orders
+ var gPath = $(gElm).data('vmGroupPath');
+ var groupList = vboxChooser._groupDefs;
+
+ if(!(gPath && groupList)) return;
+
+ var machineOrder = [];
+ var groupOrder = [];
+
+ // Get correct order
+ for(var i = 0; i < groupList.length; i++) {
+ if(groupList[i].path == gPath) {
+ order = groupList[i].order.split(',');
+ for(var a = 0; a < order.length; a++) {
+ kv = order[a].split('=',2);
+ if(kv[0] == 'm') machineOrder[machineOrder.length] = kv[1];
+ else groupOrder[groupOrder.length] = kv[1];
+ }
+ }
+ }
+
+ // sort groups
+ var groups = $(gElm).children('div.vboxChooserGroup').get();
+ var maxPos = groups.length;
+ groups.sort(function(a,b){
+
+ var Pos1 = jQuery.inArray($(a).children('div.vboxChooserGroupIdentifier').attr('title'), groupOrder);
+ var Pos2 = jQuery.inArray($(b).children('div.vboxChooserGroupIdentifier').attr('title'), groupOrder);
+
+ if(Pos1==-1) Pos1 = maxPos;
+ if(Pos2==-1) Pos2 = maxPos;
+
+ return (Pos1 > Pos2 || Pos1 == -1 ? -1 : (Pos2 == Pos1 ? 0 : 1));
+
+ });
+ $.each(groups, function(idx,itm) {
+ $(itm).insertAfter($(gElm).children('div.vboxChooserGroupHeader'));
+ });
+
+ // sort VMs
+ var vms = $(gElm).children('div.vboxChooserGroupVMs').children('table.vboxChooserVM').get();
+ var maxPos = vms.length;
+ vms.sort(function(a,b) {
+
+ var Pos1 = jQuery.inArray($(a).data('vmid'), machineOrder);
+ var Pos2 = jQuery.inArray($(b).data('vmid'), machineOrder);
+
+ if(Pos1==-1) Pos1 = maxPos;
+ if(Pos2==-1) Pos2 = maxPos;
+
+ return (Pos1 > Pos2 ? 1 : (Pos2 == Pos1 ? 0 : -1));
+
+ });
+ $.each(vms, function(idx,itm) {
+ $(gElm).children('div.vboxChooserGroupVMs').append(itm);
+ });
+
+
+ },
+
+ /*
+ * Sort selected group by item names
+ */
+ sortSelectedGroup : function(rootElm) {
+
+ var el = $(vboxChooser.getSelectedGroupElements()[0]);
+
+ if(rootElm || !el) {
+ el = vboxChooser._anchor.children('div.vboxChooserGroup');
+ }
+
+ // sort groups
+ var groups = $(el).children('div.vboxChooserGroup').get();
+ groups.sort(function(a,b){
+ return $(b).children('div.vboxChooserGroupIdentifier').attr('title').localeCompare($(a).children('div.vboxChooserGroupIdentifier').attr('title'));
+ });
+ $.each(groups, function(idx,itm) {
+ $(itm).insertAfter($(el).children('div.vboxChooserGroupHeader'));
+ });
+
+ // sort VMs
+ var vms = $(el).children('div.vboxChooserGroupVMs').children('table.vboxChooserVM').get();
+ vms.sort(function(a,b) {
+ return $(a).find('span.vboxVMName').text().localeCompare($(b).find('span.vboxVMName').text());
+ });
+ $.each(vms, function(idx,itm) {
+ $(el).children('div.vboxChooserGroupVMs').append(itm);
+ });
+
+ // compose and save group definitions
+ vboxChooser.composeGroupDef(true);
+
+ },
+
+ /*
+ * Rename selected group
+ */
+ renameSelectedGroup : function() {
+
+ var el = $(vboxChooser.getSelectedGroupElements()[0]);
+
+ // Function to rename group
+ var renameGroup = function(e, textbox) {
+
+ if(!textbox) textbox = $(this);
+
+ var newName = $(textbox).val().replace(/[\\\/:*?"<>,]/g,'_');
+
+ if(newName && newName != $(textbox).closest('div.vboxChooserGroup').children('div.vboxChooserGroupIdentifier').attr('title')) {
+
+ // Do not rename if it conflicts
+ var noConflict = newName;
+ var i = 2;
+ while(vboxChooser.groupNameConflicts($(textbox).parent().parent().parent().parent(), noConflict)) {
+ noConflict = newName + ' (' + (i++) + ')';
+ }
+ newName = noConflict;
+
+ $(textbox).closest('div.vboxChooserGroup')
+ .children('div.vboxChooserGroupIdentifier').attr({'title':newName})
+ .siblings('div.vboxChooserGroupHeader')
+ .children('span.vboxChooserGroupName').html(newName);
+
+ // group renamed, compose and save groups
+ vboxChooser.composeGroupDef(true);
+
+ // Write out collapsed group list
+ vboxChooser._saveCollapsedGroups();
+
+ }
+
+
+ $(textbox).parent().parent().children().css({'display':''});
+ $(textbox).parent().empty().remove();
+ };
+
+ $(el).children('div.vboxChooserGroupHeader').children().css({'display':'none'});
+ $(el).children('div.vboxChooserGroupHeader').append(
+
+ $('<form />').append(
+ $('<input />').attr({'type':'text','value':$(el).children('div.vboxChooserGroupIdentifier').attr('title')}).css({'width':'90%','padding':'0px','margin':'0px'}).on('keypress',function(e){
+ if (e.which == 13) {
+ $(this).off('blur', renameGroup);
+ renameGroup(e,this);
+ e.stopPropagation();
+ e.preventDefault();
+ $(this).trigger('blur');
+ return false;
+ }
+ })
+ )
+
+ );
+ $(el).children('div.vboxChooserGroupHeader').children('form').children('input').focus().select().blur(renameGroup);
+
+ },
+
+ /*
+ * Select a single group
+ */
+ _selectGroup : function(gelm) {
+ $(gelm).addClass('vboxVMGroupSelected');
+ },
+
+ /*
+ * Deselect a single group
+ */
+ _deselectGroup : function(gelm) {
+
+ $(gelm).removeClass('vboxVMGroupSelected');
+ },
+
+ /*
+ * Select (or unselect) an item in our list. Called onmousedown or onCLick
+ */
+ selectItem : function(e) {
+
+ // Right click selects item if it is not selected
+ if(e.which != 1) {
+
+ // Right click on group header and group is selected
+ // just return and show context menu
+ if($(this).hasClass('vboxChooserGroupHeader') && $(this).parent().hasClass('vboxVMGroupSelected')) {
+ return true;
+
+ // Right click on VM and VM is already selected
+ // just return and show context menu
+ } else if($(this).hasClass('vboxListItemSelected')) {
+ return true;
+ }
+ }
+
+ var selectedList = [];
+ var item = $(this);
+
+
+ // Group?
+ if($(item).hasClass('vboxChooserGroupHeader')) {
+
+
+ // No control key. Exclusive selection
+ if(!e.ctrlKey && !e.metaKey) {
+
+ // already selected
+ if(vboxChooser._selectedList.length == 1 && vboxChooser._selectedList[0].type == 'group' &&
+ vboxChooser._selectedList[0].groupPath == $(item).parent().data('vmGroupPath'))
+ return true;
+
+ vboxChooser._anchor.find('.vboxListItemSelected').removeClass('vboxListItemSelected');
+ vboxChooser._anchor.find('div.vboxVMGroupSelected')
+ .each(function(idx,gelm) {
+ vboxChooser._deselectGroup(gelm);
+ });
+
+
+
+ // select current group
+ vboxChooser._selectGroup($(item).parent());
+
+ selectedList = [{
+ type: 'group',
+ groupPath: $(item).parent().data('vmGroupPath')
+ }];
+
+ // Already selected, and ctrl key
+ } else if($(item).parent().hasClass('vboxVMGroupSelected')){
+
+ // Deselect item
+ selectedList = vboxChooser._selectedList.filter(function(v){
+ return (v.type != 'group' || (v.groupPath != $(item).parent().data('vmGroupPath')));
+ });
+
+ vboxChooser._deselectGroup($(item).parent());
+
+ // Not already selected, and ctrl key
+ } else {
+
+ vboxChooser._selectGroup($(item).parent());
+
+ selectedList = vboxChooser._selectedList;
+
+ selectedList[selectedList.length] = {
+ type: 'group',
+ groupPath: $(item).parent().data('vmGroupPath')
+ };
+
+ }
+
+
+ // VM
+ } else {
+
+ // No ctrl key or selection is host. Exclusive selection
+ if((!e.ctrlKey && !e.metaKey) || $(item).data('vmid') == 'host') {
+
+ vboxChooser._anchor.find('.vboxListItemSelected').removeClass('vboxListItemSelected');
+ vboxChooser._anchor.find('div.vboxVMGroupSelected').removeClass('vboxVMGroupSelected')
+ .each(function(idx,gelm){
+ vboxChooser._deselectGroup(gelm);
+ });
+
+ // Select current VM
+ $(item).addClass('vboxListItemSelected').removeClass('vboxHover');
+
+ // already selected
+ if(vboxChooser._selectedList.length == 1 && vboxChooser._selectedList[0].type == 'vm' &&
+ vboxChooser._selectedList[0].id == $(item).data('vmid'))
+ return true;
+
+ selectedList = [{
+ type: 'vm',
+ id: $(item).data('vmid'),
+ groupPath: $(item).parent().data('vmGroupPath')
+ }];
+
+ // Already selected, and ctrl key
+ } else if($(item).hasClass('vboxListItemSelected')) {
+
+ // Deselect item
+ selectedList = vboxChooser._selectedList.filter(function(v){
+ return (v.type == 'group' || (v.id != $(item).data('vmid')));
+ });
+
+ $(item).removeClass('vboxListItemSelected');
+
+ // ctrl key, but not already selected
+ } else {
+
+ $(item).addClass('vboxListItemSelected').removeClass('vboxHover');
+
+ selectedList = vboxChooser._selectedList;
+
+ selectedList[selectedList.length] = {
+ type: 'vm',
+ id: $(item).data('vmid'),
+ groupPath: $(item).parent().data('vmGroupPath')
+ };
+
+ }
+
+ }
+
+ // Remove host?
+ if(selectedList.length > 1) {
+
+ // Deselect host
+ selectedList = selectedList.filter(function(v){
+ return (v.type == 'group' || (v.id != 'host'));
+ });
+
+ vboxChooser._anchor.children('table.vboxChooserItem-'+vboxChooser._anchorid+'-host').removeClass('vboxListItemSelected');
+
+ }
+
+ vboxChooser.selectionListChanged(selectedList);
+
+ return true;
+
+
+ },
+
+ /*
+ * Show only single group element identified by gelm
+ */
+ showOnlyGroupElm : function(gelm) {
+
+ // Going backwards affects animations
+ var back = false;
+
+ // gelm is null if we're going backwards
+ if(!gelm) {
+
+
+ if(vboxChooser._showOnlyGroupHistory.length > 1) {
+ // this gets rid of current
+ vboxChooser._showOnlyGroupHistory.pop();
+ // selects previous
+ gelm = vboxChooser._showOnlyGroupHistory.pop();
+ back = true;
+ } else {
+ gelm = null;
+ }
+
+
+ } else {
+
+ // Hold history
+ vboxChooser._showOnlyGroupHistory[vboxChooser._showOnlyGroupHistory.length] = gelm;
+ }
+
+
+ // No scrolling
+ vboxChooser._anchor.css({'overflow-y':'hidden'});
+
+ if($(gelm)[0]) {
+
+
+ // Slide over or back
+ $.when(vboxChooser._anchor.hide('slide', {direction: (back ? 'right' : 'left'), distance: (vboxChooser._anchor.outerWidth()/1.5)}, 200)).always(function() {
+
+
+ /* hide host when showing only a group */
+ $('table.vboxChooserItem-'+vboxChooser._anchorid+'-host').hide();
+
+
+ /* Undo anything previously performed by this */
+ vboxChooser._anchor.find('div.vboxChooserGroupHide').removeClass('vboxChooserGroupHide vboxChooserGroupHideShowContainer');
+ vboxChooser._anchor.find('div.vboxChooserGroupShowOnly').removeClass('vboxChooserGroupShowOnly');
+
+ $(gelm).parents('div.vboxChooserGroup').addClass('vboxChooserGroupHide vboxChooserGroupHideShowContainer').siblings().addClass('vboxChooserGroupHide');
+
+ vboxChooser._anchor.find('div.vboxChooserGroupRootLevel').removeClass('vboxChooserGroupRootLevel');
+ $(gelm).addClass('vboxChooserGroupShowOnly vboxChooserGroupRootLevel').siblings().addClass('vboxChooserGroupHide');
+
+ $.when(vboxChooser._anchor.show('slide', {direction: (back ? 'left' : 'right'), distance: (vboxChooser._anchor.outerWidth()/1.5)}, 200))
+ .done(function(){
+
+ // Restore scrolling
+ vboxChooser._anchor.css({'overflow-y':'auto'});
+
+ // Hide group info
+ $(gelm).find('div.vboxChooserGroupHeader').trigger('mouseout');
+
+ // Reset title sizes
+ vboxChooser._resizeElements();
+
+ // force redraw of these
+ $(gelm).find('.vboxFitToContainer').css({'display':'none'}).css({'width':'','display':''});
+
+
+ });
+
+ });
+
+ } else {
+
+ vboxChooser._showOnlyGroupHistory = [];
+
+ // Slide back to anchor
+ $.when(vboxChooser._anchor.hide('slide', {direction: 'right', distance: (vboxChooser._anchor.outerWidth()/1.5)}, 200)).always(function() {
+
+ /* show host when going back to main list */
+ $('table.vboxChooserItem-'+vboxChooser._anchorid+'-host').show();
+
+ vboxChooser._anchor.find('div.vboxChooserGroupHide').removeClass('vboxChooserGroupHide vboxChooserGroupHideShowContainer');
+ vboxChooser._anchor.find('div.vboxChooserGroupShowOnly').removeClass('vboxChooserGroupShowOnly ');
+
+ vboxChooser._anchor.find('div.vboxChooserGroupRootLevel').removeClass('vboxChooserGroupRootLevel');
+ vboxChooser._anchor.children('div.vboxChooserGroupRoot').addClass('vboxChooserGroupRootLevel');
+
+ $.when(vboxChooser._anchor.show('slide', {direction: 'left', distance: (vboxChooser._anchor.outerWidth()/1.5)}, 200))
+ .done(function(){
+
+ // Restore scrolling
+ vboxChooser._anchor.css({'overflow-y':'auto'});
+
+ // Hide group info
+ vboxChooser._anchor.find('div.vboxChooserGroupHeader').trigger('mouseout');
+
+ // Reset title sizes
+ vboxChooser._resizeElements();
+
+ // force redraw of these
+ vboxChooser._anchor.find('.vboxFitToContainer').css({'display':'none','width':''}).css({'display':''});
+ });
+ });
+ }
+
+ },
+
+ /*
+ * Return HTML for group
+ */
+ groupHTML : function(gpath) {
+
+ if(!gpath) gpath = '/';
+ var first = gpath == '/';
+ var gname = gpath.substring(gpath.lastIndexOf('/')+1);
+ var collapsed = vboxChooser._isGroupCollapsed(gpath);
+
+ var gHTML = $('<div />').append(
+ $('<div />').addClass('vboxChooserGroupIdentifier').css({'display':'none'}).attr({'title':gname})
+ ).append(
+ $('<div />').addClass('vboxChooserGroupHeader').css({'display':(first ? 'none' : '')})
+ .attr({'title':gname})
+ .dblclick(function() {
+
+ // Already collapsed?
+ var collapsed = $(this).closest('div.vboxChooserGroup').hasClass('vboxVMGroupCollapsed');
+
+ // Button rotation function
+ var rotateButton = function(){return true;};
+
+ var vboxArrowImage = $(this).find('span.vboxChooserGroupNameArrowCollapse');
+
+ if(!($.browser.msie && $.browser.version.substring(0,1) < 9)) {
+
+ rotateButton = function() {
+
+ return $('<div />').animate({left:90},{
+ duration: 300,
+ step: function(currentStep) {
+ if(!collapsed) currentStep = (90 - currentStep);
+ vboxArrowImage.css({
+ 'transform':'rotate('+currentStep+'deg)',
+ '-moz-transform': 'rotate('+currentStep+'deg)',
+ '-webkit-transform': 'rotate('+currentStep+'deg)',
+ '-o-transform': 'rotate('+currentStep+'deg)',
+ '-ms-transform': 'rotate('+currentStep+'deg)'
+ });
+ },
+ queue: true,
+ complete: function() {
+ vboxArrowImage.css({
+ 'transform':'',
+ '-moz-transform': '',
+ '-webkit-transform': '',
+ '-o-transform': '',
+ '-ms-transform': ''
+ });
+ }
+
+ });
+ };
+ }
+
+
+ // Run button rotation and toggle class
+ $.when(rotateButton(), $(this).closest('div.vboxChooserGroup').toggleClass('vboxVMGroupCollapsed', ($.browser.msie && $.browser.version.substring(0,1) < 9) ? undefined : 300)).always(function(){
+
+ // Write out collapsed group list
+ vboxChooser._saveCollapsedGroups();
+
+ // Reset title sizes
+ vboxChooser._resizeElements();
+ });
+
+
+ })
+ .append(
+ $('<div />').addClass('vboxChooserDropTarget')
+ .addClass('vboxDropTargetTop').hover(function(){
+ if(vboxChooser._draggingGroup)
+ $(this).addClass('vboxChooserDropTargetHover' + (first ? 'ignore' : ''));
+ }, function(){
+ $(this).removeClass('vboxChooserDropTargetHover');
+ })
+ )
+ .append(
+ $('<span />').addClass('vboxChooserGroupNameArrowLeft vboxChooserGroupNameArrowCollapse vboxArrowImage')
+ .mousedown(function(e){
+ e.stopPropagation();
+ e.preventDefault();
+ return false;
+ }).mouseup(function(){
+ $(this).closest('div.vboxChooserGroupHeader').trigger('dblclick');
+ })
+
+ ).append(
+
+ $('<span />').addClass('vboxChooserGroupNameArrowLeft vboxChooserGroupShowOnlyBack vboxArrowImage')
+ .click(function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ vboxChooser.showOnlyGroupElm();
+ return false;
+
+ })
+
+ )
+ .append($('<span />').addClass('vboxChooserGroupInfo').html(
+ "<span class='vboxChooserGroupCounts' />"
+ ).append(
+ $('<span />').addClass('vboxChooserGroupShowOnly vboxArrowImage')
+ .click(function(e){
+ e.stopPropagation();
+ e.preventDefault();
+ vboxChooser.showOnlyGroupElm($(this).closest('div.vboxChooserGroup'));
+ return false;
+ })
+
+ ))
+ .append($('<span />').html(gname).addClass('vboxChooserGroupName vboxFitToContainer'))
+ .append(
+ $('<div />').addClass('vboxChooserDropTarget vboxChooserDropTargetBottom')
+ .hover(function(){
+ if(vboxChooser._draggingGroup)
+ $(this).addClass('vboxChooserDropTargetHover' + (first ? 'ignore' : ''));
+ }, function(){
+ $(this).removeClass('vboxChooserDropTargetHover');
+ })
+
+ )
+ .hover(function(){
+
+ if(vboxChooser._compact) return;
+
+ $(this).addClass('vboxHover');
+
+ // Resize title and add hover class?
+ if(!$(this).parent().hasClass('vboxChooserGroupRoot')) {
+
+ // Set width of title to -group info span width
+ var infoWidth = $(this).children('span.vboxChooserGroupInfo').width();
+ var pWidth = $(this).width();
+
+ $(this).children('span.vboxChooserGroupName').css({'max-width':(pWidth-infoWidth-20)+'px'});
+
+ }
+
+
+ },function(){
+
+ // Resize title and remove hover class
+ $(this).removeClass('vboxHover');
+
+ if(!$(this).parent().hasClass('vboxChooserGroupRoot'))
+ $(this).children('span.vboxChooserGroupName').css({'max-width':''});
+
+ }).on('mousedown',vboxChooser.selectItem)
+
+ ).addClass((first ? 'vboxChooserGroupRoot vboxChooserGroupRootLevel ' : (collapsed ? 'vboxVMGroupCollapsed ' : '')) + 'vboxChooserGroup')
+ .data({'vmGroupPath':gpath})
+ .draggable({'cursorAt':{left: -10, top: -10},'helper':function(){
+
+ return $(this).clone().addClass('vboxVMGroupCollapsed vboxVMGroupSelected')
+ .children('div.vboxChooserGroupHeader').removeClass('vboxHover').children('.vboxChooserGroupNameArrowCollapse')
+ .hide().closest('div.vboxChooserGroup').css({'width':$(this).width()+'px'});
+
+
+ },'start':function() {
+
+ if(!$('#vboxPane').data('vboxSession').admin) return false;
+
+ if(!vboxChooser._editable) return false;
+
+ vboxChooser._draggingGroup = $(this).data('vmGroupPath');
+ $(vboxChooser._anchor).disableSelection();
+
+ },'stop':function(e) {
+ vboxChooser.vmGroupDropped(e,$(this));
+
+ }}).append($('<div />').addClass('vboxChooserGroupVMs'));
+
+
+ // Bottom drop target
+ if(!first) {
+ gHTML.hover(function(){
+ $(this).addClass('vboxGroupHover'); }, function() {
+ $(this).removeClass('vboxGroupHover');
+ }).append(
+ $('<div />').addClass('vboxChooserDropTarget vboxChooserDropTargetBottom')
+ .hover(function(){
+ if(vboxChooser._draggingGroup)
+ $(this).addClass('vboxChooserDropTargetHover');
+ }, function(){
+ $(this).removeClass('vboxChooserDropTargetHover');
+ })
+ );
+ }
+
+
+
+ // Group context menu
+ $(gHTML).contextMenu({
+ menu: vboxChooser._vmGroupContextMenuObj.menuId(),
+ menusetup: function(el) {
+ $(el).children('div.vboxChooserGroupHeader').trigger('click');
+ }
+ },function(act,el,pos,d,e){
+ vboxChooser._vmGroupContextMenuObj.menuClickCallback(act, el);
+ });
+
+ return gHTML;
+
+
+
+ },
+
+ /*
+ * Return selected VM elements
+ */
+ getSelectedVMElements : function() {
+ return vboxChooser._anchor.find('table.vboxSelected');
+ },
+
+ /*
+ * Return selected group elements
+ */
+ getSelectedGroupElements : function() {
+ return vboxChooser._anchor.find('div.vboxVMGroupSelected');
+ },
+
+
+ /*
+ * Start VM list update
+ */
+ start : function(anchorid) {
+
+ // already running?
+ if(vboxChooser._running) return;
+ vboxChooser._running = true;
+
+ // Where are we drawn?
+ if(anchorid) {
+ vboxChooser._anchorid = anchorid;
+ vboxChooser._anchor = $('#'+anchorid);
+ }
+
+
+ // Set group definition key
+ vboxChooser._groupDefinitionKey = $('#vboxPane').data('vboxConfig')['groupDefinitionKey'];
+
+ // Get collapsed group list
+ vboxChooser._collapsedGroups = vboxGetLocalDataItem($('#vboxPane').data('vboxConfig').key+'-collapsedGroups', true);
+ if(!vboxChooser._collapsedGroups) vboxChooser._collapsedGroups = [];
+ else vboxChooser._collapsedGroups = vboxChooser._collapsedGroups.split(',');
+
+
+ // Get groups and machine list. datamediator will start listener
+ $.when(vboxAjaxRequest('vboxGroupDefinitionsGet')).done(function(g) {
+
+ vboxChooser._groupDefs = g.responseData;
+
+ $.when(vboxVMDataMediator.getVMList()).done(function(d) {
+ vboxChooser.updateList(d);
+ });
+ });
+
+ },
+
+ /*
+ * Stop VM list updates and clear list
+ */
+ stop : function() {
+
+ if(!vboxChooser._running) return;
+ vboxChooser._running = false;
+
+ vboxChooser._anchor.html("<div id='vboxChooserSpinner' style='text-align: center'><div><img src='images/spinner.gif' /></div></div>");
+
+ // reset vars
+ vboxChooser._versionChecked = false;
+ vboxChooser._selectedList = [];
+ vboxChooser.selectedVMs = [];
+ vboxChooser.selectionMode = vboxSelectionModeNone;
+
+ }
+
+
+
+};
+
+$(document).ready(function(){
+
+ // Calculate scrollbar width
+ vboxChooser._scrollbarWidth = getScrollbarWidth();
+
+ // "Stop" chooser
+ $('#vboxPane').on('hostChange',function(){
+
+ vboxChooser.stop();
+
+ }).on('hostChanged',function(){
+
+
+ vboxChooser.start();
+
+ // Refresh menus
+ }).on('vmGroupDefsSaving vmGroupDefsSaved vmSelectionListChanged', function() {
+
+ if(vboxChooser._vmGroupContextMenuObj)
+ vboxChooser._vmGroupContextMenuObj.update(vboxChooser);
+ if(vboxChooser._vmContextMenuObj)
+ vboxChooser._vmContextMenuObj.update(vboxChooser);
+
+
+ // Event list queue
+ }).on('vboxEvents',function(e, eventList) {
+
+ var redrawVMs = [];
+ var sortGroups = [];
+ var groupsChanged = false;
+ var selectedChanged = false;
+ var resizeElements = false;
+
+ for(var i = 0; i < eventList.length; i++) {
+
+ switch(eventList[i].eventType) {
+
+ ////////////////////////////////
+ //
+ // Machine data changed
+ //
+ ////////////////////////////////
+ case 'OnMachineDataChanged':
+
+ // Shorthand
+ var vmid = eventList[i].machineId;
+ var data = vboxVMDataMediator.getVMData(vmid);
+
+ // Update VM in list
+ if(data) {
+
+ // Enforce VM ownership
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership && !$('#vboxPane').data('vboxSession').admin && data.owner != $('#vboxPane').data('vboxSession').user) {
+ break;
+ }
+
+ redrawVMs[redrawVMs.length] = vmid;
+
+ // Make sure VM has root group at least
+ if(data.groups.length == 0) data.groups = ['/'];
+
+ // Remove from groups if they have changed
+ var currGroups = vboxChooser.getGroupsForVM(vmid);
+ var groupDiff = $(currGroups).not(data.groups);
+ groupsChanged = groupDiff.length;
+ for(var a = 0; a < groupDiff.length; a++) {
+
+ var gElm = vboxChooser.getGroupElement(groupDiff[a], false);
+ if(!$(gElm)[0]) return;
+
+ selectedChanged = (selectedChanged || $(gElm).children('div.vboxChooserGroupVMs').closest('div.vboxVMGroupSelected').length);
+
+ $(gElm).children('div.vboxChooserGroupVMs')
+ .children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+data.id).empty().remove();
+
+ }
+
+ // Add to other groups
+ var groupDiff = $(data.groups).not(currGroups);
+ groupsChanged = (groupsChanged || groupDiff.length);
+ for(var a = 0; a < groupDiff.length; a++) {
+
+ var gElm = vboxChooser.getGroupElement(groupDiff[a]);
+
+ // Skip it if it is already there
+ if($(gElm).children('div.vboxChooserGroupVMs').children('table.vboxChooserItem-'+vboxChooser._anchorid+'-'+data.id)[0])
+ continue;
+
+ $(gElm).children('div.vboxChooserGroupVMs')
+ .append(
+ vboxChooser.vmHTML(data)
+ );
+
+ selectedChanged = (selectedChanged || $(gElm).children('div.vboxChooserGroupVMs').closest('div.vboxVMGroupSelected').length);
+
+ // Sort the group this machine was added to
+ sortGroups = sortGroups.concat(data.groups);
+
+ }
+
+ resizeElements = (resizeElements || groupsChanged);
+
+
+ }
+
+ break;
+
+ /////////////////////////////////
+ //
+ // Snapshot taken / deleted / restored
+ //
+ /////////////////////////////////
+ case 'OnSnapshotDeleted':
+ case 'OnSnapshotTaken':
+ case 'OnSnapshotRestored':
+ case 'OnSnapshotChanged':
+ redrawVMs[redrawVMs.length] = eventList[i].machineId;
+ break;
+
+ /////////////////////////////////////
+ //
+ // Machine registered or unregistered
+ //
+ //////////////////////////////////////
+ case 'OnMachineRegistered':
+
+ // Shorthand
+ var vmid = eventList[i].machineId;
+
+ // Unregistered
+ if(!eventList[i].registered) {
+
+ var wasSelected = vboxChooser.isVMSelected(vmid);
+
+ $('#'+vboxChooser._anchorid +' table.vboxChooserItem-'+vboxChooser._anchorid+'-'+vmid).remove();
+
+ groupsChanged = true;
+
+ // See if VM was selected
+ if(wasSelected) {
+
+ selectedChanged = true;
+
+ vboxChooser._selectedList = vboxChooser._selectedList.filter(function(v){
+ return (v.type == 'group' || (v.id != vmid));
+ });
+
+
+ }
+
+ resizeElements = true;
+
+
+ break;
+
+ }
+
+ // Registered
+
+ // Enforce VM ownership
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership && !$('#vboxPane').data('vboxSession').admin && eventList[i].enrichmentData.owner != $('#vboxPane').data('vboxSession').user) {
+ break;
+ }
+
+ // Add to list
+ vboxChooser.updateVMElement(eventList[i].enrichmentData, true);
+
+ resizeElements = true;
+ break;
+
+
+ ///////////////////////////////////
+ //
+ // Extra data changed
+ //
+ ////////////////////////////////////
+ case 'OnExtraDataChanged':
+
+ if(!eventList[i].machineId && eventList[i].key.indexOf(vboxChooser._groupDefinitionKey) === 0) {
+
+ var path = eventList[i].key.substring(vboxChooser._groupDefinitionKey.length);
+ if(!path) path = "/";
+ var name = path.substring(path.lastIndexOf('/')+1);
+ var vboxVMGroups = vboxChooser._groupDefs;
+ var found = false;
+
+ // No current group definitions?
+ if(!vboxVMGroups) break;
+
+ // Step through each group, comparing
+ for(var a = 0; a < vboxVMGroups.length; a++) {
+ if(vboxVMGroups[a].path == path) {
+ // Sort this group if it is different
+ if(vboxVMGroups[a].order != eventList[i].value)
+ sortGroups[sortGroups.length] = path;
+ found = true;
+ vboxVMGroups[a] = {'path':path,'name':name,'order':eventList[i].value};
+ break;
+ }
+ }
+
+ // Add to group if not found
+ if(!found) {
+ vboxVMGroups[vboxVMGroups.length] = {'path':path,'name':name,'order':eventList[i].value};
+ sortGroups[sortGroups.length] = path; // sort when added
+ resizeElements = true;
+ }
+
+ } else {
+
+ switch(eventList[i].key) {
+
+ // redraw when custom icon changes
+ case 'phpvb/icon':
+ redrawVMs[redrawVMs.length] = eventList[i].machineId;
+ break;
+ }
+ }
+ break;
+
+ ////////////////////////////////////////
+ //
+ // Session or state change gets redrawn
+ //
+ ///////////////////////////////////////
+ case 'OnSessionStateChanged':
+ case 'OnMachineStateChanged':
+ redrawVMs[redrawVMs.length] = eventList[i].machineId;
+ break;
+
+ } // </ switch eventType >>
+
+
+ } // </ for each event >
+
+ // Now redraw each VM
+ ///////////////////////////
+ var redrawn = {};
+ var updateMenus = false;
+ for(var i = 0; i < redrawVMs.length; i++) {
+
+ if(redrawn[redrawVMs[i]]) continue;
+ redrawn[redrawVMs[i]] = true;
+
+ vboxChooser.updateVMElement(vboxVMDataMediator.getVMData(redrawVMs[i]));
+
+ // Update menus if the VM is selected
+ updateMenus = (updateMenus || vboxChooser.isVMSelected(redrawVMs[i]));
+
+ }
+
+ // Sort groups
+ var groupsSorted = {};
+ for(var i = 0; i < sortGroups.length; i++) {
+ if(groupsSorted[sortGroups[i]]) continue;
+ groupsSorted[sortGroups[i]] = true;
+ var gElm = $(vboxChooser.getGroupElement(sortGroups[i]),false);
+ if(gElm[0])
+ vboxChooser.sortGroup(gElm);
+
+ }
+
+ // Groups changed
+ if(groupsChanged || sortGroups.length) {
+ vboxChooser.composeGroupDef();
+ }
+
+
+ // update selection list
+ if(selectedChanged) {
+
+ vboxChooser.selectionListChanged(vboxChooser._selectedList);
+
+ } else if(updateMenus) {
+
+ if(vboxChooser._vmGroupContextMenuObj)
+ vboxChooser._vmGroupContextMenuObj.update(vboxChooser);
+
+
+ if(vboxChooser._vmContextMenuObj)
+ vboxChooser._vmContextMenuObj.update(vboxChooser);
+
+ }
+
+ if(resizeElements) vboxChooser._resizeElements(true);
+
+
+
+ });
+
+
+
+});
\ No newline at end of file diff --git a/js/datamediator.js b/js/datamediator.js new file mode 100644 index 0000000..7633a52 --- /dev/null +++ b/js/datamediator.js @@ -0,0 +1,471 @@ +/**
+ * @fileOverview Deferred data loader / cacher singleton. Provides vboxDataMediator
+ * @author Ian Moore (imoore76 at yahoo dot com)
+ * @version $Id: datamediator.js 591 2015-04-11 22:40:47Z imoore76 $
+ * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
+ */
+
+/**
+ * vboxVMDataMediator
+ *
+ * @see jQuery.deferred
+ * @namespace vboxVMDataMediator
+ */
+var vboxVMDataMediator = {
+
+ /* Promises for data */
+ promises : {
+ 'getVMDetails':{},
+ 'getVMRuntimeData':{}
+ },
+
+ /* Holds Basic VM data */
+ vmData : null,
+
+ /* Holds VM details */
+ vmDetailsData : {},
+
+ /* Holds VM runtime data */
+ vmRuntimeData : {},
+
+ /* Expire cached promise / data */
+ expireVMDetails: function(vmid) {
+ vboxVMDataMediator.promises.getVMDetails[vmid] = null;
+ vboxVMDataMediator.vmDetailsData[vmid] = null;
+ },
+ expireVMRuntimeData: function(vmid) {
+ vboxVMDataMediator.promises.getVMRuntimeData[vmid] = null;
+ vboxVMDataMediator.vmRuntimeData[vmid] = null;
+ },
+ expireAll: function() {
+ for(var i in vboxVMDataMediator.promises) {
+ if(typeof(i) != 'string') continue;
+ vboxVMDataMediator.promises[i] = {};
+ }
+ vboxVMDataMediator.vmData = null;
+ vboxVMDataMediator.vmRuntimeData = {};
+ vboxVMDataMediator.vmDetailsData = {};
+ },
+
+ /**
+ * Get basic vm data
+ *
+ * @param vmid {String} ID of VM
+ * @returns {Object} vm data
+ */
+ getVMData: function(vmid) {
+
+ // VMList must exist
+ if(!vboxVMDataMediator.vmData) {
+ return;
+ }
+
+ return vboxVMDataMediator.vmData[vmid];
+
+ },
+
+ /**
+ * Return list of machines, subscribe to running VM events
+ * and start the event listener
+ *
+ * @returns {Object} promise
+ */
+ getVMList: function() {
+
+ // Return array from existing data
+ if(vboxVMDataMediator.vmData) {
+ var list = [];
+ for(var i in vboxVMDataMediator.vmData) {
+ if(typeof i != 'string') continue;
+ if(i == 'host') continue;
+ list.push(vboxVMDataMediator.vmData[i]);
+ }
+ return list;
+ }
+
+
+ var mList = $.Deferred();
+ $.when(vboxAjaxRequest('vboxGetMachines')).done(function(d) {
+
+ var vmData = {};
+ var subscribeList = [];
+
+ for(var i = 0; i < d.responseData.length; i++) {
+
+ // Enforce VM ownership
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership && !$('#vboxPane').data('vboxSession').admin && d.vmlist[i].owner != $('#vboxPane').data('vboxSession').user) {
+ continue;
+ }
+
+ vmData[d.responseData[i].id] = d.responseData[i];
+
+ if(vboxVMStates.isRunning({'state':d.responseData[i].state}) || vboxVMStates.isPaused({'state':d.responseData[i].state}))
+ subscribeList[subscribeList.length] = d.responseData[i].id;
+
+ }
+
+ // Start event listener
+ $.when(vboxEventListener.start(subscribeList)).done(function(){
+ vboxVMDataMediator.vmData = vmData;
+ mList.resolve(d.responseData);
+
+ }).fail(function() {
+ mList.reject();
+ });
+
+
+ }).fail(function() {
+ mList.reject();
+ });
+
+ return mList.promise();
+ },
+
+ /**
+ * Get VM details data
+ *
+ * @param vmid {String} ID of VM to get data for
+ * @param forceRefresh {Boolean} force refresh of VM data
+ * @returns {Object} vm data or promise
+ */
+ getVMDetails: function(vmid, forceRefresh) {
+
+ // Data exists
+ if(vboxVMDataMediator.vmDetailsData[vmid] && !forceRefresh) {
+ vboxVMDataMediator.promises.getVMDetails[vmid] = null;
+ return vboxVMDataMediator.vmDetailsData[vmid];
+ }
+
+ // Promise does not yet exist?
+ if(!vboxVMDataMediator.promises.getVMDetails[vmid]) {
+
+ vboxVMDataMediator.promises.getVMDetails[vmid] = $.Deferred();
+
+ $.when(vboxAjaxRequest('machineGetDetails',{vm:vmid})).done(function(d){
+ vboxVMDataMediator.vmDetailsData[d.responseData.id] = d.responseData;
+ vboxVMDataMediator.promises.getVMDetails[vmid].resolve(d.responseData);
+ }).fail(function(){
+ vboxVMDataMediator.promises.getVMDetails[vmid].reject();
+ vboxVMDataMediator.promises.getVMDetails[vmid] = null;
+ });
+
+ }
+ return vboxVMDataMediator.promises.getVMDetails[vmid];
+ },
+
+ /**
+ * Get VM's runtime data
+ *
+ * @param vmid {String} ID of VM to get data for
+ * @returns {Object} VM runtime data or promise
+ */
+ getVMRuntimeData: function(vmid) {
+
+ // Data exists
+ if(vboxVMDataMediator.vmRuntimeData[vmid]) {
+ vboxVMDataMediator.promises.getVMRuntimeData[vmid] = null;
+ return vboxVMDataMediator.vmRuntimeData[vmid];
+ }
+
+ // Promise does not yet exist?
+ if(!vboxVMDataMediator.promises.getVMRuntimeData[vmid]) {
+
+ vboxVMDataMediator.promises.getVMRuntimeData[vmid] = $.Deferred();
+
+ $.when(vboxAjaxRequest('machineGetRuntimeData',{vm:vmid})).done(function(d){
+ vboxVMDataMediator.vmRuntimeData[d.responseData.id] = d.responseData;
+ if(vboxVMDataMediator.promises.getVMRuntimeData[vmid])
+ vboxVMDataMediator.promises.getVMRuntimeData[vmid].resolve(d.responseData);
+ }).fail(function(){
+ vboxVMDataMediator.promises.getVMRuntimeData[vmid].reject();
+ vboxVMDataMediator.promises.getVMRuntimeData[vmid] = null;
+ });
+
+ }
+ return vboxVMDataMediator.promises.getVMRuntimeData[vmid];
+ },
+
+ /**
+ * Return all data for a VM
+ * @param vmid {String} ID of VM to get data for
+ * @returns promise
+ */
+ getVMDataCombined : function(vmid) {
+
+ // Special case for 'host'
+ if(vmid == 'host') {
+ var def = $.Deferred();
+ $.when(vboxVMDataMediator.getVMDetails(vmid)).done(function(d){
+ def.resolve(d);
+ }).fail(function(){
+ def.reject();
+ });
+ return def.promise();
+ }
+
+ if(!vboxVMDataMediator.vmData[vmid]) return;
+
+ var runtime = function() { return {};};
+ if(vboxVMStates.isRunning({'state':vboxVMDataMediator.vmData[vmid].state}) || vboxVMStates.isPaused({'state':vboxVMDataMediator.vmData[vmid].state})) {
+ runtime = vboxVMDataMediator.getVMRuntimeData(vmid);
+ }
+
+ var def = $.Deferred();
+ $.when(vboxVMDataMediator.getVMDetails(vmid), runtime, vboxVMDataMediator.getVMData(vmid)).done(function(d1,d2,d3){
+ def.resolve($.extend(true,{},d1,d2,d3));
+ }).fail(function(){
+ def.reject();
+ });
+ return def.promise();
+
+ },
+
+ /**
+ * Get new VM data
+ * @param vmid {String} ID of VM to get data for
+ * @returns {Object} promise
+ */
+ refreshVMData : function(vmid) {
+
+ // Special case for host
+ if(vmid == 'host') {
+ $('#vboxPane').trigger('vboxOnMachineDataChanged', [{machineId:'host'}]);
+ $('#vboxPane').trigger('vboxEvents', [[{eventType:'OnMachineDataChanged',machineId:'host'}]]);
+ return;
+ }
+
+ if(!vboxVMDataMediator.vmData[vmid]) return;
+
+ var def = $.Deferred();
+ $.when(vboxAjaxRequest('vboxGetMachines',{'vm':vmid})).done(function(d) {
+ vm = d.responseData[0];
+ vboxVMDataMediator.vmData[vm.id] = vm;
+ def.resolve();
+ $('#vboxPane').trigger('vboxOnMachineDataChanged', [{machineId:vm.id,enrichmentData:vm}]);
+ $('#vboxPane').trigger('vboxEvents', [[{eventType:'OnMachineDataChanged',machineId:vm.id,enrichmentData:vm}]]);
+ }).fail(function(){
+ def.reject();
+ });
+
+ return def.promise();
+ }
+
+};
+
+/* Events to bind for vboxVMDataMediator when everything is loaded */
+$(document).ready(function(){
+
+ /*
+ *
+ * VirtualBox events
+ *
+ */
+
+ // Raw event to data handlers
+ $('#vboxPane').on('vboxOnMachineDataChanged',function(e, eventData) {
+
+ vboxVMDataMediator.expireVMDetails(eventData.machineId);
+ vboxVMDataMediator.expireVMRuntimeData(eventData.machineId);
+
+ if(vboxVMDataMediator.vmData[eventData.machineId] && eventData.enrichmentData) {
+ $.extend(true, vboxVMDataMediator.vmData[eventData.machineId], eventData.enrichmentData);
+ // $.extend doesn't seem to handle this for some reason
+ vboxVMDataMediator.vmData[eventData.machineId].groups = eventData.enrichmentData.groups;
+ }
+
+ // Machine state change
+ }).on('vboxOnMachineStateChanged', function(e, eventData) {
+
+ // Only care about it if its in our list
+ if(vboxVMDataMediator.vmData[eventData.machineId]) {
+
+ vboxVMDataMediator.vmData[eventData.machineId].state = eventData.state;
+ vboxVMDataMediator.vmData[eventData.machineId].lastStateChange = eventData.enrichmentData.lastStateChange;
+ vboxVMDataMediator.vmData[eventData.machineId].currentStateModified = eventData.enrichmentData.currentStateModified;
+
+ // If it's running, subscribe to its events
+ if(vboxVMStates.isRunning({'state':eventData.state}) || vboxVMStates.isPaused({'state':eventData.state})) {
+
+ // If we already have runtime data, assume we were already subscribed
+ if(!vboxVMDataMediator.vmRuntimeData[eventData.machineId]) {
+
+ // Tell event listener to subscribe to this machine's events
+ vboxEventListener.subscribeVMEvents(eventData.machineId);
+ }
+
+ } else {
+ vboxVMDataMediator.expireVMRuntimeData(eventData.machineId);
+ }
+ }
+
+ // Session state change
+ }).on('vboxOnSessionStateChanged', function(e, eventData) {
+
+ if(vboxVMDataMediator.vmData[eventData.machineId])
+ vboxVMDataMediator.vmData[eventData.machineId].sessionState = eventData.state;
+
+
+ // Snapshot changed
+ }).on('vboxOnSnapshotTaken vboxOnSnapshotDeleted vboxOnSnapshotChanged vboxOnSnapshotRestored',function(e,eventData) {
+
+ if(vboxVMDataMediator.vmData[eventData.machineId]) {
+
+ vboxVMDataMediator.vmData[eventData.machineId].currentSnapshotName = eventData.enrichmentData.currentSnapshotName;
+ vboxVMDataMediator.vmData[eventData.machineId].currentStateModified = eventData.enrichmentData.currentStateModified;
+
+ // Get media again
+ $.when(vboxAjaxRequest('vboxGetMedia')).done(function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+
+ }
+ if(vboxVMDataMediator.vmDetailsData[eventData.machineId])
+ vboxVMDataMediator.vmDetailsData[eventData.machineId].snapshotCount = eventData.enrichmentData.snapshotCount;
+
+ // Expire all data for a VM when machine is unregistered
+ }).on('vboxOnMachineRegistered', function(e, eventData) {
+
+ if(!eventData.registered) {
+ vboxVMDataMediator.expireVMDetails(eventData.machineId);
+ vboxVMDataMediator.expireVMRuntimeData(eventData.machineId);
+ vboxVMDataMediator.vmData[eventData.machineId] = null;
+
+ } else if(eventData.enrichmentData) {
+
+ // Enforce VM ownership
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership && !$('#vboxPane').data('vboxSession').admin && eventData.enrichmentData.owner != $('#vboxPane').data('vboxSession').user) {
+ return;
+ }
+
+ vboxVMDataMediator.vmData[eventData.enrichmentData.id] = eventData.enrichmentData;
+
+ }
+
+ //}).on('vboxOnCPUChanged', function(e, vmid) {
+
+ /*
+ case 'OnCPUChanged':
+ $data['cpu'] = $eventDataObject->cpu;
+ $data['add'] = $eventDataObject->add;
+ $data['dedupId'] .= '-' . $data['cpu'];
+ break;
+ */
+
+ }).on('vboxOnNetworkAdapterChanged', function(e, eventData) {
+
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId]) {
+ $.extend(vboxVMDataMediator.vmRuntimeData[eventData.machineId].networkAdapters[eventData.networkAdapterSlot], eventData.enrichmentData);
+ }
+
+
+ /* Storage controller of VM changed */
+ //}).on('vboxOnStorageControllerChanged', function() {
+ /*
+ case 'OnStorageControllerChanged':
+ $data['machineId'] = $eventDataObject->machineId;
+ $data['dedupId'] .= '-'. $data['machineId'];
+ break;
+ */
+
+ }).on('vboxOnMediumChanged', function(e, eventData) {
+
+ /* Medium attachment changed */
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId]) {
+ for(var a = 0; a < vboxVMDataMediator.vmRuntimeData[eventData.machineId].storageControllers.length; a++) {
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId].storageControllers[a].name == eventData.controller) {
+ for(var b = 0; b < vboxVMDataMediator.vmRuntimeData[eventData.machineId].storageControllers[a].mediumAttachments.length; b++) {
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId].storageControllers[a].mediumAttachments[b].port == eventData.port &&
+ vboxVMDataMediator.vmRuntimeData[eventData.machineId].storageControllers[a].mediumAttachments[b].device == eventData.device) {
+
+ vboxVMDataMediator.vmRuntimeData[eventData.machineId].storageControllers[a].mediumAttachments[b].medium = (eventData.medium ? {id:eventData.medium} : null);
+ break;
+ }
+ }
+ break;
+ }
+ }
+ }
+
+ /* Shared folders changed */
+ //}).on('vboxOnSharedFolderChanged', function() {
+
+ // VRDE runtime info
+ }).on('vboxOnVRDEServerChanged', function(e, eventData) {
+
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId]) {
+ $.extend(true,vboxVMDataMediator.vmRuntimeData[eventData.machineId].VRDEServer, eventData.enrichmentData);
+ }
+
+
+ // This only fires when it is enabled
+ }).on('vboxOnVRDEServerInfoChanged', function(e, eventData) {
+
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId]) {
+ vboxVMDataMediator.vmRuntimeData[eventData.machineId].VRDEServerInfo.port = eventData.enrichmentData.port;
+ vboxVMDataMediator.vmRuntimeData[eventData.machineId].VRDEServer.enabled = eventData.enrichmentData.enabled;
+ }
+
+
+ // Execution cap
+ }).on('vboxOnCPUExecutionCapChanged', function(e, eventData) {
+
+ if(vboxVMDataMediator.vmRuntimeData[eventData.machineId]) {
+ vboxVMDataMediator.vmRuntimeData[eventData.machineId].CPUExecutionCap = eventData.executionCap;
+ }
+
+ // Special cases for where phpvirtualbox keeps its extra data
+ }).on('vboxOnExtraDataChanged', function(e, eventData) {
+
+ // No vm id is a global change
+ if(!eventData.machineId || !vboxVMDataMediator.vmData[eventData.machineId]) return;
+
+ switch(eventData.key) {
+
+ // Startup mode
+ case 'pvbx/startupMode':
+ if(vboxVMDataMediator.vmDetailsData[eventData.machineId])
+ vboxVMDataMediator.vmDetailsData[eventData.machineId].startupMode = eventData.value;
+ break;
+
+ // Owner
+ case 'phpvb/sso/owner':
+ vboxVMDataMediator.vmData[eventData.machineId].owner = eventData.value;
+ break;
+
+ // Custom icon
+ case 'phpvb/icon':
+
+ vboxVMDataMediator.vmData[eventData.machineId].customIcon = eventData.value;
+
+ if(vboxVMDataMediator.vmDetailsData[eventData.machineId])
+ vboxVMDataMediator.vmDetailsData[eventData.machineId].customIcon = eventData.value;
+
+
+ break;
+
+ // Save mounted media changes at runtime
+ case 'GUI/SaveMountedAtRuntime':
+ if(vboxVMDataMediator.vmDetailsData[eventData.machineId])
+ vboxVMDataMediator.vmDetailsData[eventData.machineId].GUI.SaveMountedAtRuntime = eventData.value;
+ break;
+
+ // First time run
+ case 'GUI/FirstRun':
+ if(vboxVMDataMediator.vmDetailsData[eventData.machineId])
+ vboxVMDataMediator.vmDetailsData[eventData.machineId].GUI.FirstRun = eventData.value;
+ break;
+
+ }
+
+
+ /*
+ *
+ * phpVirtualBox events
+ *
+ */
+
+ // Expire everything when host changes
+ }).on('hostChange',function(){
+ vboxVMDataMediator.expireAll();
+
+ });
+
+});
\ No newline at end of file diff --git a/js/dialogs.js b/js/dialogs.js new file mode 100644 index 0000000..1989d6a --- /dev/null +++ b/js/dialogs.js @@ -0,0 +1,1725 @@ +/**
+ * @fileOverview Dialog logic for various wizards and other dialogs
+ * @author Ian Moore (imoore76 at yahoo dot com)
+ * @version $Id: dialogs.js 599 2015-07-27 10:40:37Z imoore76 $
+ * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
+ */
+
+/**
+ * Run the import appliance wizard
+ */
+function vboxWizardImportApplianceDialog() {
+
+ // reference
+ var self = this;
+
+ // Extend vboxWizard
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ /* Common settings */
+ this.name = 'wizardImportAppliance';
+ this.title = trans('Import Virtual Applicance','UIWizardImportApp');
+ this.bg = 'images/vbox/vmw_ovf_import_bg.png';
+ this.icon = 'import';
+ this.steps = 2;
+ this.height = 500;
+ this.finishText = trans('Import','UIWizardImportApp');
+ this.context = 'UIWizardImportApp';
+
+ /* Restore defaults is added to last step */
+ this.stepButtons = [
+ {
+ 'name' : trans('Restore Defaults','UIWizardImportApp'),
+ 'steps' : [-1],
+ 'click' : function() {
+ wizardImportApplianceParsed();
+ }
+ }
+ ];
+
+ /* Data to be loaded */
+ this.data = [
+ {'fn':'vboxGetEnumerationMap','args':{'class':'NetworkAdapterType'},'callback':function(d){$('#vboxPane').data('vboxNetworkAdapterTypes',d.responseData);}},
+ {'fn':'vboxGetEnumerationMap','args':{'class':'AudioControllerType'},'callback':function(d){$('#vboxPane').data('vboxAudioControllerTypes',d.responseData);}},
+ ];
+
+ /* Perform action on finish */
+ this.onFinish = function() {
+
+ var file = $(self.form).find('[name=wizardImportApplianceLocation]').val();
+ var descriptions = $('#vboxImportProps').data('descriptions');
+ var reinitNetwork = $(self.form).find('[name=vboxImportReinitNetwork]').prop('checked');
+
+ // Check for descriptions
+ if(!descriptions) {
+ return;
+ }
+
+
+ /** Call Appliance import AJAX function */
+ var vboxImportApp = function() {
+
+ $(self.dialog).empty().remove();
+
+ var l = new vboxLoader();
+ l.add('applianceImport',function(d){
+ if(d.responseData.progress) {
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(){
+ // Imported media must be refreshed
+ var ml = new vboxLoader();
+ ml.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+ ml.onLoad = function(){
+ self.completed.resolve();
+ };
+ ml.run();
+ },'progress_import_90px.png',trans('Import an appliance into VirtualBox','UIActionPool').replace(/\.+$/g,''),vboxBasename(file));
+ } else {
+ self.completed.reject();
+ }
+ },{'descriptions':descriptions,'file':file,'reinitNetwork':reinitNetwork});
+ l.run();
+ };
+
+ // license agreements
+ var licenses = [];
+
+ // Step through each VM and obtain value
+ for(var a = 0; a < descriptions.length; a++) {
+ var children = $('#vboxImportProps').children('tr.vboxChildOf'+a);
+ descriptions[a][5] = []; // enabled / disabled
+ var lic = null;
+ var vmname = null;
+ for(var b = 0; b < children.length; b++) {
+ descriptions[a][5][b] = !$(children[b]).data('propdisabled');
+ descriptions[a][3][$(children[b]).data('descOrder')] = $(children[b]).children('td:eq(1)').data('descValue');
+ // check for license
+ if(descriptions[a][0][b] == 'License') {
+ lic = descriptions[a][2][b];
+ } else if(descriptions[a][0][b] == 'Name') {
+ vmname = descriptions[a][2][b];
+ }
+ }
+ if(lic) {
+ if(!vmname) vmname = trans('Virtual System %1','UIApplianceEditorWidget').replace('%1',a);
+ licenses[licenses.length] = {'name':vmname,'license':lic};
+ }
+ }
+
+
+ if(licenses.length) {
+
+ var msg = trans('<b>The virtual system "%1" requires that you agree to the terms and conditions of the software license agreement shown below.</b><br /><br />Click <b>Agree</b> to continue or click <b>Disagree</b> to cancel the import.','UIImportLicenseViewer');
+ var a = 0;
+ var buttons = {};
+ buttons[trans('Agree','UIImportLicenseViewer')] = function() {
+
+ a++;
+ if(a >= licenses.length) {
+ $(this).remove();
+ vboxImportApp();
+ return;
+ }
+ $(this).dialog('close');
+ $('#vboxImportWizLicTitle').html(msg.replace('%1',licenses[a]['name']));
+ $('#vboxImportWizLicContent').val(licenses[a]['license']);
+ $(this).dialog('open');
+
+ };
+ buttons[trans('Disagree','UIImportLicenseViewer')] = function() {
+ $(this).empty().remove();
+ };
+
+ var dlg = $('<div />').dialog({'closeOnEscape':false,'width':600,'height':500,'buttons':buttons,'modal':true,'autoOpen':false,'dialogClass':'vboxDialogContent vboxWizard','title':'<img src="images/vbox/os_type_16px.png" class="vboxDialogTitleIcon" /> ' + trans('Software License Agreement','UIImportLicenseViewer')});
+
+ $(dlg).html('<p id="vboxImportWizLicTitle" /><textarea rows="20" spellcheck="false" wrap="off" readonly="true"id="vboxImportWizLicContent" style="width:100%; margin:2px; padding:2px;"></textarea>');
+ $('#vboxImportWizLicTitle').html(msg.replace('%1',licenses[a]['name']));
+ $('#vboxImportWizLicContent').val(licenses[a]['license']);
+ $(dlg).dialog('open');
+
+ } else {
+ vboxImportApp();
+ }
+
+
+ };
+
+}
+
+/**
+ * Run the export appliance wizard
+ */
+function vboxWizardExportApplianceDialog() {
+
+ // reference
+ var self = this;
+
+ // Extend vboxWizard class
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ /* Common settings */
+ this.name = 'wizardExportAppliance';
+ this.title = trans('Export Virtual Appliance','UIWizardExportApp');
+ this.bg = 'images/vbox/vmw_ovf_export_bg.png';
+ this.icon = 'export';
+ this.steps = 4;
+ this.height = 500;
+ this.context = 'UIWizardExportApp';
+ this.finishText = trans('Export','UIWizardExportApp');
+
+ /* Add restore defaults button to last step */
+ this.stepButtons = [
+ {
+ 'name' : trans('Restore Defaults','UIWizardExportApp'),
+ 'steps' : [-1],
+ 'click' : function(e) {
+ // Remove export VM properties
+ $('#vboxExportProps').children().remove();
+ // Re-trigger adding them
+ if(self.mode == 'advanced')
+ vboxWizardExportApplianceUpdateList();
+ else
+ $('#wizardExportApplianceStep4').trigger('show',e,self);
+ }
+ }
+ ];
+
+ /* Function run when wizard completes */
+ this.onFinish = function() {
+
+
+ // Actually export appliances
+ function vboxExportApp(force) {
+
+ // Each VM
+ var vmid = null;
+ var vms = {};
+ var vmsAndProps = $('#vboxExportProps').children('tr');
+ for(var a = 0; a < vmsAndProps.length; a++) {
+ if($(vmsAndProps[a]).hasClass('vboxTableParent')) {
+ vmid = $(vmsAndProps[a]).data('vm').id;
+ vms[vmid] = {};
+ vms[vmid]['id'] = vmid;
+ continue;
+ }
+
+ var prop = $(vmsAndProps[a]).data('vmprop');
+ vms[vmid][prop] = $(vmsAndProps[a]).children('td:eq(1)').children().first().text();
+
+ }
+
+ var file = $(self.form).find('[name=wizardExportApplianceLocation]').val();
+ var format = $(self.form).find('[name=wizardExportApplianceFormat]').val();
+ var manifest = $(self.form).find('[name=wizardExportApplianceManifest]').prop('checked');
+ var overwrite = force;
+
+ var l = new vboxLoader();
+ l.add('applianceExport',function(d){
+ if(d.responseData.progress) {
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(){
+ self.completed.resolve();
+ },'progress_export_90px.png',
+ trans('Export one or more VirtualBox virtual machines as an appliance','UIActionPool').replace(/\.+$/g,''),
+ vboxBasename(file));
+ } else {
+ self.completed.reject();
+ }
+ },{'format':format,'file':file,'vms':vms,'manifest':manifest,'overwrite':overwrite});
+ l.run();
+
+ $(self.dialog).empty().remove();
+
+
+ }
+
+ /* Remove required classes */
+ $(self.form).find('[name=wizardExportApplianceLocation]').removeClass('vboxRequired');
+ $('#vboxExportAppVMListContainer').removeClass('vboxRequired');
+
+ /* Some vms must be selected */
+ if($('#vboxExportProps').children('tr').length == 0) {
+ $('#vboxExportAppVMListContainer').addClass('vboxRequired');
+ return;
+ }
+
+ /* Check to see if file exists */
+ var loc = $(self.form).find('[name=wizardExportApplianceLocation]').val();
+ if(!loc) {
+ $(self.form).find('[name=wizardExportApplianceLocation]').addClass('vboxRequired');
+ return;
+ }
+
+ var fileExists = false;
+ var fe = new vboxLoader();
+ fe.add('fileExists',function(d){
+ fileExists = d.responseData;
+ },{'file':loc});
+ fe.onLoad = function() {
+ if(fileExists) {
+ var buttons = {};
+ buttons[trans('Yes','QIMessageBox')] = function() {
+ vboxExportApp(1);
+ $(this).empty().remove();
+ };
+ vboxConfirm(trans('A file named <b>%1</b> already exists. Are you sure you want to replace it?<br /><br />Replacing it will overwrite its contents.','UIMessageCenter').replace('%1',vboxBasename(loc)),buttons,trans('No','QIMessageBox'));
+ return;
+ }
+ vboxExportApp(0);
+
+ };
+ fe.run();
+
+ };
+
+}
+
+/**
+ * Show the medium encryption dialog
+ *
+ * @param {String} context - used in dialog name
+ * @param {Array} encIds - encryption ids
+ *
+ */
+function vboxMediumEncryptionPasswordsDialog(context, encIds, validIds) {
+
+ if(!(encIds && encIds.length)) { return []; }
+
+ var results = $.Deferred();
+
+ var dialogTitle = trans("%1 - Disk Encryption").replace('%1', context);
+
+ var l = new vboxLoader();
+ l.addFileToDOM("panes/mediumEncryptionPasswords.html");
+ l.onLoad = function() {
+
+ for(var i = 0; i < encIds.length; i++) {
+ vboxMediumEncryptionPasswordAdd(encIds[i].id, validIds && validIds.length && jQuery.inArray(encIds[i].id, validIds) > -1);
+ }
+
+ var buttons = {};
+ buttons[trans('OK','QIMessageBox')] = function(){
+ // Get passwords
+ var pws = vboxMediumEncryptionPasswordsGet();
+ if(pws === false)
+ return;
+
+ $(this).trigger('close').empty().remove();
+
+ results.resolve(pws);
+ };
+ buttons[trans('Cancel','QIMessageBox')] = function(){
+ results.reject();
+ $(this).trigger('close').empty().remove();
+ };
+
+ $('#vboxMediumEncryptionPasswords').dialog({'closeOnEscape':true,'width':600,'height':400,'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="images/vbox/nw_16px.png" class="vboxDialogTitleIcon" /> ' + dialogTitle}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Cancel','QIMessageBox')+'")').trigger('click');
+ });
+
+ };
+
+ l.run()
+
+ return results.promise();
+}
+
+/**
+ * Show the port forwarding configuration dialog
+ * @param {Array} rules - list of port forwarding rules to process
+ * @returns {Object} deferred promise
+ */
+function vboxPortForwardConfigDialog(rules) {
+
+ var results = $.Deferred();
+
+ var l = new vboxLoader();
+ l.addFileToDOM("panes/settingsPortForwarding.html");
+ l.onLoad = function(){
+
+ vboxSettingsPortForwardingInit(rules);
+
+ var resizeTable = function() {
+ var h = $('#vboxSettingsPortForwarding').children('table').hide().parent().innerHeight() - 16;
+ $('#vboxSettingsPortForwarding').children('table').css({'height':h+'px'}).show();
+ $('#vboxSettingsPortForwardingListDiv').css({'height':(h-6)+'px','overflow':'auto'});
+
+
+ };
+
+ var buttons = {};
+ buttons[trans('OK','QIMessageBox')] = function(){
+ // Get rules
+ var rules = $('#vboxSettingsPortForwardingList').children('tr');
+ var rulesToPass = new Array();
+ for(var i = 0; i < rules.length; i++) {
+ if($(rules[i]).data('vboxRule')[3] == 0 || $(rules[i]).data('vboxRule')[5] == 0) {
+ vboxAlert(trans("The current port forwarding rules are not valid. " +
+ "None of the host or guest port values may be set to zero.",'UIMessageCenter'));
+ return;
+ }
+ rulesToPass[i] = $(rules[i]).data('vboxRule');
+ }
+ $(this).trigger('close').empty().remove();
+
+ results.resolve(rulesToPass);
+ };
+ buttons[trans('Cancel','QIMessageBox')] = function(){
+ results.reject();
+ $(this).trigger('close').empty().remove();
+ };
+
+ $('#vboxSettingsPortForwarding').dialog({'closeOnEscape':true,'width':600,'height':400,'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="images/vbox/nw_16px.png" class="vboxDialogTitleIcon" /> ' + trans('Port Forwarding Rules','UIMachineSettingsPortForwardingDlg')}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Cancel','QIMessageBox')+'")').trigger('click');
+ }).on('dialogresizestop',resizeTable);
+
+ resizeTable();
+ };
+ l.run();
+
+ return results.promise();
+}
+
+/**
+ * Run the New Virtual Machine Wizard
+ * @param {String} vmgroup - VM group to add machine to
+ */
+function vboxWizardNewVMDialog(vmgroup) {
+
+ // reference to self
+ var self = this;
+
+ // Extend vboxWizard class
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ /* Common settings */
+ this.name = 'wizardNewVM';
+ this.bg = 'images/vbox/vmw_new_welcome_bg.png';
+ this.title = trans('Create Virtual Machine','UIWizardNewVM');
+ this.icon = 'vm_new';
+ this.steps = 3;
+ this.vmgroup = vmgroup;
+ this.context = 'UIWizardNewVM';
+ this.finishText = trans('Create','UIWizardNewVM');
+ this.data = [
+ {'fn':'vboxGetMedia','callback':function(d){$('#vboxPane').data('vboxMedia',d.responseData);}}
+ ];
+
+ /* Function to run when wizard completes */
+ this.onFinish = function() {
+
+ // Callback to finish wizard
+ var vboxNewVMFinish = function() {
+
+ // Get parameters
+ var disk = '';
+ if($(self.form).find('[name=newVMDisk]:checked').val() == 'existing') {
+ disk = $(self.form)[0].newVMDiskSelect.options[$(self.form)[0].newVMDiskSelect.selectedIndex].value;
+ disk = vboxMedia.getMediumById(disk).location;
+ }
+ var name = jQuery.trim($(self.form).find('[name=newVMName]').val());
+ var ostype = $(self.form).find('[name=newVMOSType]').val();
+ var mem = parseInt($(self.form).find('[name=wizardNewVMSizeValue]').val());
+
+ // Show loading screen
+ var l = new vboxLoader('machineCreate');
+ l.showLoading();
+
+ $.when(vboxAjaxRequest('machineCreate',{'disk':disk,'ostype':ostype,'memory':mem,'name':name,'group':vmgroup}))
+ .always(function() {
+ l.removeLoading();
+ }).done(function(res){
+
+ if(res.responseData.exists) {
+ vboxAlert(trans('<p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>This folder already exists and possibly belongs to another machine.</p>','UIMessageCenter').replace('%1',vboxBasename(res.exists)).replace('%2',vboxDirname(res.exists)));
+
+ } else if(res.success) {
+ $(self.dialog).empty().remove();
+ var lm = new vboxLoader('machineCreate');
+ lm.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+ lm.onLoad = function() {
+ self.completed.resolve();
+ };
+ lm.run();
+ } else {
+ self.completed.reject();
+ }
+
+ });
+
+ };
+
+ // Name must exist
+ if(!jQuery.trim($(self.form).find('[name=newVMName]').val())) {
+ $(self.form).find('[name=newVMName]').addClass('vboxRequired');
+ return;
+ }
+ $(self.form).find('[name=newVMName]').removeClass('vboxRequired');
+
+ // Make sure file does not exist
+ var fnl = new vboxLoader();
+ fnl.add('vboxGetComposedMachineFilename',function(d){
+
+ loc = vboxDirname(d.responseData);
+ var fileExists = false;
+
+ var fe = new vboxLoader('fileExists');
+ fe.add('fileExists',function(d){
+ fileExists = d.responseData;
+ },{'file':loc});
+ fe.onLoad = function() {
+
+ if(fileExists) {
+
+ vboxAlert(trans('<p>Cannot create the machine folder <b>%1</b> in the parent folder <nobr><b>%2</b>.</nobr></p><p>This folder already exists and possibly belongs to another machine.</p>','UIMessageCenter').replace('%1',vboxBasename(loc)).replace('%2',vboxDirname(loc)));
+ // Go back
+ self.displayStep(1);
+
+ return;
+ }
+
+ // Start new harddisk wizard if create new is selected
+ if($(self.form).find('[name=newVMDisk]:checked').val() == 'create') {
+
+ // Recommended size
+ var size = newVMOSTypesObj[$(self.form).find('[name=newVMOSType]').val()].recommendedHDD;
+
+ $.when(new vboxWizardNewHDDialog({'name':jQuery.trim($(self.form).find('[name=newVMName]').val()),'size':size,'group':vmgroup}).run())
+ .done(function(med){
+
+ $(self.form).find('[name=newVMDisk]').eq(2).trigger('click').prop('checked',true);
+
+ // Add newly created disk as option and select it
+ vmNewFillExistingDisks(med);
+
+ vboxNewVMFinish();
+
+ });
+
+ return;
+
+ } else if($(self.form).find('[name=newVMDisk]:checked').val() == 'none') {
+
+ buttons = {};
+ buttons[trans('Continue','UIMessageCenter')] = function(){
+ $(this).empty().remove();
+ vboxNewVMFinish();
+ };
+ vboxConfirm(trans('You are about to create a new virtual machine without a hard drive. You will not be able to install an operating system on the machine until you add one. In the mean time you will only be able to start the machine using a virtual optical disk or from the network.','UIMessageCenter'), buttons, trans('Go Back','UIMessageCenter'));
+ return;
+ }
+
+ vboxNewVMFinish();
+
+ };
+ fe.run();
+
+
+ },{'name':document.forms['frmwizardNewVM'].newVMName.value, 'group':vmgroup});
+
+ fnl.run();
+ };
+
+}
+
+/**
+ * Run the Clone Virtual Machine Wizard
+ * @param {Object} args - wizard data - args.vm and args.snapshot should be populated
+ * @returns {Object} deferred promise
+ * @see vboxWizard()
+ */
+function vboxWizardCloneVMDialog(args) {
+
+ // self reference
+ var self = this;
+
+ // Extend vboxWizard class
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ /* Common options */
+ this.name = 'wizardCloneVM';
+ this.title = trans('Clone Virtual Machine','UIWizardCloneVM');
+ this.bg = 'images/vbox/vmw_clone_bg.png';
+ this.icon = 'vm_clone';
+ this.finishText = trans('Clone','UIWizardCloneVM');
+ this.context = 'UIWizardCloneVM';
+ this.widthAdvanced = 450;
+ this.heightAdvanced = 350;
+
+ /* Override run() because we need VM data */
+ this.parentRun = this.run;
+ this.run = function() {
+
+ var l = new vboxLoader('vboxWizardCloneVMInit');
+ l.showLoading();
+ $.when(vboxVMDataMediator.getVMDetails(args.vm.id)).always(function() {
+ // Always remove loading screen
+ l.removeLoading();
+ }).done(function(d){
+ self.steps = (d.snapshotCount > 0 ? 3 : 2);
+ self.args = $.extend(true,args,{'vm':d});
+ self.parentRun();
+ });
+
+ return self.completed.promise();
+
+ };
+
+ /* Function to run when finished */
+ this.onFinish = function() {
+
+ // Get parameters
+ var name = jQuery.trim($(self.form).find('[name=machineCloneName]').val());
+ var src = self.args.vm.id;
+ var snapshot = self.args.snapshot;
+ var allNetcards = $(self.form).find('[name=vboxCloneReinitNetwork]').prop('checked');
+
+ if(!name) {
+ $(self.form).find('[name=machineCloneName]').addClass('vboxRequired');
+ return;
+ }
+
+
+ // Only two steps? We can assume that state has no child states.
+ // Force current state only
+ var vmState = 'MachineState';
+ if(self.steps > 2 || self.mode == 'advanced') {
+ vmState = $(self.form).find('[name=vmState]:checked').val();
+ }
+
+ // Full / linked clone
+ var cLink = $(self.form).find('[name=vboxCloneType]').eq(1).prop('checked');
+
+ // wrap function
+ var vbClone = function(sn) {
+
+ $.when(vboxAjaxRequest('machineClone', {'name':name,'vmState':vmState,'src':src,'snapshot':sn,'reinitNetwork':allNetcards,'link':cLink}))
+ .done(function(d){
+ if(d.responseData.progress) {
+ var registerVM = d.responseData.settingsFilePath;
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(ret) {
+ $.when(vboxAjaxRequest('machineAdd',{'file':registerVM})).done(function(){
+
+ $.when(vboxAjaxRequest('vboxGetMedia')).done(function(dat){
+ $('#vboxPane').data('vboxMedia',dat.responseData);
+ self.completed.resolve();
+ }).fail(function(){
+ self.completed.reject();
+ });
+ }).fail(function(){
+ self.completed.reject();
+ });
+ },'progress_clone_90px.png',trans('Clone the selected virtual machine','UIActionPool'),
+ self.args.vm.name + ' > ' + name);
+ } else {
+ self.completed.reject();
+ }
+ }).fail(function(){
+ self.completed.reject();
+ });
+ };
+
+ // Check for linked clone, but not a snapshot
+ if(cLink && !self.args.snapshot) {
+
+ $.when(vboxAjaxRequest('snapshotTake',
+ {'vm':src,'name':trans('Linked Base for %1 and %2','UIWizardCloneVM').replace('%1',self.args.vm.name).replace('%2',name),'description':''}))
+ .done(function(d){
+
+ if(d.responseData.progress) {
+
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(){
+ $.when(vboxVMDataMediator.getVMDetails(src, true)).done(function(md){
+ vbClone(md.currentSnapshot);
+ });
+ },
+ 'progress_snapshot_create_90px.png',
+ trans('Take a snapshot of the current virtual machine state','UIActionPool'),
+ self.args.vm.name);
+
+ } else if(d && d.error) {
+ self.completed.reject();
+ vboxAlert(d.error);
+ }
+
+ }).fail(function(){
+ self.completed.reject();
+ });
+
+ // Just clone
+ } else {
+ vbClone(snapshot);
+ }
+
+ $(self.dialog).empty().remove();
+
+ };
+}
+
+/**
+ * Run the VM Log Viewer dialog
+ * @param {String} vm - uuid or name of virtual machine to obtain logs for
+ */
+function vboxShowLogsDialogInit(vm) {
+
+ $('#vboxPane').append($('<div />').attr({'id':'vboxVMLogsDialog'}));
+
+ var l = new vboxLoader();
+ l.add('machineGetLogFilesList',function(r){
+ $('#vboxVMLogsDialog').data({'logs':r.responseData.logs,'logpath':r.responseData.path});
+ },{'vm':vm.id});
+ l.addFileToDOM('panes/vmlogs.html',$('#vboxVMLogsDialog'));
+ l.onLoad = function(){
+ var buttons = {};
+ buttons[trans('Refresh','UIVMLogViewer')] = function() {
+ l = new vboxLoader();
+ l.add('machineGetLogFilesList',function(r){
+ $('#vboxVMLogsDialog').data({'logs':r.responseData.logs,'logpath':r.responseData.path});
+
+ },{'vm':vm.id});
+ l.onLoad = function(){
+ vboxShowLogsInit(vm);
+ };
+ l.run();
+ };
+ buttons[trans('Close','UIVMLogViewer')] = function(){$(this).trigger('close').empty().remove();};
+ $('#vboxVMLogsDialog').dialog({'closeOnEscape':true,'width':800,'height':500,'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="images/vbox/vm_show_logs_16px.png" class="vboxDialogTitleIcon" /> '+ trans('%1 - VirtualBox Log Viewer','UIVMLogViewer').replace('%1',vm.name)}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Close','UIVMLogViewer')+'")').trigger('click');
+ });
+ vboxShowLogsInit(vm);
+ };
+ l.run();
+
+}
+
+/**
+ * Show the Virtual Media Manager Dialog
+ * @param {Boolean} select - true to display "Select" button and resolve with selected medium
+ * @param {String} type - optionally restrict media to media of this type
+ * @param {Boolean} hideDiff - optionally hide differencing HardDisk media
+ * @param {String} mPath - optional path to use when adding or creating media through the VMM dialog
+ * @returns {Object} deferred promise
+ */
+function vboxVMMDialog(select,type,hideDiff,mPath) {
+
+ var results = $.Deferred();
+
+ $('#vboxPane').append($('<div />').attr({'id':'vboxVMMDialog','class':'vboxVMMDialog'}));
+
+ var l = new vboxLoader();
+ l.add('getConfig',function(d){$('#vboxPane').data('vboxConfig',d.responseData);});
+ l.add('vboxSystemPropertiesGet',function(d){$('#vboxPane').data('vboxSystemProperties',d.responseData);});
+ l.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+ l.addFileToDOM('panes/vmm.html',$('#vboxVMMDialog'));
+ l.onLoad = function() {
+ var buttons = {};
+ if(select) {
+ buttons[trans('Select','UIMediumManager')] = function() {
+ var sel = null;
+ switch($("#vboxVMMTabs").tabs('option','active')) {
+ case 0: /* HardDisks */
+ sel = $('#vboxVMMHDList').find('tr.vboxListItemSelected').first();
+ break;
+ case 1: /* DVD */
+ sel = $('#vboxVMMCDList').find('tr.vboxListItemSelected').first();
+ break;
+ default:
+ sel = $('#vboxVMMFDList').find('tr.vboxListItemSelected').first();
+ }
+ if($(sel).length) {
+ vboxMedia.updateRecent(vboxMedia.getMediumById($(sel).data('medium')));
+ results.resolve($(sel).data('medium'));
+ }
+ $('#vboxVMMDialog').trigger('close').empty().remove();
+ };
+ }
+ buttons[trans('Close','UIMediumManager')] = function() {
+ $('#vboxVMMDialog').trigger('close').empty().remove();
+ results.reject();
+ };
+
+ $("#vboxVMMDialog").dialog({'closeOnEscape':true,'width':800,'height':500,'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent vboxVMMDialog','title':'<img src="images/vbox/diskimage_16px.png" class="vboxDialogTitleIcon" /> '+trans('Virtual Media Manager','VBoxMediaManagerDlg')}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Close','VBoxMediaManagerDlg')+'")').trigger('click');
+ });
+
+ vboxVMMInit(hideDiff,mPath);
+
+ if(type) {
+ switch(type) {
+ case 'HardDisk':
+ $("#vboxVMMTabs").tabs('option','active',0);
+ $("#vboxVMMTabs").tabs('disable',1);
+ $("#vboxVMMTabs").tabs('disable',2);
+ break;
+ case 'DVD':
+ $("#vboxVMMTabs").tabs('option','active',1);
+ $("#vboxVMMTabs").tabs('disable',0);
+ $("#vboxVMMTabs").tabs('disable',2);
+ break;
+ case 'Floppy':
+ $("#vboxVMMTabs").tabs('option','active',2);
+ $("#vboxVMMTabs").tabs('disable',0);
+ $("#vboxVMMTabs").tabs('disable',1);
+ break;
+ default:
+ $("#vboxVMMTabs").tabs('option','active',0);
+ break;
+ }
+ }
+ };
+ l.run();
+
+ return results.promise();
+}
+
+/**
+ * Run the New Virtual Disk wizard
+ * @param {Object} suggested - sugggested defaults such as hard disk name and path
+ */
+function vboxWizardNewHDDialog(suggested) {
+
+ // reference
+ var self = this;
+
+ // Extend vboxWizard class
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ /* Common options */
+ this.name = 'wizardNewHD';
+ this.title = trans('Create Virtual Hard Drive','UIWizardNewVD');
+ this.bg = 'images/vbox/vmw_new_harddisk_bg.png';
+ this.icon = 'hd';
+ this.steps = 3;
+ this.suggested = suggested;
+ this.context = 'UIWizardNewVD';
+ this.finishText = trans('Create','UIWizardNewVD');
+ this.height = 450;
+
+ this.data = [
+ {'fn':'vboxSystemPropertiesGet','callback':function(d){$('#vboxPane').data('vboxSystemProperties',d.responseData);}},
+ {'fn':'vboxGetMedia','callback':function(d){$('#vboxPane').data('vboxMedia',d.responseData);}}
+ ];
+
+ // Compose folder if suggested name exists
+ if(this.suggested && this.suggested.name) {
+ if(!this.suggested['group']) this.suggested.group = '';
+ this.data.push(
+ {'fn':'vboxGetComposedMachineFilename','callback':function(d){
+ self.suggested.path = vboxDirname(d.responseData)+$('#vboxPane').data('vboxConfig').DSEP;
+ },'args':{'name':this.suggested.name, 'group':this.suggested.group}});
+ }
+
+ /* Function to run when wizard completes */
+ this.onFinish = function() {
+
+ // Fix size if we need to
+ var mbytes = vboxConvertMbytes($(self.form).find('[name=wizardNewHDSizeValue]').val());
+ $(self.form).find('[name=wizardNewHDSizeValue]').val(vboxMbytesConvert(mbytes));
+ $('#wizardNewHDSizeLabel').html(vboxMbytesConvert(mbytes) + ' ('+mbytes+' '+trans('MB','VBoxGlobal')+')');
+
+ // Determine file location
+ var file = $(self.form).find('[name=wizardNewHDLocation]').val();
+ if(file.search(/[\/|\\]/) < 0) {
+ // just a name
+ if(self.suggested.path) {
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership==true){
+ file = self.suggested.path + $('#vboxPane').data('vboxConfig').DSEP + $('#vboxPane').data('vboxSession').user + "_" + file;
+ } else {
+ file = self.suggested.path + $('#vboxPane').data('vboxConfig').DSEP + file;
+ }
+ } else{
+ if($('#vboxPane').data('vboxConfig').enforceVMOwnership==true){
+ file = $('#vboxPane').data('vboxSystemProperties').homeFolder + $('#vboxPane').data('vboxConfig').DSEP + $('#vboxPane').data('vboxSession').user + "_" + file;
+ } else {
+ file = $('#vboxPane').data('vboxSystemProperties').homeFolder + $('#vboxPane').data('vboxConfig').DSEP + file;
+ }
+ }
+
+ // Enforce VM ownership
+ } else if($('#vboxPane').data('vboxConfig').enforceVMOwnership==true) {
+ // has user ownership so use folderbased
+ var nameIndex = file.lastIndexOf($('#vboxPane').data('vboxConfig').DSEP);
+ var path = file.substr(0,nameIndex);
+ var name = file.substr(nameIndex+1,file.length);
+ file = path +$('#vboxPane').data('vboxConfig').DSEP + $('#vboxPane').data('vboxSession').user + "_" + name;
+ }
+
+ var format = $(self.form)[0].elements['newHardDiskFileType'];
+ var formatOpts = {};
+ for(var i = 0; i < format.length; i++) {
+ if(format[i].checked) {
+ formatOpts = $(format[i]).closest('tr').data('vboxFormat');
+ format=format[i].value;
+ break;
+ }
+ }
+
+ // append filename ext?
+ if(jQuery.inArray(file.substring(file.lastIndexOf('.')+1).toLowerCase(),formatOpts.extensions) < 0) {
+ file += '.'+formatOpts.extensions[0];
+ }
+
+ // Normalize file
+ file = file.replace($('#vboxPane').data('vboxConfig').DSEP+$('#vboxPane').data('vboxConfig').DSEP,$('#vboxPane').data('vboxConfig').DSEP);
+
+ /* Check to see if file exists */
+ var fileExists = false;
+ var l = new vboxLoader('fileExists');
+ l.add('fileExists',function(d){
+ fileExists = d.responseData;
+ },{'file':file});
+ l.onLoad = function() {
+ if(fileExists) {
+ vboxAlert(trans("<p>The hard disk storage unit at location <b>%1</b> already " +
+ "exists. You cannot create a new virtual hard disk that uses this " +
+ "location because it can be already used by another virtual hard " +
+ "disk.</p>" +
+ "<p>Please specify a different location.</p>",'UIMessageCenter').replace('%1',file));
+ return;
+ }
+ var fsplit = $(self.form).find('[name=newHardDiskSplit]').prop('checked');
+ var size = vboxConvertMbytes($(self.form).find('[name=wizardNewHDSizeValue]').val());
+ var type = ($(self.form).find('[name=newHardDiskType]').eq(1).prop('checked') ? 'fixed' : 'dynamic');
+ var nl = new vboxLoader('mediumCreateBaseStorage');
+ nl.add('mediumCreateBaseStorage',function(d){
+ if(d.responseData.progress) {
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(ret) {
+ var ml = new vboxLoader();
+ ml.add('vboxGetMedia',function(dat){$('#vboxPane').data('vboxMedia',dat.responseData);});
+ ml.onLoad = function() {
+ var med = vboxMedia.getMediumByLocation(file);
+ if(med) {
+ vboxMedia.updateRecent(med);
+ self.completed.resolve(med.id);
+ } else {
+ self.completed.reject();
+ }
+ };
+ ml.run();
+ },'progress_media_create_90px.png',trans('Create a new virtual hard drive','VBoxMediaManagerDlg'),
+ vboxBasename(file),true);
+ } else {
+ self.completed.reject();
+ }
+ },{'file':file,'type':type,'size':size,'format':format,'split':fsplit});
+ nl.run();
+
+ $(self.dialog).empty().remove();
+ };
+ l.run();
+
+ };
+}
+
+/**
+ * Run the Copy Virtual Disk wizard
+ * @param {Object} suggested - sugggested defaults such as hard disk name and path
+ */
+function vboxWizardCopyHDDialog(suggested) {
+
+ // reference
+ var self = this;
+
+ /* Extend vboxWizard class */
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ /* Common options */
+ this.name = 'wizardCopyHD';
+ this.title = trans('Copy Virtual Hard Drive','UIWizardCloneVD');
+ this.bg = 'images/vbox/vmw_new_harddisk_bg.png';
+ this.icon = 'hd';
+ this.steps = 4;
+ this.suggested = suggested;
+ this.context = 'UIWizardCloneVD';
+ this.finishText = trans('Copy','UIWizardCloneVD');
+ this.height = 450;
+
+ this.data = [
+ {'fn':'vboxSystemPropertiesGet','callback':function(d){$('#vboxPane').data('vboxSystemProperties',d.responseData);}},
+ {'fn':'vboxGetMedia','callback':function(d){$('#vboxPane').data('vboxMedia',d.responseData);}}
+ ];
+
+
+ /* Function run when wizard completes */
+ this.onFinish = function() {
+
+ var format = $(self.form)[0].elements['copyHDFileType'];
+ var formatOpts = {};
+ for(var i = 0; i < format.length; i++) {
+ if(format[i].checked) {
+ formatOpts = $(format[i]).closest('tr').data('vboxFormat');
+ break;
+ }
+ }
+
+ var src = $(self.form).find('[name=copyHDDiskSelect]').val();
+ var type = ($(self.form).find('[name=newHardDiskType]').eq(1).prop('checked') ? 'fixed' : 'dynamic');
+ var format = $(self.form)[0].elements['copyHDFileType'];
+ for(var i = 0; i < format.length; i++) {
+ if(format[i].checked) {
+ format=format[i].value;
+ break;
+ }
+ }
+
+ var fsplit = $(self.form).find('[name=newHardDiskSplit]').prop('checked') && vboxMedia.formatSupportsSplit(format);
+
+ var loc = jQuery.trim($(self.form).find('[name=wizardCopyHDLocation]').val());
+ if(!loc) {
+ $(self.form).find('[name=wizardCopyHDLocation]').addClass('vboxRequired');
+ return;
+ }
+ $(self.form).find('[name=wizardCopyHDLocation]').removeClass('vboxRequired');
+ if(loc.search(/[\/|\\]/) < 0) {
+ if($('#wizardCopyHDStep4').data('suggestedpath')) {
+ loc = $('#wizardCopyHDStep4').data('suggestedpath') + loc;
+ } else {
+ loc = vboxDirname(vboxMedia.getMediumById(src).location) + $('#vboxPane').data('vboxConfig').DSEP + loc;
+ }
+ }
+
+ // append ext?
+ if(jQuery.inArray(loc.substring(loc.lastIndexOf('.')+1).toLowerCase(),formatOpts.extensions) < 0) {
+ loc += '.'+formatOpts.extensions[0];
+ }
+
+
+ /* Check to see if file exists */
+ var fileExists = false;
+ var fe = new vboxLoader();
+ fe.add('fileExists',function(d){
+ fileExists = d.responseData;
+ },{'file':loc});
+ fe.onLoad = function() {
+ if(fileExists) {
+ vboxAlert(trans("<p>The hard disk storage unit at location <b>%1</b> already " +
+ "exists. You cannot create a new virtual hard disk that uses this " +
+ "location because it can be already used by another virtual hard " +
+ "disk.</p>" +
+ "<p>Please specify a different location.</p>",'UIMessageCenter').replace('%1',loc));
+ return;
+ }
+ $(self.dialog).empty().remove();
+
+ var l = new vboxLoader();
+ l.add('mediumCloneTo',function(d){
+ if(d.responseData.progress) {
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(ret,mid) {
+ var ml = new vboxLoader();
+ ml.add('vboxGetMedia',function(dat){$('#vboxPane').data('vboxMedia',dat.responseData);});
+ ml.onLoad = function() {
+ med = vboxMedia.getMediumByLocation(loc);
+ vboxMedia.updateRecent(med);
+ self.completed.resolve(mid);
+ };
+ ml.run();
+ },'progress_media_create_90px.png',trans('Copy Virtual Hard Drive','UIWizardCloneVD'),
+ vboxBasename(vboxMedia.getMediumById(src).location) + ' > ' + vboxBasename(loc));
+ } else {
+ self.completed.reject();
+ }
+ },{'src':vboxMedia.getMediumById(src).location,'type':type,'format':format,'location':loc,'split':fsplit});
+ l.run();
+ };
+ fe.run();
+
+
+ };
+}
+
+/**
+ * Display guest network adapters dialog
+ * @param {String} vm - virtual machine uuid or name
+ */
+function vboxGuestNetworkAdaptersDialogInit(vm) {
+
+ /*
+ * Dialog
+ */
+ $('#vboxPane').append($('<div />').attr({'id':'vboxGuestNetworkDialog','style':'display: none'}));
+
+ /*
+ * Loader
+ */
+ var l = new vboxLoader();
+ l.addFileToDOM('panes/guestNetAdapters.html',$('#vboxGuestNetworkDialog'));
+ l.onLoad = function(){
+
+ var buttons = {};
+ buttons[trans('Close','UIVMLogViewer')] = function() {$('#vboxGuestNetworkDialog').trigger('close').empty().remove();};
+ $('#vboxGuestNetworkDialog').dialog({'closeOnEscape':true,'width':500,'height':250,'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="images/vbox/nw_16px.png" class="vboxDialogTitleIcon" /> ' + trans('Guest Network Adapters','VBoxGlobal')}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Close','UIVMLogViewer')+'")').trigger('click');
+ });
+
+ // defined in pane
+ vboxVMNetAdaptersInit(vm,nic);
+ };
+ l.run();
+
+}
+
+
+/**
+ * Display Global Preferences dialog
+ */
+
+function vboxGlobalPrefsDialog() {
+
+ // Prefs
+ var panes = new Array(
+ {'name':'GlobalGeneral','label':'General','icon':'machine','context':'UIGlobalSettingsGeneral'},
+ {'name':'GlobalLanguage','label':'Language','icon':'site','context':'UIGlobalSettingsLanguage'},
+ {'name':'GlobalNetwork','label':'Network','icon':'nw','context':'UIGlobalSettingsNetwork','tabbed':true},
+ {'name':'GlobalUsers','label':'Users','icon':'register','context':'UIUsers'}
+ );
+
+ var data = new Array(
+ {'fn':'hostOnlyInterfacesGet','callback':function(d){$('#vboxSettingsDialog').data('vboxHostOnlyInterfaces',d.responseData);}},
+ {'fn':'vboxSystemPropertiesGet','callback':function(d){$('#vboxSettingsDialog').data('vboxSystemProperties',d.responseData);}},
+ {'fn':'vboxNATNetworksGet','callback':function(d){$('#vboxSettingsDialog').data('vboxNATNetworks',d.responseData);}},
+ {'fn':'getUsers','callback':function(d){$('#vboxSettingsDialog').data('vboxUsers',d.responseData);}}
+ );
+
+ // Check for noAuth setting
+ if($('#vboxPane').data('vboxConfig').noAuth || !$('#vboxPane').data('vboxSession').admin || !$('#vboxPane').data('vboxConfig').authCapabilities.canModifyUsers) {
+ panes.pop();
+ data.pop();
+ }
+
+ $.when(vboxSettingsDialog(trans('Preferences...','UIActionPool').replace(/\./g,''),
+ panes,data,null,'global_settings','UISettingsDialogGlobal'))
+ .done(function(){
+
+ var l = new vboxLoader();
+
+ // Language change?
+ if($('#vboxSettingsDialog').data('language') && $('#vboxSettingsDialog').data('language') != __vboxLangName) {
+ vboxSetCookie('vboxLanguage',$('#vboxSettingsDialog').data('language'));
+ l.onLoad = function(){location.reload(true);};
+
+ }
+
+ l.add('vboxNATNetworksSave',function(){return;},{'networks':$('#vboxSettingsDialog').data('vboxNATNetworks')});
+ l.add('hostOnlyInterfacesSave',function(){return;},{'networkInterfaces':$('#vboxSettingsDialog').data('vboxHostOnlyInterfaces').networkInterfaces});
+ l.add('vboxSystemPropertiesSave',function(){return;},{'SystemProperties':$('#vboxSettingsDialog').data('vboxSystemProperties')});
+ l.run();
+
+ // Update system properties
+ $('#vboxPane').data('vboxSystemProperties',$('#vboxSettingsDialog').data('vboxSystemProperties'));
+
+ });
+
+}
+
+
+
+/**
+ * Display a virtual machine settings dialog
+ * @param {String} vm - uuid or name of virtual machine
+ * @param {String} pane - optionally automatically select pane when dialog is displayed
+ * @returns {Object} deferred promise
+ */
+function vboxVMsettingsDialog(vm,pane) {
+
+ var results = $.Deferred();
+
+ if(typeof(vm) == 'string')
+ vm = vboxVMDataMediator.getVMData(vm);
+
+ // Only show these dialogs once per change
+ var reloadConfirmShowing = false;
+
+ // Handler for when VM settings have changed
+ /////////////////////////////////////////////
+ var machineSettingsChanged = function(e, eventList) {
+
+ for(var i = 0; i < eventList.length; i++) {
+
+ ////////////////////////////////
+ //
+ // Machine data changed..
+ //
+ ////////////////////////////////
+ switch(eventList[i].eventType) {
+
+ case 'OnMachineStateChanged':
+
+ if(!eventList[i].machineId || eventList[i].machineId != vm.id) break;
+
+ // Display loading screen
+ var l = new vboxLoader();
+ l.showLoading();
+
+ $.when(vboxVMDataMediator.getVMDataCombined(vm.id)).done(function(vmData) {
+ // data received from deferred object
+ $('#vboxSettingsDialog').data('vboxMachineData',vmData);
+ $('#vboxSettingsDialog').data('vboxFullEdit', (vboxVMStates.isPoweredOff(vmData) && !vboxVMStates.isSaved(vmData)));
+ $('#vboxSettingsDialog').trigger('dataLoaded');
+ l.removeLoading();
+ if(vboxVMStates.isRunning(vmData)) {
+ vboxAlert(trans('The virtual machine that you are changing has been started. Only certain settings can be changed while a machine is running. All other changes will be lost if you close this window now.','UIMessageCenter'));
+ }
+ });
+
+ break;
+
+ // Unregistered machine
+ case 'OnMachineRegistered':
+
+ if(!eventList[i].machineId || eventList[i].machineId != vm.id || eventList[i].registered) break;
+
+ $('#vboxSettingsDialog').parent().find('span:contains("'+trans('Cancel','QIMessageBox')+'")').trigger('click');
+ break;
+
+ case 'OnMachineDataChanged':
+ case 'OnNetworkAdapterChanged':
+ case 'OnVRDEServerInfoChanged':
+ case 'OnCPUChanged':
+ case 'OnStorageControllerChanged':
+ case 'OnMediumChanged':
+ case 'OnVRDEServerChanged':
+ case 'OnUSBControllerChanged':
+ case 'OnSharedFolderChanged':
+ case 'OnCPUExecutionCapChanged':
+ case 'OnStorageDeviceChanged':
+ case 'OnNATRedirect':
+
+ if(!eventList[i].machineId || eventList[i].machineId != vm.id) break;
+
+ // already showing reload confirmation
+ if(reloadConfirmShowing) break;
+
+ var buttons = {};
+ buttons[trans('Reload settings','UIMessageCenter')] = function() {
+
+ // Display loading screen
+ var l = new vboxLoader();
+ l.showLoading();
+
+ $(this).empty().remove();
+
+ /*
+ * Data to be reloaded
+ */
+ var reload = [
+ vboxAjaxRequest('vboxGetMedia',{}).done(function(d){$('#vboxPane').data('vboxMedia',d.responseData);}),
+
+ vboxAjaxRequest('getNetworking',{}).done(function(d){$('#vboxSettingsDialog').data('vboxNetworking',d.responseData);}),
+
+ vboxAjaxRequest('vboxRecentMediaGet',{}).done(function(d){$('#vboxPane').data('vboxRecentMedia',d.responseData);}),
+
+ vboxAjaxRequest('consoleGetSharedFolders',{'vm':vm.id}).done(function(d){$('#vboxSettingsDialog').data('vboxTransientSharedFolders',d.responseData);}),
+
+ $.when(vboxVMDataMediator.getVMDataCombined(vm.id)).done(function(vmData) {
+
+ // data received from deferred object
+ $('#vboxSettingsDialog').data('vboxMachineData',vmData);
+ $('#vboxSettingsDialog').data('vboxFullEdit', (vboxVMStates.isPoweredOff(vmData) && !vboxVMStates.isSaved(vmData)));
+
+ })
+ ];
+
+ // Only when all of these are done
+ $.when.apply($, reload).done(function(){
+
+ /* Change title and tell dialog that data is loaded */
+ $('#vboxSettingsDialog').trigger('dataLoaded').dialog('option','title','<img src="images/vbox/vm_settings_16px.png" class="vboxDialogTitleIcon" /> ' +
+ $('<div />').text($('#vboxSettingsDialog').data('vboxMachineData').name).text() + ' - ' + trans('Settings','UISettingsDialog'));
+
+ l.removeLoading();
+ reloadConfirmShowing = false;
+ });
+
+
+ };
+
+ reloadConfirmShowing = true;
+
+ vboxConfirm(trans("<p>The machine settings were changed while you were editing them. You currently have unsaved setting changes.</p><p>Would you like to reload the changed settings or to keep your own changes?</p>",'UIMessageCenter'),
+ buttons,
+ trans('Keep changes', 'UIMessageCenter'), function(){
+ reloadConfirmShowing = false;
+ });
+
+ return;
+
+ }
+ }
+ };
+
+ // Watch for changed VM settings
+ $('#vboxPane').on('vboxEvents',machineSettingsChanged);
+
+ $.when(vboxVMDataMediator.getVMDataCombined(vm.id)).done(function(vmData) {
+
+
+ /*
+ * Settings dialog data
+ */
+ var dataList = new Array(
+ {'fn':'vboxGetMedia','callback':function(d){
+
+ $('#vboxPane').data('vboxMedia',d.responseData);
+
+ // data received from deferred object
+ $('#vboxSettingsDialog').data('vboxMachineData',vmData);
+ $('#vboxSettingsDialog').data('vboxFullEdit', (vboxVMStates.isPoweredOff(vmData) && !vboxVMStates.isSaved(vmData)));
+
+ }},
+ {'fn':'getNetworking','callback':function(d){$('#vboxSettingsDialog').data('vboxNetworking',d.responseData);}},
+ {'fn':'hostGetDetails','callback':function(d){$('#vboxSettingsDialog').data('vboxHostDetails',d.responseData);}},
+ {'fn':'vboxGetEnumerationMap','callback':function(d){$('#vboxSettingsDialog').data('vboxNetworkAdapterTypes',d.responseData);},'args':{'class':'NetworkAdapterType'}},
+ {'fn':'vboxGetEnumerationMap','callback':function(d){$('#vboxSettingsDialog').data('vboxAudioControllerTypes',d.responseData);},'args':{'class':'AudioControllerType'}},
+ {'fn':'vboxRecentMediaGet','callback':function(d){$('#vboxPane').data('vboxRecentMedia',d.responseData);}},
+ {'fn':'consoleGetSharedFolders','callback':function(d){$('#vboxSettingsDialog').data('vboxTransientSharedFolders',d.responseData);},'args':{'vm':vm.id}}
+ );
+
+ /*
+ * Settings dialog panes
+ */
+ var panes = new Array(
+
+ {name:'General',label:'General',icon:'machine',tabbed:true,context:'UIMachineSettingsGeneral'},
+ {name:'System',label:'System',icon:'chipset',tabbed:true,context:'UIMachineSettingsSystem'},
+ {name:'Display',label:'Display',icon:'vrdp',tabbed:true,context:'UIMachineSettingsDisplay'},
+ {name:'Storage',label:'Storage',icon:'attachment',context:'UIMachineSettingsStorage'},
+ {name:'Audio',label:'Audio',icon:'sound',context:'UIMachineSettingsAudio'},
+ {name:'Network',label:'Network',icon:'nw',tabbed:true,context:'UIMachineSettingsNetwork'},
+ {name:'SerialPorts',label:'Serial Ports',icon:'serial_port',tabbed:true,context:'UIMachineSettingsSerial'},
+ {name:'ParallelPorts',label:'Parallel Ports',icon:'parallel_port',tabbed:true,disabled:(!$('#vboxPane').data('vboxConfig').enableLPTConfig),context:'UIMachineSettingsParallel'},
+ {name:'USB',label:'USB',icon:'usb',context:'UIMachineSettingsUSB'},
+ {name:'SharedFolders',label:'Shared Folders',icon:'sf',context:'UIMachineSettingsSF'}
+
+ );
+
+ /*
+ * Check for encryption settings change
+ */
+ var presaveCallback = function() {
+
+ if(!$('#vboxSettingsDialog').data('vboxEncSettingsChanged'))
+ return true;
+
+ var encMediaSettings = $.Deferred();
+
+ // Validate
+ if(!vboxSettingsGeneralValidate()) {
+ $('#vboxSettingsMenuList').children('li:eq(0)').first().click();
+ $('#vboxSettingsPane-General').tabs('option','active', 3);
+ encMediaSettings.reject();
+ return encMediaSettings;
+ }
+
+ var vm = $('#vboxSettingsDialog').data('vboxMachineData');
+ var media = vboxStorage.getAttachedBaseMedia(vm);
+ var encIds = vboxMedia.getEncryptedMediaIds(media);
+ var encMedia = vboxMedia.getEncryptedMedia(media);
+
+ var formCipher = $('#vboxSettingsDialog').data('vboxEncCipher');
+ var formPassword = $('#vboxSettingsDialog').data('vboxEncPw');
+ var formEncEnabled = $('#vboxSettingsDialog').data('vboxEncEnabled');
+
+ // If encryption is not enabled, cipher needs to be blank
+ if(!formEncEnabled) {
+ formCipher = '';
+ }
+
+ // Get encryption password(s)
+ $.when(vboxMediumEncryptionPasswordsDialog(vm.name, encIds))
+
+ .done(function(pwdata) {
+
+ var runs = []
+
+ // Each medium attached
+ for(var i = 0; i < media.length; i++) {
+ // Only hard disks
+ if(media[i].deviceType != 'HardDisk') continue;
+
+ var id = vm.name;
+ var oldpw = "";
+ var cipher = null;
+
+ // Check for existing encryption setting
+ for(var a = 0; a < encMedia.length; a++) {
+ if(encMedia[a].medium == media[i].id) {
+ cipher = media[i].encryptionSettings.cipher;
+ // Look in passwords for id
+ for(var b = 0; b < pwdata.length; b++) {
+ if(pwdata[b].id == id) {
+ oldpw = pwdata[b].password;
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ runs.push({
+ medium: media[i].id,
+ cipher: cipher,
+ encId: id,
+ password: oldpw
+ });
+
+ }
+ // No encrypted media changes
+ if(!runs.length) {
+ encMediaSettings.resolve();
+ return;
+ }
+
+ var l = new vboxLoader();
+ l.showLoading();
+
+ (function doruns(encMediaRuns){
+
+ if(!encMediaRuns.length) {
+ l.removeLoading();
+ encMediaSettings.resolve();
+ return;
+ }
+
+ var run = encMediaRuns.shift();
+
+ // If encryption is enabled, and cypher is blank / "Leave Unchanged"
+ // keep the original cipher
+ var mcipher = formCipher;
+ if(formEncEnabled && !mcipher) {
+ mcipher = run.cipher;
+ }
+
+ var rdata = {
+ medium: run.medium,
+ id: run.encId,
+ old_password: run.password,
+ cipher: mcipher,
+ password: formPassword
+ };
+
+ $.when(vboxAjaxRequest('mediumChangeEncryption',rdata)).done(function(d){
+
+ if(d.responseData.progress) {
+ var icon = 'progress_media_create_90px.png';
+ var title = trans('Encryption');
+ vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(){
+ // Loop
+ doruns(encMediaRuns);
+ },icon,title,vboxMedia.getMediumById(run.medium).name, true);
+ } else {
+ l.removeLoading();
+ encMediaSettings.reject();
+ return;
+ }
+
+ });
+
+ })(runs);
+
+ })
+ .fail(function() {
+ encMediaSettings.reject();
+ });
+
+ return encMediaSettings.promise();
+
+ }
+
+ $.when(vboxSettingsDialog(vmData.name + ' - ' + trans('Settings','UISettingsDialog'),panes,dataList,pane,'vm_settings','UISettingsDialogMachine', presaveCallback))
+
+ // Always run this
+ .always(function(){
+
+ // No longer watch for changed VM settings
+ $('#vboxPane').unbind('vboxEvents',machineSettingsChanged);
+
+ })
+
+ // Run this when "Save" is clicked
+ .done(function() {
+
+ var loader = new vboxLoader();
+ var sdata = $.extend($('#vboxSettingsDialog').data('vboxMachineData'),{'clientConfig':$('#vboxPane').data('vboxConfig')});
+ loader.add('machineSave',function(){return;},sdata);
+ loader.onLoad = function() {
+ // Refresh media
+ var mload = new vboxLoader();
+ mload.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+ mload.onLoad = function() {
+ results.resolve();
+ };
+ mload.run();
+ };
+ loader.run();
+ });
+
+ });
+
+ return results.promise();
+}
+
+
+
+
+/**
+ * Run the "First Run" wizard
+ * @param {Object} vm - VM details object
+ */
+function vboxWizardFirstRunDialog(vm) {
+
+ // ref
+ var self = this;
+
+ this.parentClass = vboxWizard;
+ this.parentClass();
+
+ this.name = 'wizardFirstRun';
+ this.title = $('<div />').text(vm.name).html();
+ this.bg = 'images/vbox/vmw_first_run_bg.png';
+ this.icon = vboxGuestOSTypeIcon(vm.OSTypeId);
+ this.steps = 1;
+ this.finishText = trans('Start','UIWizardFirstRun');
+ this.context = 'UIWizardFirstRun';
+ this.noAdvanced = true;
+ this.args = vm;
+
+ // This still resolves on cancel
+ this.onCancel = function () {
+ self.completed.resolve();
+ };
+
+ this.onFinish = function() {
+
+ var med = vboxMedia.getMediumById($('#wizardFirstRunMedia').find(":selected").attr('value'));
+
+ $(self.dialog).empty().remove();
+
+ if(med) {
+
+ var port = null;
+ var device = null;
+ var bus = null;
+ var controller = null;
+
+ for(var i = 0; i < self.args.storageControllers.length; i++) {
+ for(var a = 0; a < self.args.storageControllers[i].mediumAttachments.length; a++) {
+ if(self.args.storageControllers[i].mediumAttachments[a].type == "DVD" &&
+ self.args.storageControllers[i].mediumAttachments[a].medium == null) {
+
+ port = self.args.storageControllers[i].mediumAttachments[a].port;
+ device = self.args.storageControllers[i].mediumAttachments[a].device;
+ bus = self.args.storageControllers[i].bus;
+ controller = self.args.storageControllers[i].name;
+
+ break;
+ }
+ }
+ }
+
+
+ var args = {'vm':self.args.id,
+ 'medium':med,
+ 'port':port,
+ 'device':device,
+ 'bus':bus,
+ 'controller':controller,
+ 'noSave':true
+ };
+
+ // Ajax request to mount medium
+ var mount = new vboxLoader();
+ mount.add('mediumMount',function(ret){
+ var l = new vboxLoader();
+ l.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);});
+ l.onLoad = function(){
+ self.completed.resolve();
+ };
+ l.run();
+ },args);
+ mount.run();
+
+
+ } else {
+ self.completed.resolve();
+ }
+
+ };
+}
+
+
+/**
+ * Display a settings dialog (generic) called by dialog initializers
+ * @param {String} title - title of dialog
+ * @param {Array} panes - list of panes {Object} to load
+ * @param {Object} data - list of data to load
+ * @param {String} pane - optionally automatically select pane when dialog is shown
+ * @param {String} icon - optional URL to icon for dialog
+ * @param {String} langContext - language context to use for translations
+ * @param {Function} presave - presave callback to run
+ * @returns {Object} deferred promise
+ * @see trans()
+ */
+function vboxSettingsDialog(title,panes,data,pane,icon,langContext,presave) {
+
+ var results = $.Deferred();
+
+ var d = $('<div />').attr({'id':'vboxSettingsDialog','style':'display: none;'});
+
+ var f = $('<form />').attr({'name':'frmVboxSettings','style':'height: 100%'});
+
+ var t = $('<table />').attr({'style':'height: 100%;','class':'vboxSettingsTable'});
+
+ var tr = $('<tr />');
+
+ $($('<td />').attr({'id':'vboxSettingsMenu','style': (panes.length == 1 ? 'display:none;' : '')})).append($('<ul />').attr({'id':'vboxSettingsMenuList','class':'vboxHover'})).appendTo(tr);
+
+ var td = $('<td />').attr({'id':'vboxSettingsPane'}).css({'height':'100%'});
+
+ // Settings table contains title and visible settings pane
+ var stbl = $('<table />').css({'height':'100%','width':'100%','padding':'0px','margin':'0px','border':'0px','border-spacing':'0px'});
+
+ // Title
+ var d1 = $('<div />').attr({'id':'vboxSettingsTitle'}).html('Padding').css({'display':(panes.length == 1 ? 'none' : '')});
+ $(stbl).append($('<tr />').append($('<td />').css({'height':'1%','padding':'0px','margin':'0px','border':'0px'}).append(d1)));
+
+
+ // Settings pane
+ var d1 = $('<div />').attr({'id':'vboxSettingsList'}).css({'width':'100%'});
+
+ $(stbl).append($('<tr />').append($('<td />').css({'padding':'0px','margin':'0px','border':'0px'}).append(d1)));
+
+
+ $(td).append(stbl).appendTo(tr);
+
+ $(d).append($(f).append($(t).append(tr))).appendTo('#vboxPane');
+
+ /* Load panes and data */
+ var loader = new vboxLoader();
+
+ /* Load Data */
+ for(var i = 0; i < data.length; i++) {
+ loader.add(data[i].fn,data[i].callback,(data[i].args ? data[i].args : undefined));
+ }
+
+ /* Load settings panes */
+ for(var i = 0; i < panes.length; i++) {
+
+ if(panes[i].disabled) continue;
+
+ // Menu item
+ $('<li />').html('<div><img src="images/vbox/'+panes[i].icon+'_16px.png" /></div> <div>'+trans(panes[i].label,langContext)+'</div>').data(panes[i]).click(function(){
+
+ $('#vboxSettingsTitle').html(trans($(this).data('label'),langContext));
+
+ $(this).addClass('vboxListItemSelected').siblings().addClass('vboxListItem').removeClass('vboxListItemSelected');
+
+ // jquery apply this css to everything with class .settingsPa..
+ $('#vboxSettingsDialog .vboxSettingsPaneSection').css({'display':'none'});
+
+ // Show selected pane
+ $('#vboxSettingsPane-' + $(this).data('name')).css({'display':''}).children().first().trigger('show');
+
+ }).on("mouseenter",function(){$(this).addClass('vboxHover');}).on("mouseleave",function(){$(this).removeClass('vboxHover');}).appendTo($('#vboxSettingsMenuList'));
+
+
+ // Settings pane
+ $('#vboxSettingsList').append($('<div />').attr({'id':'vboxSettingsPane-'+panes[i].name,'style':'display: none;','class':'vboxSettingsPaneSection ui-corner-all ' + (panes[i].tabbed ? 'vboxTabbed' : 'vboxNonTabbed')}));
+
+ loader.addFileToDOM('panes/settings'+panes[i].name+'.html',$('#vboxSettingsPane-'+panes[i].name));
+
+ }
+
+ loader.onLoad = function(){
+
+
+ /* Init UI Items */
+ for(var i = 0; i < panes.length; i++) {
+ vboxInitDisplay($('#vboxSettingsPane-'+panes[i].name),panes[i].context);
+ if(panes[i].tabbed) $('#vboxSettingsPane-'+panes[i].name).tabs();
+ }
+
+ /* Tell dialog that data is loaded */
+ $('#vboxSettingsDialog').trigger('dataLoaded');
+
+ var buttons = { };
+ buttons[trans('OK','QIMessageBox')] = function() {
+
+ $(this).trigger('save');
+
+ // Does some settings pane need to do some presave
+ // work? (ask questions, run wizard, some other asynch task)
+ var promise = true;
+ if(presave) {
+ promise = presave();
+ }
+ var dlg = this;
+ $.when(promise).done(function() {
+ results.resolve(true);
+ $(dlg).trigger('close').empty().remove();
+ $(document).trigger('click');
+ });
+ };
+ buttons[trans('Cancel','QIMessageBox')] = function() {
+ results.reject();
+ $(this).trigger('close').empty().remove();
+ $(document).trigger('click');
+ };
+
+ // Init with "nothing has changed yet"
+ $('#vboxSettingsDialog').data('formDataChanged', false);
+
+ // Show dialog
+ $('#vboxSettingsDialog').dialog({'closeOnEscape':true,'width':(panes.length > 1 ? 900 : 600),'height':(panes.length > 1 ? 500 : 450),'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxSettingsDialog vboxDialogContent','title':(icon ? '<img src="images/vbox/'+icon+'_16px.png" class="vboxDialogTitleIcon" /> ' : '') + title}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Cancel','QIMessageBox')+'")').trigger('click');
+ });
+
+ // Resize pane
+ $('#vboxSettingsList').height($('#vboxSettingsList').parent().innerHeight()-8).css({'overflow':'auto','padding':'0px','margin-top':'8px','border':'0px','border-spacing':'0px'});
+
+ // Resizing dialog, resizes this too
+ $('#vboxSettingsDialog').on('dialogresizestop',function(){
+ var h = $('#vboxSettingsList').css({'display':'none'}).parent().innerHeight();
+ $('#vboxSettingsList').height(h-8).css({'display':''});
+ });
+
+ /* Select first or passed menu item */
+ var i = 0;
+ var offset = 0;
+ var tab = undefined;
+ if(typeof pane == "string") {
+ var section = pane.split(':');
+ if(section[1]) tab = section[1];
+ for(i = 0; i < panes.length; i++) {
+ if(panes[i].disabled) offset++;
+ if(panes[i].name == section[0]) break;
+ }
+ }
+ i-=offset;
+ if(i >= panes.length) i = 0;
+ $('#vboxSettingsMenuList').children('li:eq('+i+')').first().click().each(function(){
+ if(tab !== undefined) {
+ // Check for out of scope tab
+ tab = Math.min(($('#vboxSettingsPane-'+$(this).data('name')).children('ul').first().children().length-1), parseInt(tab));
+ $('#vboxSettingsPane-'+$(this).data('name')).tabs('option','active', tab);
+ }
+
+ });
+
+ /* Only 1 pane? */
+ if(panes.length == 1) {
+ $('#vboxSettingsDialog table.vboxSettingsTable').css('width','100%');
+ $('#vboxSettingsDialog').dialog('option','title',(icon ? '<img src="images/vbox/'+icon+'_16px.png" class="vboxDialogTitleIcon" /> ' : '') + trans(panes[0].label,langContext));
+ }
+
+
+ };
+
+ loader.run();
+
+ return results.promise();
+
+}
diff --git a/js/eventlistener.js b/js/eventlistener.js new file mode 100644 index 0000000..43de551 --- /dev/null +++ b/js/eventlistener.js @@ -0,0 +1,250 @@ +/**
+ *
+ * @fileOverview Event listener singleton. Provides vboxEventListener
+ * @author Ian Moore (imoore76 at yahoo dot com)
+ * @version $Id: eventlistener.js 596 2015-04-19 11:50:53Z imoore76 $
+ * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
+ */
+
+/**
+ * vboxEventListener
+ *
+ * Polls vboxwebsrv for pending events and triggers
+ * events on $('#vboxPane')
+ *
+ * @namespace vboxEventListener
+ */
+var vboxEventListener = {
+
+ // Timeout
+ timeout: 20,
+
+ // Not initially running
+ _running: false,
+
+ // persistent request data
+ _persist: {},
+
+ // List of machines to subscribe to at runtime
+ _subscribeList: [],
+
+ // Watchdog to make sure vboxEventListener is still
+ // running and attempting to get events
+ _watchdog: {
+ lastRun: 0,
+ start: function() {
+ window.setInterval(function() {
+ if(vboxEventListener._running &&
+ ((new Date().getTime()/1000) - vboxEventListener._watchdog.lastRun > vboxEventListener.timeout)) {
+ phpVirtualBoxFailure(' (EventListener watchdog failure)');
+ vboxEventListener.stop();
+ window.clearInterval(vboxEventListener._watchdog.timer);
+ }
+ }, vboxEventListener.timeout)
+ },
+ stop: function() {
+ window.clearInterval(vboxEventListener._watchdog.timer);
+ }
+ },
+
+ // Since VirtualBox handles to event listener objects are persistent,
+ // calls using the same handle should be synchronous
+ _requestQueue: {
+
+ requests: [],
+ running: false,
+
+ // run timer
+ timer: window.setInterval(function(){
+ vboxEventListener._requestQueue.run();
+ }, 5000), // 5 seconds
+
+ // Add a request to the queue
+ addReq: function(q) {
+
+ var d = $.Deferred();
+
+ vboxEventListener._requestQueue.requests.push({'request':q,'deferred':d});
+ vboxEventListener._requestQueue.run();
+
+ return d.promise();
+ },
+
+ // Run through the queue
+ run : function() {
+
+ // Already running through queue
+ if(vboxEventListener._requestQueue.running) return;
+
+ vboxEventListener._requestQueue.running = true;
+ vboxEventListener._requestQueue.runReq();
+
+ },
+
+ // Run a single request, removing it from the queue
+ runReq: function() {
+ var r = vboxEventListener._requestQueue.requests.shift();
+ if(r) {
+ $.when(r.request())
+ .done(r.deferred.resolve)
+ .fail(r.deferred.reject)
+ .always(vboxEventListener._requestQueue.runReq);
+ } else {
+ vboxEventListener._requestQueue.running = false;
+ }
+ }
+
+ },
+
+ /**
+ * Start event listener loop
+ * @param {Array} vmlist - list of VM ids to subscribe to
+ */
+ start: function(vmlist) {
+
+ // Already started?
+ if(vboxEventListener._running) return;
+
+ // Get timeout if exists
+ if($('#vboxPane').data('vboxConfig').eventListenerTimeout)
+ vboxEventListener.timeout = $('#vboxPane').data('vboxConfig').eventListenerTimeout;
+
+ vboxEventListener._running = true;
+
+ var started = $.Deferred();
+
+ // Subscribe to events and start main loop
+ $.when(vboxAjaxRequest('subscribeEvents',{vms:vmlist})).done(function(d) {
+ vboxEventListener._persist = d.persist;
+ $.when(vboxEventListener._getEvents()).done(function(){
+ vboxEventListener._watchdog.start();
+ started.resolve();
+ });
+ });
+
+ return started.promise();
+
+ },
+
+ /**
+ * Subscribe to a single machine's events. This should happen
+ *
+ * @param {String} vmid - ID of VM to subscribe to
+ */
+ subscribeVMEvents: function(vmid) {
+
+ // Push into list
+ vboxEventListener._subscribeList.push(vmid);
+
+ // Add subscription request to queue
+ return vboxEventListener._requestQueue.addReq(function(){
+
+ if(!vboxEventListener._subscribeList.length) return;
+
+ var vms = vboxEventListener._subscribeList.concat();
+ vboxEventListener._subscribeList = [];
+
+ var vmEvents = $.Deferred();
+ $.when(vboxAjaxRequest('machineSubscribeEvents', {'vms':vms},{'persist':vboxEventListener._persist})).done(function(d){
+ // Always set persistent request data
+ vboxEventListener._persist = d.persist;
+ }).always(function(){
+ vmEvents.resolve();
+ });
+ return vmEvents.promise();
+ });
+
+ },
+
+ /**
+ * Stop event listener loop and unsubscribe from events
+ */
+ stop: function() {
+
+ if(!vboxEventListener._running)
+ return;
+
+ window.clearTimeout(vboxEventListener._running);
+ vboxEventListener._running = false;
+
+ vboxEventListener._watchdog.stop();
+
+ // Unsubscribe from events. Returns a deferred object
+ return vboxEventListener._requestQueue.addReq(function(){
+ return vboxAjaxRequest('unsubscribeEvents', {}, {'persist':vboxEventListener._persist});
+ });
+
+ },
+
+ /**
+ * Main loop - get pending events
+ */
+ _getEvents: function(){
+
+ // Don't do anything if we aren't running anymore
+ if(!vboxEventListener._running) return;
+
+ // Add to queue
+ return vboxEventListener._requestQueue.addReq(function(){
+
+ return $.when(new Date().getTime(), vboxAjaxRequest('getEvents',{}, {'persist':vboxEventListener._persist})).done(function(lastTime,d) {
+
+ // Don't do anything if this is not running
+ if(!vboxEventListener._running) return;
+
+ // Check for valid result
+ if(!d || !d.success) {
+ if(vboxEventListener._running)
+ phpVirtualBoxFailure();
+ return;
+ }
+
+
+ // Check key to make sure this isn't a stale
+ // response from a previously selected server
+ if(!d.key || (d.key != $('#vboxPane').data('vboxConfig').key)) return;
+
+ // Tell the watch dog that we were run
+ vboxEventListener._watchdog.lastRun = (new Date().getTime() / 1000);
+
+ // Always set persistent request data
+ vboxEventListener._persist = d.persist;
+
+ // Loop through each event triggering changes
+ if(d.responseData && d.responseData.length) {
+
+ // Trigger each event individually
+ for(var i = 0; i < d.responseData.length; i++) {
+
+ // Trigger raw vbox events
+ $('#vboxPane').trigger('vbox' + d.responseData[i].eventType, [d.responseData[i]]);
+
+ }
+
+ // Trigger event list queue
+ $('#vboxPane').trigger('vboxEvents', [d.responseData]);
+
+ }
+
+ // Wait at most 3 seconds
+ var wait = Math.min(3000,3000 - ((new Date().getTime()) - lastTime));
+ if(wait <= 0) {
+ vboxEventListener._running = true;
+ vboxEventListener._getEvents();
+ }
+ else {
+ vboxEventListener._running = window.setTimeout(vboxEventListener._getEvents, wait);
+ }
+
+ });
+
+ });
+ }
+};
+
+// Stop event listener on window unload
+$(document).ready(function() {
+ $(window).on('unload',function() {
+ vboxEventListener.stop();
+ });
+});
diff --git a/js/jquery-1.11.2.min.js b/js/jquery-1.11.2.min.js new file mode 100644 index 0000000..e6a051d --- /dev/null +++ b/js/jquery-1.11.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.2 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.2",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)+1>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=hb(),z=hb(),A=hb(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},eb=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fb){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function gb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+rb(o[l]);w=ab.test(a)&&pb(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function hb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ib(a){return a[u]=!0,a}function jb(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function kb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function lb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function nb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function ob(a){return ib(function(b){return b=+b,ib(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pb(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=gb.support={},f=gb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=gb.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",eb,!1):e.attachEvent&&e.attachEvent("onunload",eb)),p=!f(g),c.attributes=jb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=jb(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=jb(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(jb(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\f]' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),jb(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&jb(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return lb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?lb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},gb.matches=function(a,b){return gb(a,null,null,b)},gb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return gb(b,n,null,[a]).length>0},gb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},gb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},gb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},gb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=gb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=gb.selectors={cacheLength:50,createPseudo:ib,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||gb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&gb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=gb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||gb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ib(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ib(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ib(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ib(function(a){return function(b){return gb(a,b).length>0}}),contains:ib(function(a){return a=a.replace(cb,db),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ib(function(a){return W.test(a||"")||gb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:ob(function(){return[0]}),last:ob(function(a,b){return[b-1]}),eq:ob(function(a,b,c){return[0>c?c+b:c]}),even:ob(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:ob(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:ob(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:ob(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=mb(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=nb(b);function qb(){}qb.prototype=d.filters=d.pseudos,d.setFilters=new qb,g=gb.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=S.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=T.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(R," ")}),h=h.slice(c.length));for(g in d.filter)!(e=X[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?gb.error(a):z(a,i).slice(0)};function rb(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function sb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function tb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ub(a,b,c){for(var d=0,e=b.length;e>d;d++)gb(a,b[d],c);return c}function vb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wb(a,b,c,d,e,f){return d&&!d[u]&&(d=wb(d)),e&&!e[u]&&(e=wb(e,f)),ib(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ub(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:vb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=vb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=vb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sb(function(a){return a===b},h,!0),l=sb(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sb(tb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wb(i>1&&tb(m),i>1&&rb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xb(a.slice(i,e)),f>e&&xb(a=a.slice(e)),f>e&&rb(a))}m.push(c)}return tb(m)}function yb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=vb(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&gb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ib(f):f}return h=gb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,yb(e,d)),f.selector=a}return f},i=gb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&pb(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&rb(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&pb(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=jb(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),jb(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||kb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&jb(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||kb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),jb(function(a){return null==a.getAttribute("disabled")})||kb(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),gb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1; +return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?m.queue(this[0],a):void 0===b?this:this.each(function(){var c=m.queue(this,a,b);m._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&m.dequeue(this,a)})},dequeue:function(a){return this.each(function(){m.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=m.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=m._data(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var S=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=["Top","Right","Bottom","Left"],U=function(a,b){return a=b||a,"none"===m.css(a,"display")||!m.contains(a.ownerDocument,a)},V=m.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===m.type(c)){e=!0;for(h in c)m.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,m.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(m(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav></:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="<textarea>x</textarea>",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="<input type='radio' checked='checked' name='t'/>",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},fix:function(a){if(a[m.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=Z.test(e)?this.mouseHooks:Y.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new m.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return a.target||(a.target=f.srcElement||y),3===a.target.nodeType&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,g.filter?g.filter(a,f):a},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,d,e,f=b.button,g=b.fromElement;return null==a.pageX&&null!=b.clientX&&(d=a.target.ownerDocument||y,e=d.documentElement,c=d.body,a.pageX=b.clientX+(e&&e.scrollLeft||c&&c.scrollLeft||0)-(e&&e.clientLeft||c&&c.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||c&&c.scrollTop||0)-(e&&e.clientTop||c&&c.clientTop||0)),!a.relatedTarget&&g&&(a.relatedTarget=g===a.target?b.toElement:g),a.which||void 0===f||(a.which=1&f?1:2&f?3:4&f?2:0),a}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==cb()&&this.focus)try{return this.focus(),!1}catch(a){}},delegateType:"focusin"},blur:{trigger:function(){return this===cb()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return m.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):void 0},_default:function(a){return m.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}},simulate:function(a,b,c,d){var e=m.extend(new m.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?m.event.trigger(e,null,b):m.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},m.removeEvent=y.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]===K&&(a[d]=null),a.detachEvent(d,c))},m.Event=function(a,b){return this instanceof m.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ab:bb):this.type=a,b&&m.extend(this,b),this.timeStamp=a&&a.timeStamp||m.now(),void(this[m.expando]=!0)):new m.Event(a,b)},m.Event.prototype={isDefaultPrevented:bb,isPropagationStopped:bb,isImmediatePropagationStopped:bb,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ab,a&&(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ab,a&&(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ab,a&&a.stopImmediatePropagation&&a.stopImmediatePropagation(),this.stopPropagation()}},m.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){m.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!m.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),k.submitBubbles||(m.event.special.submit={setup:function(){return m.nodeName(this,"form")?!1:void m.event.add(this,"click._submit keypress._submit",function(a){var b=a.target,c=m.nodeName(b,"input")||m.nodeName(b,"button")?b.form:void 0;c&&!m._data(c,"submitBubbles")&&(m.event.add(c,"submit._submit",function(a){a._submit_bubble=!0}),m._data(c,"submitBubbles",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&m.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){return m.nodeName(this,"form")?!1:void m.event.remove(this,"._submit")}}),k.changeBubbles||(m.event.special.change={setup:function(){return X.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(m.event.add(this,"propertychange._change",function(a){"checked"===a.originalEvent.propertyName&&(this._just_changed=!0)}),m.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),m.event.simulate("change",this,a,!0)})),!1):void m.event.add(this,"beforeactivate._change",function(a){var b=a.target;X.test(b.nodeName)&&!m._data(b,"changeBubbles")&&(m.event.add(b,"change._change",function(a){!this.parentNode||a.isSimulated||a.isTrigger||m.event.simulate("change",this.parentNode,a,!0)}),m._data(b,"changeBubbles",!0))})},handle:function(a){var b=a.target;return this!==b||a.isSimulated||a.isTrigger||"radio"!==b.type&&"checkbox"!==b.type?a.handleObj.handler.apply(this,arguments):void 0},teardown:function(){return m.event.remove(this,"._change"),!X.test(this.nodeName)}}),k.focusinBubbles||m.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){m.event.simulate(b,a.target,m.event.fix(a),!0)};m.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=m._data(d,b);e||d.addEventListener(a,c,!0),m._data(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=m._data(d,b)-1;e?m._data(d,b,e):(d.removeEventListener(a,c,!0),m._removeData(d,b))}}}),m.fn.extend({on:function(a,b,c,d,e){var f,g;if("object"==typeof a){"string"!=typeof b&&(c=c||b,b=void 0);for(f in a)this.on(f,b,c,a[f],e);return this}if(null==c&&null==d?(d=b,c=b=void 0):null==d&&("string"==typeof b?(d=c,c=void 0):(d=c,c=b,b=void 0)),d===!1)d=bb;else if(!d)return this;return 1===e&&(g=d,d=function(a){return m().off(a),g.apply(this,arguments)},d.guid=g.guid||(g.guid=m.guid++)),this.each(function(){m.event.add(this,a,d,c,b)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,m(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=bb),this.each(function(){m.event.remove(this,a,c,b)})},trigger:function(a,b){return this.each(function(){m.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?m.event.trigger(a,b,c,!0):void 0}});function db(a){var b=eb.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}var eb="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",fb=/ jQuery\d+="(?:null|\d+)"/g,gb=new RegExp("<(?:"+eb+")[\\s/>]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/<tbody/i,lb=/<|&#?\w+;/,mb=/<(?:script|style|link)/i,nb=/checked\s*(?:[^=]|=\s*.checked.)/i,ob=/^$|\/(?:java|ecma)script/i,pb=/^true\/(.*)/,qb=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,rb={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:k.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1></$2>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?"<table>"!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1></$2>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement),b=(Cb[0].contentWindow||Cb[0].contentDocument).document,b.write(),b.close(),c=Eb(a,b),Cb.detach()),Db[a]=c),c}!function(){var a;k.shrinkWrapBlocks=function(){if(null!=a)return a;a=!1;var b,c,d;return c=y.getElementsByTagName("body")[0],c&&c.style?(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:1px;width:1px;zoom:1",b.appendChild(y.createElement("div")).style.width="5px",a=3!==b.offsetWidth),c.removeChild(d),a):void 0}}();var Gb=/^margin/,Hb=new RegExp("^("+S+")(?!px)[a-z%]+$","i"),Ib,Jb,Kb=/^(top|right|bottom|left)$/;a.getComputedStyle?(Ib=function(b){return b.ownerDocument.defaultView.opener?b.ownerDocument.defaultView.getComputedStyle(b,null):a.getComputedStyle(b,null)},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c.getPropertyValue(b)||c[b]:void 0,c&&(""!==g||m.contains(a.ownerDocument,a)||(g=m.style(a,b)),Hb.test(g)&&Gb.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0===g?g:g+""}):y.documentElement.currentStyle&&(Ib=function(a){return a.currentStyle},Jb=function(a,b,c){var d,e,f,g,h=a.style;return c=c||Ib(a),g=c?c[b]:void 0,null==g&&h&&h[b]&&(g=h[b]),Hb.test(g)&&!Kb.test(b)&&(d=h.left,e=a.runtimeStyle,f=e&&e.left,f&&(e.left=a.currentStyle.left),h.left="fontSize"===b?"1em":g,g=h.pixelLeft+"px",h.left=d,f&&(e.left=f)),void 0===g?g:g+""||"auto"});function Lb(a,b){return{get:function(){var c=a();if(null!=c)return c?void delete this.get:(this.get=b).apply(this,arguments)}}}!function(){var b,c,d,e,f,g,h;if(b=y.createElement("div"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=d&&d.style){c.cssText="float:left;opacity:.5",k.opacity="0.5"===c.opacity,k.cssFloat=!!c.cssFloat,b.style.backgroundClip="content-box",b.cloneNode(!0).style.backgroundClip="",k.clearCloneStyle="content-box"===b.style.backgroundClip,k.boxSizing=""===c.boxSizing||""===c.MozBoxSizing||""===c.WebkitBoxSizing,m.extend(k,{reliableHiddenOffsets:function(){return null==g&&i(),g},boxSizingReliable:function(){return null==f&&i(),f},pixelPosition:function(){return null==e&&i(),e},reliableMarginRight:function(){return null==h&&i(),h}});function i(){var b,c,d,i;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),b.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;display:block;margin-top:1%;top:1%;border:1px;padding:1px;width:4px;position:absolute",e=f=!1,h=!0,a.getComputedStyle&&(e="1%"!==(a.getComputedStyle(b,null)||{}).top,f="4px"===(a.getComputedStyle(b,null)||{width:"4px"}).width,i=b.appendChild(y.createElement("div")),i.style.cssText=b.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;margin:0;border:0;padding:0",i.style.marginRight=i.style.width="0",b.style.width="1px",h=!parseFloat((a.getComputedStyle(i,null)||{}).marginRight),b.removeChild(i)),b.innerHTML="<table><tr><td></td><td>t</td></tr></table>",i=b.getElementsByTagName("td"),i[0].style.cssText="margin:0;border:0;padding:0;display:none",g=0===i[0].offsetHeight,g&&(i[0].style.display="",i[1].style.display="none",g=0===i[0].offsetHeight),c.removeChild(d))}}}(),m.swap=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};var Mb=/alpha\([^)]*\)/i,Nb=/opacity\s*=\s*([^)]*)/,Ob=/^(none|table(?!-c[ea]).+)/,Pb=new RegExp("^("+S+")(.*)$","i"),Qb=new RegExp("^([+-])=("+S+")","i"),Rb={position:"absolute",visibility:"hidden",display:"block"},Sb={letterSpacing:"0",fontWeight:"400"},Tb=["Webkit","O","Moz","ms"];function Ub(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=Tb.length;while(e--)if(b=Tb[e]+c,b in a)return b;return d}function Vb(a,b){for(var c,d,e,f=[],g=0,h=a.length;h>g;g++)d=a[g],d.style&&(f[g]=m._data(d,"olddisplay"),c=d.style.display,b?(f[g]||"none"!==c||(d.style.display=""),""===d.style.display&&U(d)&&(f[g]=m._data(d,"olddisplay",Fb(d.nodeName)))):(e=U(d),(c&&"none"!==c||!e)&&m._data(d,"olddisplay",e?c:m.css(d,"display"))));for(g=0;h>g;g++)d=a[g],d.style&&(b&&"none"!==d.style.display&&""!==d.style.display||(d.style.display=b?f[g]||"":"none"));return a}function Wb(a,b,c){var d=Pb.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function Xb(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=m.css(a,c+T[f],!0,e)),d?("content"===c&&(g-=m.css(a,"padding"+T[f],!0,e)),"margin"!==c&&(g-=m.css(a,"border"+T[f]+"Width",!0,e))):(g+=m.css(a,"padding"+T[f],!0,e),"padding"!==c&&(g+=m.css(a,"border"+T[f]+"Width",!0,e)));return g}function Yb(a,b,c){var d=!0,e="width"===b?a.offsetWidth:a.offsetHeight,f=Ib(a),g=k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,f);if(0>=e||null==e){if(e=Jb(a,b,f),(0>e||null==e)&&(e=a.style[b]),Hb.test(e))return e;d=g&&(k.boxSizingReliable()||e===a.style[b]),e=parseFloat(e)||0}return e+Xb(a,b,c||(g?"border":"content"),d,f)+"px"}m.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Jb(a,"opacity");return""===c?"1":c}}}},cssNumber:{columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":k.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=m.camelCase(b),i=a.style;if(b=m.cssProps[h]||(m.cssProps[h]=Ub(i,h)),g=m.cssHooks[b]||m.cssHooks[h],void 0===c)return g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b];if(f=typeof c,"string"===f&&(e=Qb.exec(c))&&(c=(e[1]+1)*e[2]+parseFloat(m.css(a,b)),f="number"),null!=c&&c===c&&("number"!==f||m.cssNumber[h]||(c+="px"),k.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),!(g&&"set"in g&&void 0===(c=g.set(a,c,d)))))try{i[b]=c}catch(j){}}},css:function(a,b,c,d){var e,f,g,h=m.camelCase(b);return b=m.cssProps[h]||(m.cssProps[h]=Ub(a.style,h)),g=m.cssHooks[b]||m.cssHooks[h],g&&"get"in g&&(f=g.get(a,!0,c)),void 0===f&&(f=Jb(a,b,d)),"normal"===f&&b in Sb&&(f=Sb[b]),""===c||c?(e=parseFloat(f),c===!0||m.isNumeric(e)?e||0:f):f}}),m.each(["height","width"],function(a,b){m.cssHooks[b]={get:function(a,c,d){return c?Ob.test(m.css(a,"display"))&&0===a.offsetWidth?m.swap(a,Rb,function(){return Yb(a,b,d)}):Yb(a,b,d):void 0},set:function(a,c,d){var e=d&&Ib(a);return Wb(a,c,d?Xb(a,b,d,k.boxSizing&&"border-box"===m.css(a,"boxSizing",!1,e),e):0)}}}),k.opacity||(m.cssHooks.opacity={get:function(a,b){return Nb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=m.isNumeric(b)?"alpha(opacity="+100*b+")":"",f=d&&d.filter||c.filter||"";c.zoom=1,(b>=1||""===b)&&""===m.trim(f.replace(Mb,""))&&c.removeAttribute&&(c.removeAttribute("filter"),""===b||d&&!d.filter)||(c.filter=Mb.test(f)?f.replace(Mb,e):f+" "+e)}}),m.cssHooks.marginRight=Lb(k.reliableMarginRight,function(a,b){return b?m.swap(a,{display:"inline-block"},Jb,[a,"marginRight"]):void 0}),m.each({margin:"",padding:"",border:"Width"},function(a,b){m.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+T[d]+b]=f[d]||f[d-2]||f[0];return e}},Gb.test(a)||(m.cssHooks[a+b].set=Wb)}),m.fn.extend({css:function(a,b){return V(this,function(a,b,c){var d,e,f={},g=0;if(m.isArray(b)){for(d=Ib(a),e=b.length;e>g;g++)f[b[g]]=m.css(a,b[g],!1,d);return f}return void 0!==c?m.style(a,b,c):m.css(a,b)},a,b,arguments.length>1)},show:function(){return Vb(this,!0)},hide:function(){return Vb(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){U(this)?m(this).show():m(this).hide()})}});function Zb(a,b,c,d,e){return new Zb.prototype.init(a,b,c,d,e) +}m.Tween=Zb,Zb.prototype={constructor:Zb,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(m.cssNumber[c]?"":"px")},cur:function(){var a=Zb.propHooks[this.prop];return a&&a.get?a.get(this):Zb.propHooks._default.get(this)},run:function(a){var b,c=Zb.propHooks[this.prop];return this.pos=b=this.options.duration?m.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Zb.propHooks._default.set(this),this}},Zb.prototype.init.prototype=Zb.prototype,Zb.propHooks={_default:{get:function(a){var b;return null==a.elem[a.prop]||a.elem.style&&null!=a.elem.style[a.prop]?(b=m.css(a.elem,a.prop,""),b&&"auto"!==b?b:0):a.elem[a.prop]},set:function(a){m.fx.step[a.prop]?m.fx.step[a.prop](a):a.elem.style&&(null!=a.elem.style[m.cssProps[a.prop]]||m.cssHooks[a.prop])?m.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},Zb.propHooks.scrollTop=Zb.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},m.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},m.fx=Zb.prototype.init,m.fx.step={};var $b,_b,ac=/^(?:toggle|show|hide)$/,bc=new RegExp("^(?:([+-])=|)("+S+")([a-z%]*)$","i"),cc=/queueHooks$/,dc=[ic],ec={"*":[function(a,b){var c=this.createTween(a,b),d=c.cur(),e=bc.exec(b),f=e&&e[3]||(m.cssNumber[a]?"":"px"),g=(m.cssNumber[a]||"px"!==f&&+d)&&bc.exec(m.css(c.elem,a)),h=1,i=20;if(g&&g[3]!==f){f=f||g[3],e=e||[],g=+d||1;do h=h||".5",g/=h,m.style(c.elem,a,g+f);while(h!==(h=c.cur()/d)&&1!==h&&--i)}return e&&(g=c.start=+g||+d||0,c.unit=f,c.end=e[1]?g+(e[1]+1)*e[2]:+e[2]),c}]};function fc(){return setTimeout(function(){$b=void 0}),$b=m.now()}function gc(a,b){var c,d={height:a},e=0;for(b=b?1:0;4>e;e+=2-b)c=T[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function hc(a,b,c){for(var d,e=(ec[b]||[]).concat(ec["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ic(a,b,c){var d,e,f,g,h,i,j,l,n=this,o={},p=a.style,q=a.nodeType&&U(a),r=m._data(a,"fxshow");c.queue||(h=m._queueHooks(a,"fx"),null==h.unqueued&&(h.unqueued=0,i=h.empty.fire,h.empty.fire=function(){h.unqueued||i()}),h.unqueued++,n.always(function(){n.always(function(){h.unqueued--,m.queue(a,"fx").length||h.empty.fire()})})),1===a.nodeType&&("height"in b||"width"in b)&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=m.css(a,"display"),l="none"===j?m._data(a,"olddisplay")||Fb(a.nodeName):j,"inline"===l&&"none"===m.css(a,"float")&&(k.inlineBlockNeedsLayout&&"inline"!==Fb(a.nodeName)?p.zoom=1:p.display="inline-block")),c.overflow&&(p.overflow="hidden",k.shrinkWrapBlocks()||n.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]}));for(d in b)if(e=b[d],ac.exec(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}o[d]=r&&r[d]||m.style(a,d)}else j=void 0;if(m.isEmptyObject(o))"inline"===("none"===j?Fb(a.nodeName):j)&&(p.display=j);else{r?"hidden"in r&&(q=r.hidden):r=m._data(a,"fxshow",{}),f&&(r.hidden=!q),q?m(a).show():n.done(function(){m(a).hide()}),n.done(function(){var b;m._removeData(a,"fxshow");for(b in o)m.style(a,b,o[b])});for(d in o)g=hc(q?r[d]:0,d,n),d in r||(r[d]=g.start,q&&(g.end=g.start,g.start="width"===d||"height"===d?1:0))}}function jc(a,b){var c,d,e,f,g;for(c in a)if(d=m.camelCase(c),e=b[d],f=a[c],m.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=m.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function kc(a,b,c){var d,e,f=0,g=dc.length,h=m.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=$b||fc(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:m.extend({},b),opts:m.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:$b||fc(),duration:c.duration,tweens:[],createTween:function(b,c){var d=m.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;for(jc(k,j.opts.specialEasing);g>f;f++)if(d=dc[f].call(j,a,k,j.opts))return d;return m.map(k,hc,j),m.isFunction(j.opts.start)&&j.opts.start.call(a,j),m.fx.timer(m.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}m.Animation=m.extend(kc,{tweener:function(a,b){m.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");for(var c,d=0,e=a.length;e>d;d++)c=a[d],ec[c]=ec[c]||[],ec[c].unshift(b)},prefilter:function(a,b){b?dc.unshift(a):dc.push(a)}}),m.speed=function(a,b,c){var d=a&&"object"==typeof a?m.extend({},a):{complete:c||!c&&b||m.isFunction(a)&&a,duration:a,easing:c&&b||b&&!m.isFunction(b)&&b};return d.duration=m.fx.off?0:"number"==typeof d.duration?d.duration:d.duration in m.fx.speeds?m.fx.speeds[d.duration]:m.fx.speeds._default,(null==d.queue||d.queue===!0)&&(d.queue="fx"),d.old=d.complete,d.complete=function(){m.isFunction(d.old)&&d.old.call(this),d.queue&&m.dequeue(this,d.queue)},d},m.fn.extend({fadeTo:function(a,b,c,d){return this.filter(U).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=m.isEmptyObject(a),f=m.speed(b,c,d),g=function(){var b=kc(this,m.extend({},a),f);(e||m._data(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=m.timers,g=m._data(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&cc.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&m.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=m._data(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=m.timers,g=d?d.length:0;for(c.finish=!0,m.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),m.each(["toggle","show","hide"],function(a,b){var c=m.fn[b];m.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(gc(b,!0),a,d,e)}}),m.each({slideDown:gc("show"),slideUp:gc("hide"),slideToggle:gc("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){m.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),m.timers=[],m.fx.tick=function(){var a,b=m.timers,c=0;for($b=m.now();c<b.length;c++)a=b[c],a()||b[c]!==a||b.splice(c--,1);b.length||m.fx.stop(),$b=void 0},m.fx.timer=function(a){m.timers.push(a),a()?m.fx.start():m.timers.pop()},m.fx.interval=13,m.fx.start=function(){_b||(_b=setInterval(m.fx.tick,m.fx.interval))},m.fx.stop=function(){clearInterval(_b),_b=null},m.fx.speeds={slow:600,fast:200,_default:400},m.fn.delay=function(a,b){return a=m.fx?m.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},function(){var a,b,c,d,e;b=y.createElement("div"),b.setAttribute("className","t"),b.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",d=b.getElementsByTagName("a")[0],c=y.createElement("select"),e=c.appendChild(y.createElement("option")),a=b.getElementsByTagName("input")[0],d.style.cssText="top:1px",k.getSetAttribute="t"!==b.className,k.style=/top/.test(d.getAttribute("style")),k.hrefNormalized="/a"===d.getAttribute("href"),k.checkOn=!!a.value,k.optSelected=e.selected,k.enctype=!!y.createElement("form").enctype,c.disabled=!0,k.optDisabled=!e.disabled,a=y.createElement("input"),a.setAttribute("value",""),k.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),k.radioValue="t"===a.value}();var lc=/\r/g;m.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=m.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,m(this).val()):a,null==e?e="":"number"==typeof e?e+="":m.isArray(e)&&(e=m.map(e,function(a){return null==a?"":a+""})),b=m.valHooks[this.type]||m.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=m.valHooks[e.type]||m.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lc,""):null==c?"":c)}}}),m.extend({valHooks:{option:{get:function(a){var b=m.find.attr(a,"value");return null!=b?b:m.trim(m.text(a))}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type||0>e,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],!(!c.selected&&i!==e||(k.optDisabled?c.disabled:null!==c.getAttribute("disabled"))||c.parentNode.disabled&&m.nodeName(c.parentNode,"optgroup"))){if(b=m(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=m.makeArray(b),g=e.length;while(g--)if(d=e[g],m.inArray(m.valHooks.option.get(d),f)>=0)try{d.selected=c=!0}catch(h){d.scrollHeight}else d.selected=!1;return c||(a.selectedIndex=-1),e}}}}),m.each(["radio","checkbox"],function(){m.valHooks[this]={set:function(a,b){return m.isArray(b)?a.checked=m.inArray(m(a).val(),b)>=0:void 0}},k.checkOn||(m.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mc,nc,oc=m.expr.attrHandle,pc=/^(?:checked|selected)$/i,qc=k.getSetAttribute,rc=k.input;m.fn.extend({attr:function(a,b){return V(this,m.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){m.removeAttr(this,a)})}}),m.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(a&&3!==f&&8!==f&&2!==f)return typeof a.getAttribute===K?m.prop(a,b,c):(1===f&&m.isXMLDoc(a)||(b=b.toLowerCase(),d=m.attrHooks[b]||(m.expr.match.bool.test(b)?nc:mc)),void 0===c?d&&"get"in d&&null!==(e=d.get(a,b))?e:(e=m.find.attr(a,b),null==e?void 0:e):null!==c?d&&"set"in d&&void 0!==(e=d.set(a,c,b))?e:(a.setAttribute(b,c+""),c):void m.removeAttr(a,b))},removeAttr:function(a,b){var c,d,e=0,f=b&&b.match(E);if(f&&1===a.nodeType)while(c=f[e++])d=m.propFix[c]||c,m.expr.match.bool.test(c)?rc&&qc||!pc.test(c)?a[d]=!1:a[m.camelCase("default-"+c)]=a[d]=!1:m.attr(a,c,""),a.removeAttribute(qc?c:d)},attrHooks:{type:{set:function(a,b){if(!k.radioValue&&"radio"===b&&m.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}}}),nc={set:function(a,b,c){return b===!1?m.removeAttr(a,c):rc&&qc||!pc.test(c)?a.setAttribute(!qc&&m.propFix[c]||c,c):a[m.camelCase("default-"+c)]=a[c]=!0,c}},m.each(m.expr.match.bool.source.match(/\w+/g),function(a,b){var c=oc[b]||m.find.attr;oc[b]=rc&&qc||!pc.test(b)?function(a,b,d){var e,f;return d||(f=oc[b],oc[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,oc[b]=f),e}:function(a,b,c){return c?void 0:a[m.camelCase("default-"+b)]?b.toLowerCase():null}}),rc&&qc||(m.attrHooks.value={set:function(a,b,c){return m.nodeName(a,"input")?void(a.defaultValue=b):mc&&mc.set(a,b,c)}}),qc||(mc={set:function(a,b,c){var d=a.getAttributeNode(c);return d||a.setAttributeNode(d=a.ownerDocument.createAttribute(c)),d.value=b+="","value"===c||b===a.getAttribute(c)?b:void 0}},oc.id=oc.name=oc.coords=function(a,b,c){var d;return c?void 0:(d=a.getAttributeNode(b))&&""!==d.value?d.value:null},m.valHooks.button={get:function(a,b){var c=a.getAttributeNode(b);return c&&c.specified?c.value:void 0},set:mc.set},m.attrHooks.contenteditable={set:function(a,b,c){mc.set(a,""===b?!1:b,c)}},m.each(["width","height"],function(a,b){m.attrHooks[b]={set:function(a,c){return""===c?(a.setAttribute(b,"auto"),c):void 0}}})),k.style||(m.attrHooks.style={get:function(a){return a.style.cssText||void 0},set:function(a,b){return a.style.cssText=b+""}});var sc=/^(?:input|select|textarea|button|object)$/i,tc=/^(?:a|area)$/i;m.fn.extend({prop:function(a,b){return V(this,m.prop,a,b,arguments.length>1)},removeProp:function(a){return a=m.propFix[a]||a,this.each(function(){try{this[a]=void 0,delete this[a]}catch(b){}})}}),m.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(a,b,c){var d,e,f,g=a.nodeType;if(a&&3!==g&&8!==g&&2!==g)return f=1!==g||!m.isXMLDoc(a),f&&(b=m.propFix[b]||b,e=m.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=m.find.attr(a,"tabindex");return b?parseInt(b,10):sc.test(a.nodeName)||tc.test(a.nodeName)&&a.href?0:-1}}}}),k.hrefNormalized||m.each(["href","src"],function(a,b){m.propHooks[b]={get:function(a){return a.getAttribute(b,4)}}}),k.optSelected||(m.propHooks.selected={get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}}),m.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){m.propFix[this.toLowerCase()]=this}),k.enctype||(m.propFix.enctype="encoding");var uc=/[\t\r\n\f]/g;m.fn.extend({addClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j="string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).addClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):" ")){f=0;while(e=b[f++])d.indexOf(" "+e+" ")<0&&(d+=e+" ");g=m.trim(d),c.className!==g&&(c.className=g)}return this},removeClass:function(a){var b,c,d,e,f,g,h=0,i=this.length,j=0===arguments.length||"string"==typeof a&&a;if(m.isFunction(a))return this.each(function(b){m(this).removeClass(a.call(this,b,this.className))});if(j)for(b=(a||"").match(E)||[];i>h;h++)if(c=this[h],d=1===c.nodeType&&(c.className?(" "+c.className+" ").replace(uc," "):"")){f=0;while(e=b[f++])while(d.indexOf(" "+e+" ")>=0)d=d.replace(" "+e+" "," ");g=a?m.trim(d):"",c.className!==g&&(c.className=g)}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):this.each(m.isFunction(a)?function(c){m(this).toggleClass(a.call(this,c,this.className,b),b)}:function(){if("string"===c){var b,d=0,e=m(this),f=a.match(E)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(c===K||"boolean"===c)&&(this.className&&m._data(this,"__className__",this.className),this.className=this.className||a===!1?"":m._data(this,"__className__")||"")})},hasClass:function(a){for(var b=" "+a+" ",c=0,d=this.length;d>c;c++)if(1===this[c].nodeType&&(" "+this[c].className+" ").replace(uc," ").indexOf(b)>=0)return!0;return!1}}),m.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){m.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),m.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}});var vc=m.now(),wc=/\?/,xc=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;m.parseJSON=function(b){if(a.JSON&&a.JSON.parse)return a.JSON.parse(b+"");var c,d=null,e=m.trim(b+"");return e&&!m.trim(e.replace(xc,function(a,b,e,f){return c&&b&&(d=0),0===d?a:(c=e||b,d+=!f-!e,"")}))?Function("return "+e)():m.error("Invalid JSON: "+b)},m.parseXML=function(b){var c,d;if(!b||"string"!=typeof b)return null;try{a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b))}catch(e){c=void 0}return c&&c.documentElement&&!c.getElementsByTagName("parsererror").length||m.error("Invalid XML: "+b),c};var yc,zc,Ac=/#.*$/,Bc=/([?&])_=[^&]*/,Cc=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Dc=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Ec=/^(?:GET|HEAD)$/,Fc=/^\/\//,Gc=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Hc={},Ic={},Jc="*/".concat("*");try{zc=location.href}catch(Kc){zc=y.createElement("a"),zc.href="",zc=zc.href}yc=Gc.exec(zc.toLowerCase())||[];function Lc(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(E)||[];if(m.isFunction(c))while(d=f[e++])"+"===d.charAt(0)?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Mc(a,b,c,d){var e={},f=a===Ic;function g(h){var i;return e[h]=!0,m.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Nc(a,b){var c,d,e=m.ajaxSettings.flatOptions||{};for(d in b)void 0!==b[d]&&((e[d]?a:c||(c={}))[d]=b[d]);return c&&m.extend(!0,a,c),a}function Oc(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===e&&(e=a.mimeType||b.getResponseHeader("Content-Type"));if(e)for(g in h)if(h[g]&&h[g].test(e)){i.unshift(g);break}if(i[0]in c)f=i[0];else{for(g in c){if(!i[0]||a.converters[g+" "+i[0]]){f=g;break}d||(d=g)}f=f||d}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Pc(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}m.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:zc,type:"GET",isLocal:Dc.test(yc[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Jc,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":m.parseJSON,"text xml":m.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Nc(Nc(a,m.ajaxSettings),b):Nc(m.ajaxSettings,a)},ajaxPrefilter:Lc(Hc),ajaxTransport:Lc(Ic),ajax:function(a,b){"object"==typeof a&&(b=a,a=void 0),b=b||{};var c,d,e,f,g,h,i,j,k=m.ajaxSetup({},b),l=k.context||k,n=k.context&&(l.nodeType||l.jquery)?m(l):m.event,o=m.Deferred(),p=m.Callbacks("once memory"),q=k.statusCode||{},r={},s={},t=0,u="canceled",v={readyState:0,getResponseHeader:function(a){var b;if(2===t){if(!j){j={};while(b=Cc.exec(f))j[b[1].toLowerCase()]=b[2]}b=j[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return 2===t?f:null},setRequestHeader:function(a,b){var c=a.toLowerCase();return t||(a=s[c]=s[c]||a,r[a]=b),this},overrideMimeType:function(a){return t||(k.mimeType=a),this},statusCode:function(a){var b;if(a)if(2>t)for(b in a)q[b]=[q[b],a[b]];else v.always(a[v.status]);return this},abort:function(a){var b=a||u;return i&&i.abort(b),x(0,b),this}};if(o.promise(v).complete=p.add,v.success=v.done,v.error=v.fail,k.url=((a||k.url||zc)+"").replace(Ac,"").replace(Fc,yc[1]+"//"),k.type=b.method||b.type||k.method||k.type,k.dataTypes=m.trim(k.dataType||"*").toLowerCase().match(E)||[""],null==k.crossDomain&&(c=Gc.exec(k.url.toLowerCase()),k.crossDomain=!(!c||c[1]===yc[1]&&c[2]===yc[2]&&(c[3]||("http:"===c[1]?"80":"443"))===(yc[3]||("http:"===yc[1]?"80":"443")))),k.data&&k.processData&&"string"!=typeof k.data&&(k.data=m.param(k.data,k.traditional)),Mc(Hc,k,b,v),2===t)return v;h=m.event&&k.global,h&&0===m.active++&&m.event.trigger("ajaxStart"),k.type=k.type.toUpperCase(),k.hasContent=!Ec.test(k.type),e=k.url,k.hasContent||(k.data&&(e=k.url+=(wc.test(e)?"&":"?")+k.data,delete k.data),k.cache===!1&&(k.url=Bc.test(e)?e.replace(Bc,"$1_="+vc++):e+(wc.test(e)?"&":"?")+"_="+vc++)),k.ifModified&&(m.lastModified[e]&&v.setRequestHeader("If-Modified-Since",m.lastModified[e]),m.etag[e]&&v.setRequestHeader("If-None-Match",m.etag[e])),(k.data&&k.hasContent&&k.contentType!==!1||b.contentType)&&v.setRequestHeader("Content-Type",k.contentType),v.setRequestHeader("Accept",k.dataTypes[0]&&k.accepts[k.dataTypes[0]]?k.accepts[k.dataTypes[0]]+("*"!==k.dataTypes[0]?", "+Jc+"; q=0.01":""):k.accepts["*"]);for(d in k.headers)v.setRequestHeader(d,k.headers[d]);if(k.beforeSend&&(k.beforeSend.call(l,v,k)===!1||2===t))return v.abort();u="abort";for(d in{success:1,error:1,complete:1})v[d](k[d]);if(i=Mc(Ic,k,b,v)){v.readyState=1,h&&n.trigger("ajaxSend",[v,k]),k.async&&k.timeout>0&&(g=setTimeout(function(){v.abort("timeout")},k.timeout));try{t=1,i.send(r,x)}catch(w){if(!(2>t))throw w;x(-1,w)}}else x(-1,"No Transport");function x(a,b,c,d){var j,r,s,u,w,x=b;2!==t&&(t=2,g&&clearTimeout(g),i=void 0,f=d||"",v.readyState=a>0?4:0,j=a>=200&&300>a||304===a,c&&(u=Oc(k,v,c)),u=Pc(k,u,v,j),j?(k.ifModified&&(w=v.getResponseHeader("Last-Modified"),w&&(m.lastModified[e]=w),w=v.getResponseHeader("etag"),w&&(m.etag[e]=w)),204===a||"HEAD"===k.type?x="nocontent":304===a?x="notmodified":(x=u.state,r=u.data,s=u.error,j=!s)):(s=x,(a||!x)&&(x="error",0>a&&(a=0))),v.status=a,v.statusText=(b||x)+"",j?o.resolveWith(l,[r,x,v]):o.rejectWith(l,[v,x,s]),v.statusCode(q),q=void 0,h&&n.trigger(j?"ajaxSuccess":"ajaxError",[v,k,j?r:s]),p.fireWith(l,[v,x]),h&&(n.trigger("ajaxComplete",[v,k]),--m.active||m.event.trigger("ajaxStop")))}return v},getJSON:function(a,b,c){return m.get(a,b,c,"json")},getScript:function(a,b){return m.get(a,void 0,b,"script")}}),m.each(["get","post"],function(a,b){m[b]=function(a,c,d,e){return m.isFunction(c)&&(e=e||d,d=c,c=void 0),m.ajax({url:a,type:b,dataType:e,data:c,success:d})}}),m._evalUrl=function(a){return m.ajax({url:a,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})},m.fn.extend({wrapAll:function(a){if(m.isFunction(a))return this.each(function(b){m(this).wrapAll(a.call(this,b))});if(this[0]){var b=m(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&1===a.firstChild.nodeType)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return this.each(m.isFunction(a)?function(b){m(this).wrapInner(a.call(this,b))}:function(){var b=m(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=m.isFunction(a);return this.each(function(c){m(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){m.nodeName(this,"body")||m(this).replaceWith(this.childNodes)}).end()}}),m.expr.filters.hidden=function(a){return a.offsetWidth<=0&&a.offsetHeight<=0||!k.reliableHiddenOffsets()&&"none"===(a.style&&a.style.display||m.css(a,"display"))},m.expr.filters.visible=function(a){return!m.expr.filters.hidden(a)};var Qc=/%20/g,Rc=/\[\]$/,Sc=/\r?\n/g,Tc=/^(?:submit|button|image|reset|file)$/i,Uc=/^(?:input|select|textarea|keygen)/i;function Vc(a,b,c,d){var e;if(m.isArray(b))m.each(b,function(b,e){c||Rc.test(a)?d(a,e):Vc(a+"["+("object"==typeof e?b:"")+"]",e,c,d)});else if(c||"object"!==m.type(b))d(a,b);else for(e in b)Vc(a+"["+e+"]",b[e],c,d)}m.param=function(a,b){var c,d=[],e=function(a,b){b=m.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=m.ajaxSettings&&m.ajaxSettings.traditional),m.isArray(a)||a.jquery&&!m.isPlainObject(a))m.each(a,function(){e(this.name,this.value)});else for(c in a)Vc(c,a[c],b,e);return d.join("&").replace(Qc,"+")},m.fn.extend({serialize:function(){return m.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=m.prop(this,"elements");return a?m.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!m(this).is(":disabled")&&Uc.test(this.nodeName)&&!Tc.test(a)&&(this.checked||!W.test(a))}).map(function(a,b){var c=m(this).val();return null==c?null:m.isArray(c)?m.map(c,function(a){return{name:b.name,value:a.replace(Sc,"\r\n")}}):{name:b.name,value:c.replace(Sc,"\r\n")}}).get()}}),m.ajaxSettings.xhr=void 0!==a.ActiveXObject?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&Zc()||$c()}:Zc;var Wc=0,Xc={},Yc=m.ajaxSettings.xhr();a.attachEvent&&a.attachEvent("onunload",function(){for(var a in Xc)Xc[a](void 0,!0)}),k.cors=!!Yc&&"withCredentials"in Yc,Yc=k.ajax=!!Yc,Yc&&m.ajaxTransport(function(a){if(!a.crossDomain||k.cors){var b;return{send:function(c,d){var e,f=a.xhr(),g=++Wc;if(f.open(a.type,a.url,a.async,a.username,a.password),a.xhrFields)for(e in a.xhrFields)f[e]=a.xhrFields[e];a.mimeType&&f.overrideMimeType&&f.overrideMimeType(a.mimeType),a.crossDomain||c["X-Requested-With"]||(c["X-Requested-With"]="XMLHttpRequest");for(e in c)void 0!==c[e]&&f.setRequestHeader(e,c[e]+"");f.send(a.hasContent&&a.data||null),b=function(c,e){var h,i,j;if(b&&(e||4===f.readyState))if(delete Xc[g],b=void 0,f.onreadystatechange=m.noop,e)4!==f.readyState&&f.abort();else{j={},h=f.status,"string"==typeof f.responseText&&(j.text=f.responseText);try{i=f.statusText}catch(k){i=""}h||!a.isLocal||a.crossDomain?1223===h&&(h=204):h=j.text?200:404}j&&d(h,i,j,f.getAllResponseHeaders())},a.async?4===f.readyState?setTimeout(b):f.onreadystatechange=Xc[g]=b:b()},abort:function(){b&&b(void 0,!0)}}}});function Zc(){try{return new a.XMLHttpRequest}catch(b){}}function $c(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}m.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(a){return m.globalEval(a),a}}}),m.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),m.ajaxTransport("script",function(a){if(a.crossDomain){var b,c=y.head||m("head")[0]||y.documentElement;return{send:function(d,e){b=y.createElement("script"),b.async=!0,a.scriptCharset&&(b.charset=a.scriptCharset),b.src=a.url,b.onload=b.onreadystatechange=function(a,c){(c||!b.readyState||/loaded|complete/.test(b.readyState))&&(b.onload=b.onreadystatechange=null,b.parentNode&&b.parentNode.removeChild(b),b=null,c||e(200,"success"))},c.insertBefore(b,c.firstChild)},abort:function(){b&&b.onload(void 0,!0)}}}});var _c=[],ad=/(=)\?(?=&|$)|\?\?/;m.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=_c.pop()||m.expando+"_"+vc++;return this[a]=!0,a}}),m.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(ad.test(b.url)?"url":"string"==typeof b.data&&!(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&ad.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=m.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(ad,"$1"+e):b.jsonp!==!1&&(b.url+=(wc.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||m.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,_c.push(e)),g&&m.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),m.parseHTML=function(a,b,c){if(!a||"string"!=typeof a)return null;"boolean"==typeof b&&(c=b,b=!1),b=b||y;var d=u.exec(a),e=!c&&[];return d?[b.createElement(d[1])]:(d=m.buildFragment([a],b,e),e&&e.length&&m(e).remove(),m.merge([],d.childNodes))};var bd=m.fn.load;m.fn.load=function(a,b,c){if("string"!=typeof a&&bd)return bd.apply(this,arguments);var d,e,f,g=this,h=a.indexOf(" ");return h>=0&&(d=m.trim(a.slice(h,a.length)),a=a.slice(0,h)),m.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(f="POST"),g.length>0&&m.ajax({url:a,type:f,dataType:"html",data:b}).done(function(a){e=arguments,g.html(d?m("<div>").append(m.parseHTML(a)).find(d):a)}).complete(c&&function(a,b){g.each(c,e||[a.responseText,b,a])}),this},m.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){m.fn[b]=function(a){return this.on(b,a)}}),m.expr.filters.animated=function(a){return m.grep(m.timers,function(b){return a===b.elem}).length};var cd=a.document.documentElement;function dd(a){return m.isWindow(a)?a:9===a.nodeType?a.defaultView||a.parentWindow:!1}m.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=m.css(a,"position"),l=m(a),n={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=m.css(a,"top"),i=m.css(a,"left"),j=("absolute"===k||"fixed"===k)&&m.inArray("auto",[f,i])>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),m.isFunction(b)&&(b=b.call(a,c,h)),null!=b.top&&(n.top=b.top-h.top+g),null!=b.left&&(n.left=b.left-h.left+e),"using"in b?b.using.call(a,n):l.css(n)}},m.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){m.offset.setOffset(this,a,b)});var b,c,d={top:0,left:0},e=this[0],f=e&&e.ownerDocument;if(f)return b=f.documentElement,m.contains(b,e)?(typeof e.getBoundingClientRect!==K&&(d=e.getBoundingClientRect()),c=dd(f),{top:d.top+(c.pageYOffset||b.scrollTop)-(b.clientTop||0),left:d.left+(c.pageXOffset||b.scrollLeft)-(b.clientLeft||0)}):d},position:function(){if(this[0]){var a,b,c={top:0,left:0},d=this[0];return"fixed"===m.css(d,"position")?b=d.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),m.nodeName(a[0],"html")||(c=a.offset()),c.top+=m.css(a[0],"borderTopWidth",!0),c.left+=m.css(a[0],"borderLeftWidth",!0)),{top:b.top-c.top-m.css(d,"marginTop",!0),left:b.left-c.left-m.css(d,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||cd;while(a&&!m.nodeName(a,"html")&&"static"===m.css(a,"position"))a=a.offsetParent;return a||cd})}}),m.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c=/Y/.test(b);m.fn[a]=function(d){return V(this,function(a,d,e){var f=dd(a);return void 0===e?f?b in f?f[b]:f.document.documentElement[d]:a[d]:void(f?f.scrollTo(c?m(f).scrollLeft():e,c?e:m(f).scrollTop()):a[d]=e)},a,d,arguments.length,null)}}),m.each(["top","left"],function(a,b){m.cssHooks[b]=Lb(k.pixelPosition,function(a,c){return c?(c=Jb(a,b),Hb.test(c)?m(a).position()[b]+"px":c):void 0})}),m.each({Height:"height",Width:"width"},function(a,b){m.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){m.fn[d]=function(d,e){var f=arguments.length&&(c||"boolean"!=typeof d),g=c||(d===!0||e===!0?"margin":"border");return V(this,function(b,c,d){var e;return m.isWindow(b)?b.document.documentElement["client"+a]:9===b.nodeType?(e=b.documentElement,Math.max(b.body["scroll"+a],e["scroll"+a],b.body["offset"+a],e["offset"+a],e["client"+a])):void 0===d?m.css(b,c,g):m.style(b,c,d,g)},b,f?d:void 0,f,null)}})}),m.fn.size=function(){return this.length},m.fn.andSelf=m.fn.addBack,"function"==typeof define&&define.amd&&define("jquery",[],function(){return m});var ed=a.jQuery,fd=a.$;return m.noConflict=function(b){return a.$===m&&(a.$=fd),b&&a.jQuery===m&&(a.jQuery=ed),m},typeof b===K&&(a.jQuery=a.$=m),m}); diff --git a/js/jquery-ui-1.11.4.min.js b/js/jquery-ui-1.11.4.min.js new file mode 100644 index 0000000..5824d12 --- /dev/null +++ b/js/jquery-ui-1.11.4.min.js @@ -0,0 +1,13 @@ +/*! jQuery UI - v1.11.4 - 2015-03-11 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}function s(e){for(var t,i;e.length&&e[0]!==document;){if(t=e.css("position"),("absolute"===t||"relative"===t||"fixed"===t)&&(i=parseInt(e.css("zIndex"),10),!isNaN(i)&&0!==i))return i;e=e.parent()}return 0}function n(){this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},e.extend(this._defaults,this.regional[""]),this.regional.en=e.extend(!0,{},this.regional[""]),this.regional["en-US"]=e.extend(!0,{},this.regional.en),this.dpDiv=a(e("<div id='"+this._mainDivId+"' class='ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>"))}function a(t){var i="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return t.delegate(i,"mouseout",function(){e(this).removeClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).removeClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).removeClass("ui-datepicker-next-hover")}).delegate(i,"mouseover",o)}function o(){e.datepicker._isDisabledDatepicker(v.inline?v.dpDiv.parent()[0]:v.input[0])||(e(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),e(this).addClass("ui-state-hover"),-1!==this.className.indexOf("ui-datepicker-prev")&&e(this).addClass("ui-datepicker-prev-hover"),-1!==this.className.indexOf("ui-datepicker-next")&&e(this).addClass("ui-datepicker-next-hover"))}function r(t,i){e.extend(t,i);for(var s in i)null==i[s]&&(t[s]=i[s]);return t}function h(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var l=0,u=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,n=u.call(arguments,1),a=0,o=n.length;o>a;a++)for(i in n[a])s=n[a][i],n[a].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(n){var a="string"==typeof n,o=u.call(arguments,1),r=this;return a?this.each(function(){var i,a=e.data(this,s);return"instance"===n?(r=a,!1):a?e.isFunction(a[n])&&"_"!==n.charAt(0)?(i=a[n].apply(a,o),i!==a&&void 0!==i?(r=i&&i.jquery?r.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+n+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+n+"'")}):(o.length&&(n=e.widget.extend.apply(null,[n].concat(o))),this.each(function(){var t=e.data(this,s);t?(t.option(n||{}),t._init&&t._init()):e.data(this,s,new i(n,this))})),r}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=l++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget;var d=!1;e(document).mouseup(function(){d=!1}),e.widget("ui.mouse",{version:"1.11.4",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(!d){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var i=this,s=1===t.which,n="string"==typeof this.options.cancel&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;return s&&!n&&this._mouseCapture(t)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(t)!==!1,!this._mouseStarted)?(t.preventDefault(),!0):(!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return i._mouseMove(e)},this._mouseUpDelegate=function(e){return i._mouseUp(e)},this.document.bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),d=!0,!0)):!0}},_mouseMove:function(t){if(this._mouseMoved){if(e.ui.ie&&(!document.documentMode||9>document.documentMode)&&!t.button)return this._mouseUp(t);if(!t.which)return this._mouseUp(t)}return(t.which||t.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted)},_mouseUp:function(t){return this.document.unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),d=!1,!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("<div style='display:block;position:absolute;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.width<t.element[0].scrollWidth,a="scroll"===s||"auto"===s&&t.height<t.element[0].scrollHeight;return{width:a?e.position.scrollbarWidth():0,height:n?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var i=e(t||window),s=e.isWindow(i[0]),n=!!i[0]&&9===i[0].nodeType;return{element:i,isWindow:s,isDocument:n,offset:i.offset()||{left:0,top:0},scrollLeft:i.scrollLeft(),scrollTop:i.scrollTop(),width:s||n?i.width():i.outerWidth(),height:s||n?i.height():i.outerHeight()}}},e.fn.position=function(n){if(!n||!n.of)return f.apply(this,arguments);n=e.extend({},n);var p,m,g,v,y,b,_=e(n.of),x=e.position.getWithinInfo(n.within),w=e.position.getScrollInfo(x),k=(n.collision||"flip").split(" "),T={};return b=s(_),_[0].preventDefault&&(n.at="left top"),m=b.width,g=b.height,v=b.offset,y=e.extend({},v),e.each(["my","at"],function(){var e,t,i=(n[this]||"").split(" ");1===i.length&&(i=l.test(i[0])?i.concat(["center"]):u.test(i[0])?["center"].concat(i):["center","center"]),i[0]=l.test(i[0])?i[0]:"center",i[1]=u.test(i[1])?i[1]:"center",e=d.exec(i[0]),t=d.exec(i[1]),T[this]=[e?e[0]:0,t?t[0]:0],n[this]=[c.exec(i[0])[0],c.exec(i[1])[0]]}),1===k.length&&(k[1]=k[0]),"right"===n.at[0]?y.left+=m:"center"===n.at[0]&&(y.left+=m/2),"bottom"===n.at[1]?y.top+=g:"center"===n.at[1]&&(y.top+=g/2),p=t(T.at,m,g),y.left+=p[0],y.top+=p[1],this.each(function(){var s,l,u=e(this),d=u.outerWidth(),c=u.outerHeight(),f=i(this,"marginLeft"),b=i(this,"marginTop"),D=d+f+i(this,"marginRight")+w.width,S=c+b+i(this,"marginBottom")+w.height,M=e.extend({},y),C=t(T.my,u.outerWidth(),u.outerHeight());"right"===n.my[0]?M.left-=d:"center"===n.my[0]&&(M.left-=d/2),"bottom"===n.my[1]?M.top-=c:"center"===n.my[1]&&(M.top-=c/2),M.left+=C[0],M.top+=C[1],a||(M.left=h(M.left),M.top=h(M.top)),s={marginLeft:f,marginTop:b},e.each(["left","top"],function(t,i){e.ui.position[k[t]]&&e.ui.position[k[t]][i](M,{targetWidth:m,targetHeight:g,elemWidth:d,elemHeight:c,collisionPosition:s,collisionWidth:D,collisionHeight:S,offset:[p[0]+C[0],p[1]+C[1]],my:n.my,at:n.at,within:x,elem:u})}),n.using&&(l=function(e){var t=v.left-M.left,i=t+m-d,s=v.top-M.top,a=s+g-c,h={target:{element:_,left:v.left,top:v.top,width:m,height:g},element:{element:u,left:M.left,top:M.top,width:d,height:c},horizontal:0>i?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(M,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.accordion",{version:"1.11.4",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},hideProps:{borderTopWidth:"hide",borderBottomWidth:"hide",paddingTop:"hide",paddingBottom:"hide",height:"hide"},showProps:{borderTopWidth:"show",borderBottomWidth:"show",paddingTop:"show",paddingBottom:"show",height:"show"},_create:function(){var t=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset").attr("role","tablist"),t.collapsible||t.active!==!1&&null!=t.active||(t.active=0),this._processPanels(),0>t.active&&(t.active+=this.headers.length),this._refresh()},_getCreateEventData:function(){return{header:this.active,panel:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").removeUniqueId(),this._destroyIcons(),e=this.headers.next().removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").css("display","").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeUniqueId(),"content"!==this.options.heightStyle&&e.css("height","")},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):("event"===e&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),"collapsible"!==e||t||this.options.active!==!1||this._activate(0),"icons"===e&&(this._destroyIcons(),t&&this._createIcons()),"disabled"===e&&(this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)),void 0)},_keydown:function(t){if(!t.altKey&&!t.ctrlKey){var i=e.ui.keyCode,s=this.headers.length,n=this.headers.index(t.target),a=!1;switch(t.keyCode){case i.RIGHT:case i.DOWN:a=this.headers[(n+1)%s];break;case i.LEFT:case i.UP:a=this.headers[(n-1+s)%s];break;case i.SPACE:case i.ENTER:this._eventHandler(t);break;case i.HOME:a=this.headers[0];break;case i.END:a=this.headers[s-1]}a&&(e(t.target).attr("tabIndex",-1),e(a).attr("tabIndex",0),a.focus(),t.preventDefault())}},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t=this.options;this._processPanels(),t.active===!1&&t.collapsible===!0||!this.headers.length?(t.active=!1,this.active=e()):t.active===!1?this._activate(0):this.active.length&&!e.contains(this.element[0],this.active[0])?this.headers.length===this.headers.find(".ui-state-disabled").length?(t.active=!1,this.active=e()):this._activate(Math.max(0,t.active-1)):t.active=this.headers.index(this.active),this._destroyIcons(),this._refresh()},_processPanels:function(){var e=this.headers,t=this.panels;this.headers=this.element.find(this.options.header).addClass("ui-accordion-header ui-state-default ui-corner-all"),this.panels=this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").filter(":not(.ui-accordion-content-active)").hide(),t&&(this._off(e.not(this.headers)),this._off(t.not(this.panels)))},_refresh:function(){var t,i=this.options,s=i.heightStyle,n=this.element.parent();this.active=this._findActive(i.active).addClass("ui-accordion-header-active ui-state-active ui-corner-top").removeClass("ui-corner-all"),this.active.next().addClass("ui-accordion-content-active").show(),this.headers.attr("role","tab").each(function(){var t=e(this),i=t.uniqueId().attr("id"),s=t.next(),n=s.uniqueId().attr("id");t.attr("aria-controls",n),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}).next().attr({"aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}).next().attr({"aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._createIcons(),this._setupEvents(i.event),"fill"===s?(t=n.height(),this.element.siblings(":visible").each(function(){var i=e(this),s=i.css("position");"absolute"!==s&&"fixed"!==s&&(t-=i.outerHeight(!0))}),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===s&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).css("height","").height())}).height(t))},_activate:function(t){var i=this._findActive(t)[0];i!==this.active[0]&&(i=i||this.active[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return"number"==typeof t?this.headers.eq(t):e()},_setupEvents:function(t){var i={keydown:"_keydown"};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.headers.add(this.headers.next())),this._on(this.headers,i),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._hoverable(this.headers),this._focusable(this.headers)},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n[0]===s[0],o=a&&i.collapsible,r=o?e():n.next(),h=s.next(),l={oldHeader:s,oldPanel:h,newHeader:o?e():n,newPanel:r};t.preventDefault(),a&&!i.collapsible||this._trigger("beforeActivate",t,l)===!1||(i.active=o?!1:this.headers.index(n),this.active=a?e():n,this._toggle(l),s.removeClass("ui-accordion-header-active ui-state-active"),i.icons&&s.children(".ui-accordion-header-icon").removeClass(i.icons.activeHeader).addClass(i.icons.header),a||(n.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),i.icons&&n.children(".ui-accordion-header-icon").removeClass(i.icons.header).addClass(i.icons.activeHeader),n.next().addClass("ui-accordion-content-active")))},_toggle:function(t){var i=t.newPanel,s=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=i,this.prevHide=s,this.options.animate?this._animate(i,s,t):(s.hide(),i.show(),this._toggleComplete(t)),s.attr({"aria-hidden":"true"}),s.prev().attr({"aria-selected":"false","aria-expanded":"false"}),i.length&&s.length?s.prev().attr({tabIndex:-1,"aria-expanded":"false"}):i.length&&this.headers.filter(function(){return 0===parseInt(e(this).attr("tabIndex"),10)}).attr("tabIndex",-1),i.attr("aria-hidden","false").prev().attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_animate:function(e,t,i){var s,n,a,o=this,r=0,h=e.css("box-sizing"),l=e.length&&(!t.length||e.index()<t.index()),u=this.options.animate||{},d=l&&u.down||u,c=function(){o._toggleComplete(i)};return"number"==typeof d&&(a=d),"string"==typeof d&&(n=d),n=n||d.easing||u.easing,a=a||d.duration||u.duration,t.length?e.length?(s=e.show().outerHeight(),t.animate(this.hideProps,{duration:a,easing:n,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(this.showProps,{duration:a,easing:n,complete:c,step:function(e,i){i.now=Math.round(e),"height"!==i.prop?"content-box"===h&&(r+=i.now):"content"!==o.options.heightStyle&&(i.now=Math.round(s-t.outerHeight()-r),r=0)}}),void 0):t.animate(this.hideProps,a,n,c):e.animate(this.showProps,a,n,c)},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.widget("ui.menu",{version:"1.11.4",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},items:"> *",menus:"ul",position:{my:"left-1 top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item":function(e){e.preventDefault()},"click .ui-menu-item":function(t){var i=e(t.target);!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(t),t.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(t):!this.element.is(":focus")&&e(this.document[0].activeElement).closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){if(!this.previousFilter){var i=e(t.currentTarget); +i.siblings(".ui-state-active").removeClass("ui-state-active"),this.focus(t,i)}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var i=this.active||this.element.find(this.options.items).eq(0);t||this.focus(e,i)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(e){this._closeOnDocumentClick(e)&&this.collapseAll(e),this.mouseHandled=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeClass("ui-menu ui-widget ui-widget-content ui-menu-icons ui-front").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").removeUniqueId().removeClass("ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){var i,s,n,a,o=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:o=!1,s=this.previousFilter||"",n=String.fromCharCode(t.keyCode),a=!1,clearTimeout(this.filterTimer),n===s?a=!0:n=s+n,i=this._filterMenuItems(n),i=a&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(t.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(t,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}o&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.is("[aria-haspopup='true']")?this.expand(e):this.select(e))},refresh:function(){var t,i,s=this,n=this.options.icons.submenu,a=this.element.find(this.options.menus);this.element.toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length),a.filter(":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-front").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var t=e(this),i=t.parent(),s=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);i.attr("aria-haspopup","true").prepend(s),t.attr("aria-labelledby",i.attr("id"))}),t=a.add(this.element),i=t.find(this.options.items),i.not(".ui-menu-item").each(function(){var t=e(this);s._isDivider(t)&&t.addClass("ui-widget-content ui-menu-divider")}),i.not(".ui-menu-item, .ui-menu-divider").addClass("ui-menu-item").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(e,t){"icons"===e&&this.element.find(".ui-menu-icon").removeClass(this.options.icons.submenu).addClass(t.submenu),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},focus:function(e,t){var i,s;this.blur(e,e&&"focus"===e.type),this._scrollIntoView(t),this.active=t.first(),s=this.active.addClass("ui-state-focus").removeClass("ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),this.active.parent().closest(".ui-menu-item").addClass("ui-state-active"),e&&"keydown"===e.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=t.children(".ui-menu"),i.length&&e&&/^mouse/.test(e.type)&&this._startOpening(i),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var i,s,n,a,o,r;this._hasScroll()&&(i=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,n=t.offset().top-this.activeMenu.offset().top-i-s,a=this.activeMenu.scrollTop(),o=this.activeMenu.height(),r=t.outerHeight(),0>n?this.activeMenu.scrollTop(a+n):n+r>o&&this.activeMenu.scrollTop(a+n-o+r))},blur:function(e,t){t||clearTimeout(this.timer),this.active&&(this.active.removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active}))},_startOpening:function(e){clearTimeout(this.timer),"true"===e.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(e)},this.delay))},_open:function(t){var i=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(t,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(t),this.activeMenu=s},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find(".ui-state-active").not(".ui-state-focus").removeClass("ui-state-active")},_closeOnDocumentClick:function(t){return!e(t.target).closest(".ui-menu").length},_isDivider:function(e){return!/[^\-\u2014\u2013\s]/.test(e.text())},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,i){var s;this.active&&(s="first"===e||"last"===e?this.active["first"===e?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[e+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[t]()),this.focus(i,s)},nextPage:function(t){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=e(this),0>i.offset().top-s-n}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(t),void 0)},previousPage:function(t){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=e(this),i.offset().top-s+n>0}),this.focus(t,i)):this.focus(t,this.activeMenu.find(this.options.items).first())),void 0):(this.next(t),void 0)},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var i={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,i)},_filterMenuItems:function(t){var i=t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&"),s=RegExp("^"+i,"i");return this.activeMenu.find(this.options.items).filter(".ui-menu-item").filter(function(){return s.test(e.trim(e(this).text()))})}}),e.widget("ui.autocomplete",{version:"1.11.4",defaultElement:"<input>",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var t,i,s,n=this.element[0].nodeName.toLowerCase(),a="textarea"===n,o="input"===n;this.isMultiLine=a?!0:o?!1:this.element.prop("isContentEditable"),this.valueMethod=this.element[a||o?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return t=!0,s=!0,i=!0,void 0;t=!1,s=!1,i=!1;var a=e.ui.keyCode;switch(n.keyCode){case a.PAGE_UP:t=!0,this._move("previousPage",n);break;case a.PAGE_DOWN:t=!0,this._move("nextPage",n);break;case a.UP:t=!0,this._keyEvent("previous",n);break;case a.DOWN:t=!0,this._keyEvent("next",n);break;case a.ENTER:this.menu.active&&(t=!0,n.preventDefault(),this.menu.select(n));break;case a.TAB:this.menu.active&&this.menu.select(n);break;case a.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(t)return t=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=e.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(e){return s?(s=!1,e.preventDefault(),void 0):(this._searchTimeout(e),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(e),this._change(e),void 0)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete ui-front").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var i=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(s){s.target===t.element[0]||s.target===i||e.contains(i,s.target)||t.close()})})},menufocus:function(t,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,t.originalEvent&&/^mouse/.test(t.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",t,{item:n})&&t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&e.trim(s).length&&(this.liveRegion.children().hide(),e("<div>").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,t){var i=t.item.data("ui-autocomplete-item"),s=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s,this.selectedItem=i})),!1!==this._trigger("select",e,{item:i})&&this._value(i.value),this.term=this._value(),this.close(e),this.selectedItem=i}}),this.liveRegion=e("<span>",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),"source"===e&&this._initSource(),"appendTo"===e&&this.menu.element.appendTo(this._appendTo()),"disabled"===e&&t&&this.xhr&&this.xhr.abort()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_initSource:function(){var t,i,s=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(i,s){s(e.ui.autocomplete.filter(t,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(t,n){s.xhr&&s.xhr.abort(),s.xhr=e.ajax({url:i,data:t,dataType:"json",success:function(e){n(e)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){var t=this.term===this._value(),i=this.menu.element.is(":visible"),s=e.altKey||e.ctrlKey||e.metaKey||e.shiftKey;(!t||t&&!i&&!s)&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){return e=null!=e?e:this._value(),this.term=this._value(),e.length<this.options.minLength?this.close(t):this._trigger("search",t)!==!1?this._search(e):void 0},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var t=++this.requestIndex;return e.proxy(function(e){t===this.requestIndex&&this.__response(e),this.pending--,this.pending||this.element.removeClass("ui-autocomplete-loading")},this)},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return"string"==typeof t?{label:t,value:t}:e.extend({},t,{label:t.label||t.value,value:t.value||t.label})})},_suggest:function(t){var i=this.menu.element.empty();this._renderMenu(i,t),this.isNewMenu=!0,this.menu.refresh(),i.show(),this._resizeMenu(),i.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,i){var s=this;e.each(i,function(e,i){s._renderItemData(t,i)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,i){return e("<li>").text(i.label).appendTo(t)},_move:function(e,t){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[e](t),void 0):(this.search(null,t),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(e,t),t.preventDefault())}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,i){var s=RegExp(e.ui.autocomplete.escapeRegex(i),"i");return e.grep(t,function(e){return s.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(t){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=t&&t.length?this.options.messages.results(t.length):this.options.messages.noResults,this.liveRegion.children().hide(),e("<div>").text(i).appendTo(this.liveRegion))}}),e.ui.autocomplete;var c,p="ui-button ui-widget ui-state-default ui-corner-all",f="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",m=function(){var t=e(this);setTimeout(function(){t.find(":ui-button").button("refresh")},1)},g=function(t){var i=t.name,s=t.form,n=e([]);return i&&(i=i.replace(/'/g,"\\'"),n=s?e(s).find("[name='"+i+"'][type=radio]"):e("[name='"+i+"'][type=radio]",t.ownerDocument).filter(function(){return!this.form})),n};e.widget("ui.button",{version:"1.11.4",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,m),"boolean"!=typeof this.options.disabled?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,i=this.options,s="checkbox"===this.type||"radio"===this.type,n=s?"":"ui-state-active";null===i.label&&(i.label="input"===this.type?this.buttonElement.val():this.buttonElement.html()),this._hoverable(this.buttonElement),this.buttonElement.addClass(p).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){i.disabled||this===c&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){i.disabled||e(this).removeClass(n)}).bind("click"+this.eventNamespace,function(e){i.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this._on({focus:function(){this.buttonElement.addClass("ui-state-focus")},blur:function(){this.buttonElement.removeClass("ui-state-focus")}}),s&&this.element.bind("change"+this.eventNamespace,function(){t.refresh()}),"checkbox"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){return i.disabled?!1:void 0}):"radio"===this.type?this.buttonElement.bind("click"+this.eventNamespace,function(){if(i.disabled)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var s=t.element[0];g(s).not(s).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){return i.disabled?!1:(e(this).addClass("ui-state-active"),c=this,t.document.one("mouseup",function(){c=null}),void 0)}).bind("mouseup"+this.eventNamespace,function(){return i.disabled?!1:(e(this).removeClass("ui-state-active"),void 0)}).bind("keydown"+this.eventNamespace,function(t){return i.disabled?!1:((t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active"),void 0)}).bind("keyup"+this.eventNamespace+" blur"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",i.disabled),this._resetButton()},_determineButtonType:function(){var e,t,i;this.type=this.element.is("[type=checkbox]")?"checkbox":this.element.is("[type=radio]")?"radio":this.element.is("input")?"input":"button","checkbox"===this.type||"radio"===this.type?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),i=this.element.is(":checked"),i&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",i)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(p+" ui-state-active "+f).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){return this._super(e,t),"disabled"===e?(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),t&&("checkbox"===this.type||"radio"===this.type?this.buttonElement.removeClass("ui-state-focus"):this.buttonElement.removeClass("ui-state-focus ui-state-active")),void 0):(this._resetButton(),void 0)},refresh:function(){var t=this.element.is("input, button")?this.element.is(":disabled"):this.element.hasClass("ui-button-disabled");t!==this.options.disabled&&this._setOption("disabled",t),"radio"===this.type?g(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):"checkbox"===this.type&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if("input"===this.type)return this.options.label&&this.element.val(this.options.label),void 0;var t=this.buttonElement.removeClass(f),i=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),s=this.options.icons,n=s.primary&&s.secondary,a=[];s.primary||s.secondary?(this.options.text&&a.push("ui-button-text-icon"+(n?"s":s.primary?"-primary":"-secondary")),s.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+s.primary+"'></span>"),s.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+s.secondary+"'></span>"),this.options.text||(a.push(n?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(i)))):a.push("ui-button-text-only"),t.addClass(a.join(" "))}}),e.widget("ui.buttonset",{version:"1.11.4",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(ui-button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){"disabled"===e&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t="rtl"===this.element.css("direction"),i=this.element.find(this.options.items),s=i.filter(":ui-button");i.not(":ui-button").button(),s.button("refresh"),this.buttons=i.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}}),e.ui.button,e.extend(e.ui,{datepicker:{version:"1.11.4"}});var v;e.extend(n.prototype,{markerClassName:"hasDatepicker",maxRows:4,_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return r(this._defaults,e||{}),this},_attachDatepicker:function(t,i){var s,n,a;s=t.nodeName.toLowerCase(),n="div"===s||"span"===s,t.id||(this.uuid+=1,t.id="dp"+this.uuid),a=this._newInst(e(t),n),a.settings=e.extend({},i||{}),"input"===s?this._connectDatepicker(t,a):n&&this._inlineDatepicker(t,a)},_newInst:function(t,i){var s=t[0].id.replace(/([^A-Za-z0-9_\-])/g,"\\\\$1");return{id:s,input:t,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:i,dpDiv:i?a(e("<div class='"+this._inlineClass+" ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>")):this.dpDiv}},_connectDatepicker:function(t,i){var s=e(t);i.append=e([]),i.trigger=e([]),s.hasClass(this.markerClassName)||(this._attachments(s,i),s.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp),this._autoSize(i),e.data(t,"datepicker",i),i.settings.disabled&&this._disableDatepicker(t))},_attachments:function(t,i){var s,n,a,o=this._get(i,"appendText"),r=this._get(i,"isRTL");i.append&&i.append.remove(),o&&(i.append=e("<span class='"+this._appendClass+"'>"+o+"</span>"),t[r?"before":"after"](i.append)),t.unbind("focus",this._showDatepicker),i.trigger&&i.trigger.remove(),s=this._get(i,"showOn"),("focus"===s||"both"===s)&&t.focus(this._showDatepicker),("button"===s||"both"===s)&&(n=this._get(i,"buttonText"),a=this._get(i,"buttonImage"),i.trigger=e(this._get(i,"buttonImageOnly")?e("<img/>").addClass(this._triggerClass).attr({src:a,alt:n,title:n}):e("<button type='button'></button>").addClass(this._triggerClass).html(a?e("<img/>").attr({src:a,alt:n,title:n}):n)),t[r?"before":"after"](i.trigger),i.trigger.click(function(){return e.datepicker._datepickerShowing&&e.datepicker._lastInput===t[0]?e.datepicker._hideDatepicker():e.datepicker._datepickerShowing&&e.datepicker._lastInput!==t[0]?(e.datepicker._hideDatepicker(),e.datepicker._showDatepicker(t[0])):e.datepicker._showDatepicker(t[0]),!1}))},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t,i,s,n,a=new Date(2009,11,20),o=this._get(e,"dateFormat");o.match(/[DM]/)&&(t=function(e){for(i=0,s=0,n=0;e.length>n;n++)e[n].length>i&&(i=e[n].length,s=n);return s},a.setMonth(t(this._get(e,o.match(/MM/)?"monthNames":"monthNamesShort"))),a.setDate(t(this._get(e,o.match(/DD/)?"dayNames":"dayNamesShort"))+20-a.getDay())),e.input.attr("size",this._formatDate(e,a).length)}},_inlineDatepicker:function(t,i){var s=e(t);s.hasClass(this.markerClassName)||(s.addClass(this.markerClassName).append(i.dpDiv),e.data(t,"datepicker",i),this._setDate(i,this._getDefaultDate(i),!0),this._updateDatepicker(i),this._updateAlternate(i),i.settings.disabled&&this._disableDatepicker(t),i.dpDiv.css("display","block"))},_dialogDatepicker:function(t,i,s,n,a){var o,h,l,u,d,c=this._dialogInst;return c||(this.uuid+=1,o="dp"+this.uuid,this._dialogInput=e("<input type='text' id='"+o+"' style='position: absolute; top: -100px; width: 0px;'/>"),this._dialogInput.keydown(this._doKeyDown),e("body").append(this._dialogInput),c=this._dialogInst=this._newInst(this._dialogInput,!1),c.settings={},e.data(this._dialogInput[0],"datepicker",c)),r(c.settings,n||{}),i=i&&i.constructor===Date?this._formatDate(c,i):i,this._dialogInput.val(i),this._pos=a?a.length?a:[a.pageX,a.pageY]:null,this._pos||(h=document.documentElement.clientWidth,l=document.documentElement.clientHeight,u=document.documentElement.scrollLeft||document.body.scrollLeft,d=document.documentElement.scrollTop||document.body.scrollTop,this._pos=[h/2-100+u,l/2-150+d]),this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),c.settings.onSelect=s,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),e.blockUI&&e.blockUI(this.dpDiv),e.data(this._dialogInput[0],"datepicker",c),this},_destroyDatepicker:function(t){var i,s=e(t),n=e.data(t,"datepicker");s.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),e.removeData(t,"datepicker"),"input"===i?(n.append.remove(),n.trigger.remove(),s.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):("div"===i||"span"===i)&&s.removeClass(this.markerClassName).empty(),v===n&&(v=null))},_enableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!1,a.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().removeClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}))},_disableDatepicker:function(t){var i,s,n=e(t),a=e.data(t,"datepicker");n.hasClass(this.markerClassName)&&(i=t.nodeName.toLowerCase(),"input"===i?(t.disabled=!0,a.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"})):("div"===i||"span"===i)&&(s=n.children("."+this._inlineClass),s.children().addClass("ui-state-disabled"),s.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)),this._disabledInputs=e.map(this._disabledInputs,function(e){return e===t?null:e}),this._disabledInputs[this._disabledInputs.length]=t)},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;this._disabledInputs.length>t;t++)if(this._disabledInputs[t]===e)return!0;return!1},_getInst:function(t){try{return e.data(t,"datepicker")}catch(i){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(t,i,s){var n,a,o,h,l=this._getInst(t);return 2===arguments.length&&"string"==typeof i?"defaults"===i?e.extend({},e.datepicker._defaults):l?"all"===i?e.extend({},l.settings):this._get(l,i):null:(n=i||{},"string"==typeof i&&(n={},n[i]=s),l&&(this._curInst===l&&this._hideDatepicker(),a=this._getDateDatepicker(t,!0),o=this._getMinMaxDate(l,"min"),h=this._getMinMaxDate(l,"max"),r(l.settings,n),null!==o&&void 0!==n.dateFormat&&void 0===n.minDate&&(l.settings.minDate=this._formatDate(l,o)),null!==h&&void 0!==n.dateFormat&&void 0===n.maxDate&&(l.settings.maxDate=this._formatDate(l,h)),"disabled"in n&&(n.disabled?this._disableDatepicker(t):this._enableDatepicker(t)),this._attachments(e(t),l),this._autoSize(l),this._setDate(l,a),this._updateAlternate(l),this._updateDatepicker(l)),void 0)},_changeDatepicker:function(e,t,i){this._optionDatepicker(e,t,i)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var i=this._getInst(e);i&&(this._setDate(i,t),this._updateDatepicker(i),this._updateAlternate(i))},_getDateDatepicker:function(e,t){var i=this._getInst(e);return i&&!i.inline&&this._setDateFromField(i,t),i?this._getDate(i):null},_doKeyDown:function(t){var i,s,n,a=e.datepicker._getInst(t.target),o=!0,r=a.dpDiv.is(".ui-datepicker-rtl");if(a._keyEvent=!0,e.datepicker._datepickerShowing)switch(t.keyCode){case 9:e.datepicker._hideDatepicker(),o=!1;break;case 13:return n=e("td."+e.datepicker._dayOverClass+":not(."+e.datepicker._currentClass+")",a.dpDiv),n[0]&&e.datepicker._selectDay(t.target,a.selectedMonth,a.selectedYear,n[0]),i=e.datepicker._get(a,"onSelect"),i?(s=e.datepicker._formatDate(a),i.apply(a.input?a.input[0]:null,[s,a])):e.datepicker._hideDatepicker(),!1;case 27:e.datepicker._hideDatepicker();break;case 33:e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 34:e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 35:(t.ctrlKey||t.metaKey)&&e.datepicker._clearDate(t.target),o=t.ctrlKey||t.metaKey;break;case 36:(t.ctrlKey||t.metaKey)&&e.datepicker._gotoToday(t.target),o=t.ctrlKey||t.metaKey;break;case 37:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?1:-1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?-e.datepicker._get(a,"stepBigMonths"):-e.datepicker._get(a,"stepMonths"),"M");break;case 38:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,-7,"D"),o=t.ctrlKey||t.metaKey;break;case 39:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,r?-1:1,"D"),o=t.ctrlKey||t.metaKey,t.originalEvent.altKey&&e.datepicker._adjustDate(t.target,t.ctrlKey?+e.datepicker._get(a,"stepBigMonths"):+e.datepicker._get(a,"stepMonths"),"M");break;case 40:(t.ctrlKey||t.metaKey)&&e.datepicker._adjustDate(t.target,7,"D"),o=t.ctrlKey||t.metaKey;break;default:o=!1}else 36===t.keyCode&&t.ctrlKey?e.datepicker._showDatepicker(this):o=!1;o&&(t.preventDefault(),t.stopPropagation())},_doKeyPress:function(t){var i,s,n=e.datepicker._getInst(t.target); +return e.datepicker._get(n,"constrainInput")?(i=e.datepicker._possibleChars(e.datepicker._get(n,"dateFormat")),s=String.fromCharCode(null==t.charCode?t.keyCode:t.charCode),t.ctrlKey||t.metaKey||" ">s||!i||i.indexOf(s)>-1):void 0},_doKeyUp:function(t){var i,s=e.datepicker._getInst(t.target);if(s.input.val()!==s.lastVal)try{i=e.datepicker.parseDate(e.datepicker._get(s,"dateFormat"),s.input?s.input.val():null,e.datepicker._getFormatConfig(s)),i&&(e.datepicker._setDateFromField(s),e.datepicker._updateAlternate(s),e.datepicker._updateDatepicker(s))}catch(n){}return!0},_showDatepicker:function(t){if(t=t.target||t,"input"!==t.nodeName.toLowerCase()&&(t=e("input",t.parentNode)[0]),!e.datepicker._isDisabledDatepicker(t)&&e.datepicker._lastInput!==t){var i,n,a,o,h,l,u;i=e.datepicker._getInst(t),e.datepicker._curInst&&e.datepicker._curInst!==i&&(e.datepicker._curInst.dpDiv.stop(!0,!0),i&&e.datepicker._datepickerShowing&&e.datepicker._hideDatepicker(e.datepicker._curInst.input[0])),n=e.datepicker._get(i,"beforeShow"),a=n?n.apply(t,[t,i]):{},a!==!1&&(r(i.settings,a),i.lastVal=null,e.datepicker._lastInput=t,e.datepicker._setDateFromField(i),e.datepicker._inDialog&&(t.value=""),e.datepicker._pos||(e.datepicker._pos=e.datepicker._findPos(t),e.datepicker._pos[1]+=t.offsetHeight),o=!1,e(t).parents().each(function(){return o|="fixed"===e(this).css("position"),!o}),h={left:e.datepicker._pos[0],top:e.datepicker._pos[1]},e.datepicker._pos=null,i.dpDiv.empty(),i.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),e.datepicker._updateDatepicker(i),h=e.datepicker._checkOffset(i,h,o),i.dpDiv.css({position:e.datepicker._inDialog&&e.blockUI?"static":o?"fixed":"absolute",display:"none",left:h.left+"px",top:h.top+"px"}),i.inline||(l=e.datepicker._get(i,"showAnim"),u=e.datepicker._get(i,"duration"),i.dpDiv.css("z-index",s(e(t))+1),e.datepicker._datepickerShowing=!0,e.effects&&e.effects.effect[l]?i.dpDiv.show(l,e.datepicker._get(i,"showOptions"),u):i.dpDiv[l||"show"](l?u:null),e.datepicker._shouldFocusInput(i)&&i.input.focus(),e.datepicker._curInst=i))}},_updateDatepicker:function(t){this.maxRows=4,v=t,t.dpDiv.empty().append(this._generateHTML(t)),this._attachHandlers(t);var i,s=this._getNumberOfMonths(t),n=s[1],a=17,r=t.dpDiv.find("."+this._dayOverClass+" a");r.length>0&&o.apply(r.get(0)),t.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),n>1&&t.dpDiv.addClass("ui-datepicker-multi-"+n).css("width",a*n+"em"),t.dpDiv[(1!==s[0]||1!==s[1]?"add":"remove")+"Class"]("ui-datepicker-multi"),t.dpDiv[(this._get(t,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),t===e.datepicker._curInst&&e.datepicker._datepickerShowing&&e.datepicker._shouldFocusInput(t)&&t.input.focus(),t.yearshtml&&(i=t.yearshtml,setTimeout(function(){i===t.yearshtml&&t.yearshtml&&t.dpDiv.find("select.ui-datepicker-year:first").replaceWith(t.yearshtml),i=t.yearshtml=null},0))},_shouldFocusInput:function(e){return e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&!e.input.is(":focus")},_checkOffset:function(t,i,s){var n=t.dpDiv.outerWidth(),a=t.dpDiv.outerHeight(),o=t.input?t.input.outerWidth():0,r=t.input?t.input.outerHeight():0,h=document.documentElement.clientWidth+(s?0:e(document).scrollLeft()),l=document.documentElement.clientHeight+(s?0:e(document).scrollTop());return i.left-=this._get(t,"isRTL")?n-o:0,i.left-=s&&i.left===t.input.offset().left?e(document).scrollLeft():0,i.top-=s&&i.top===t.input.offset().top+r?e(document).scrollTop():0,i.left-=Math.min(i.left,i.left+n>h&&h>n?Math.abs(i.left+n-h):0),i.top-=Math.min(i.top,i.top+a>l&&l>a?Math.abs(a+r):0),i},_findPos:function(t){for(var i,s=this._getInst(t),n=this._get(s,"isRTL");t&&("hidden"===t.type||1!==t.nodeType||e.expr.filters.hidden(t));)t=t[n?"previousSibling":"nextSibling"];return i=e(t).offset(),[i.left,i.top]},_hideDatepicker:function(t){var i,s,n,a,o=this._curInst;!o||t&&o!==e.data(t,"datepicker")||this._datepickerShowing&&(i=this._get(o,"showAnim"),s=this._get(o,"duration"),n=function(){e.datepicker._tidyDialog(o)},e.effects&&(e.effects.effect[i]||e.effects[i])?o.dpDiv.hide(i,e.datepicker._get(o,"showOptions"),s,n):o.dpDiv["slideDown"===i?"slideUp":"fadeIn"===i?"fadeOut":"hide"](i?s:null,n),i||n(),this._datepickerShowing=!1,a=this._get(o,"onClose"),a&&a.apply(o.input?o.input[0]:null,[o.input?o.input.val():"",o]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),e.blockUI&&(e.unblockUI(),e("body").append(this.dpDiv))),this._inDialog=!1)},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(t){if(e.datepicker._curInst){var i=e(t.target),s=e.datepicker._getInst(i[0]);(i[0].id!==e.datepicker._mainDivId&&0===i.parents("#"+e.datepicker._mainDivId).length&&!i.hasClass(e.datepicker.markerClassName)&&!i.closest("."+e.datepicker._triggerClass).length&&e.datepicker._datepickerShowing&&(!e.datepicker._inDialog||!e.blockUI)||i.hasClass(e.datepicker.markerClassName)&&e.datepicker._curInst!==s)&&e.datepicker._hideDatepicker()}},_adjustDate:function(t,i,s){var n=e(t),a=this._getInst(n[0]);this._isDisabledDatepicker(n[0])||(this._adjustInstDate(a,i+("M"===s?this._get(a,"showCurrentAtPos"):0),s),this._updateDatepicker(a))},_gotoToday:function(t){var i,s=e(t),n=this._getInst(s[0]);this._get(n,"gotoCurrent")&&n.currentDay?(n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear):(i=new Date,n.selectedDay=i.getDate(),n.drawMonth=n.selectedMonth=i.getMonth(),n.drawYear=n.selectedYear=i.getFullYear()),this._notifyChange(n),this._adjustDate(s)},_selectMonthYear:function(t,i,s){var n=e(t),a=this._getInst(n[0]);a["selected"+("M"===s?"Month":"Year")]=a["draw"+("M"===s?"Month":"Year")]=parseInt(i.options[i.selectedIndex].value,10),this._notifyChange(a),this._adjustDate(n)},_selectDay:function(t,i,s,n){var a,o=e(t);e(n).hasClass(this._unselectableClass)||this._isDisabledDatepicker(o[0])||(a=this._getInst(o[0]),a.selectedDay=a.currentDay=e("a",n).html(),a.selectedMonth=a.currentMonth=i,a.selectedYear=a.currentYear=s,this._selectDate(t,this._formatDate(a,a.currentDay,a.currentMonth,a.currentYear)))},_clearDate:function(t){var i=e(t);this._selectDate(i,"")},_selectDate:function(t,i){var s,n=e(t),a=this._getInst(n[0]);i=null!=i?i:this._formatDate(a),a.input&&a.input.val(i),this._updateAlternate(a),s=this._get(a,"onSelect"),s?s.apply(a.input?a.input[0]:null,[i,a]):a.input&&a.input.trigger("change"),a.inline?this._updateDatepicker(a):(this._hideDatepicker(),this._lastInput=a.input[0],"object"!=typeof a.input[0]&&a.input.focus(),this._lastInput=null)},_updateAlternate:function(t){var i,s,n,a=this._get(t,"altField");a&&(i=this._get(t,"altFormat")||this._get(t,"dateFormat"),s=this._getDate(t),n=this.formatDate(i,s,this._getFormatConfig(t)),e(a).each(function(){e(this).val(n)}))},noWeekends:function(e){var t=e.getDay();return[t>0&&6>t,""]},iso8601Week:function(e){var t,i=new Date(e.getTime());return i.setDate(i.getDate()+4-(i.getDay()||7)),t=i.getTime(),i.setMonth(0),i.setDate(1),Math.floor(Math.round((t-i)/864e5)/7)+1},parseDate:function(t,i,s){if(null==t||null==i)throw"Invalid arguments";if(i="object"==typeof i?""+i:i+"",""===i)return null;var n,a,o,r,h=0,l=(s?s.shortYearCutoff:null)||this._defaults.shortYearCutoff,u="string"!=typeof l?l:(new Date).getFullYear()%100+parseInt(l,10),d=(s?s.dayNamesShort:null)||this._defaults.dayNamesShort,c=(s?s.dayNames:null)||this._defaults.dayNames,p=(s?s.monthNamesShort:null)||this._defaults.monthNamesShort,f=(s?s.monthNames:null)||this._defaults.monthNames,m=-1,g=-1,v=-1,y=-1,b=!1,_=function(e){var i=t.length>n+1&&t.charAt(n+1)===e;return i&&n++,i},x=function(e){var t=_(e),s="@"===e?14:"!"===e?20:"y"===e&&t?4:"o"===e?3:2,n="y"===e?s:1,a=RegExp("^\\d{"+n+","+s+"}"),o=i.substring(h).match(a);if(!o)throw"Missing number at position "+h;return h+=o[0].length,parseInt(o[0],10)},w=function(t,s,n){var a=-1,o=e.map(_(t)?n:s,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)});if(e.each(o,function(e,t){var s=t[1];return i.substr(h,s.length).toLowerCase()===s.toLowerCase()?(a=t[0],h+=s.length,!1):void 0}),-1!==a)return a+1;throw"Unknown name at position "+h},k=function(){if(i.charAt(h)!==t.charAt(n))throw"Unexpected literal at position "+h;h++};for(n=0;t.length>n;n++)if(b)"'"!==t.charAt(n)||_("'")?k():b=!1;else switch(t.charAt(n)){case"d":v=x("d");break;case"D":w("D",d,c);break;case"o":y=x("o");break;case"m":g=x("m");break;case"M":g=w("M",p,f);break;case"y":m=x("y");break;case"@":r=new Date(x("@")),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"!":r=new Date((x("!")-this._ticksTo1970)/1e4),m=r.getFullYear(),g=r.getMonth()+1,v=r.getDate();break;case"'":_("'")?k():b=!0;break;default:k()}if(i.length>h&&(o=i.substr(h),!/^\s+/.test(o)))throw"Extra/unparsed characters found in date: "+o;if(-1===m?m=(new Date).getFullYear():100>m&&(m+=(new Date).getFullYear()-(new Date).getFullYear()%100+(u>=m?0:-100)),y>-1)for(g=1,v=y;;){if(a=this._getDaysInMonth(m,g-1),a>=v)break;g++,v-=a}if(r=this._daylightSavingAdjust(new Date(m,g-1,v)),r.getFullYear()!==m||r.getMonth()+1!==g||r.getDate()!==v)throw"Invalid date";return r},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:1e7*60*60*24*(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925)),formatDate:function(e,t,i){if(!t)return"";var s,n=(i?i.dayNamesShort:null)||this._defaults.dayNamesShort,a=(i?i.dayNames:null)||this._defaults.dayNames,o=(i?i.monthNamesShort:null)||this._defaults.monthNamesShort,r=(i?i.monthNames:null)||this._defaults.monthNames,h=function(t){var i=e.length>s+1&&e.charAt(s+1)===t;return i&&s++,i},l=function(e,t,i){var s=""+t;if(h(e))for(;i>s.length;)s="0"+s;return s},u=function(e,t,i,s){return h(e)?s[t]:i[t]},d="",c=!1;if(t)for(s=0;e.length>s;s++)if(c)"'"!==e.charAt(s)||h("'")?d+=e.charAt(s):c=!1;else switch(e.charAt(s)){case"d":d+=l("d",t.getDate(),2);break;case"D":d+=u("D",t.getDay(),n,a);break;case"o":d+=l("o",Math.round((new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()-new Date(t.getFullYear(),0,0).getTime())/864e5),3);break;case"m":d+=l("m",t.getMonth()+1,2);break;case"M":d+=u("M",t.getMonth(),o,r);break;case"y":d+=h("y")?t.getFullYear():(10>t.getYear()%100?"0":"")+t.getYear()%100;break;case"@":d+=t.getTime();break;case"!":d+=1e4*t.getTime()+this._ticksTo1970;break;case"'":h("'")?d+="'":c=!0;break;default:d+=e.charAt(s)}return d},_possibleChars:function(e){var t,i="",s=!1,n=function(i){var s=e.length>t+1&&e.charAt(t+1)===i;return s&&t++,s};for(t=0;e.length>t;t++)if(s)"'"!==e.charAt(t)||n("'")?i+=e.charAt(t):s=!1;else switch(e.charAt(t)){case"d":case"m":case"y":case"@":i+="0123456789";break;case"D":case"M":return null;case"'":n("'")?i+="'":s=!0;break;default:i+=e.charAt(t)}return i},_get:function(e,t){return void 0!==e.settings[t]?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()!==e.lastVal){var i=this._get(e,"dateFormat"),s=e.lastVal=e.input?e.input.val():null,n=this._getDefaultDate(e),a=n,o=this._getFormatConfig(e);try{a=this.parseDate(i,s,o)||n}catch(r){s=t?"":s}e.selectedDay=a.getDate(),e.drawMonth=e.selectedMonth=a.getMonth(),e.drawYear=e.selectedYear=a.getFullYear(),e.currentDay=s?a.getDate():0,e.currentMonth=s?a.getMonth():0,e.currentYear=s?a.getFullYear():0,this._adjustInstDate(e)}},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(t,i,s){var n=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},a=function(i){try{return e.datepicker.parseDate(e.datepicker._get(t,"dateFormat"),i,e.datepicker._getFormatConfig(t))}catch(s){}for(var n=(i.toLowerCase().match(/^c/)?e.datepicker._getDate(t):null)||new Date,a=n.getFullYear(),o=n.getMonth(),r=n.getDate(),h=/([+\-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,l=h.exec(i);l;){switch(l[2]||"d"){case"d":case"D":r+=parseInt(l[1],10);break;case"w":case"W":r+=7*parseInt(l[1],10);break;case"m":case"M":o+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o));break;case"y":case"Y":a+=parseInt(l[1],10),r=Math.min(r,e.datepicker._getDaysInMonth(a,o))}l=h.exec(i)}return new Date(a,o,r)},o=null==i||""===i?s:"string"==typeof i?a(i):"number"==typeof i?isNaN(i)?s:n(i):new Date(i.getTime());return o=o&&"Invalid Date"==""+o?s:o,o&&(o.setHours(0),o.setMinutes(0),o.setSeconds(0),o.setMilliseconds(0)),this._daylightSavingAdjust(o)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,i){var s=!t,n=e.selectedMonth,a=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),n===e.selectedMonth&&a===e.selectedYear||i||this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(s?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&""===e.input.val()?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(t){var i=this._get(t,"stepMonths"),s="#"+t.id.replace(/\\\\/g,"\\");t.dpDiv.find("[data-handler]").map(function(){var t={prev:function(){e.datepicker._adjustDate(s,-i,"M")},next:function(){e.datepicker._adjustDate(s,+i,"M")},hide:function(){e.datepicker._hideDatepicker()},today:function(){e.datepicker._gotoToday(s)},selectDay:function(){return e.datepicker._selectDay(s,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return e.datepicker._selectMonthYear(s,this,"M"),!1},selectYear:function(){return e.datepicker._selectMonthYear(s,this,"Y"),!1}};e(this).bind(this.getAttribute("data-event"),t[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t,i,s,n,a,o,r,h,l,u,d,c,p,f,m,g,v,y,b,_,x,w,k,T,D,S,M,C,N,A,P,I,H,z,F,E,O,j,W,L=new Date,R=this._daylightSavingAdjust(new Date(L.getFullYear(),L.getMonth(),L.getDate())),Y=this._get(e,"isRTL"),B=this._get(e,"showButtonPanel"),J=this._get(e,"hideIfNoPrevNext"),q=this._get(e,"navigationAsDateFormat"),K=this._getNumberOfMonths(e),V=this._get(e,"showCurrentAtPos"),U=this._get(e,"stepMonths"),Q=1!==K[0]||1!==K[1],G=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),X=this._getMinMaxDate(e,"min"),$=this._getMinMaxDate(e,"max"),Z=e.drawMonth-V,et=e.drawYear;if(0>Z&&(Z+=12,et--),$)for(t=this._daylightSavingAdjust(new Date($.getFullYear(),$.getMonth()-K[0]*K[1]+1,$.getDate())),t=X&&X>t?X:t;this._daylightSavingAdjust(new Date(et,Z,1))>t;)Z--,0>Z&&(Z=11,et--);for(e.drawMonth=Z,e.drawYear=et,i=this._get(e,"prevText"),i=q?this.formatDate(i,this._daylightSavingAdjust(new Date(et,Z-U,1)),this._getFormatConfig(e)):i,s=this._canAdjustMonth(e,-1,et,Z)?"<a class='ui-datepicker-prev ui-corner-all' data-handler='prev' data-event='click' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>":J?"":"<a class='ui-datepicker-prev ui-corner-all ui-state-disabled' title='"+i+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"e":"w")+"'>"+i+"</span></a>",n=this._get(e,"nextText"),n=q?this.formatDate(n,this._daylightSavingAdjust(new Date(et,Z+U,1)),this._getFormatConfig(e)):n,a=this._canAdjustMonth(e,1,et,Z)?"<a class='ui-datepicker-next ui-corner-all' data-handler='next' data-event='click' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>":J?"":"<a class='ui-datepicker-next ui-corner-all ui-state-disabled' title='"+n+"'><span class='ui-icon ui-icon-circle-triangle-"+(Y?"w":"e")+"'>"+n+"</span></a>",o=this._get(e,"currentText"),r=this._get(e,"gotoCurrent")&&e.currentDay?G:R,o=q?this.formatDate(o,r,this._getFormatConfig(e)):o,h=e.inline?"":"<button type='button' class='ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all' data-handler='hide' data-event='click'>"+this._get(e,"closeText")+"</button>",l=B?"<div class='ui-datepicker-buttonpane ui-widget-content'>"+(Y?h:"")+(this._isInRange(e,r)?"<button type='button' class='ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all' data-handler='today' data-event='click'>"+o+"</button>":"")+(Y?"":h)+"</div>":"",u=parseInt(this._get(e,"firstDay"),10),u=isNaN(u)?0:u,d=this._get(e,"showWeek"),c=this._get(e,"dayNames"),p=this._get(e,"dayNamesMin"),f=this._get(e,"monthNames"),m=this._get(e,"monthNamesShort"),g=this._get(e,"beforeShowDay"),v=this._get(e,"showOtherMonths"),y=this._get(e,"selectOtherMonths"),b=this._getDefaultDate(e),_="",w=0;K[0]>w;w++){for(k="",this.maxRows=4,T=0;K[1]>T;T++){if(D=this._daylightSavingAdjust(new Date(et,Z,e.selectedDay)),S=" ui-corner-all",M="",Q){if(M+="<div class='ui-datepicker-group",K[1]>1)switch(T){case 0:M+=" ui-datepicker-group-first",S=" ui-corner-"+(Y?"right":"left");break;case K[1]-1:M+=" ui-datepicker-group-last",S=" ui-corner-"+(Y?"left":"right");break;default:M+=" ui-datepicker-group-middle",S=""}M+="'>"}for(M+="<div class='ui-datepicker-header ui-widget-header ui-helper-clearfix"+S+"'>"+(/all|left/.test(S)&&0===w?Y?a:s:"")+(/all|right/.test(S)&&0===w?Y?s:a:"")+this._generateMonthYearHeader(e,Z,et,X,$,w>0||T>0,f,m)+"</div><table class='ui-datepicker-calendar'><thead>"+"<tr>",C=d?"<th class='ui-datepicker-week-col'>"+this._get(e,"weekHeader")+"</th>":"",x=0;7>x;x++)N=(x+u)%7,C+="<th scope='col'"+((x+u+6)%7>=5?" class='ui-datepicker-week-end'":"")+">"+"<span title='"+c[N]+"'>"+p[N]+"</span></th>";for(M+=C+"</tr></thead><tbody>",A=this._getDaysInMonth(et,Z),et===e.selectedYear&&Z===e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,A)),P=(this._getFirstDayOfMonth(et,Z)-u+7)%7,I=Math.ceil((P+A)/7),H=Q?this.maxRows>I?this.maxRows:I:I,this.maxRows=H,z=this._daylightSavingAdjust(new Date(et,Z,1-P)),F=0;H>F;F++){for(M+="<tr>",E=d?"<td class='ui-datepicker-week-col'>"+this._get(e,"calculateWeek")(z)+"</td>":"",x=0;7>x;x++)O=g?g.apply(e.input?e.input[0]:null,[z]):[!0,""],j=z.getMonth()!==Z,W=j&&!y||!O[0]||X&&X>z||$&&z>$,E+="<td class='"+((x+u+6)%7>=5?" ui-datepicker-week-end":"")+(j?" ui-datepicker-other-month":"")+(z.getTime()===D.getTime()&&Z===e.selectedMonth&&e._keyEvent||b.getTime()===z.getTime()&&b.getTime()===D.getTime()?" "+this._dayOverClass:"")+(W?" "+this._unselectableClass+" ui-state-disabled":"")+(j&&!v?"":" "+O[1]+(z.getTime()===G.getTime()?" "+this._currentClass:"")+(z.getTime()===R.getTime()?" ui-datepicker-today":""))+"'"+(j&&!v||!O[2]?"":" title='"+O[2].replace(/'/g,"'")+"'")+(W?"":" data-handler='selectDay' data-event='click' data-month='"+z.getMonth()+"' data-year='"+z.getFullYear()+"'")+">"+(j&&!v?" ":W?"<span class='ui-state-default'>"+z.getDate()+"</span>":"<a class='ui-state-default"+(z.getTime()===R.getTime()?" ui-state-highlight":"")+(z.getTime()===G.getTime()?" ui-state-active":"")+(j?" ui-priority-secondary":"")+"' href='#'>"+z.getDate()+"</a>")+"</td>",z.setDate(z.getDate()+1),z=this._daylightSavingAdjust(z);M+=E+"</tr>"}Z++,Z>11&&(Z=0,et++),M+="</tbody></table>"+(Q?"</div>"+(K[0]>0&&T===K[1]-1?"<div class='ui-datepicker-row-break'></div>":""):""),k+=M}_+=k}return _+=l,e._keyEvent=!1,_},_generateMonthYearHeader:function(e,t,i,s,n,a,o,r){var h,l,u,d,c,p,f,m,g=this._get(e,"changeMonth"),v=this._get(e,"changeYear"),y=this._get(e,"showMonthAfterYear"),b="<div class='ui-datepicker-title'>",_="";if(a||!g)_+="<span class='ui-datepicker-month'>"+o[t]+"</span>";else{for(h=s&&s.getFullYear()===i,l=n&&n.getFullYear()===i,_+="<select class='ui-datepicker-month' data-handler='selectMonth' data-event='change'>",u=0;12>u;u++)(!h||u>=s.getMonth())&&(!l||n.getMonth()>=u)&&(_+="<option value='"+u+"'"+(u===t?" selected='selected'":"")+">"+r[u]+"</option>");_+="</select>"}if(y||(b+=_+(!a&&g&&v?"":" ")),!e.yearshtml)if(e.yearshtml="",a||!v)b+="<span class='ui-datepicker-year'>"+i+"</span>";else{for(d=this._get(e,"yearRange").split(":"),c=(new Date).getFullYear(),p=function(e){var t=e.match(/c[+\-].*/)?i+parseInt(e.substring(1),10):e.match(/[+\-].*/)?c+parseInt(e,10):parseInt(e,10);return isNaN(t)?c:t},f=p(d[0]),m=Math.max(f,p(d[1]||"")),f=s?Math.max(f,s.getFullYear()):f,m=n?Math.min(m,n.getFullYear()):m,e.yearshtml+="<select class='ui-datepicker-year' data-handler='selectYear' data-event='change'>";m>=f;f++)e.yearshtml+="<option value='"+f+"'"+(f===i?" selected='selected'":"")+">"+f+"</option>";e.yearshtml+="</select>",b+=e.yearshtml,e.yearshtml=null}return b+=this._get(e,"yearSuffix"),y&&(b+=(!a&&g&&v?"":" ")+_),b+="</div>"},_adjustInstDate:function(e,t,i){var s=e.drawYear+("Y"===i?t:0),n=e.drawMonth+("M"===i?t:0),a=Math.min(e.selectedDay,this._getDaysInMonth(s,n))+("D"===i?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(s,n,a)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),("M"===i||"Y"===i)&&this._notifyChange(e)},_restrictMinMax:function(e,t){var i=this._getMinMaxDate(e,"min"),s=this._getMinMaxDate(e,"max"),n=i&&i>t?i:t;return s&&n>s?s:n},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return null==t?[1,1]:"number"==typeof t?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return new Date(e,t,1).getDay()},_canAdjustMonth:function(e,t,i,s){var n=this._getNumberOfMonths(e),a=this._daylightSavingAdjust(new Date(i,s+(0>t?t:n[0]*n[1]),1));return 0>t&&a.setDate(this._getDaysInMonth(a.getFullYear(),a.getMonth())),this._isInRange(e,a)},_isInRange:function(e,t){var i,s,n=this._getMinMaxDate(e,"min"),a=this._getMinMaxDate(e,"max"),o=null,r=null,h=this._get(e,"yearRange");return h&&(i=h.split(":"),s=(new Date).getFullYear(),o=parseInt(i[0],10),r=parseInt(i[1],10),i[0].match(/[+\-].*/)&&(o+=s),i[1].match(/[+\-].*/)&&(r+=s)),(!n||t.getTime()>=n.getTime())&&(!a||t.getTime()<=a.getTime())&&(!o||t.getFullYear()>=o)&&(!r||r>=t.getFullYear())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t="string"!=typeof t?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,i,s){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var n=t?"object"==typeof t?t:this._daylightSavingAdjust(new Date(s,i,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),n,this._getFormatConfig(e))}}),e.fn.datepicker=function(t){if(!this.length)return this;e.datepicker.initialized||(e(document).mousedown(e.datepicker._checkExternalClick),e.datepicker.initialized=!0),0===e("#"+e.datepicker._mainDivId).length&&e("body").append(e.datepicker.dpDiv);var i=Array.prototype.slice.call(arguments,1);return"string"!=typeof t||"isDisabled"!==t&&"getDate"!==t&&"widget"!==t?"option"===t&&2===arguments.length&&"string"==typeof arguments[1]?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i)):this.each(function(){"string"==typeof t?e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this].concat(i)):e.datepicker._attachDatepicker(this,t)}):e.datepicker["_"+t+"Datepicker"].apply(e.datepicker,[this[0]].concat(i))},e.datepicker=new n,e.datepicker.initialized=!1,e.datepicker.uuid=(new Date).getTime(),e.datepicker.version="1.11.4",e.datepicker,e.widget("ui.draggable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1,drag:null,start:null,stop:null},_create:function(){"original"===this.options.helper&&this._setPositionRelative(),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._setHandleClassName(),this._mouseInit()},_setOption:function(e,t){this._super(e,t),"handle"===e&&(this._removeHandleClassName(),this._setHandleClassName())},_destroy:function(){return(this.helper||this.element).is(".ui-draggable-dragging")?(this.destroyOnClear=!0,void 0):(this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._removeHandleClassName(),this._mouseDestroy(),void 0)},_mouseCapture:function(t){var i=this.options;return this._blurActiveElement(t),this.helper||i.disabled||e(t.target).closest(".ui-resizable-handle").length>0?!1:(this.handle=this._getHandle(t),this.handle?(this._blockFrames(i.iframeFix===!0?"iframe":i.iframeFix),!0):!1)},_blockFrames:function(t){this.iframeBlocks=this.document.find(t).map(function(){var t=e(this);return e("<div>").css("position","absolute").appendTo(t.parent()).outerWidth(t.outerWidth()).outerHeight(t.outerHeight()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_blurActiveElement:function(t){var i=this.document[0];if(this.handleElement.is(t.target))try{i.activeElement&&"body"!==i.activeElement.nodeName.toLowerCase()&&e(i.activeElement).blur()}catch(s){}},_mouseStart:function(t){var i=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(!0),this.offsetParent=this.helper.offsetParent(),this.hasFixedAncestor=this.helper.parents().filter(function(){return"fixed"===e(this).css("position")}).length>0,this.positionAbs=this.element.offset(),this._refreshOffsets(t),this.originalPosition=this.position=this._generatePosition(t,!1),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._normalizeRightBottom(),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_refreshOffsets:function(e){this.offset={top:this.positionAbs.top-this.margins.top,left:this.positionAbs.left-this.margins.left,scroll:!1,parent:this._getParentOffset(),relative:this._getRelativeOffset()},this.offset.click={left:e.pageX-this.offset.left,top:e.pageY-this.offset.top}},_mouseDrag:function(t,i){if(this.hasFixedAncestor&&(this.offset.parent=this._getParentOffset()),this.position=this._generatePosition(t,!0),this.positionAbs=this._convertPositionTo("absolute"),!i){var s=this._uiHash();if(this._trigger("drag",t,s)===!1)return this._mouseUp({}),!1;this.position=s.position}return this.helper[0].style.left=this.position.left+"px",this.helper[0].style.top=this.position.top+"px",e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var i=this,s=!1;return e.ui.ddmanager&&!this.options.dropBehaviour&&(s=e.ui.ddmanager.drop(this,t)),this.dropped&&(s=this.dropped,this.dropped=!1),"invalid"===this.options.revert&&!s||"valid"===this.options.revert&&s||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,s)?e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){i._trigger("stop",t)!==!1&&i._clear()}):this._trigger("stop",t)!==!1&&this._clear(),!1},_mouseUp:function(t){return this._unblockFrames(),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),this.handleElement.is(t.target)&&this.element.focus(),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){return this.options.handle?!!e(t.target).closest(this.element.find(this.options.handle)).length:!0},_setHandleClassName:function(){this.handleElement=this.options.handle?this.element.find(this.options.handle):this.element,this.handleElement.addClass("ui-draggable-handle")},_removeHandleClassName:function(){this.handleElement.removeClass("ui-draggable-handle")},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper),n=s?e(i.helper.apply(this.element[0],[t])):"clone"===i.helper?this.element.clone().removeAttr("id"):this.element;return n.parents("body").length||n.appendTo("parent"===i.appendTo?this.element[0].parentNode:i.appendTo),s&&n[0]===this.element[0]&&this._setPositionRelative(),n[0]===this.element[0]||/(fixed|absolute)/.test(n.css("position"))||n.css("position","absolute"),n},_setPositionRelative:function(){/^(?:r|a|f)/.test(this.element.css("position"))||(this.element[0].style.position="relative")},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_isRootNode:function(e){return/(html|body)/i.test(e.tagName)||e===this.document[0]},_getParentOffset:function(){var t=this.offsetParent.offset(),i=this.document[0];return"absolute"===this.cssPosition&&this.scrollParent[0]!==i&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),this._isRootNode(this.offsetParent[0])&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"!==this.cssPosition)return{top:0,left:0};var e=this.element.position(),t=this._isRootNode(this.scrollParent[0]);return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+(t?0:this.scrollParent.scrollTop()),left:e.left-(parseInt(this.helper.css("left"),10)||0)+(t?0:this.scrollParent.scrollLeft())}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options,a=this.document[0];return this.relativeContainer=null,n.containment?"window"===n.containment?(this.containment=[e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,e(window).scrollLeft()+e(window).width()-this.helperProportions.width-this.margins.left,e(window).scrollTop()+(e(window).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):"document"===n.containment?(this.containment=[0,0,e(a).width()-this.helperProportions.width-this.margins.left,(e(a).height()||a.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top],void 0):n.containment.constructor===Array?(this.containment=n.containment,void 0):("parent"===n.containment&&(n.containment=this.helper[0].parentNode),i=e(n.containment),s=i[0],s&&(t=/(scroll|auto)/.test(i.css("overflow")),this.containment=[(parseInt(i.css("borderLeftWidth"),10)||0)+(parseInt(i.css("paddingLeft"),10)||0),(parseInt(i.css("borderTopWidth"),10)||0)+(parseInt(i.css("paddingTop"),10)||0),(t?Math.max(s.scrollWidth,s.offsetWidth):s.offsetWidth)-(parseInt(i.css("borderRightWidth"),10)||0)-(parseInt(i.css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(t?Math.max(s.scrollHeight,s.offsetHeight):s.offsetHeight)-(parseInt(i.css("borderBottomWidth"),10)||0)-(parseInt(i.css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relativeContainer=i),void 0):(this.containment=null,void 0) +},_convertPositionTo:function(e,t){t||(t=this.position);var i="absolute"===e?1:-1,s=this._isRootNode(this.scrollParent[0]);return{top:t.top+this.offset.relative.top*i+this.offset.parent.top*i-("fixed"===this.cssPosition?-this.offset.scroll.top:s?0:this.offset.scroll.top)*i,left:t.left+this.offset.relative.left*i+this.offset.parent.left*i-("fixed"===this.cssPosition?-this.offset.scroll.left:s?0:this.offset.scroll.left)*i}},_generatePosition:function(e,t){var i,s,n,a,o=this.options,r=this._isRootNode(this.scrollParent[0]),h=e.pageX,l=e.pageY;return r&&this.offset.scroll||(this.offset.scroll={top:this.scrollParent.scrollTop(),left:this.scrollParent.scrollLeft()}),t&&(this.containment&&(this.relativeContainer?(s=this.relativeContainer.offset(),i=[this.containment[0]+s.left,this.containment[1]+s.top,this.containment[2]+s.left,this.containment[3]+s.top]):i=this.containment,e.pageX-this.offset.click.left<i[0]&&(h=i[0]+this.offset.click.left),e.pageY-this.offset.click.top<i[1]&&(l=i[1]+this.offset.click.top),e.pageX-this.offset.click.left>i[2]&&(h=i[2]+this.offset.click.left),e.pageY-this.offset.click.top>i[3]&&(l=i[3]+this.offset.click.top)),o.grid&&(n=o.grid[1]?this.originalPageY+Math.round((l-this.originalPageY)/o.grid[1])*o.grid[1]:this.originalPageY,l=i?n-this.offset.click.top>=i[1]||n-this.offset.click.top>i[3]?n:n-this.offset.click.top>=i[1]?n-o.grid[1]:n+o.grid[1]:n,a=o.grid[0]?this.originalPageX+Math.round((h-this.originalPageX)/o.grid[0])*o.grid[0]:this.originalPageX,h=i?a-this.offset.click.left>=i[0]||a-this.offset.click.left>i[2]?a:a-this.offset.click.left>=i[0]?a-o.grid[0]:a+o.grid[0]:a),"y"===o.axis&&(h=this.originalPageX),"x"===o.axis&&(l=this.originalPageY)),{top:l-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.offset.scroll.top:r?0:this.offset.scroll.top),left:h-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.offset.scroll.left:r?0:this.offset.scroll.left)}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]===this.element[0]||this.cancelHelperRemoval||this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1,this.destroyOnClear&&this.destroy()},_normalizeRightBottom:function(){"y"!==this.options.axis&&"auto"!==this.helper.css("right")&&(this.helper.width(this.helper.width()),this.helper.css("right","auto")),"x"!==this.options.axis&&"auto"!==this.helper.css("bottom")&&(this.helper.height(this.helper.height()),this.helper.css("bottom","auto"))},_trigger:function(t,i,s){return s=s||this._uiHash(),e.ui.plugin.call(this,t,[i,s,this],!0),/^(drag|start|stop)/.test(t)&&(this.positionAbs=this._convertPositionTo("absolute"),s.offset=this.positionAbs),e.Widget.prototype._trigger.call(this,t,i,s)},plugins:{},_uiHash:function(){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,i,s){var n=e.extend({},i,{item:s.element});s.sortables=[],e(s.options.connectToSortable).each(function(){var i=e(this).sortable("instance");i&&!i.options.disabled&&(s.sortables.push(i),i.refreshPositions(),i._trigger("activate",t,n))})},stop:function(t,i,s){var n=e.extend({},i,{item:s.element});s.cancelHelperRemoval=!1,e.each(s.sortables,function(){var e=this;e.isOver?(e.isOver=0,s.cancelHelperRemoval=!0,e.cancelHelperRemoval=!1,e._storedCSS={position:e.placeholder.css("position"),top:e.placeholder.css("top"),left:e.placeholder.css("left")},e._mouseStop(t),e.options.helper=e.options._helper):(e.cancelHelperRemoval=!0,e._trigger("deactivate",t,n))})},drag:function(t,i,s){e.each(s.sortables,function(){var n=!1,a=this;a.positionAbs=s.positionAbs,a.helperProportions=s.helperProportions,a.offset.click=s.offset.click,a._intersectsWith(a.containerCache)&&(n=!0,e.each(s.sortables,function(){return this.positionAbs=s.positionAbs,this.helperProportions=s.helperProportions,this.offset.click=s.offset.click,this!==a&&this._intersectsWith(this.containerCache)&&e.contains(a.element[0],this.element[0])&&(n=!1),n})),n?(a.isOver||(a.isOver=1,s._parent=i.helper.parent(),a.currentItem=i.helper.appendTo(a.element).data("ui-sortable-item",!0),a.options._helper=a.options.helper,a.options.helper=function(){return i.helper[0]},t.target=a.currentItem[0],a._mouseCapture(t,!0),a._mouseStart(t,!0,!0),a.offset.click.top=s.offset.click.top,a.offset.click.left=s.offset.click.left,a.offset.parent.left-=s.offset.parent.left-a.offset.parent.left,a.offset.parent.top-=s.offset.parent.top-a.offset.parent.top,s._trigger("toSortable",t),s.dropped=a.element,e.each(s.sortables,function(){this.refreshPositions()}),s.currentItem=s.element,a.fromOutside=s),a.currentItem&&(a._mouseDrag(t),i.position=a.position)):a.isOver&&(a.isOver=0,a.cancelHelperRemoval=!0,a.options._revert=a.options.revert,a.options.revert=!1,a._trigger("out",t,a._uiHash(a)),a._mouseStop(t,!0),a.options.revert=a.options._revert,a.options.helper=a.options._helper,a.placeholder&&a.placeholder.remove(),i.helper.appendTo(s._parent),s._refreshOffsets(t),i.position=s._generatePosition(t,!0),s._trigger("fromSortable",t),s.dropped=!1,e.each(s.sortables,function(){this.refreshPositions()}))})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,i,s){var n=e("body"),a=s.options;n.css("cursor")&&(a._cursor=n.css("cursor")),n.css("cursor",a.cursor)},stop:function(t,i,s){var n=s.options;n._cursor&&e("body").css("cursor",n._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("opacity")&&(a._opacity=n.css("opacity")),n.css("opacity",a.opacity)},stop:function(t,i,s){var n=s.options;n._opacity&&e(i.helper).css("opacity",n._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(e,t,i){i.scrollParentNotHidden||(i.scrollParentNotHidden=i.helper.scrollParent(!1)),i.scrollParentNotHidden[0]!==i.document[0]&&"HTML"!==i.scrollParentNotHidden[0].tagName&&(i.overflowOffset=i.scrollParentNotHidden.offset())},drag:function(t,i,s){var n=s.options,a=!1,o=s.scrollParentNotHidden[0],r=s.document[0];o!==r&&"HTML"!==o.tagName?(n.axis&&"x"===n.axis||(s.overflowOffset.top+o.offsetHeight-t.pageY<n.scrollSensitivity?o.scrollTop=a=o.scrollTop+n.scrollSpeed:t.pageY-s.overflowOffset.top<n.scrollSensitivity&&(o.scrollTop=a=o.scrollTop-n.scrollSpeed)),n.axis&&"y"===n.axis||(s.overflowOffset.left+o.offsetWidth-t.pageX<n.scrollSensitivity?o.scrollLeft=a=o.scrollLeft+n.scrollSpeed:t.pageX-s.overflowOffset.left<n.scrollSensitivity&&(o.scrollLeft=a=o.scrollLeft-n.scrollSpeed))):(n.axis&&"x"===n.axis||(t.pageY-e(r).scrollTop()<n.scrollSensitivity?a=e(r).scrollTop(e(r).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(r).scrollTop())<n.scrollSensitivity&&(a=e(r).scrollTop(e(r).scrollTop()+n.scrollSpeed))),n.axis&&"y"===n.axis||(t.pageX-e(r).scrollLeft()<n.scrollSensitivity?a=e(r).scrollLeft(e(r).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(r).scrollLeft())<n.scrollSensitivity&&(a=e(r).scrollLeft(e(r).scrollLeft()+n.scrollSpeed)))),a!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(s,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,i,s){var n=s.options;s.snapElements=[],e(n.snap.constructor!==String?n.snap.items||":data(ui-draggable)":n.snap).each(function(){var t=e(this),i=t.offset();this!==s.element[0]&&s.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:i.top,left:i.left})})},drag:function(t,i,s){var n,a,o,r,h,l,u,d,c,p,f=s.options,m=f.snapTolerance,g=i.offset.left,v=g+s.helperProportions.width,y=i.offset.top,b=y+s.helperProportions.height;for(c=s.snapElements.length-1;c>=0;c--)h=s.snapElements[c].left-s.margins.left,l=h+s.snapElements[c].width,u=s.snapElements[c].top-s.margins.top,d=u+s.snapElements[c].height,h-m>v||g>l+m||u-m>b||y>d+m||!e.contains(s.snapElements[c].item.ownerDocument,s.snapElements[c].item)?(s.snapElements[c].snapping&&s.options.snap.release&&s.options.snap.release.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=!1):("inner"!==f.snapMode&&(n=m>=Math.abs(u-b),a=m>=Math.abs(d-y),o=m>=Math.abs(h-v),r=m>=Math.abs(l-g),n&&(i.position.top=s._convertPositionTo("relative",{top:u-s.helperProportions.height,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h-s.helperProportions.width}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l}).left)),p=n||a||o||r,"outer"!==f.snapMode&&(n=m>=Math.abs(u-y),a=m>=Math.abs(d-b),o=m>=Math.abs(h-g),r=m>=Math.abs(l-v),n&&(i.position.top=s._convertPositionTo("relative",{top:u,left:0}).top),a&&(i.position.top=s._convertPositionTo("relative",{top:d-s.helperProportions.height,left:0}).top),o&&(i.position.left=s._convertPositionTo("relative",{top:0,left:h}).left),r&&(i.position.left=s._convertPositionTo("relative",{top:0,left:l-s.helperProportions.width}).left)),!s.snapElements[c].snapping&&(n||a||o||r||p)&&s.options.snap.snap&&s.options.snap.snap.call(s.element,t,e.extend(s._uiHash(),{snapItem:s.snapElements[c].item})),s.snapElements[c].snapping=n||a||o||r||p)}}),e.ui.plugin.add("draggable","stack",{start:function(t,i,s){var n,a=s.options,o=e.makeArray(e(a.stack)).sort(function(t,i){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(i).css("zIndex"),10)||0)});o.length&&(n=parseInt(e(o[0]).css("zIndex"),10)||0,e(o).each(function(t){e(this).css("zIndex",n+t)}),this.css("zIndex",n+o.length))}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,i,s){var n=e(i.helper),a=s.options;n.css("zIndex")&&(a._zIndex=n.css("zIndex")),n.css("zIndex",a.zIndex)},stop:function(t,i,s){var n=s.options;n._zIndex&&e(i.helper).css("zIndex",n._zIndex)}}),e.ui.draggable,e.widget("ui.resizable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(e){return parseInt(e,10)||0},_isNumber:function(e){return!isNaN(parseInt(e,10))},_hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},_create:function(){var t,i,s,n,a,o=this,r=this.options;if(this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!r.aspectRatio,aspectRatio:r.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:r.helper||r.ghost||r.animate?r.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(e("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=r.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=e(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),t=this.handles.split(","),this.handles={},i=0;t.length>i;i++)s=e.trim(t[i]),a="ui-resizable-"+s,n=e("<div class='ui-resizable-handle "+a+"'></div>"),n.css({zIndex:r.zIndex}),"se"===s&&n.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(n);this._renderAxis=function(t){var i,s,n,a;t=t||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=e(this.handles[i]),this._on(this.handles[i],{mousedown:o._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=e(this.handles[i],this.element),a=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),t.css(n,a),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.mouseover(function(){o.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),o.axis=n&&n[1]?n[1]:"se")}),r.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){r.disabled||(e(this).removeClass("ui-resizable-autohide"),o._handles.show())}).mouseleave(function(){r.disabled||o.resizing||(e(this).addClass("ui-resizable-autohide"),o._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t,i=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),t=this.element,this.originalElement.css({position:t.css("position"),width:t.outerWidth(),height:t.outerHeight(),top:t.css("top"),left:t.css("left")}).insertAfter(t),t.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_mouseCapture:function(t){var i,s,n=!1;for(i in this.handles)s=e(this.handles[i])[0],(s===t.target||e.contains(s,t.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var i,s,n,a=this.options,o=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),a.containment&&(i+=e(a.containment).scrollLeft()||0,s+=e(a.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:o.width(),height:o.height()},this.originalSize=this._helper?{width:o.outerWidth(),height:o.outerHeight()}:{width:o.width(),height:o.height()},this.sizeDiff={width:o.outerWidth()-o.width(),height:o.outerHeight()-o.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof a.aspectRatio?a.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=e(".ui-resizable-"+this.axis).css("cursor"),e("body").css("cursor","auto"===n?this.axis+"-resize":n),o.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var i,s,n=this.originalMousePosition,a=this.axis,o=t.pageX-n.left||0,r=t.pageY-n.top||0,h=this._change[a];return this._updatePrevProperties(),h?(i=h.apply(this,[t,o,r]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(i=this._updateRatio(i,t)),i=this._respectSize(i,t),this._updateCache(i),this._propagate("resize",t),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),e.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(t){this.resizing=!1;var i,s,n,a,o,r,h,l=this.options,u=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:u.sizeDiff.height,a=s?0:u.sizeDiff.width,o={width:u.helper.width()-a,height:u.helper.height()-n},r=parseInt(u.element.css("left"),10)+(u.position.left-u.originalPosition.left)||null,h=parseInt(u.element.css("top"),10)+(u.position.top-u.originalPosition.top)||null,l.animate||this.element.css(e.extend(o,{top:h,left:r})),u.helper.height(u.size.height),u.helper.width(u.size.width),this._helper&&!l.animate&&this._proportionallyResize()),e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var e={};return this.position.top!==this.prevPosition.top&&(e.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(e.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(e.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(e.height=this.size.height+"px"),this.helper.css(e),e},_updateVirtualBoundaries:function(e){var t,i,s,n,a,o=this.options;a={minWidth:this._isNumber(o.minWidth)?o.minWidth:0,maxWidth:this._isNumber(o.maxWidth)?o.maxWidth:1/0,minHeight:this._isNumber(o.minHeight)?o.minHeight:0,maxHeight:this._isNumber(o.maxHeight)?o.maxHeight:1/0},(this._aspectRatio||e)&&(t=a.minHeight*this.aspectRatio,s=a.minWidth/this.aspectRatio,i=a.maxHeight*this.aspectRatio,n=a.maxWidth/this.aspectRatio,t>a.minWidth&&(a.minWidth=t),s>a.minHeight&&(a.minHeight=s),a.maxWidth>i&&(a.maxWidth=i),a.maxHeight>n&&(a.maxHeight=n)),this._vBoundaries=a},_updateCache:function(e){this.offset=this.helper.offset(),this._isNumber(e.left)&&(this.position.left=e.left),this._isNumber(e.top)&&(this.position.top=e.top),this._isNumber(e.height)&&(this.size.height=e.height),this._isNumber(e.width)&&(this.size.width=e.width)},_updateRatio:function(e){var t=this.position,i=this.size,s=this.axis;return this._isNumber(e.height)?e.width=e.height*this.aspectRatio:this._isNumber(e.width)&&(e.height=e.width/this.aspectRatio),"sw"===s&&(e.left=t.left+(i.width-e.width),e.top=null),"nw"===s&&(e.top=t.top+(i.height-e.height),e.left=t.left+(i.width-e.width)),e},_respectSize:function(e){var t=this._vBoundaries,i=this.axis,s=this._isNumber(e.width)&&t.maxWidth&&t.maxWidth<e.width,n=this._isNumber(e.height)&&t.maxHeight&&t.maxHeight<e.height,a=this._isNumber(e.width)&&t.minWidth&&t.minWidth>e.width,o=this._isNumber(e.height)&&t.minHeight&&t.minHeight>e.height,r=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,l=/sw|nw|w/.test(i),u=/nw|ne|n/.test(i);return a&&(e.width=t.minWidth),o&&(e.height=t.minHeight),s&&(e.width=t.maxWidth),n&&(e.height=t.maxHeight),a&&l&&(e.left=r-t.minWidth),s&&l&&(e.left=r-t.maxWidth),o&&u&&(e.top=h-t.minHeight),n&&u&&(e.top=h-t.maxHeight),e.width||e.height||e.left||!e.top?e.width||e.height||e.top||!e.left||(e.left=null):e.top=null,e},_getPaddingPlusBorderDimensions:function(e){for(var t=0,i=[],s=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],n=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];4>t;t++)i[t]=parseInt(s[t],10)||0,i[t]+=parseInt(n[t],10)||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var e,t=0,i=this.helper||this.element;this._proportionallyResizeElements.length>t;t++)e=this._proportionallyResizeElements[t],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(e)),e.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var t=this.element,i=this.options;this.elementOffset=t.offset(),this._helper?(this.helper=this.helper||e("<div style='overflow:hidden;'></div>"),this.helper.addClass(this._helper).css({width:this.element.outerWidth()-1,height:this.element.outerHeight()-1,position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(e,t){return{width:this.originalSize.width+t}},w:function(e,t){var i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(e,t,i){return{height:this.originalSize.height+i}},se:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},sw:function(t,i,s){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,i,s]))},ne:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,i,s]))},nw:function(t,i,s){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,i,s]))}},_propagate:function(t,i){e.ui.plugin.call(this,t,[i,this.ui()]),"resize"!==t&&this._trigger(t,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","animate",{stop:function(t){var i=e(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,a=n.length&&/textarea/i.test(n[0].nodeName),o=a&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=a?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-o},l=parseInt(i.element.css("left"),10)+(i.position.left-i.originalPosition.left)||null,u=parseInt(i.element.css("top"),10)+(i.position.top-i.originalPosition.top)||null;i.element.animate(e.extend(h,u&&l?{top:u,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseInt(i.element.css("width"),10),height:parseInt(i.element.css("height"),10),top:parseInt(i.element.css("top"),10),left:parseInt(i.element.css("left"),10)};n&&n.length&&e(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(){var t,i,s,n,a,o,r,h=e(this).resizable("instance"),l=h.options,u=h.element,d=l.containment,c=d instanceof e?d.get(0):/parent/.test(d)?u.parent().get(0):d;c&&(h.containerElement=e(c),/document/.test(d)||d===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}):(t=e(c),i=[],e(["Top","Right","Left","Bottom"]).each(function(e,s){i[e]=h._num(t.css("padding"+s))}),h.containerOffset=t.offset(),h.containerPosition=t.position(),h.containerSize={height:t.innerHeight()-i[3],width:t.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,a=h.containerSize.width,o=h._hasScroll(c,"left")?c.scrollWidth:a,r=h._hasScroll(c)?c.scrollHeight:n,h.parentData={element:c,left:s.left,top:s.top,width:o,height:r}))},resize:function(t){var i,s,n,a,o=e(this).resizable("instance"),r=o.options,h=o.containerOffset,l=o.position,u=o._aspectRatio||t.shiftKey,d={top:0,left:0},c=o.containerElement,p=!0;c[0]!==document&&/static/.test(c.css("position"))&&(d=h),l.left<(o._helper?h.left:0)&&(o.size.width=o.size.width+(o._helper?o.position.left-h.left:o.position.left-d.left),u&&(o.size.height=o.size.width/o.aspectRatio,p=!1),o.position.left=r.helper?h.left:0),l.top<(o._helper?h.top:0)&&(o.size.height=o.size.height+(o._helper?o.position.top-h.top:o.position.top),u&&(o.size.width=o.size.height*o.aspectRatio,p=!1),o.position.top=o._helper?h.top:0),n=o.containerElement.get(0)===o.element.parent().get(0),a=/relative|absolute/.test(o.containerElement.css("position")),n&&a?(o.offset.left=o.parentData.left+o.position.left,o.offset.top=o.parentData.top+o.position.top):(o.offset.left=o.element.offset().left,o.offset.top=o.element.offset().top),i=Math.abs(o.sizeDiff.width+(o._helper?o.offset.left-d.left:o.offset.left-h.left)),s=Math.abs(o.sizeDiff.height+(o._helper?o.offset.top-d.top:o.offset.top-h.top)),i+o.size.width>=o.parentData.width&&(o.size.width=o.parentData.width-i,u&&(o.size.height=o.size.width/o.aspectRatio,p=!1)),s+o.size.height>=o.parentData.height&&(o.size.height=o.parentData.height-s,u&&(o.size.width=o.size.height*o.aspectRatio,p=!1)),p||(o.position.left=o.prevPosition.left,o.position.top=o.prevPosition.top,o.size.width=o.prevSize.width,o.size.height=o.prevSize.height)},stop:function(){var t=e(this).resizable("instance"),i=t.options,s=t.containerOffset,n=t.containerPosition,a=t.containerElement,o=e(t.helper),r=o.offset(),h=o.outerWidth()-t.sizeDiff.width,l=o.outerHeight()-t.sizeDiff.height;t._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l}),t._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),e.ui.plugin.add("resizable","alsoResize",{start:function(){var t=e(this).resizable("instance"),i=t.options;e(i.alsoResize).each(function(){var t=e(this);t.data("ui-resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})},resize:function(t,i){var s=e(this).resizable("instance"),n=s.options,a=s.originalSize,o=s.originalPosition,r={height:s.size.height-a.height||0,width:s.size.width-a.width||0,top:s.position.top-o.top||0,left:s.position.left-o.left||0};e(n.alsoResize).each(function(){var t=e(this),s=e(this).data("ui-resizable-alsoresize"),n={},a=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(a,function(e,t){var i=(s[t]||0)+(r[t]||0);i&&i>=0&&(n[t]=i||null)}),t.css(n)})},stop:function(){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","ghost",{start:function(){var t=e(this).resizable("instance"),i=t.options,s=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass("string"==typeof i.ghost?i.ghost:""),t.ghost.appendTo(t.helper)},resize:function(){var t=e(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=e(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(){var t,i=e(this).resizable("instance"),s=i.options,n=i.size,a=i.originalSize,o=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,u=h[1]||1,d=Math.round((n.width-a.width)/l)*l,c=Math.round((n.height-a.height)/u)*u,p=a.width+d,f=a.height+c,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,v=s.minWidth&&s.minWidth>p,y=s.minHeight&&s.minHeight>f;s.grid=h,v&&(p+=l),y&&(f+=u),m&&(p-=l),g&&(f-=u),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=o.top-c):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=o.left-d):((0>=f-u||0>=p-l)&&(t=i._getPaddingPlusBorderDimensions(this)),f-u>0?(i.size.height=f,i.position.top=o.top-c):(f=u-t.height,i.size.height=f,i.position.top=o.top+a.height-f),p-l>0?(i.size.width=p,i.position.left=o.left-d):(p=l-t.width,i.size.width=p,i.position.left=o.left+a.width-p))}}),e.ui.resizable,e.widget("ui.dialog",{version:"1.11.4",options:{appendTo:"body",autoOpen:!0,buttons:[],closeOnEscape:!0,closeText:"Close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:null,maxWidth:null,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var i=e(this).css(t).offset().top;0>i&&e(this).css("top",t.top-i)}},resizable:!0,show:null,title:null,width:300,beforeClose:null,close:null,drag:null,dragStart:null,dragStop:null,focus:null,open:null,resize:null,resizeStart:null,resizeStop:null},sizeRelatedOptions:{buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},resizableRelatedOptions:{maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0},_create:function(){this.originalCss={display:this.element[0].style.display,width:this.element[0].style.width,minHeight:this.element[0].style.minHeight,maxHeight:this.element[0].style.maxHeight,height:this.element[0].style.height},this.originalPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.originalTitle=this.element.attr("title"),this.options.title=this.options.title||this.originalTitle,this._createWrapper(),this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(this.uiDialog),this._createTitlebar(),this._createButtonPane(),this.options.draggable&&e.fn.draggable&&this._makeDraggable(),this.options.resizable&&e.fn.resizable&&this._makeResizable(),this._isOpen=!1,this._trackFocus()},_init:function(){this.options.autoOpen&&this.open()},_appendTo:function(){var t=this.options.appendTo;return t&&(t.jquery||t.nodeType)?e(t):this.document.find(t||"body").eq(0)},_destroy:function(){var e,t=this.originalPosition;this._untrackInstance(),this._destroyOverlay(),this.element.removeUniqueId().removeClass("ui-dialog-content ui-widget-content").css(this.originalCss).detach(),this.uiDialog.stop(!0,!0).remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},disable:e.noop,enable:e.noop,close:function(t){var i,s=this;if(this._isOpen&&this._trigger("beforeClose",t)!==!1){if(this._isOpen=!1,this._focusedElement=null,this._destroyOverlay(),this._untrackInstance(),!this.opener.filter(":focusable").focus().length)try{i=this.document[0].activeElement,i&&"body"!==i.nodeName.toLowerCase()&&e(i).blur()}catch(n){}this._hide(this.uiDialog,this.options.hide,function(){s._trigger("close",t)})}},isOpen:function(){return this._isOpen},moveToTop:function(){this._moveToTop()},_moveToTop:function(t,i){var s=!1,n=this.uiDialog.siblings(".ui-front:visible").map(function(){return+e(this).css("z-index")}).get(),a=Math.max.apply(null,n);return a>=+this.uiDialog.css("z-index")&&(this.uiDialog.css("z-index",a+1),s=!0),s&&!i&&this._trigger("focus",t),s},open:function(){var t=this;return this._isOpen?(this._moveToTop()&&this._focusTabbable(),void 0):(this._isOpen=!0,this.opener=e(this.document[0].activeElement),this._size(),this._position(),this._createOverlay(),this._moveToTop(null,!0),this.overlay&&this.overlay.css("z-index",this.uiDialog.css("z-index")-1),this._show(this.uiDialog,this.options.show,function(){t._focusTabbable(),t._trigger("focus")}),this._makeFocusTarget(),this._trigger("open"),void 0)},_focusTabbable:function(){var e=this._focusedElement;e||(e=this.element.find("[autofocus]")),e.length||(e=this.element.find(":tabbable")),e.length||(e=this.uiDialogButtonPane.find(":tabbable")),e.length||(e=this.uiDialogTitlebarClose.filter(":tabbable")),e.length||(e=this.uiDialog),e.eq(0).focus()},_keepFocus:function(t){function i(){var t=this.document[0].activeElement,i=this.uiDialog[0]===t||e.contains(this.uiDialog[0],t);i||this._focusTabbable()}t.preventDefault(),i.call(this),this._delay(i)},_createWrapper:function(){this.uiDialog=e("<div>").addClass("ui-dialog ui-widget ui-widget-content ui-corner-all ui-front "+this.options.dialogClass).hide().attr({tabIndex:-1,role:"dialog"}).appendTo(this._appendTo()),this._on(this.uiDialog,{keydown:function(t){if(this.options.closeOnEscape&&!t.isDefaultPrevented()&&t.keyCode&&t.keyCode===e.ui.keyCode.ESCAPE)return t.preventDefault(),this.close(t),void 0; +if(t.keyCode===e.ui.keyCode.TAB&&!t.isDefaultPrevented()){var i=this.uiDialog.find(":tabbable"),s=i.filter(":first"),n=i.filter(":last");t.target!==n[0]&&t.target!==this.uiDialog[0]||t.shiftKey?t.target!==s[0]&&t.target!==this.uiDialog[0]||!t.shiftKey||(this._delay(function(){n.focus()}),t.preventDefault()):(this._delay(function(){s.focus()}),t.preventDefault())}},mousedown:function(e){this._moveToTop(e)&&this._focusTabbable()}}),this.element.find("[aria-describedby]").length||this.uiDialog.attr({"aria-describedby":this.element.uniqueId().attr("id")})},_createTitlebar:function(){var t;this.uiDialogTitlebar=e("<div>").addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(this.uiDialog),this._on(this.uiDialogTitlebar,{mousedown:function(t){e(t.target).closest(".ui-dialog-titlebar-close")||this.uiDialog.focus()}}),this.uiDialogTitlebarClose=e("<button type='button'></button>").button({label:this.options.closeText,icons:{primary:"ui-icon-closethick"},text:!1}).addClass("ui-dialog-titlebar-close").appendTo(this.uiDialogTitlebar),this._on(this.uiDialogTitlebarClose,{click:function(e){e.preventDefault(),this.close(e)}}),t=e("<span>").uniqueId().addClass("ui-dialog-title").prependTo(this.uiDialogTitlebar),this._title(t),this.uiDialog.attr({"aria-labelledby":t.attr("id")})},_title:function(e){this.options.title||e.html(" "),e.text(this.options.title)},_createButtonPane:function(){this.uiDialogButtonPane=e("<div>").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),this.uiButtonSet=e("<div>").addClass("ui-dialog-buttonset").appendTo(this.uiDialogButtonPane),this._createButtons()},_createButtons:function(){var t=this,i=this.options.buttons;return this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),e.isEmptyObject(i)||e.isArray(i)&&!i.length?(this.uiDialog.removeClass("ui-dialog-buttons"),void 0):(e.each(i,function(i,s){var n,a;s=e.isFunction(s)?{click:s,text:i}:s,s=e.extend({type:"button"},s),n=s.click,s.click=function(){n.apply(t.element[0],arguments)},a={icons:s.icons,text:s.showText},delete s.icons,delete s.showText,e("<button></button>",s).button(a).appendTo(t.uiButtonSet)}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog),void 0)},_makeDraggable:function(){function t(e){return{position:e.position,offset:e.offset}}var i=this,s=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(s,n){e(this).addClass("ui-dialog-dragging"),i._blockFrames(),i._trigger("dragStart",s,t(n))},drag:function(e,s){i._trigger("drag",e,t(s))},stop:function(n,a){var o=a.offset.left-i.document.scrollLeft(),r=a.offset.top-i.document.scrollTop();s.position={my:"left top",at:"left"+(o>=0?"+":"")+o+" "+"top"+(r>=0?"+":"")+r,of:i.window},e(this).removeClass("ui-dialog-dragging"),i._unblockFrames(),i._trigger("dragStop",n,t(a))}})},_makeResizable:function(){function t(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}var i=this,s=this.options,n=s.resizable,a=this.uiDialog.css("position"),o="string"==typeof n?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:s.maxWidth,maxHeight:s.maxHeight,minWidth:s.minWidth,minHeight:this._minHeight(),handles:o,start:function(s,n){e(this).addClass("ui-dialog-resizing"),i._blockFrames(),i._trigger("resizeStart",s,t(n))},resize:function(e,s){i._trigger("resize",e,t(s))},stop:function(n,a){var o=i.uiDialog.offset(),r=o.left-i.document.scrollLeft(),h=o.top-i.document.scrollTop();s.height=i.uiDialog.height(),s.width=i.uiDialog.width(),s.position={my:"left top",at:"left"+(r>=0?"+":"")+r+" "+"top"+(h>=0?"+":"")+h,of:i.window},e(this).removeClass("ui-dialog-resizing"),i._unblockFrames(),i._trigger("resizeStop",n,t(a))}}).css("position",a)},_trackFocus:function(){this._on(this.widget(),{focusin:function(t){this._makeFocusTarget(),this._focusedElement=e(t.target)}})},_makeFocusTarget:function(){this._untrackInstance(),this._trackingInstances().unshift(this)},_untrackInstance:function(){var t=this._trackingInstances(),i=e.inArray(this,t);-1!==i&&t.splice(i,1)},_trackingInstances:function(){var e=this.document.data("ui-dialog-instances");return e||(e=[],this.document.data("ui-dialog-instances",e)),e},_minHeight:function(){var e=this.options;return"auto"===e.height?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(){var e=this.uiDialog.is(":visible");e||this.uiDialog.show(),this.uiDialog.position(this.options.position),e||this.uiDialog.hide()},_setOptions:function(t){var i=this,s=!1,n={};e.each(t,function(e,t){i._setOption(e,t),e in i.sizeRelatedOptions&&(s=!0),e in i.resizableRelatedOptions&&(n[e]=t)}),s&&(this._size(),this._position()),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option",n)},_setOption:function(e,t){var i,s,n=this.uiDialog;"dialogClass"===e&&n.removeClass(this.options.dialogClass).addClass(t),"disabled"!==e&&(this._super(e,t),"appendTo"===e&&this.uiDialog.appendTo(this._appendTo()),"buttons"===e&&this._createButtons(),"closeText"===e&&this.uiDialogTitlebarClose.button({label:""+t}),"draggable"===e&&(i=n.is(":data(ui-draggable)"),i&&!t&&n.draggable("destroy"),!i&&t&&this._makeDraggable()),"position"===e&&this._position(),"resizable"===e&&(s=n.is(":data(ui-resizable)"),s&&!t&&n.resizable("destroy"),s&&"string"==typeof t&&n.resizable("option","handles",t),s||t===!1||this._makeResizable()),"title"===e&&this._title(this.uiDialogTitlebar.find(".ui-dialog-title")))},_size:function(){var e,t,i,s=this.options;this.element.show().css({width:"auto",minHeight:0,maxHeight:"none",height:0}),s.minWidth>s.width&&(s.width=s.minWidth),e=this.uiDialog.css({height:"auto",width:s.width}).outerHeight(),t=Math.max(0,s.minHeight-e),i="number"==typeof s.maxHeight?Math.max(0,s.maxHeight-e):"none","auto"===s.height?this.element.css({minHeight:t,maxHeight:i,height:"auto"}):this.element.height(Math.max(0,s.height-e)),this.uiDialog.is(":data(ui-resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())},_blockFrames:function(){this.iframeBlocks=this.document.find("iframe").map(function(){var t=e(this);return e("<div>").css({position:"absolute",width:t.outerWidth(),height:t.outerHeight()}).appendTo(t.parent()).offset(t.offset())[0]})},_unblockFrames:function(){this.iframeBlocks&&(this.iframeBlocks.remove(),delete this.iframeBlocks)},_allowInteraction:function(t){return e(t.target).closest(".ui-dialog").length?!0:!!e(t.target).closest(".ui-datepicker").length},_createOverlay:function(){if(this.options.modal){var t=!0;this._delay(function(){t=!1}),this.document.data("ui-dialog-overlays")||this._on(this.document,{focusin:function(e){t||this._allowInteraction(e)||(e.preventDefault(),this._trackingInstances()[0]._focusTabbable())}}),this.overlay=e("<div>").addClass("ui-widget-overlay ui-front").appendTo(this._appendTo()),this._on(this.overlay,{mousedown:"_keepFocus"}),this.document.data("ui-dialog-overlays",(this.document.data("ui-dialog-overlays")||0)+1)}},_destroyOverlay:function(){if(this.options.modal&&this.overlay){var e=this.document.data("ui-dialog-overlays")-1;e?this.document.data("ui-dialog-overlays",e):this.document.unbind("focusin").removeData("ui-dialog-overlays"),this.overlay.remove(),this.overlay=null}}}),e.widget("ui.droppable",{version:"1.11.4",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect",activate:null,deactivate:null,drop:null,out:null,over:null},_create:function(){var t,i=this.options,s=i.accept;this.isover=!1,this.isout=!0,this.accept=e.isFunction(s)?s:function(e){return e.is(s)},this.proportions=function(){return arguments.length?(t=arguments[0],void 0):t?t:t={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight}},this._addToManager(i.scope),i.addClasses&&this.element.addClass("ui-droppable")},_addToManager:function(t){e.ui.ddmanager.droppables[t]=e.ui.ddmanager.droppables[t]||[],e.ui.ddmanager.droppables[t].push(this)},_splice:function(e){for(var t=0;e.length>t;t++)e[t]===this&&e.splice(t,1)},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];this._splice(t),this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,i){if("accept"===t)this.accept=e.isFunction(i)?i:function(e){return e.is(i)};else if("scope"===t){var s=e.ui.ddmanager.droppables[this.options.scope];this._splice(s),this._addToManager(i)}this._super(t,i)},_activate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),i&&this._trigger("activate",t,this.ui(i))},_deactivate:function(t){var i=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),i&&this._trigger("deactivate",t,this.ui(i))},_over:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(i)))},_out:function(t){var i=e.ui.ddmanager.current;i&&(i.currentItem||i.element)[0]!==this.element[0]&&this.accept.call(this.element[0],i.currentItem||i.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(i)))},_drop:function(t,i){var s=i||e.ui.ddmanager.current,n=!1;return s&&(s.currentItem||s.element)[0]!==this.element[0]?(this.element.find(":data(ui-droppable)").not(".ui-draggable-dragging").each(function(){var i=e(this).droppable("instance");return i.options.greedy&&!i.options.disabled&&i.options.scope===s.options.scope&&i.accept.call(i.element[0],s.currentItem||s.element)&&e.ui.intersect(s,e.extend(i,{offset:i.element.offset()}),i.options.tolerance,t)?(n=!0,!1):void 0}),n?!1:this.accept.call(this.element[0],s.currentItem||s.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(s)),this.element):!1):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(){function e(e,t,i){return e>=t&&t+i>e}return function(t,i,s,n){if(!i.offset)return!1;var a=(t.positionAbs||t.position.absolute).left+t.margins.left,o=(t.positionAbs||t.position.absolute).top+t.margins.top,r=a+t.helperProportions.width,h=o+t.helperProportions.height,l=i.offset.left,u=i.offset.top,d=l+i.proportions().width,c=u+i.proportions().height;switch(s){case"fit":return a>=l&&d>=r&&o>=u&&c>=h;case"intersect":return a+t.helperProportions.width/2>l&&d>r-t.helperProportions.width/2&&o+t.helperProportions.height/2>u&&c>h-t.helperProportions.height/2;case"pointer":return e(n.pageY,u,i.proportions().height)&&e(n.pageX,l,i.proportions().width);case"touch":return(o>=u&&c>=o||h>=u&&c>=h||u>o&&h>c)&&(a>=l&&d>=a||r>=l&&d>=r||l>a&&r>d);default:return!1}}}(),e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,i){var s,n,a=e.ui.ddmanager.droppables[t.options.scope]||[],o=i?i.type:null,r=(t.currentItem||t.element).find(":data(ui-droppable)").addBack();e:for(s=0;a.length>s;s++)if(!(a[s].options.disabled||t&&!a[s].accept.call(a[s].element[0],t.currentItem||t.element))){for(n=0;r.length>n;n++)if(r[n]===a[s].element[0]){a[s].proportions().height=0;continue e}a[s].visible="none"!==a[s].element.css("display"),a[s].visible&&("mousedown"===o&&a[s]._activate.call(a[s],i),a[s].offset=a[s].element.offset(),a[s].proportions({width:a[s].element[0].offsetWidth,height:a[s].element[0].offsetHeight}))}},drop:function(t,i){var s=!1;return e.each((e.ui.ddmanager.droppables[t.options.scope]||[]).slice(),function(){this.options&&(!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance,i)&&(s=this._drop.call(this,i)||s),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=!0,this.isover=!1,this._deactivate.call(this,i)))}),s},dragStart:function(t,i){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)})},drag:function(t,i){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,i),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options.disabled&&!this.greedyChild&&this.visible){var s,n,a,o=e.ui.intersect(t,this,this.options.tolerance,i),r=!o&&this.isover?"isout":o&&!this.isover?"isover":null;r&&(this.options.greedy&&(n=this.options.scope,a=this.element.parents(":data(ui-droppable)").filter(function(){return e(this).droppable("instance").options.scope===n}),a.length&&(s=e(a[0]).droppable("instance"),s.greedyChild="isover"===r)),s&&"isover"===r&&(s.isover=!1,s.isout=!0,s._out.call(s,i)),this[r]=!0,this["isout"===r?"isover":"isout"]=!1,this["isover"===r?"_over":"_out"].call(this,i),s&&"isout"===r&&(s.isout=!1,s.isover=!0,s._over.call(s,i)))}})},dragStop:function(t,i){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,i)}},e.ui.droppable;var y="ui-effects-",b=e;e.effects={effect:{}},function(e,t){function i(e,t,i){var s=d[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),n=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,a){var o,r=a.re.exec(i),h=r&&a.parse(r),l=a.space||"rgba";return h?(o=s[l](h),s[u[l].cache]=o[u[l].cache],n=s._rgba=o._rgba,!1):t}),n.length?("0,0,0,0"===n.join()&&e.extend(n,a.transparent),s):a[i]}function n(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var a,o="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",r=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,n){return new e.Color.fn.parse(t,i,s,n)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},d={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},c=l.support={},p=e("<p>")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",c.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(n,o,r,h){if(n===t)return this._rgba=[null,null,null,null],this;(n.jquery||n.nodeType)&&(n=e(n).css(o),o=t);var d=this,c=e.type(n),p=this._rgba=[];return o!==t&&(n=[n,o,r,h],c="array"),"string"===c?this.parse(s(n)||a._default):"array"===c?(f(u.rgba.props,function(e,t){p[t.idx]=i(n[t.idx],t)}),this):"object"===c?(n instanceof l?f(u,function(e,t){n[t.cache]&&(d[t.cache]=n[t.cache].slice())}):f(u,function(t,s){var a=s.cache;f(s.props,function(e,t){if(!d[a]&&s.to){if("alpha"===e||null==n[e])return;d[a]=s.to(d._rgba)}d[a][t.idx]=i(n[e],t,!0)}),d[a]&&0>e.inArray(null,d[a].slice(0,3))&&(d[a][3]=1,s.from&&(d._rgba=s.from(d[a])))}),this):t},is:function(e){var i=l(e),s=!0,n=this;return f(u,function(e,a){var o,r=i[a.cache];return r&&(o=n[a.cache]||a.to&&a.to(n._rgba)||[],f(a.props,function(e,i){return null!=r[i.idx]?s=r[i.idx]===o[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),n=s._space(),a=u[n],o=0===this.alpha()?l("transparent"):this,r=o[a.cache]||a.to(o._rgba),h=r.slice();return s=s[a.cache],f(a.props,function(e,n){var a=n.idx,o=r[a],l=s[a],u=d[n.type]||{};null!==l&&(null===o?h[a]=l:(u.mod&&(l-o>u.mod/2?o+=u.mod:o-l>u.mod/2&&(o-=u.mod)),h[a]=i((l-o)*t+o,n)))}),this[n](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),n=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*n[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,n=e[1]/255,a=e[2]/255,o=e[3],r=Math.max(s,n,a),h=Math.min(s,n,a),l=r-h,u=r+h,d=.5*u;return t=h===r?0:s===r?60*(n-a)/l+360:n===r?60*(a-s)/l+120:60*(s-n)/l+240,i=0===l?0:.5>=d?l/u:l/(2-u),[Math.round(t)%360,i,d,null==o?1:o]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],a=e[3],o=.5>=s?s*(1+i):s+i-s*i,r=2*s-o;return[Math.round(255*n(r,o,t+1/3)),Math.round(255*n(r,o,t)),Math.round(255*n(r,o,t-1/3)),a]},f(u,function(s,n){var a=n.props,o=n.cache,h=n.to,u=n.from;l.fn[s]=function(s){if(h&&!this[o]&&(this[o]=h(this._rgba)),s===t)return this[o].slice();var n,r=e.type(s),d="array"===r||"object"===r?s:arguments,c=this[o].slice();return f(a,function(e,t){var s=d["object"===r?e:t.idx];null==s&&(s=c[t.idx]),c[t.idx]=i(s,t)}),u?(n=l(u(c)),n[o]=c,n):l(c)},f(a,function(t,i){l.fn[t]||(l.fn[t]=function(n){var a,o=e.type(n),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===o?u:("function"===o&&(n=n.call(this,u),o=e.type(n)),null==n&&i.empty?this:("string"===o&&(a=r.exec(n),a&&(n=u+parseFloat(a[2])*("+"===a[1]?1:-1))),l[i.idx]=n,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,n){var a,o,r="";if("transparent"!==n&&("string"!==e.type(n)||(a=s(n)))){if(n=l(a||n),!c.rgba&&1!==n._rgba[3]){for(o="backgroundColor"===i?t.parentNode:t;(""===r||"transparent"===r)&&o&&o.style;)try{r=e.css(o,"backgroundColor"),o=o.parentNode}catch(h){}n=n.blend(r&&"transparent"!==r?r:"_default")}n=n.toRgbaString()}try{t.style[i]=n}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(o),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},a=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(b),function(){function t(t){var i,s,n=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,a={};if(n&&n.length&&n[0]&&n[n[0]])for(s=n.length;s--;)i=n[s],"string"==typeof n[i]&&(a[e.camelCase(i)]=n[i]);else for(i in n)"string"==typeof n[i]&&(a[i]=n[i]);return a}function i(t,i){var s,a,o={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(o[s]=a));return o}var s=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(b.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(n,a,o,r){var h=e.speed(a,o,r);return this.queue(function(){var a,o=e(this),r=o.attr("class")||"",l=h.children?o.find("*").addBack():o;l=l.map(function(){var i=e(this);return{el:i,start:t(this)}}),a=function(){e.each(s,function(e,t){n[t]&&o[t+"Class"](n[t])})},a(),l=l.map(function(){return this.end=t(this.el[0]),this.diff=i(this.start,this.end),this}),o.attr("class",r),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){a(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(o[0])})})},e.fn.extend({addClass:function(t){return function(i,s,n,a){return s?e.effects.animateClass.call(this,{add:i},s,n,a):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,n,a){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,n,a):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(t){return function(i,s,n,a,o){return"boolean"==typeof s||void 0===s?n?e.effects.animateClass.call(this,s?{add:i}:{remove:i},n,a,o):t.apply(this,arguments):e.effects.animateClass.call(this,{toggle:i},s,n,a)}}(e.fn.toggleClass),switchClass:function(t,i,s,n,a){return e.effects.animateClass.call(this,{add:i,remove:t},s,n,a)}})}(),function(){function t(t,i,s,n){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(n=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(n=s,s=i,i={}),e.isFunction(s)&&(n=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=n||i.complete,t}function i(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.11.4",save:function(e,t){for(var i=0;t.length>i;i++)null!==t[i]&&e.data(y+t[i],e[0].style[t[i]])},restore:function(e,t){var i,s;for(s=0;t.length>s;s++)null!==t[s]&&(i=e.data(y+t[s]),void 0===i&&(i=""),e.css(t[s],i))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),n={width:t.width(),height:t.height()},a=document.activeElement;try{a.id}catch(o){a=document.body}return t.wrap(s),(t[0]===a||e.contains(t[0],a))&&e(a).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(n),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,n){return n=n||{},e.each(i,function(e,i){var a=t.cssUnit(i);a[0]>0&&(n[i]=a[0]*s+a[1])}),n}}),e.fn.extend({effect:function(){function i(t){function i(){e.isFunction(a)&&a.call(n[0]),e.isFunction(t)&&t()}var n=e(this),a=s.complete,r=s.mode;(n.is(":hidden")?"hide"===r:"show"===r)?(n[r](),i()):o.call(n[0],s,i)}var s=t.apply(this,arguments),n=s.mode,a=s.queue,o=e.effects.effect[s.effect];return e.fx.off||!o?n?this[n](s.duration,s.complete):this.each(function(){s.complete&&s.complete.call(this)}):a===!1?this.each(i):this.queue(a||"fx",i)},show:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="show",this.effect.call(this,n)}}(e.fn.show),hide:function(e){return function(s){if(i(s))return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="hide",this.effect.call(this,n)}}(e.fn.hide),toggle:function(e){return function(s){if(i(s)||"boolean"==typeof s)return e.apply(this,arguments);var n=t.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}(),e.effects,e.effects.effect.blind=function(t,i){var s,n,a,o=e(this),r=/up|down|vertical/,h=/up|left|vertical|horizontal/,l=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(o,t.mode||"hide"),d=t.direction||"up",c=r.test(d),p=c?"height":"width",f=c?"top":"left",m=h.test(d),g={},v="show"===u;o.parent().is(".ui-effects-wrapper")?e.effects.save(o.parent(),l):e.effects.save(o,l),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n=s[p](),a=parseFloat(s.css(f))||0,g[p]=v?n:0,m||(o.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?a:n+a),v&&(s.css(p,0),m||s.css(f,a+n)),s.animate(g,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){"hide"===u&&o.hide(),e.effects.restore(o,l),e.effects.removeWrapper(o),i()}})},e.effects.effect.bounce=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"effect"),l="hide"===h,u="show"===h,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||l?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=o.queue(),_=b.length;for((u||l)&&r.push("opacity"),e.effects.save(o,r),o.show(),e.effects.createWrapper(o),c||(c=o["top"===v?"outerHeight":"outerWidth"]()/3),u&&(a={opacity:1},a[v]=0,o.css("opacity",0).css(v,y?2*-c:2*c).animate(a,m,g)),l&&(c/=Math.pow(2,p-1)),a={},a[v]=0,s=0;p>s;s++)n={},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g).animate(a,m,g),c=l?2*c:c/2;l&&(n={opacity:0},n[v]=(y?"-=":"+=")+c,o.animate(n,m,g)),o.queue(function(){l&&o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),o.dequeue()},e.effects.effect.clip=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","height","width"],h=e.effects.setMode(o,t.mode||"hide"),l="show"===h,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(o,r),o.show(),s=e.effects.createWrapper(o).css({overflow:"hidden"}),n="IMG"===o[0].tagName?s:o,a=n[c](),l&&(n.css(c,0),n.css(p,a/2)),f[c]=l?a:0,f[p]=l?0:a/2,n.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){l||o.hide(),e.effects.restore(o,r),e.effects.removeWrapper(o),i()}})},e.effects.effect.drop=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","opacity","height","width"],o=e.effects.setMode(n,t.mode||"hide"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h?"pos":"neg",d={opacity:r?1:0};e.effects.save(n,a),n.show(),e.effects.createWrapper(n),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0)/2,r&&n.css("opacity",0).css(l,"pos"===u?-s:s),d[l]=(r?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&n()}function n(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var a,o,r,h,l,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(a=0;d>a;a++)for(h=g.top+a*y,u=a-(d-1)/2,o=0;c>o;o++)r=g.left+o*v,l=o-(c-1)/2,p.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-o*v,top:-a*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:r+(m?l*v:0),top:h+(m?u*y:0),opacity:m?0:1}).animate({left:r+(m?0:l*v),top:h+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)},e.effects.effect.fade=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:n},{queue:!1,duration:t.duration,easing:t.easing,complete:i})},e.effects.effect.fold=function(t,i){var s,n,a=e(this),o=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"hide"),h="show"===r,l="hide"===r,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=h!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(a,o),a.show(),s=e.effects.createWrapper(a).css({overflow:"hidden"}),n=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*n[l?0:1]),h&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=h?n[0]:u,v[f[1]]=h?n[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){l&&a.hide(),e.effects.restore(a,o),e.effects.removeWrapper(a),i()})},e.effects.effect.highlight=function(t,i){var s=e(this),n=["backgroundImage","backgroundColor","opacity"],a=e.effects.setMode(s,t.mode||"show"),o={backgroundColor:s.css("backgroundColor")};"hide"===a&&(o.opacity=0),e.effects.save(s,n),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===a&&s.hide(),e.effects.restore(s,n),i()}})},e.effects.effect.size=function(t,i){var s,n,a,o=e(this),r=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(o,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=o.css("position"),y=f?r:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&o.show(),s={height:o.height(),width:o.width(),outerHeight:o.outerHeight(),outerWidth:o.outerWidth()},"toggle"===t.mode&&"show"===p?(o.from=t.to||b,o.to=t.from||s):(o.from=t.from||("show"===p?b:s),o.to=t.to||("hide"===p?b:s)),a={from:{y:o.from.height/s.height,x:o.from.width/s.width},to:{y:o.to.height/s.height,x:o.to.width/s.width}},("box"===m||"both"===m)&&(a.from.y!==a.to.y&&(y=y.concat(d),o.from=e.effects.setTransition(o,d,a.from.y,o.from),o.to=e.effects.setTransition(o,d,a.to.y,o.to)),a.from.x!==a.to.x&&(y=y.concat(c),o.from=e.effects.setTransition(o,c,a.from.x,o.from),o.to=e.effects.setTransition(o,c,a.to.x,o.to))),("content"===m||"both"===m)&&a.from.y!==a.to.y&&(y=y.concat(u).concat(l),o.from=e.effects.setTransition(o,u,a.from.y,o.from),o.to=e.effects.setTransition(o,u,a.to.y,o.to)),e.effects.save(o,y),o.show(),e.effects.createWrapper(o),o.css("overflow","hidden").css(o.from),g&&(n=e.effects.getBaseline(g,s),o.from.top=(s.outerHeight-o.outerHeight())*n.y,o.from.left=(s.outerWidth-o.outerWidth())*n.x,o.to.top=(s.outerHeight-o.to.outerHeight)*n.y,o.to.left=(s.outerWidth-o.to.outerWidth)*n.x),o.css(o.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=r.concat(d).concat(c),o.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()}; +f&&e.effects.save(i,l),i.from={height:s.height*a.from.y,width:s.width*a.from.x,outerHeight:s.outerHeight*a.from.y,outerWidth:s.outerWidth*a.from.x},i.to={height:s.height*a.to.y,width:s.width*a.to.x,outerHeight:s.height*a.to.y,outerWidth:s.width*a.to.x},a.from.y!==a.to.y&&(i.from=e.effects.setTransition(i,d,a.from.y,i.from),i.to=e.effects.setTransition(i,d,a.to.y,i.to)),a.from.x!==a.to.x&&(i.from=e.effects.setTransition(i,c,a.from.x,i.from),i.to=e.effects.setTransition(i,c,a.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),o.animate(o.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===o.to.opacity&&o.css("opacity",o.from.opacity),"hide"===p&&o.hide(),e.effects.restore(o,y),f||("static"===v?o.css({position:"relative",top:o.to.top,left:o.to.left}):e.each(["top","left"],function(e,t){o.css(t,function(t,i){var s=parseInt(i,10),n=e?o.to.left:o.to.top;return"auto"===i?n+"px":s+n+"px"})})),e.effects.removeWrapper(o),i()}})},e.effects.effect.scale=function(t,i){var s=e(this),n=e.extend(!0,{},t),a=e.effects.setMode(s,t.mode||"effect"),o=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===a?0:100),r=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==r?o/100:1,x:"vertical"!==r?o/100:1};n.effect="size",n.queue=!1,n.complete=i,"effect"!==a&&(n.origin=h||["middle","center"],n.restore=!0),n.from=t.from||("show"===a?{height:0,width:0,outerHeight:0,outerWidth:0}:l),n.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},n.fade&&("show"===a&&(n.from.opacity=0,n.to.opacity=1),"hide"===a&&(n.from.opacity=1,n.to.opacity=0)),s.effect(n)},e.effects.effect.puff=function(t,i){var s=e(this),n=e.effects.setMode(s,t.mode||"hide"),a="hide"===n,o=parseInt(t.percent,10)||150,r=o/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:n,complete:i,percent:a?o:100,from:a?h:{height:h.height*r,width:h.width*r,outerHeight:h.outerHeight*r,outerWidth:h.outerWidth*r}}),s.effect(t)},e.effects.effect.pulsate=function(t,i){var s,n=e(this),a=e.effects.setMode(n,t.mode||"show"),o="show"===a,r="hide"===a,h=o||"hide"===a,l=2*(t.times||5)+(h?1:0),u=t.duration/l,d=0,c=n.queue(),p=c.length;for((o||!n.is(":visible"))&&(n.css("opacity",0).show(),d=1),s=1;l>s;s++)n.animate({opacity:d},u,t.easing),d=1-d;n.animate({opacity:d},u,t.easing),n.queue(function(){r&&n.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,l+1))),n.dequeue()},e.effects.effect.shake=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"effect"),r=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===r||"down"===r?"top":"left",p="up"===r||"left"===r,f={},m={},g={},v=n.queue(),y=v.length;for(e.effects.save(n,a),n.show(),e.effects.createWrapper(n),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,n.animate(f,d,t.easing),s=1;l>s;s++)n.animate(m,d,t.easing).animate(g,d,t.easing);n.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),n.dequeue()},e.effects.effect.slide=function(t,i){var s,n=e(this),a=["position","top","bottom","left","right","width","height"],o=e.effects.setMode(n,t.mode||"show"),r="show"===o,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(n,a),n.show(),s=t.distance||n["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(n).css({overflow:"hidden"}),r&&n.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(r?u?"+=":"-=":u?"-=":"+=")+s,n.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===o&&n.hide(),e.effects.restore(n,a),e.effects.removeWrapper(n),i()}})},e.effects.effect.transfer=function(t,i){var s=e(this),n=e(t.to),a="fixed"===n.css("position"),o=e("body"),r=a?o.scrollTop():0,h=a?o.scrollLeft():0,l=n.offset(),u={top:l.top-r,left:l.left-h,height:n.innerHeight(),width:n.innerWidth()},d=s.offset(),c=e("<div class='ui-effects-transfer'></div>").appendTo(document.body).addClass(t.className).css({top:d.top-r,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:a?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})},e.widget("ui.progressbar",{version:"1.11.4",options:{max:100,value:0,change:null,complete:null},min:0,_create:function(){this.oldValue=this.options.value=this._constrainedValue(),this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return void 0===e?this.options.value:(this.options.value=this._constrainedValue(e),this._refreshValue(),void 0)},_constrainedValue:function(e){return void 0===e&&(e=this.options.value),this.indeterminate=e===!1,"number"!=typeof e&&(e=0),this.indeterminate?!1:Math.min(this.options.max,Math.max(this.min,e))},_setOptions:function(e){var t=e.value;delete e.value,this._super(e),this.options.value=this._constrainedValue(t),this._refreshValue()},_setOption:function(e,t){"max"===e&&(t=Math.max(this.min,t)),"disabled"===e&&this.element.toggleClass("ui-state-disabled",!!t).attr("aria-disabled",t),this._super(e,t)},_percentage:function(){return this.indeterminate?100:100*(this.options.value-this.min)/(this.options.max-this.min)},_refreshValue:function(){var t=this.options.value,i=this._percentage();this.valueDiv.toggle(this.indeterminate||t>this.min).toggleClass("ui-corner-right",t===this.options.max).width(i.toFixed(0)+"%"),this.element.toggleClass("ui-progressbar-indeterminate",this.indeterminate),this.indeterminate?(this.element.removeAttr("aria-valuenow"),this.overlayDiv||(this.overlayDiv=e("<div class='ui-progressbar-overlay'></div>").appendTo(this.valueDiv))):(this.element.attr({"aria-valuemax":this.options.max,"aria-valuenow":t}),this.overlayDiv&&(this.overlayDiv.remove(),this.overlayDiv=null)),this.oldValue!==t&&(this.oldValue=t,this._trigger("change")),t===this.options.max&&this._trigger("complete")}}),e.widget("ui.selectable",e.ui.mouse,{version:"1.11.4",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch",selected:null,selecting:null,start:null,stop:null,unselected:null,unselecting:null},_create:function(){var t,i=this;this.element.addClass("ui-selectable"),this.dragged=!1,this.refresh=function(){t=e(i.options.filter,i.element[0]),t.addClass("ui-selectee"),t.each(function(){var t=e(this),i=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:i.left,top:i.top,right:i.left+t.outerWidth(),bottom:i.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=t.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var i=this,s=this.options;this.opos=[t.pageX,t.pageY],this.options.disabled||(this.selectees=e(s.filter,this.element[0]),this._trigger("start",t),e(s.appendTo).append(this.helper),this.helper.css({left:t.pageX,top:t.pageY,width:0,height:0}),s.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var s=e.data(this,"selectable-item");s.startselected=!0,t.metaKey||t.ctrlKey||(s.$element.removeClass("ui-selected"),s.selected=!1,s.$element.addClass("ui-unselecting"),s.unselecting=!0,i._trigger("unselecting",t,{unselecting:s.element}))}),e(t.target).parents().addBack().each(function(){var s,n=e.data(this,"selectable-item");return n?(s=!t.metaKey&&!t.ctrlKey||!n.$element.hasClass("ui-selected"),n.$element.removeClass(s?"ui-unselecting":"ui-selected").addClass(s?"ui-selecting":"ui-unselecting"),n.unselecting=!s,n.selecting=s,n.selected=s,s?i._trigger("selecting",t,{selecting:n.element}):i._trigger("unselecting",t,{unselecting:n.element}),!1):void 0}))},_mouseDrag:function(t){if(this.dragged=!0,!this.options.disabled){var i,s=this,n=this.options,a=this.opos[0],o=this.opos[1],r=t.pageX,h=t.pageY;return a>r&&(i=r,r=a,a=i),o>h&&(i=h,h=o,o=i),this.helper.css({left:a,top:o,width:r-a,height:h-o}),this.selectees.each(function(){var i=e.data(this,"selectable-item"),l=!1;i&&i.element!==s.element[0]&&("touch"===n.tolerance?l=!(i.left>r||a>i.right||i.top>h||o>i.bottom):"fit"===n.tolerance&&(l=i.left>a&&r>i.right&&i.top>o&&h>i.bottom),l?(i.selected&&(i.$element.removeClass("ui-selected"),i.selected=!1),i.unselecting&&(i.$element.removeClass("ui-unselecting"),i.unselecting=!1),i.selecting||(i.$element.addClass("ui-selecting"),i.selecting=!0,s._trigger("selecting",t,{selecting:i.element}))):(i.selecting&&((t.metaKey||t.ctrlKey)&&i.startselected?(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.$element.addClass("ui-selected"),i.selected=!0):(i.$element.removeClass("ui-selecting"),i.selecting=!1,i.startselected&&(i.$element.addClass("ui-unselecting"),i.unselecting=!0),s._trigger("unselecting",t,{unselecting:i.element}))),i.selected&&(t.metaKey||t.ctrlKey||i.startselected||(i.$element.removeClass("ui-selected"),i.selected=!1,i.$element.addClass("ui-unselecting"),i.unselecting=!0,s._trigger("unselecting",t,{unselecting:i.element})))))}),!1}},_mouseStop:function(t){var i=this;return this.dragged=!1,e(".ui-unselecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-unselecting"),s.unselecting=!1,s.startselected=!1,i._trigger("unselected",t,{unselected:s.element})}),e(".ui-selecting",this.element[0]).each(function(){var s=e.data(this,"selectable-item");s.$element.removeClass("ui-selecting").addClass("ui-selected"),s.selecting=!1,s.selected=!0,s.startselected=!0,i._trigger("selected",t,{selected:s.element})}),this._trigger("stop",t),this.helper.remove(),!1}}),e.widget("ui.selectmenu",{version:"1.11.4",defaultElement:"<select>",options:{appendTo:null,disabled:null,icons:{button:"ui-icon-triangle-1-s"},position:{my:"left top",at:"left bottom",collision:"none"},width:null,change:null,close:null,focus:null,open:null,select:null},_create:function(){var e=this.element.uniqueId().attr("id");this.ids={element:e,button:e+"-button",menu:e+"-menu"},this._drawButton(),this._drawMenu(),this.options.disabled&&this.disable()},_drawButton:function(){var t=this;this.label=e("label[for='"+this.ids.element+"']").attr("for",this.ids.button),this._on(this.label,{click:function(e){this.button.focus(),e.preventDefault()}}),this.element.hide(),this.button=e("<span>",{"class":"ui-selectmenu-button ui-widget ui-state-default ui-corner-all",tabindex:this.options.disabled?-1:0,id:this.ids.button,role:"combobox","aria-expanded":"false","aria-autocomplete":"list","aria-owns":this.ids.menu,"aria-haspopup":"true"}).insertAfter(this.element),e("<span>",{"class":"ui-icon "+this.options.icons.button}).prependTo(this.button),this.buttonText=e("<span>",{"class":"ui-selectmenu-text"}).appendTo(this.button),this._setText(this.buttonText,this.element.find("option:selected").text()),this._resizeButton(),this._on(this.button,this._buttonEvents),this.button.one("focusin",function(){t.menuItems||t._refreshMenu()}),this._hoverable(this.button),this._focusable(this.button)},_drawMenu:function(){var t=this;this.menu=e("<ul>",{"aria-hidden":"true","aria-labelledby":this.ids.button,id:this.ids.menu}),this.menuWrap=e("<div>",{"class":"ui-selectmenu-menu ui-front"}).append(this.menu).appendTo(this._appendTo()),this.menuInstance=this.menu.menu({role:"listbox",select:function(e,i){e.preventDefault(),t._setSelection(),t._select(i.item.data("ui-selectmenu-item"),e)},focus:function(e,i){var s=i.item.data("ui-selectmenu-item");null!=t.focusIndex&&s.index!==t.focusIndex&&(t._trigger("focus",e,{item:s}),t.isOpen||t._select(s,e)),t.focusIndex=s.index,t.button.attr("aria-activedescendant",t.menuItems.eq(s.index).attr("id"))}}).menu("instance"),this.menu.addClass("ui-corner-bottom").removeClass("ui-corner-all"),this.menuInstance._off(this.menu,"mouseleave"),this.menuInstance._closeOnDocumentClick=function(){return!1},this.menuInstance._isDivider=function(){return!1}},refresh:function(){this._refreshMenu(),this._setText(this.buttonText,this._getSelectedItem().text()),this.options.width||this._resizeButton()},_refreshMenu:function(){this.menu.empty();var e,t=this.element.find("option");t.length&&(this._parseOptions(t),this._renderMenu(this.menu,this.items),this.menuInstance.refresh(),this.menuItems=this.menu.find("li").not(".ui-selectmenu-optgroup"),e=this._getSelectedItem(),this.menuInstance.focus(null,e),this._setAria(e.data("ui-selectmenu-item")),this._setOption("disabled",this.element.prop("disabled")))},open:function(e){this.options.disabled||(this.menuItems?(this.menu.find(".ui-state-focus").removeClass("ui-state-focus"),this.menuInstance.focus(null,this._getSelectedItem())):this._refreshMenu(),this.isOpen=!0,this._toggleAttr(),this._resizeMenu(),this._position(),this._on(this.document,this._documentClick),this._trigger("open",e))},_position:function(){this.menuWrap.position(e.extend({of:this.button},this.options.position))},close:function(e){this.isOpen&&(this.isOpen=!1,this._toggleAttr(),this.range=null,this._off(this.document),this._trigger("close",e))},widget:function(){return this.button},menuWidget:function(){return this.menu},_renderMenu:function(t,i){var s=this,n="";e.each(i,function(i,a){a.optgroup!==n&&(e("<li>",{"class":"ui-selectmenu-optgroup ui-menu-divider"+(a.element.parent("optgroup").prop("disabled")?" ui-state-disabled":""),text:a.optgroup}).appendTo(t),n=a.optgroup),s._renderItemData(t,a)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-selectmenu-item",t)},_renderItem:function(t,i){var s=e("<li>");return i.disabled&&s.addClass("ui-state-disabled"),this._setText(s,i.label),s.appendTo(t)},_setText:function(e,t){t?e.text(t):e.html(" ")},_move:function(e,t){var i,s,n=".ui-menu-item";this.isOpen?i=this.menuItems.eq(this.focusIndex):(i=this.menuItems.eq(this.element[0].selectedIndex),n+=":not(.ui-state-disabled)"),s="first"===e||"last"===e?i["first"===e?"prevAll":"nextAll"](n).eq(-1):i[e+"All"](n).eq(0),s.length&&this.menuInstance.focus(t,s)},_getSelectedItem:function(){return this.menuItems.eq(this.element[0].selectedIndex)},_toggle:function(e){this[this.isOpen?"close":"open"](e)},_setSelection:function(){var e;this.range&&(window.getSelection?(e=window.getSelection(),e.removeAllRanges(),e.addRange(this.range)):this.range.select(),this.button.focus())},_documentClick:{mousedown:function(t){this.isOpen&&(e(t.target).closest(".ui-selectmenu-menu, #"+this.ids.button).length||this.close(t))}},_buttonEvents:{mousedown:function(){var e;window.getSelection?(e=window.getSelection(),e.rangeCount&&(this.range=e.getRangeAt(0))):this.range=document.selection.createRange()},click:function(e){this._setSelection(),this._toggle(e)},keydown:function(t){var i=!0;switch(t.keyCode){case e.ui.keyCode.TAB:case e.ui.keyCode.ESCAPE:this.close(t),i=!1;break;case e.ui.keyCode.ENTER:this.isOpen&&this._selectFocusedItem(t);break;case e.ui.keyCode.UP:t.altKey?this._toggle(t):this._move("prev",t);break;case e.ui.keyCode.DOWN:t.altKey?this._toggle(t):this._move("next",t);break;case e.ui.keyCode.SPACE:this.isOpen?this._selectFocusedItem(t):this._toggle(t);break;case e.ui.keyCode.LEFT:this._move("prev",t);break;case e.ui.keyCode.RIGHT:this._move("next",t);break;case e.ui.keyCode.HOME:case e.ui.keyCode.PAGE_UP:this._move("first",t);break;case e.ui.keyCode.END:case e.ui.keyCode.PAGE_DOWN:this._move("last",t);break;default:this.menu.trigger(t),i=!1}i&&t.preventDefault()}},_selectFocusedItem:function(e){var t=this.menuItems.eq(this.focusIndex);t.hasClass("ui-state-disabled")||this._select(t.data("ui-selectmenu-item"),e)},_select:function(e,t){var i=this.element[0].selectedIndex;this.element[0].selectedIndex=e.index,this._setText(this.buttonText,e.label),this._setAria(e),this._trigger("select",t,{item:e}),e.index!==i&&this._trigger("change",t,{item:e}),this.close(t)},_setAria:function(e){var t=this.menuItems.eq(e.index).attr("id");this.button.attr({"aria-labelledby":t,"aria-activedescendant":t}),this.menu.attr("aria-activedescendant",t)},_setOption:function(e,t){"icons"===e&&this.button.find("span.ui-icon").removeClass(this.options.icons.button).addClass(t.button),this._super(e,t),"appendTo"===e&&this.menuWrap.appendTo(this._appendTo()),"disabled"===e&&(this.menuInstance.option("disabled",t),this.button.toggleClass("ui-state-disabled",t).attr("aria-disabled",t),this.element.prop("disabled",t),t?(this.button.attr("tabindex",-1),this.close()):this.button.attr("tabindex",0)),"width"===e&&this._resizeButton()},_appendTo:function(){var t=this.options.appendTo;return t&&(t=t.jquery||t.nodeType?e(t):this.document.find(t).eq(0)),t&&t[0]||(t=this.element.closest(".ui-front")),t.length||(t=this.document[0].body),t},_toggleAttr:function(){this.button.toggleClass("ui-corner-top",this.isOpen).toggleClass("ui-corner-all",!this.isOpen).attr("aria-expanded",this.isOpen),this.menuWrap.toggleClass("ui-selectmenu-open",this.isOpen),this.menu.attr("aria-hidden",!this.isOpen)},_resizeButton:function(){var e=this.options.width;e||(e=this.element.show().outerWidth(),this.element.hide()),this.button.outerWidth(e)},_resizeMenu:function(){this.menu.outerWidth(Math.max(this.button.outerWidth(),this.menu.width("").outerWidth()+1))},_getCreateOptions:function(){return{disabled:this.element.prop("disabled")}},_parseOptions:function(t){var i=[];t.each(function(t,s){var n=e(s),a=n.parent("optgroup");i.push({element:n,index:t,value:n.val(),label:n.text(),optgroup:a.attr("label")||"",disabled:a.prop("disabled")||n.prop("disabled")})}),this.items=i},_destroy:function(){this.menuWrap.remove(),this.button.remove(),this.element.show(),this.element.removeUniqueId(),this.label.attr("for",this.ids.element)}}),e.widget("ui.slider",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null,change:null,slide:null,start:null,stop:null},numPages:5,_create:function(){this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this._calculateNewMax(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"),this._refresh(),this._setOption("disabled",this.options.disabled),this._animateOff=!1},_refresh:function(){this._createRange(),this._createHandles(),this._setupEvents(),this._refreshValue()},_createHandles:function(){var t,i,s=this.options,n=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),a="<span class='ui-slider-handle ui-state-default ui-corner-all' tabindex='0'></span>",o=[];for(i=s.values&&s.values.length||1,n.length>i&&(n.slice(i).remove(),n=n.slice(0,i)),t=n.length;i>t;t++)o.push(a);this.handles=n.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)})},_createRange:function(){var t=this.options,i="";t.range?(t.range===!0&&(t.values?t.values.length&&2!==t.values.length?t.values=[t.values[0],t.values[0]]:e.isArray(t.values)&&(t.values=t.values.slice(0)):t.values=[this._valueMin(),this._valueMin()]),this.range&&this.range.length?this.range.removeClass("ui-slider-range-min ui-slider-range-max").css({left:"",bottom:""}):(this.range=e("<div></div>").appendTo(this.element),i="ui-slider-range ui-widget-header ui-corner-all"),this.range.addClass(i+("min"===t.range||"max"===t.range?" ui-slider-range-"+t.range:""))):(this.range&&this.range.remove(),this.range=null)},_setupEvents:function(){this._off(this.handles),this._on(this.handles,this._handleEvents),this._hoverable(this.handles),this._focusable(this.handles)},_destroy:function(){this.handles.remove(),this.range&&this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,o,r,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));(n>i||n===i&&(t===u._lastChangedValue||u.values(t)===d.min))&&(n=i,a=e(this),o=t)}),r=this._start(t,o),r===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().addBack().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._lastChangedValue=t,this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),void 0):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),void 0;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch("range"===t&&this.options.range===!0&&("min"===i?(this.options.value=this._values(0),this.options.values=null):"max"===i&&(this.options.value=this._values(this.options.values.length-1),this.options.values=null)),e.isArray(this.options.values)&&(n=this.options.values.length),"disabled"===t&&this.element.toggleClass("ui-state-disabled",!!i),this._super(t,i),t){case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue(),this.handles.css("horizontal"===i?"bottom":"left","");break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"step":case"min":case"max":this._animateOff=!0,this._calculateNewMax(),this._refreshValue(),this._animateOff=!1;break;case"range":this._animateOff=!0,this._refresh(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);if(this.options.values&&this.options.values.length){for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i}return[]},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_calculateNewMax:function(){var e=this.options.max,t=this._valueMin(),i=this.options.step,s=Math.floor(+(e-t).toFixed(this._precision())/i)*i;e=s+t,this.max=parseFloat(e.toFixed(this._precision()))},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_valueMin:function(){return this.options.min},_valueMax:function(){return this.max},_refreshValue:function(){var t,i,s,n,a,o=this.options.range,r=this.options,h=this,l=this._animateOff?!1:r.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,r.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:r.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},r.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:r.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,r.animate),"min"===o&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},r.animate),"max"===o&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:r.animate}),"min"===o&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},r.animate),"max"===o&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:r.animate}))},_handleEvents:{keydown:function(t){var i,s,n,a,o=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(t.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(t.target).addClass("ui-state-active"),i=this._start(t,o),i===!1))return}switch(a=this.options.step,s=n=this.options.values&&this.options.values.length?this.values(o):this.value(),t.keyCode){case e.ui.keyCode.HOME:n=this._valueMin();break;case e.ui.keyCode.END:n=this._valueMax();break;case e.ui.keyCode.PAGE_UP:n=this._trimAlignValue(s+(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.PAGE_DOWN:n=this._trimAlignValue(s-(this._valueMax()-this._valueMin())/this.numPages);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(s===this._valueMax())return;n=this._trimAlignValue(s+a);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(s===this._valueMin())return;n=this._trimAlignValue(s-a)}this._slide(t,o,n)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}}),e.widget("ui.sortable",e.ui.mouse,{version:"1.11.4",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3,activate:null,beforeStop:null,change:null,deactivate:null,out:null,over:null,receive:null,remove:null,sort:null,start:null,stop:null,update:null},_isOverAxis:function(e,t,i){return e>=t&&t+i>e},_isFloating:function(e){return/left|right/.test(e.css("float"))||/inline|table-cell/.test(e.css("display"))},_create:function(){this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.offset=this.element.offset(),this._mouseInit(),this._setHandleClassName(),this.ready=!0},_setOption:function(e,t){this._super(e,t),"handle"===e&&this._setHandleClassName()},_setHandleClassName:function(){this.element.find(".ui-sortable-handle").removeClass("ui-sortable-handle"),e.each(this.items,function(){(this.instance.options.handle?this.item.find(this.instance.options.handle):this.item).addClass("ui-sortable-handle")})},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").find(".ui-sortable-handle").removeClass("ui-sortable-handle"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_mouseCapture:function(t,i){var s=null,n=!1,a=this;return this.reverting?!1:this.options.disabled||"static"===this.options.type?!1:(this._refreshItems(t),e(t.target).parents().each(function(){return e.data(this,a.widgetName+"-item")===a?(s=e(this),!1):void 0}),e.data(t.target,a.widgetName+"-item")===a&&(s=e(t.target)),s?!this.options.handle||i||(e(this.options.handle,s).find("*").addBack().each(function(){this===t.target&&(n=!0)}),n)?(this.currentItem=s,this._removeCurrentsFromItems(),!0):!1:!1)},_mouseStart:function(t,i,s){var n,a,o=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,o.cursorAt&&this._adjustOffsetFromHelper(o.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!==this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),o.containment&&this._setContainment(),o.cursor&&"auto"!==o.cursor&&(a=this.document.find("body"),this.storedCursor=a.css("cursor"),a.css("cursor",o.cursor),this.storedStylesheet=e("<style>*{ cursor: "+o.cursor+" !important; }</style>").appendTo(a)),o.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",o.opacity)),o.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",o.zIndex)),this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(n=this.containers.length-1;n>=0;n--)this.containers[n]._trigger("activate",t,this._uiHash(this)); +return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){var i,s,n,a,o=this.options,r=!1;for(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll&&(this.scrollParent[0]!==this.document[0]&&"HTML"!==this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<o.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+o.scrollSpeed:t.pageY-this.overflowOffset.top<o.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-o.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<o.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+o.scrollSpeed:t.pageX-this.overflowOffset.left<o.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-o.scrollSpeed)):(t.pageY-this.document.scrollTop()<o.scrollSensitivity?r=this.document.scrollTop(this.document.scrollTop()-o.scrollSpeed):this.window.height()-(t.pageY-this.document.scrollTop())<o.scrollSensitivity&&(r=this.document.scrollTop(this.document.scrollTop()+o.scrollSpeed)),t.pageX-this.document.scrollLeft()<o.scrollSensitivity?r=this.document.scrollLeft(this.document.scrollLeft()-o.scrollSpeed):this.window.width()-(t.pageX-this.document.scrollLeft())<o.scrollSensitivity&&(r=this.document.scrollLeft(this.document.scrollLeft()+o.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!o.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)),this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"===this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"===this.options.axis||(this.helper[0].style.top=this.position.top+"px"),i=this.items.length-1;i>=0;i--)if(s=this.items[i],n=s.item[0],a=this._intersectsWithPointer(s),a&&s.instance===this.currentContainer&&n!==this.currentItem[0]&&this.placeholder[1===a?"next":"prev"]()[0]!==n&&!e.contains(this.placeholder[0],n)&&("semi-dynamic"===this.options.type?!e.contains(this.element[0],n):!0)){if(this.direction=1===a?"down":"up","pointer"!==this.options.tolerance&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset(),a=this.options.axis,o={};a&&"x"!==a||(o.left=n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollLeft)),a&&"y"!==a||(o.top=n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]===this.document[0].body?0:this.offsetParent[0].scrollTop)),this.reverting=!0,e(this.helper).animate(o,parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"===this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!==this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[\-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d="x"===this.options.axis||s+l>r&&h>s+l,c="y"===this.options.axis||t+u>a&&o>t+u,p=d&&c;return"pointer"===this.options.tolerance||this.options.forcePointerForContainers||"pointer"!==this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?p:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(e){var t="x"===this.options.axis||this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top,e.height),i="y"===this.options.axis||this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left,e.width),s=t&&i,n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return s?this.floating?a&&"right"===a||"down"===n?2:1:n&&("down"===n?2:1):!1},_intersectsWithSides:function(e){var t=this._isOverAxis(this.positionAbs.top+this.offset.click.top,e.top+e.height/2,e.height),i=this._isOverAxis(this.positionAbs.left+this.offset.click.left,e.left+e.width/2,e.width),s=this._getDragVerticalDirection(),n=this._getDragHorizontalDirection();return this.floating&&n?"right"===n&&i||"left"===n&&!i:s&&("down"===s&&t||"up"===s&&!t)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!==e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!==e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this._setHandleClassName(),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor===String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){function i(){r.push(this)}var s,n,a,o,r=[],h=[],l=this._connectWith();if(l&&t)for(s=l.length-1;s>=0;s--)for(a=e(l[s],this.document[0]),n=a.length-1;n>=0;n--)o=e.data(a[n],this.widgetFullName),o&&o!==this&&!o.options.disabled&&h.push([e.isFunction(o.options.items)?o.options.items.call(o.element):e(o.options.items,o.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),o]);for(h.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]),s=h.length-1;s>=0;s--)h[s][0].each(i);return e(r)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]===e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i,s,n,a,o,r,h,l,u=this.items,d=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],c=this._connectWith();if(c&&this.ready)for(i=c.length-1;i>=0;i--)for(n=e(c[i],this.document[0]),s=n.length-1;s>=0;s--)a=e.data(n[s],this.widgetFullName),a&&a!==this&&!a.options.disabled&&(d.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a));for(i=d.length-1;i>=0;i--)for(o=d[i][1],r=d[i][0],s=0,l=r.length;l>s;s++)h=e(r[s]),h.data(this.widgetName+"-item",o),u.push({item:h,instance:o,width:0,height:0,left:0,top:0})},refreshPositions:function(t){this.floating=this.items.length?"x"===this.options.axis||this._isFloating(this.items[0].item):!1,this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());var i,s,n,a;for(i=this.items.length-1;i>=0;i--)s=this.items[i],s.instance!==this.currentContainer&&this.currentContainer&&s.item[0]!==this.currentItem[0]||(n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item,t||(s.width=n.outerWidth(),s.height=n.outerHeight()),a=n.offset(),s.left=a.left,s.top=a.top);if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(i=this.containers.length-1;i>=0;i--)a=this.containers[i].element.offset(),this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight();return this},_createPlaceholder:function(t){t=t||this;var i,s=t.options;s.placeholder&&s.placeholder.constructor!==String||(i=s.placeholder,s.placeholder={element:function(){var s=t.currentItem[0].nodeName.toLowerCase(),n=e("<"+s+">",t.document[0]).addClass(i||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper");return"tbody"===s?t._createTrPlaceholder(t.currentItem.find("tr").eq(0),e("<tr>",t.document[0]).appendTo(n)):"tr"===s?t._createTrPlaceholder(t.currentItem,n):"img"===s&&n.attr("src",t.currentItem.attr("src")),i||n.css("visibility","hidden"),n},update:function(e,n){(!i||s.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}),t.placeholder=e(s.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),s.placeholder.update(t,t.placeholder)},_createTrPlaceholder:function(t,i){var s=this;t.children().each(function(){e("<td> </td>",s.document[0]).attr("colspan",e(this).attr("colspan")||1).appendTo(i)})},_contactContainers:function(t){var i,s,n,a,o,r,h,l,u,d,c=null,p=null;for(i=this.containers.length-1;i>=0;i--)if(!e.contains(this.currentItem[0],this.containers[i].element[0]))if(this._intersectsWith(this.containers[i].containerCache)){if(c&&e.contains(this.containers[i].element[0],c.element[0]))continue;c=this.containers[i],p=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0);if(c)if(1===this.containers.length)this.containers[p].containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1);else{for(n=1e4,a=null,u=c.floating||this._isFloating(this.currentItem),o=u?"left":"top",r=u?"width":"height",d=u?"clientX":"clientY",s=this.items.length-1;s>=0;s--)e.contains(this.containers[p].element[0],this.items[s].item[0])&&this.items[s].item[0]!==this.currentItem[0]&&(h=this.items[s].item.offset()[o],l=!1,t[d]-h>this.items[s][r]/2&&(l=!0),n>Math.abs(t[d]-h)&&(n=Math.abs(t[d]-h),a=this.items[s],this.direction=l?"up":"down"));if(!a&&!this.options.dropOnEmpty)return;if(this.currentContainer===this.containers[p])return this.currentContainer.containerCache.over||(this.containers[p]._trigger("over",t,this._uiHash()),this.currentContainer.containerCache.over=1),void 0;a?this._rearrange(t,a,null,!0):this._rearrange(t,null,this.containers[p].element,!0),this._trigger("change",t,this._uiHash()),this.containers[p]._trigger("change",t,this._uiHash(this)),this.currentContainer=this.containers[p],this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[p]._trigger("over",t,this._uiHash(this)),this.containers[p].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"===i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!==i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]===this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(!s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(!s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"===this.cssPosition&&this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]===this.document[0].body||this.offsetParent[0].tagName&&"html"===this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"===this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t,i,s,n=this.options;"parent"===n.containment&&(n.containment=this.helper[0].parentNode),("document"===n.containment||"window"===n.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,"document"===n.containment?this.document.width():this.window.width()-this.helperProportions.width-this.margins.left,("document"===n.containment?this.document.width():this.window.height()||this.document[0].body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),/^(document|window|parent)$/.test(n.containment)||(t=e(n.containment)[0],i=e(n.containment).offset(),s="hidden"!==e(t).css("overflow"),this.containment=[i.left+(parseInt(e(t).css("borderLeftWidth"),10)||0)+(parseInt(e(t).css("paddingLeft"),10)||0)-this.margins.left,i.top+(parseInt(e(t).css("borderTopWidth"),10)||0)+(parseInt(e(t).css("paddingTop"),10)||0)-this.margins.top,i.left+(s?Math.max(t.scrollWidth,t.offsetWidth):t.offsetWidth)-(parseInt(e(t).css("borderLeftWidth"),10)||0)-(parseInt(e(t).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,i.top+(s?Math.max(t.scrollHeight,t.offsetHeight):t.offsetHeight)-(parseInt(e(t).css("borderTopWidth"),10)||0)-(parseInt(e(t).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top])},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"===t?1:-1,n="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"===this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i,s,n=this.options,a=t.pageX,o=t.pageY,r="absolute"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,h=/(html|body)/i.test(r[0].tagName);return"relative"!==this.cssPosition||this.scrollParent[0]!==this.document[0]&&this.scrollParent[0]!==this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset()),this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),n.grid&&(i=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1],o=this.containment?i-this.offset.click.top>=this.containment[1]&&i-this.offset.click.top<=this.containment[3]?i:i-this.offset.click.top>=this.containment[1]?i-n.grid[1]:i+n.grid[1]:i,s=this.originalPageX+Math.round((a-this.originalPageX)/n.grid[0])*n.grid[0],a=this.containment?s-this.offset.click.left>=this.containment[0]&&s-this.offset.click.left<=this.containment[2]?s:s-this.offset.click.left>=this.containment[0]?s-n.grid[0]:s+n.grid[0]:s)),{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"===this.cssPosition?-this.scrollParent.scrollTop():h?0:r.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"===this.cssPosition?-this.scrollParent.scrollLeft():h?0:r.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"===this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n===this.counter&&this.refreshPositions(!s)})},_clear:function(e,t){function i(e,t,i){return function(s){i._trigger(e,s,t._uiHash(t))}}this.reverting=!1;var s,n=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]===this.currentItem[0]){for(s in this._storedCSS)("auto"===this._storedCSS[s]||"static"===this._storedCSS[s])&&(this._storedCSS[s]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();for(this.fromOutside&&!t&&n.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev===this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent===this.currentItem.parent()[0]||t||n.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(t||(n.push(function(e){this._trigger("remove",e,this._uiHash())}),n.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),n.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer)))),s=this.containers.length-1;s>=0;s--)t||n.push(i("deactivate",this,this.containers[s])),this.containers[s].containerCache.over&&(n.push(i("out",this,this.containers[s])),this.containers[s].containerCache.over=0);if(this.storedCursor&&(this.document.find("body").css("cursor",this.storedCursor),this.storedStylesheet.remove()),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"===this._storedZIndex?"":this._storedZIndex),this.dragging=!1,t||this._trigger("beforeStop",e,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.cancelHelperRemoval||(this.helper[0]!==this.currentItem[0]&&this.helper.remove(),this.helper=null),!t){for(s=0;n.length>s;s++)n[s].call(this,e);this._trigger("stop",e,this._uiHash())}return this.fromOutside=!1,!this.cancelHelperRemoval},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}}),e.widget("ui.spinner",{version:"1.11.4",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),""!==this.value()&&this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},i=this.element;return e.each(["min","max","step"],function(e,s){var n=i.attr(s);void 0!==n&&n.length&&(t[s]=n)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.previous=this.element.val()},blur:function(e){return this.cancelBlur?(delete this.cancelBlur,void 0):(this._stop(),this._refresh(),this.previous!==this.element.val()&&this._trigger("change",e),void 0)},mousewheel:function(e,t){if(t){if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()}},"mousedown .ui-spinner-button":function(t){function i(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=s,this._delay(function(){this.previous=s}))}var s;s=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),i.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,i.call(this)}),this._start(t)!==!1&&this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){return e(t.currentTarget).hasClass("ui-state-active")?this._start(t)===!1?!1:(this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t),void 0):void 0},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(.5*e.height())&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var i=this.options,s=e.ui.keyCode;switch(t.keyCode){case s.UP:return this._repeat(null,1,t),!0;case s.DOWN:return this._repeat(null,-1,t),!0;case s.PAGE_UP:return this._repeat(null,i.page,t),!0;case s.PAGE_DOWN:return this._repeat(null,-i.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>▲</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>▼</span>"+"</a>"},_start:function(e){return this.spinning||this._trigger("start",e)!==!1?(this.counter||(this.counter=1),this.spinning=!0,!0):!1},_repeat:function(e,t,i){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,i)},e),this._spin(t*this.options.step,i)},_spin:function(e,t){var i=this.value()||0;this.counter||(this.counter=1),i=this._adjustValue(i+e*this._increment(this.counter)),this.spinning&&this._trigger("spin",t,{value:i})===!1||(this._value(i),this.counter++)},_increment:function(t){var i=this.options.incremental;return i?e.isFunction(i)?i(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return null!==this.options.min&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=""+e,i=t.indexOf(".");return-1===i?0:t.length-i-1},_adjustValue:function(e){var t,i,s=this.options;return t=null!==s.min?s.min:0,i=e-t,i=Math.round(i/s.step)*s.step,e=t+i,e=parseFloat(e.toFixed(this._precision())),null!==s.max&&e>s.max?s.max:null!==s.min&&s.min>e?s.min:e},_stop:function(e){this.spinning&&(clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e))},_setOption:function(e,t){if("culture"===e||"numberFormat"===e){var i=this._parse(this.element.val());return this.options[e]=t,this.element.val(this._format(i)),void 0}("max"===e||"min"===e||"step"===e)&&"string"==typeof t&&(t=this._parse(t)),"icons"===e&&(this.buttons.first().find(".ui-icon").removeClass(this.options.icons.up).addClass(t.up),this.buttons.last().find(".ui-icon").removeClass(this.options.icons.down).addClass(t.down)),this._super(e,t),"disabled"===e&&(this.widget().toggleClass("ui-state-disabled",!!t),this.element.prop("disabled",!!t),this.buttons.button(t?"disable":"enable"))},_setOptions:h(function(e){this._super(e)}),_parse:function(e){return"string"==typeof e&&""!==e&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),""===e||isNaN(e)?null:e},_format:function(e){return""===e?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},isValid:function(){var e=this.value();return null===e?!1:e===this._adjustValue(e)},_value:function(e,t){var i;""!==e&&(i=this._parse(e),null!==i&&(t||(i=this._adjustValue(i)),e=this._format(i))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:h(function(e){this._stepUp(e)}),_stepUp:function(e){this._start()&&(this._spin((e||1)*this.options.step),this._stop())},stepDown:h(function(e){this._stepDown(e)}),_stepDown:function(e){this._start()&&(this._spin((e||1)*-this.options.step),this._stop())},pageUp:h(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:h(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){return arguments.length?(h(this._value).call(this,e),void 0):this._parse(this.element.val())},widget:function(){return this.uiSpinner}}),e.widget("ui.tabs",{version:"1.11.4",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_isLocal:function(){var e=/#.*$/;return function(t){var i,s;t=t.cloneNode(!1),i=t.href.replace(e,""),s=location.href.replace(e,"");try{i=decodeURIComponent(i)}catch(n){}try{s=decodeURIComponent(s)}catch(n){}return t.hash.length>1&&i===s}}(),_create:function(){var t=this,i=this.options;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",i.collapsible),this._processTabs(),i.active=this._initialActive(),e.isArray(i.disabled)&&(i.disabled=e.unique(i.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return t.tabs.index(e)}))).sort()),this.active=this.options.active!==!1&&this.anchors.length?this._findActive(i.active):e(),this._refresh(),this.active.length&&this.load(i.active)},_initialActive:function(){var t=this.options.active,i=this.options.collapsible,s=location.hash.substring(1);return null===t&&(s&&this.tabs.each(function(i,n){return e(n).attr("aria-controls")===s?(t=i,!1):void 0}),null===t&&(t=this.tabs.index(this.tabs.filter(".ui-tabs-active"))),(null===t||-1===t)&&(t=this.tabs.length?0:!1)),t!==!1&&(t=this.tabs.index(this.tabs.eq(t)),-1===t&&(t=i?!1:0)),!i&&t===!1&&this.anchors.length&&(t=0),t},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var i=e(this.document[0].activeElement).closest("li"),s=this.tabs.index(i),n=!0;if(!this._handlePageNav(t)){switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:s++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:n=!1,s--;break;case e.ui.keyCode.END:s=this.anchors.length-1;break;case e.ui.keyCode.HOME:s=0;break;case e.ui.keyCode.SPACE:return t.preventDefault(),clearTimeout(this.activating),this._activate(s),void 0;case e.ui.keyCode.ENTER:return t.preventDefault(),clearTimeout(this.activating),this._activate(s===this.options.active?!1:s),void 0;default:return}t.preventDefault(),clearTimeout(this.activating),s=this._focusNextTab(s,n),t.ctrlKey||t.metaKey||(i.attr("aria-selected","false"),this.tabs.eq(s).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",s)},this.delay))}},_panelKeydown:function(t){this._handlePageNav(t)||t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){return t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP?(this._activate(this._focusNextTab(this.options.active-1,!1)),!0):t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN?(this._activate(this._focusNextTab(this.options.active+1,!0)),!0):void 0},_findNextTab:function(t,i){function s(){return t>n&&(t=0),0>t&&(t=n),t}for(var n=this.tabs.length-1;-1!==e.inArray(s(),this.options.disabled);)t=i?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){return"active"===e?(this._activate(t),void 0):"disabled"===e?(this._setupDisabled(t),void 0):(this._super(e,t),"collapsible"===e&&(this.element.toggleClass("ui-tabs-collapsible",t),t||this.options.active!==!1||this._activate(0)),"event"===e&&this._setupEvents(t),"heightStyle"===e&&this._setupHeightStyle(t),void 0)},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t=this.options,i=this.tablist.children(":has(a[href])");t.disabled=e.map(i.filter(".ui-state-disabled"),function(e){return i.index(e)}),this._processTabs(),t.active!==!1&&this.anchors.length?this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===t.disabled.length?(t.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,t.active-1),!1)):t.active=this.tabs.index(this.active):(t.active=!1,this.active=e()),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false","aria-expanded":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this,i=this.tabs,s=this.anchors,n=this.panels; +this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist").delegate("> li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(i,s){var n,a,o,r=e(s).uniqueId().attr("id"),h=e(s).closest("li"),l=h.attr("aria-controls");t._isLocal(s)?(n=s.hash,o=n.substring(1),a=t.element.find(t._sanitizeSelector(n))):(o=h.attr("aria-controls")||e({}).uniqueId()[0].id,n="#"+o,a=t.element.find(n),a.length||(a=t._createPanel(o),a.insertAfter(t.panels[i-1]||t.tablist)),a.attr("aria-live","polite")),a.length&&(t.panels=t.panels.add(a)),l&&h.data("ui-tabs-aria-controls",l),h.attr({"aria-controls":o,"aria-labelledby":r}),a.attr("aria-labelledby",r)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel"),i&&(this._off(i.not(this.tabs)),this._off(s.not(this.anchors)),this._off(n.not(this.panels)))},_getList:function(){return this.tablist||this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var i,s=0;i=this.tabs[s];s++)t===!0||-1!==e.inArray(s,t)?e(i).addClass("ui-state-disabled").attr("aria-disabled","true"):e(i).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var i={};t&&e.each(t.split(" "),function(e,t){i[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(!0,this.anchors,{click:function(e){e.preventDefault()}}),this._on(this.anchors,i),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var i,s=this.element.parent();"fill"===t?(i=s.height(),i-=this.element.outerHeight()-this.element.height(),this.element.siblings(":visible").each(function(){var t=e(this),s=t.css("position");"absolute"!==s&&"fixed"!==s&&(i-=t.outerHeight(!0))}),this.element.children().not(this.panels).each(function(){i-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,i-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):"auto"===t&&(i=0,this.panels.each(function(){i=Math.max(i,e(this).height("").height())}).height(i))},_eventHandler:function(t){var i=this.options,s=this.active,n=e(t.currentTarget),a=n.closest("li"),o=a[0]===s[0],r=o&&i.collapsible,h=r?e():this._getPanelForTab(a),l=s.length?this._getPanelForTab(s):e(),u={oldTab:s,oldPanel:l,newTab:r?e():a,newPanel:h};t.preventDefault(),a.hasClass("ui-state-disabled")||a.hasClass("ui-tabs-loading")||this.running||o&&!i.collapsible||this._trigger("beforeActivate",t,u)===!1||(i.active=r?!1:this.tabs.index(a),this.active=o?e():a,this.xhr&&this.xhr.abort(),l.length||h.length||e.error("jQuery UI Tabs: Mismatching fragment identifier."),h.length&&this.load(this.tabs.index(a),t),this._toggle(t,u))},_toggle:function(t,i){function s(){a.running=!1,a._trigger("activate",t,i)}function n(){i.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),o.length&&a.options.show?a._show(o,a.options.show,s):(o.show(),s())}var a=this,o=i.newPanel,r=i.oldPanel;this.running=!0,r.length&&this.options.hide?this._hide(r,this.options.hide,function(){i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),n()}):(i.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),r.hide(),n()),r.attr("aria-hidden","true"),i.oldTab.attr({"aria-selected":"false","aria-expanded":"false"}),o.length&&r.length?i.oldTab.attr("tabIndex",-1):o.length&&this.tabs.filter(function(){return 0===e(this).attr("tabIndex")}).attr("tabIndex",-1),o.attr("aria-hidden","false"),i.newTab.attr({"aria-selected":"true","aria-expanded":"true",tabIndex:0})},_activate:function(t){var i,s=this._findActive(t);s[0]!==this.active[0]&&(s.length||(s=this.active),i=s.find(".ui-tabs-anchor")[0],this._eventHandler({target:i,currentTarget:i,preventDefault:e.noop}))},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return"string"==typeof e&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeUniqueId(),this.tablist.unbind(this.eventNamespace),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),i=t.data("ui-tabs-aria-controls");i?t.attr("aria-controls",i).removeData("ui-tabs-aria-controls"):t.removeAttr("aria-controls")}),this.panels.show(),"content"!==this.options.heightStyle&&this.panels.css("height","")},enable:function(t){var i=this.options.disabled;i!==!1&&(void 0===t?i=!1:(t=this._getIndex(t),i=e.isArray(i)?e.map(i,function(e){return e!==t?e:null}):e.map(this.tabs,function(e,i){return i!==t?i:null})),this._setupDisabled(i))},disable:function(t){var i=this.options.disabled;if(i!==!0){if(void 0===t)i=!0;else{if(t=this._getIndex(t),-1!==e.inArray(t,i))return;i=e.isArray(i)?e.merge([t],i).sort():[t]}this._setupDisabled(i)}},load:function(t,i){t=this._getIndex(t);var s=this,n=this.tabs.eq(t),a=n.find(".ui-tabs-anchor"),o=this._getPanelForTab(n),r={tab:n,panel:o},h=function(e,t){"abort"===t&&s.panels.stop(!1,!0),n.removeClass("ui-tabs-loading"),o.removeAttr("aria-busy"),e===s.xhr&&delete s.xhr};this._isLocal(a[0])||(this.xhr=e.ajax(this._ajaxSettings(a,i,r)),this.xhr&&"canceled"!==this.xhr.statusText&&(n.addClass("ui-tabs-loading"),o.attr("aria-busy","true"),this.xhr.done(function(e,t,n){setTimeout(function(){o.html(e),s._trigger("load",i,r),h(n,t)},1)}).fail(function(e,t){setTimeout(function(){h(e,t)},1)})))},_ajaxSettings:function(t,i,s){var n=this;return{url:t.attr("href"),beforeSend:function(t,a){return n._trigger("beforeLoad",i,e.extend({jqXHR:t,ajaxSettings:a},s))}}},_getPanelForTab:function(t){var i=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+i))}}),e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("<a>").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("<div>").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("<div>").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("<div>").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})});
\ No newline at end of file diff --git a/js/jquery.jec-1.3.1.js b/js/jquery.jec-1.3.1.js new file mode 100644 index 0000000..33acd4b --- /dev/null +++ b/js/jquery.jec-1.3.1.js @@ -0,0 +1,861 @@ +/**
+ * jQuery jEC (jQuery Editable Combobox) 1.3.1
+ * http://code.google.com/p/jquery-jec
+ *
+ * Copyright (c) 2008-2009 Lukasz Rajchel (lukasz@rajchel.pl | http://rajchel.pl)
+ * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
+ * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
+ *
+ * Documentation : http://code.google.com/p/jquery-jec/wiki/Documentation
+ * Changelog : http://code.google.com/p/jquery-jec/wiki/Changelog
+ *
+ * Contributors : Lukasz Rajchel, Artem Orlov
+ */
+
+/*jslint white: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true,
+bitwise: true, regexp: true, strict: true, newcap: true, immed: true, maxerr: 50, indent: 4,
+maxlen: 100*/
+/*global Array, Math, String, clearInterval, document, jQuery, setInterval*/
+/*members ':', Handle, Remove, Set, acceptedKeys, addClass, all, append, appendTo, array, attr,
+before, bind, blinkingCursor, blinkingCursorInterval, blur, bool, browser, ceil, change, charCode,
+classes, clearCursor, click, css, cursorState, data, destroy, disable, each, editable, enable, eq,
+expr, extend, filter, find, floor, fn, focus, focusOnNewOption, fromCharCode, get, getId,
+handleCursor, ignoredKeys, ignoreOptGroups, inArray, init, initJS, integer, isArray, isPlainObject,
+jEC, jECTimer, jec, jecKill, jecOff, jecOn, jecPref, jecValue, keyCode, keyDown, keyPress,
+keyRange, keyUp, keys, length, max, maxLength, min, msie, object, openedState, optionClasses,
+optionStyles, parent, position, pref, push, random, remove, removeAttr, removeClass, removeData,
+safari, setEditableOption, styles, substring, text, trigger triggerChangeEvent, unbind, uneditable,
+useExistingOptions, val, value, valueIsEditable*/
+'use strict';
+(function ($) {
+
+ $.jEC = (function () {
+ var pluginClass = 'jecEditableOption', cursorClass = 'hasCursor', options = {},
+ values = {}, lastKeyCode, defaults, Validators, EventHandlers, Combobox,
+ activeCombobox;
+
+ defaults = {
+ position: 0,
+ ignoreOptGroups: false,
+ maxLength: 255,
+ classes: [],
+ styles: {},
+ optionClasses: [],
+ optionStyles: {},
+ triggerChangeEvent: false,
+ focusOnNewOption: false,
+ useExistingOptions: false,
+ blinkingCursor: false,
+ blinkingCursorInterval: 1000,
+ ignoredKeys: [],
+ acceptedKeys: [[32, 126], [191, 382]]
+ };
+
+ Validators = (function () {
+ return {
+ integer: function (value) {
+ return typeof value === 'number' && Math.ceil(value) === Math.floor(value);
+ },
+
+ keyRange: function (value) {
+ var min, max;
+ if (typeof value === 'object' && !$.isArray(value)) {
+ min = value.min;
+ max = value.max;
+ } else if ($.isArray(value) && value.length === 2) {
+ min = value[0];
+ max = value[1];
+ }
+ return Validators.integer(min) && Validators.integer(max) && min <= max;
+ }
+ };
+ }());
+
+ EventHandlers = (function () {
+ var getKeyCode;
+
+ getKeyCode = function (event) {
+ var charCode = event.charCode;
+ if (charCode !== undefined && charCode !== 0) {
+ return charCode;
+ } else {
+ return event.keyCode;
+ }
+ };
+
+ return {
+ // focus event handler
+ // enables blinking cursor
+ focus: function (event) {
+ var opt = options[Combobox.getId($(this))];
+ if (opt.blinkingCursor && $.jECTimer === undefined) {
+ activeCombobox = $(this);
+ $.jECTimer = setInterval($.jEC.handleCursor, opt.blinkingCursorInterval);
+ }
+ },
+
+ // blur event handler
+ // disables blinking cursor
+ blur: function (event) {
+ if ($.jECTimer !== undefined) {
+ clearInterval($.jECTimer);
+ $.jECTimer = undefined;
+ activeCombobox = undefined;
+ Combobox.clearCursor($(this));
+ }
+ Combobox.openedState($(this), false);
+ },
+
+ // keydown event handler
+ // handles keys pressed on select (backspace and delete must be handled
+ // in keydown event in order to work in IE)
+ keyDown: function (event) {
+ var keyCode = getKeyCode(event), option, value;
+
+ lastKeyCode = keyCode;
+
+ switch (keyCode) {
+ case 8: // backspace
+ case 46: // delete
+ option = $(this).find('option.' + pluginClass);
+ if (option.val().length >= 1) {
+ value = option.text().substring(0, option.text().length - 1);
+ option.val(value).text(value).prop('selected', true);
+ }
+ return (keyCode !== 8);
+ default:
+ break;
+ }
+ },
+
+ // keypress event handler
+ // handles the rest of the keys (keypress event gives more informations
+ // about pressed keys)
+ keyPress: function (event) {
+ var keyCode = getKeyCode(event), opt = options[Combobox.getId($(this))],
+ option, value, specialKeys, exit = false, text;
+
+ Combobox.clearCursor($(this));
+ if (keyCode !== 9 && keyCode !== 13 && keyCode !== 27) {
+ // special keys codes
+ specialKeys = [37, 38, 39, 40, 46];
+ // handle special keys
+ $.each(specialKeys, function (i, val) {
+ if (keyCode === val && keyCode === lastKeyCode) {
+ exit = true;
+ }
+ });
+
+ // don't handle ignored keys
+ if (!exit && $.inArray(keyCode, opt.ignoredKeys) === -1) {
+
+ // remove selection from all options
+ $(this).find('option:selected').prop('selected',false);
+
+ if ($.inArray(keyCode, opt.acceptedKeys) !== -1) {
+ option = $(this).find('option.' + pluginClass).first();
+ text = option.text();
+
+ if (text.length < opt.maxLength) {
+ value = text + String.fromCharCode(keyCode);
+ option.val(value).text(value).attr('label',value);
+ }
+
+ option.prop('selected', true);
+ }
+ }
+
+ return false;
+ }
+ },
+
+ keyUp: function (event) {
+ var opt = options[Combobox.getId($(this))];
+ if (opt.triggerChangeEvent) {
+ $(this).trigger('change');
+ }
+ },
+
+ // change event handler
+ // handles editable option changing based on a pre-existing values
+ change: function () {
+ var opt = options[Combobox.getId($(this))];
+ if (opt.useExistingOptions) {
+ Combobox.setEditableOption($(this));
+ }
+ },
+
+ click: function () {
+ if (!$.browser.safari) {
+ Combobox.openedState($(this), !Combobox.openedState($(this)));
+ }
+ }
+ };
+ }());
+
+ // Combobox
+ Combobox = (function () {
+ var Parameters, EditableOption, generateId, setup;
+
+ // validates and set combobox parameters
+ Parameters = (function () {
+ var Set, Remove, Handle;
+
+ Set = (function () {
+ var parseKeys, Handles;
+
+ parseKeys = function (value) {
+ var keys = [];
+ if ($.isArray(value)) {
+ $.each(value, function (i, val) {
+ var j, min, max;
+ if (Validators.keyRange(val)) {
+ if ($.isArray(val)) {
+ min = val[0];
+ max = val[1];
+ } else {
+ min = val.min;
+ max = val.max;
+ }
+ for (j = min; j <= max; j += 1) {
+ keys.push(j);
+ }
+ } else if (typeof val === 'number' && Validators.integer(val)) {
+ keys.push(val);
+ }
+ });
+ }
+ return keys;
+ };
+
+ Handles = (function () {
+ return {
+ integer: function (elem, name, value) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && Validators.integer(value)) {
+ opt[name] = value;
+ return true;
+ }
+ return false;
+ },
+ bool: function (elem, name, value) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && typeof value === 'boolean') {
+ opt[name] = value;
+ return true;
+ }
+ return false;
+ },
+ array: function (elem, name, value) {
+ if (typeof value === 'string') {
+ value = [value];
+ }
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && $.isArray(value)) {
+ opt[name] = value;
+ return true;
+ }
+ return false;
+ },
+ object: function (elem, name, value) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && value !== null &&
+ typeof value === 'object' && !$.isArray(value)) {
+ opt[name] = value;
+ }
+ },
+ keys: function (elem, name, value) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && $.isArray(value)) {
+ opt[name] = parseKeys(value);
+ }
+ }
+ };
+ }());
+
+ return {
+ position: function (elem, value) {
+ if (Handles.integer(elem, 'position', value)) {
+ var id = Combobox.getId(elem), opt = options[id], optionsCount;
+ optionsCount =
+ elem.find('option:not(.' + pluginClass + ')').length;
+ if (value > optionsCount) {
+ opt.position = optionsCount;
+ }
+ }
+ },
+
+ ignoreOptGroups: function (elem, value) {
+ Handles.bool(elem, 'ignoreOptGroups', value);
+ },
+
+ maxLength: function (elem, value) {
+ if (Handles.integer(elem, 'maxLength', value)) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (value < 0 || value > 255) {
+ opt.maxLength = 255;
+ }
+ }
+ },
+
+ classes: function (elem, value) {
+ Handles.array(elem, 'classes', value);
+ },
+
+ optionClasses: function (elem, value) {
+ Handles.array(elem, 'optionClasses', value);
+ },
+
+ styles: function (elem, value) {
+ Handles.object(elem, 'styles', value);
+ },
+
+ optionStyles: function (elem, value) {
+ Handles.object(elem, 'optionStyles', value);
+ },
+
+ triggerChangeEvent: function (elem, value) {
+ Handles.bool(elem, 'triggerChangeEvent', value);
+ },
+
+ focusOnNewOption: function (elem, value) {
+ Handles.bool(elem, 'focusOnNewOption', value);
+ },
+
+ useExistingOptions: function (elem, value) {
+ Handles.bool(elem, 'useExistingOptions', value);
+ },
+
+ blinkingCursor: function (elem, value) {
+ Handles.bool(elem, 'blinkingCursor', value);
+ },
+
+ blinkingCursorInterval: function (elem, value) {
+ Handles.integer(elem, 'blinkingCursorInterval', value);
+ },
+
+ ignoredKeys: function (elem, value) {
+ Handles.keys(elem, 'ignoredKeys', value);
+ },
+
+ acceptedKeys: function (elem, value) {
+ Handles.keys(elem, 'acceptedKeys', value);
+ }
+ };
+ }());
+
+ Remove = (function () {
+ var removeClasses, removeStyles;
+
+ removeClasses = function (elem, classes) {
+ $.each(classes, function (i, val) {
+ elem.removeClass(val);
+ });
+ };
+
+ removeStyles = function (elem, styles) {
+ $.each(styles, function (key, val) {
+ elem.css(key, '');
+ });
+ };
+
+ return {
+ classes: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ removeClasses(elem, opt.classes);
+ }
+ },
+
+ optionClasses: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ removeClasses(elem.find('option.' + pluginClass),
+ opt.optionClasses);
+ }
+ },
+
+ styles: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ removeStyles(elem, opt.styles);
+ }
+ },
+
+ optionStyles: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ removeStyles(elem.find('option.' + pluginClass),
+ opt.optionStyles);
+ }
+ },
+
+ all: function (elem) {
+ Remove.classes(elem);
+ Remove.optionClasses(elem);
+ Remove.styles(elem);
+ Remove.optionStyles(elem);
+ }
+ };
+ }());
+
+ Handle = (function () {
+ var setClasses, setStyles;
+
+ setClasses = function (elem, classes) {
+ $.each(classes, function (i, val) {
+ elem.addClass(val);
+ });
+ };
+
+ setStyles = function (elem, styles) {
+ $.each(styles, function (key, val) {
+ elem.css(key, val);
+ });
+ };
+
+ return {
+ position: function (elem) {
+ var opt = options[Combobox.getId(elem)], option, uneditableOptions,
+ container;
+ option = elem.find('option.' + pluginClass);
+
+ uneditableOptions = elem.find('option:not(.' + pluginClass + ')');
+ if (opt.position < uneditableOptions.length) {
+ container = uneditableOptions.eq(opt.position);
+
+ if (!opt.ignoreOptGroups &&
+ container.parent('optgroup').length > 0) {
+ uneditableOptions.eq(opt.position).parent().before(option);
+ } else {
+ uneditableOptions.eq(opt.position).before(option);
+ }
+ } else {
+ elem.append(option);
+ }
+ },
+
+ classes: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ setClasses(elem, opt.classes);
+ }
+ },
+
+ optionClasses: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ setClasses(elem.find('option.' + pluginClass),
+ opt.optionClasses);
+ }
+ },
+
+ styles: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ setStyles(elem, opt.styles);
+ }
+ },
+
+ optionStyles: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined) {
+ setStyles(elem.find('option.' + pluginClass),
+ opt.optionStyles);
+ }
+ },
+
+ focusOnNewOption: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && opt.focusOnNewOption) {
+ elem.find('option.' + pluginClass)
+ .prop('selected', true);
+ }
+ },
+
+ useExistingOptions: function (elem) {
+ var id = Combobox.getId(elem), opt = options[id];
+ if (opt !== undefined && opt.useExistingOptions) {
+ Combobox.setEditableOption(elem);
+ }
+ },
+
+ all: function (elem) {
+ Handle.position(elem);
+ Handle.classes(elem);
+ Handle.optionClasses(elem);
+ Handle.styles(elem);
+ Handle.optionStyles(elem);
+ Handle.focusOnNewOption(elem);
+ Handle.useExistingOptions(elem);
+ }
+ };
+ }());
+
+ return {
+ Set: Set,
+ Remove: Remove,
+ Handle: Handle
+ };
+ }());
+
+ EditableOption = (function () {
+ return {
+ init: function (elem) {
+ if (!elem.find('option.' + pluginClass).length) {
+ var editableOption = $('<option>');
+ editableOption.addClass(pluginClass);
+ elem.append(editableOption);
+ }
+
+ elem.on('keydown', EventHandlers.keyDown);
+ elem.on('keypress', EventHandlers.keyPress);
+ elem.on('keyup', EventHandlers.keyUp);
+ elem.on('change', EventHandlers.change);
+ elem.on('focus', EventHandlers.focus);
+ elem.on('blur', EventHandlers.blur);
+ elem.on('click', EventHandlers.click);
+ },
+
+ destroy: function (elem) {
+ elem.find('option.' + pluginClass).remove();
+ elem.off('keydown', EventHandlers.keyDown);
+ elem.off('keypress', EventHandlers.keyPress);
+ elem.off('keyup', EventHandlers.keyUp);
+ elem.off('change', EventHandlers.change);
+ elem.off('focus', EventHandlers.focus);
+ elem.off('blur', EventHandlers.blur);
+ elem.off('click', EventHandlers.click);
+ }
+ };
+ }());
+
+ // generates unique identifier
+ generateId = function () {
+ while (true) {
+ var random = Math.floor(Math.random() * 100000);
+
+ if (options[random] === undefined) {
+ return random;
+ }
+ }
+ };
+
+ // sets combobox
+ setup = function (elem) {
+ EditableOption.init(elem);
+ Parameters.Handle.all(elem);
+ };
+
+ // Combobox public members
+ return {
+ // create editable combobox
+ init: function (settings) {
+ return $(this).filter(':uneditable').each(function () {
+
+ var id = generateId(), elem = $(this);
+
+ elem.data('jecId', id);
+
+ // override passed default options
+ options[id] = $.extend(true, {}, defaults);
+
+ // parse keys
+ Parameters.Set.ignoredKeys(elem, options[id].ignoredKeys);
+ Parameters.Set.acceptedKeys(elem, options[id].acceptedKeys);
+
+ if (typeof settings === 'object' && !$.isArray(settings)) {
+ $.each(settings, function (key, val) {
+ if (val !== undefined) {
+ switch (key) {
+ case 'position':
+ Parameters.Set.position(elem, val);
+ break;
+ case 'ignoreOptGroups':
+ Parameters.Set.ignoreOptGroups(elem, val);
+ break;
+ case 'maxLength':
+ Parameters.Set.maxLength(elem, val);
+ break;
+ case 'classes':
+ Parameters.Set.classes(elem, val);
+ break;
+ case 'optionClasses':
+ Parameters.Set.optionClasses(elem, val);
+ break;
+ case 'styles':
+ Parameters.Set.styles(elem, val);
+ break;
+ case 'optionStyles':
+ Parameters.Set.optionStyles(elem, val);
+ break;
+ case 'triggerChangeEvent':
+ Parameters.Set.triggerChangeEvent(elem, val);
+ break;
+ case 'focusOnNewOption':
+ Parameters.Set.focusOnNewOption(elem, val);
+ break;
+ case 'useExistingOptions':
+ Parameters.Set.useExistingOptions(elem, val);
+ break;
+ case 'blinkingCursor':
+ Parameters.Set.blinkingCursor(elem, val);
+ break;
+ case 'blinkingCursorInterval':
+ Parameters.Set.blinkingCursorInterval(elem, val);
+ break;
+ case 'ignoredKeys':
+ Parameters.Set.ignoredKeys(elem, val);
+ break;
+ case 'acceptedKeys':
+ Parameters.Set.acceptedKeys(elem, val);
+ break;
+ }
+ }
+ });
+ }
+
+ setup($(this));
+ });
+ },
+
+ // creates editable combobox without using existing select elements
+ initJS: function (options, settings) {
+ var select, addOptions;
+
+ select = $('<select>');
+
+ addOptions = function (elem, options) {
+ if ($.isArray(options)) {
+ $.each(options, function (i, val) {
+ if ($.isPlainObject(val)) {
+ $.each(val, function (key, value) {
+ if ($.isArray(value)) {
+ var og = $('<optgroup>').attr('label', key);
+ addOptions(og, value);
+ og.appendTo(select);
+ } else if (typeof value === 'number' ||
+ typeof value === 'string') {
+ $('<option>').text(value).prop('value', key)
+ .appendTo(elem);
+ }
+ });
+ } else if (typeof val === 'string' || typeof val === 'number') {
+ $('<option>').text(val).prop('value', val).appendTo(elem);
+ }
+ });
+ }
+ };
+
+ addOptions(select, options);
+
+ return select.jec(settings);
+ },
+
+ // destroys editable combobox
+ destroy: function () {
+ return $(this).filter(':editable').each(function () {
+ $(this).jecOff();
+ $.removeData($(this).get(0), 'jecId');
+ $.removeData($(this).get(0), 'jecCursorState');
+ $.removeData($(this).get(0), 'jecOpenedState');
+ });
+ },
+
+ // enable editablecombobox
+ enable: function () {
+ return $(this).filter(':editable').each(function () {
+ var id = Combobox.getId($(this)), value = values[id];
+
+ setup($(this));
+
+ if (value !== undefined) {
+ $(this).jecValue(value);
+ }
+ });
+ },
+
+ // disable editable combobox
+ disable: function () {
+ return $(this).filter(':editable').each(function () {
+ var val = $(this).find('option.' + pluginClass).val();
+ values[Combobox.getId($(this))] = val;
+ Parameters.Remove.all($(this));
+ EditableOption.destroy($(this));
+ });
+ },
+
+ // gets or sets editable option's value
+ value: function (value, setFocus) {
+ if ($(this).filter(':editable').length > 0) {
+ if (value === null || value === undefined) {
+ // get value
+ return $(this).find('option.' + pluginClass).val();
+ } else if (typeof value === 'string' || typeof value === 'number') {
+ // set value
+ return $(this).filter(':editable').each(function () {
+ var option = $(this).find('option.' + pluginClass);
+ option.val(value).text(value);
+ if (typeof setFocus !== 'boolean' || setFocus) {
+ option.prop('selected', true);
+ }
+ });
+ }
+ }
+ },
+
+ // gets or sets editable option's preference
+ pref: function (name, value) {
+ if ($(this).filter(':editable').length > 0) {
+ if (typeof name === 'string') {
+ if (value === null || value === undefined) {
+ // get preference
+ return options[Combobox.getId($(this))][name];
+ } else {
+ // set preference
+ return $(this).filter(':editable').each(function () {
+ switch (name) {
+ case 'position':
+ Parameters.Set.position($(this), value);
+ Parameters.Handle.position($(this));
+ break;
+ case 'classes':
+ Parameters.Remove.classes($(this));
+ Parameters.Set.classes($(this), value);
+ Parameters.Handle.position($(this));
+ break;
+ case 'optionClasses':
+ Parameters.Remove.optionClasses($(this));
+ Parameters.Set.optionClasses($(this), value);
+ Parameters.Set.optionClasses($(this));
+ break;
+ case 'styles':
+ Parameters.Remove.styles($(this));
+ Parameters.Set.styles($(this), value);
+ Parameters.Set.styles($(this));
+ break;
+ case 'optionStyles':
+ Parameters.Remove.optionStyles($(this));
+ Parameters.Set.optionStyles($(this), value);
+ Parameters.Handle.optionStyles($(this));
+ break;
+ case 'focusOnNewOption':
+ Parameters.Set.focusOnNewOption($(this), value);
+ Parameters.Handle.focusOnNewOption($(this));
+ break;
+ case 'useExistingOptions':
+ Parameters.Set.useExistingOptions($(this), value);
+ Parameters.Handle.useExistingOptions($(this));
+ break;
+ case 'blinkingCursor':
+ Parameters.Set.blinkingCursor($(this), value);
+ break;
+ case 'blinkingCursorInterval':
+ Parameters.Set.blinkingCursorInterval($(this), value);
+ break;
+ case 'ignoredKeys':
+ Parameters.Set.ignoredKeys($(this), value);
+ break;
+ case 'acceptedKeys':
+ Parameters.Set.acceptedKeys($(this), value);
+ break;
+ }
+ });
+ }
+ }
+ }
+ },
+
+ // sets editable option to the value of currently selected option
+ setEditableOption: function (elem) {
+ var value = elem.find('option:selected').text();
+ elem.find('option.' + pluginClass).prop('value', elem.val())
+ .text(value).prop('selected', true);
+ },
+
+ // get combobox id
+ getId: function (elem) {
+ return elem.data('jecId');
+ },
+
+ valueIsEditable: function (elem) {
+ return elem.find('option.' + pluginClass).get(0) ===
+ elem.find('option:selected').get(0);
+ },
+
+ clearCursor: function (elem) {
+ $(elem).find('option.' + cursorClass).each(function () {
+ var text = $(this).text();
+ $(this).removeClass(cursorClass).text(text.substring(0, text.length - 1));
+ });
+ },
+
+ cursorState: function (elem, state) {
+ return elem.data('jecCursorState', state);
+ },
+
+ openedState: function (elem, state) {
+ return elem.data('jecOpenedState', state);
+ },
+
+ //handles editable cursor
+ handleCursor: function () {
+ if (activeCombobox !== undefined && activeCombobox !== null) {
+ if ($.browser.msie && Combobox.openedState(activeCombobox)) {
+ return;
+ }
+
+ var state = Combobox.cursorState(activeCombobox), elem;
+ if (state) {
+ Combobox.clearCursor(activeCombobox);
+ } else if (Combobox.valueIsEditable(activeCombobox)) {
+ elem = activeCombobox.find('option:selected');
+ elem.addClass(cursorClass).text(elem.text() + '|');
+ }
+ Combobox.cursorState(activeCombobox, !state);
+ }
+ }
+ };
+ }());
+
+ // jEC public members
+ return {
+ init: Combobox.init,
+ enable: Combobox.enable,
+ disable: Combobox.disable,
+ destroy: Combobox.destroy,
+ value: Combobox.value,
+ pref: Combobox.pref,
+ initJS: Combobox.initJS,
+ handleCursor: Combobox.handleCursor
+ };
+ }());
+
+ // register functions
+ $.fn.extend({
+ jec: $.jEC.init,
+ jecOn: $.jEC.enable,
+ jecOff: $.jEC.disable,
+ jecKill: $.jEC.destroy,
+ jecValue: $.jEC.value,
+ jecPref: $.jEC.pref
+ });
+
+ $.extend({
+ jec: $.jEC.initJS
+ });
+
+ // register selectors
+ $.extend($.expr[':'], {
+ editable: function (a) {
+ var data = $(a).data('jecId');
+ return data !== null && data !== undefined;
+ },
+
+ uneditable: function (a) {
+ var data = $(a).data('jecId');
+ return data === null || data === undefined;
+ }
+ });
+
+}(jQuery));
\ No newline at end of file diff --git a/js/jquery.projectPlugins.js b/js/jquery.projectPlugins.js new file mode 100644 index 0000000..1386b2f --- /dev/null +++ b/js/jquery.projectPlugins.js @@ -0,0 +1,972 @@ +/** + * @fileOverview Misc jQuery plugins maintained by the phpVirtualBox project for + * the phpVirtualBox project. These are either solely authored by + * the project or so heavily modified that they can no longer be + * separately maintained + * @author Ian Moore (imoore76 at yahoo dot com) + * @version $Id: jquery.projectPlugins.js 595 2015-04-17 09:50:36Z imoore76 $ + * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com) + * + */ + +/** + * Override _title method of dialog to accept HTML + * + * http://stackoverflow.com/questions/14488774/using-html-in-a-dialogs-title-in-jquery-ui-1-10 + */ +$.widget("ui.dialog", $.extend({}, $.ui.dialog.prototype, { + _title: function(title) { + title.html(this.options.title ? this.options.title : " "); + } +})); +/** + * Adds deprecated enable/disableSelection to jquery. + * + * Taken from jQuery source. + * + */ +$.support.selectstart = "onselectstart" in document.createElement( "div" ); + +$.fn.extend({ + disableSelection: function() { + return this.on( ( $.support.selectstart ? "selectstart" : "mousedown" ) + + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }, + + enableSelection: function() { + return this.off( ".ui-disableSelection" ); + } +}); + +/** + * + * Add hover and hoverClass functionality to jquery + * + */ + +(function($) { + + + /* Mimic jquery hover function deprecated in jquery 1.9 */ + $.fn.hover = function(onenter, onleave) { + + this.each(function() { + $(this).on("mouseenter", onenter).on("mouseleave", onleave); + }); + + return $(this); + + } + + /* Add / remove class onmouseenter/leave */ + $.fn.hoverClass = function(hclass) { + + this.each(function() { + $(this).on("mouseenter",function(){ + $(this).addClass(hclass); + }).on("mouseleave", function(){ + $(this).removeClass(hclass); + }); + }); + + return $(this); + + } + +})(jQuery); + + + +/** + * Restore jQuery.browser functionality. Taken from: + * + * https://github.com/jquery/jquery-migrate/blob/master/src/core.js + * + */ +jQuery.uaMatch = function( ua ) { + + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || + /(webkit)[ \/]([\w.]+)/.exec( ua ) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || + /(msie) ([\w.]+)/.exec( ua ) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; +}; + +// Don't clobber any existing jQuery.browser in case it's different +if ( !jQuery.browser ) { + matched = jQuery.uaMatch( navigator.userAgent ); + browser = {}; + + if ( matched.browser ) { + browser[ matched.browser ] = true; + browser.version = matched.version; + } + + // Chrome is Webkit, but Webkit is also Safari. + if ( browser.chrome ) { + browser.webkit = true; + } else if ( browser.webkit ) { + browser.safari = true; + } + + jQuery.browser = browser; +} + + +/** + * Modified version of http://archive.plugins.jquery.com/project/TextFill + */ +;(function($) { + $.fn.textFill = function(options) { + + var maxFontSize = options.maxFontPixels; + var maxHeight = parseInt(options.height); + var maxWidth = parseInt(options.width); + + var ourText = $(this); + + var fontSize = parseInt(ourText.css('font-size')); + var fontSizeOrig = fontSize; + var textHeight = $(ourText).outerHeight(true); + var textWidth = $(ourText).outerWidth(true); + + do { + ourText.css('font-size', fontSize++); + textHeight = $(ourText).outerHeight(true); + textWidth = $(ourText).outerWidth(true); + + } while(textHeight <= maxHeight && textWidth <= maxWidth && fontSize <= maxFontSize); + + fontSize--; + return ourText.css({'font-size':(fontSize)+'px','top':(fontSize > fontSizeOrig ? '-1' : '0') + 'px'}); + }; +})(jQuery); + + + +/** + * + * phpVirtualBox tree view for snapshots + * + */ + +(function($) { + + + $.fn.vbtree = function(options, toplevel) { + + if(!toplevel) + var toplevel = this; + + this.each(function() { + + $(this).addClass('vboxTreeView').children('li').each(function(i,li){ + + // Change class + ///////////////////// + var children = $(li).children('ul').length; + var last = !$(this).next().is('li'); + var classadd = null; + + // Children and last + if(children && !last) { + classadd = 'collapsable'; + // Children but no last + } else if(children && last) { + classadd = 'lastCollapsable'; + } else if(!children && last) { + classadd = 'last'; + } + $(li).addClass(classadd); + + // Insert hitarea + var d = document.createElement('div'); + $(d).addClass('hitarea').addClass((classadd ? classadd + '-hitarea' : '')).click(function(){ + + if(!$(this).data('toggleClicked')) { + + $(this).data('toggleClicked', true); + + if($(this).hasClass('last-hitarea')) return; + if($(this).hasClass('lastCollapsable-hitarea')) + $(this).addClass('lastExpandable-hitarea').removeClass('lastCollapsable-hitarea').parent().parent().children('ul').css({'display':'none'}); + else + $(this).addClass('expandable-hitarea').removeClass('collapsable-hitarea').parent().parent().children('ul').css({'display':'none'}); + + } else { + + $(this).data('toggleClicked', false); + + if($(this).hasClass('last-hitarea')) return; + if($(this).hasClass('lastExpandable-hitarea')) + $(this).addClass('lastCollapsable-hitarea').removeClass('lastExpandable-hitarea').parent().parent().children('ul').css({'display':''}); + else + $(this).addClass('collapsable-hitarea').removeClass('expandable-hitarea').parent().parent().children('ul').css({'display':''}); + } + + return false; + }); + + $(li).children('div').first().prepend(d); + + // Tree each UL under li one + $(li).children('ul').vbtree({},toplevel); + + + }); + + }); + + return this; + + }; + +})(jQuery); + +/** + * + * phpVirtualBox medium (disk / CD image etc.) select box + * + * Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com) + * + */ + +(function($) { + + $.fn.mediumselect = function(options) { + + /* Public access to select medium */ + if(options.selectMedium) { + $('#'+$(this).attr('id')+'-mediumselect-'+options.selectMedium).click(); + return; + } + + /* Defaults */ + if(!options.type) options.type = 'HardDisk'; + if(!options.media) options.media = []; + + /* Internal Select Medium */ + function _selectmedium(d,sel) { + + if($(d).hasClass('vboxMediumReadOnly')) { + $(sel).addClass('vboxMediumSelectReadOnly').addClass('vboxMediumReadOnly'); + } else { + $(sel).removeClass('vboxMediumSelectReadOnly').removeClass('vboxMediumReadOnly'); + } + + // Set text + $(sel).html(($(d).data('label') ? $(d).data('label') : '')); + + // Hide list + $('#'+$(sel).attr('id')+'-list').hide(); + + // Set hidden select box value and + // trigger change + var old = $('#'+$(sel).data('origId')); + $(old).val($(d).data('id')); + $(old).trigger('change',old); + + + } + + + + /* Generate and return list item */ + function listItem(m,sel,old,children) { + + var li = document.createElement('li'); + + + var d = document.createElement('div'); + d.setAttribute('id',$(sel).attr('id')+'-'+m.attachedId); + + var opt = $(old).children('option[value='+m.attachedId+']'); + + if($(opt).hasClass('vboxMediumReadOnly')) { + $(d).addClass('vboxMediumReadOnly'); + $(li).addClass('vboxMediumReadOnly'); + } + + if($(opt).attr('title')) { + $(d).attr('title',$(opt).attr('title')); + $(d).tipped({'source':'title'}); + } + + $(d).addClass('vboxMediumSelectDiv').on("mouseenter",function(){$(this).addClass('vboxMediumSelectHover');}).on("mouseleave",function(){$(this).removeClass('vboxMediumSelectHover');}); + $(d).html(m.label); + $(d).data('label',m.label); + $(d).data('id',m.attachedId); + + $(d).click(function(){_selectmedium(this,sel);}); + + $(li).append(d); + + // Traverse children + if(children && m.children && m.children.length) { + var ul = document.createElement('ul'); + for(var c = 0; c < m.children.length; c++) { + $(ul).append(listItem(m.children[c],sel,old,true)); + } + $(li).append(ul); + } + + return li; + } + + /* Show list */ + function showList(sel) { + + var list = $('#'+$(sel).attr('id')+'-list'); + var sTop = $(sel).offset().top + $(sel).outerHeight(); + var sLeft = $(sel).offset().left; + var sWidth = $(sel).outerWidth() + $(sel).closest('table').find('.vboxMediumSelectImg').outerWidth(); + + // Hide menu when clicking anywhere else + $(document).one('click',function(){$(list).hide();}); + + $(list).css({'left':sLeft+'px','top':sTop+'px','min-width':sWidth}).show(); + + return false; + + } + + /* + * Main + */ + this.each(function() { + + // Generate select box replacement + if(!$('#'+$(this).attr('id')+'-mediumselect').attr('id')) { + + var sel = document.createElement('div'); + $(sel).data('origId', $(this).attr('id')); + $(sel).attr('id',$(this).attr('id')+'-mediumselect'); + $(sel).attr('class','vboxMediumSelect'); + $(sel).on('click',function(){ + if($('#'+$(this).data('origId')+'-table').hasClass('vboxDisabled')) return; + return showList(this); + }); + + $(this).hide(); + + var img = document.createElement('div'); + img.setAttribute('id',$(this).attr('id')+'-mediumselectimg'); + img.setAttribute('class','vboxMediumSelectImg'); + $(img).click(function(e){ + $(e.target).closest('table').find('div.vboxMediumSelect').trigger('click'); + return false; + }); + + var tbl = document.createElement('table'); + $(tbl).attr('id',$(this).attr('id')+'-table'); + $(tbl).attr('class','vboxMediumSelect'); + $(tbl).css({'padding':'0px','margin':'0px','border':'0px','width':'100%','border-spacing':'0px'}); + var tr = document.createElement('tr'); + var td = document.createElement('td'); + $(td).attr({'class':'vboxMediumSelectTableLeft'}).css({'padding':'0px','margin':'0px','width':'100%'}); + $(td).append(sel); + $(tr).append(td); + var td = document.createElement('td'); + $(td).attr({'class':'vboxMediumSelectTableRight'}).css({'padding':'0px','margin':'0px','width':'auto'}); + $(td).append(img); + $(tr).append(td); + $(tbl).append(tr); + + // Handle enabled / disabled + $(tbl).on('enable',function(){ + $(this).removeClass('vboxDisabled'); + }).on('disable',function(){ + $(this).addClass('vboxDisabled'); + }); + + $(this).before(tbl); + + + var list = document.createElement('ul'); + $(list).attr('id',$(this).attr('id')+'-mediumselect-list'); + $(list).attr('class', 'vboxMediumSelect'); + $(list).css({'display':'none'}); + + $('#vboxPane').append(list); + } + + // Hide list if it exists + $('#'+$(this).attr('id')+'-mediumselect-list').hide(); + + $('#'+$(this).attr('id')+'-mediumselectimg').css({'background-image':'url(images/downArrow.png)'}); + + // Compile list + var list = $('#'+$(this).attr('id')+'-mediumselect-list'); + $(list).children().remove(); + + var sel = $('#'+$(this).attr('id')+'-mediumselect'); + var old = this; + + for(var i = 0; i < options.media.length; i++) { + if(options.media[i].base && options.media[i].id != options.media[i].base) continue; + $(list).append(listItem(options.media[i],sel,old,options.showdiff)); + } + + // Set initial text and styles + var oldopt = $(this).children('option:eq('+Math.max($(this).prop('selectedIndex'),0)+')'); + + if(!$(oldopt).val()) { + _selectmedium($(list).find('div').first(), sel, old); + } else { + _selectmedium($('#'+$(sel).attr('id')+'-'+$(oldopt).val()), sel, old); + } + }); // </ .each() > + + return this; + + }; // </mediumselect()> + +})(jQuery); + + +//jQuery File Tree Plugin +// +// Version 1.01 +// +// Cory S.N. LaViska +// A Beautiful Site (http://abeautifulsite.net/) +// 24 March 2008 +// +// Visit http://abeautifulsite.net/notebook.php?article=58 for more information +// +// Usage: $('.fileTreeDemo').fileTree( options, callback ) +// +// Options: root - root folder to display; default = / +// script - location of the serverside AJAX file to use; default = jqueryFileTree.php +// folderEvent - event to trigger expand/collapse; default = click +// expandSpeed - default = 500 (ms); use -1 for no animation +// collapseSpeed - default = 500 (ms); use -1 for no animation +// expandEasing - easing function to use on expand (optional) +// collapseEasing - easing function to use on collapse (optional) +// multiFolder - whether or not to limit the browser to one subfolder at a time +// loadMessage - Message to display while initial tree loads (can be HTML) +// +// History: +// +// 1.01 - updated to work with foreign characters in directory/file names (12 April 2008) +// 1.00 - released (24 March 2008) +// +// TERMS OF USE +// +// This plugin is dual-licensed under the GNU General Public License and the MIT License and +// is copyright 2008 A Beautiful Site, LLC. +// +// 2010-05-12 - Modified by Ian Moore for phpVirtualBox +// +// +if(jQuery) (function($){ + + $.extend($.fn, { + fileTree: function(o, h) { + // Defaults + if( !o ) var o = {}; + if( o.root == undefined ) o.root = '/'; + if( o.script == undefined ) o.script = vboxEndpointConfig.filebrowser; + if( o.expandSpeed == undefined ) o.expandSpeed= 500; + if( o.collapseSpeed == undefined ) o.collapseSpeed= 500; + if( o.expandEasing == undefined ) o.expandEasing = null; + if( o.collapseEasing == undefined ) o.collapseEasing = null; + if( o.multiFolder == undefined ) o.multiFolder = true; + if( o.loadMessage == undefined ) o.loadMessage = trans('Loading ...','UIVMDesktop'); + if( o.scrollTo == undefined ) o.scrollTo = null; + if( o.dirsOnly == undefined) o.dirsOnly = false; + + var top = this; + + $(this).each( function() { + + function showTree(c, t, fullpath) { + + // If a UL is not the target, find or create it + if($(c).prop('tagName') != 'UL') { + var target = $(c).children('UL').first(); + if(target.length) { + c = $(target); + } else { + var rootList = $('<ul />').addClass("jqueryFileTree"); + $(c).append(rootList); + c = rootList; + } + } + + // If data is already loaded, just show it + if($(c).children().length) { + $(c).slideDown({ duration: o.expandSpeed, easing: o.expandEasing }); + return; + } + + $(c).append($('<li />').addClass("wait").text(o.loadMessage)); + + $.post(o.script, JSON.stringify({ 'dir': t, 'dirsOnly' : (o.dirsOnly ? true : false), 'fullpath' : (fullpath ? true : false)}), function(data) { + + $(c).children('.wait').remove(); + $(c).append(toHTML(data)); + + if(o.scrollTo) { + var sto = $(o.scrollTo).find('a.vboxListItemSelected').first(); + if(sto.length) { + $(o.scrollTo).scrollTo($(sto),{'axis':'y','offset':{'top':-15}}); + } + } + bindTree(c); + + }, "json"); + } + + function folderElement(data) { + return $('<li/>').addClass("folder") + .addClass(data.expanded ? 'expanded' : 'collapsed') + .addClass('vboxListItem') + .addClass(data.selected ? 'vboxListItemSelected' : '') + .append( + $('<a/>').attr({'href':'#','name':data.path,'rel':data.path}).text(data.name) + ); + } + + function fileElement(data) { + return $('<li/>').addClass('file file_' + data.ext +' vboxListItem') + .append( + $('<a/>').attr({'href':'#','name':data.path,'rel':data.path}).text(data.name) + ); + } + function toHTML(data) { + + data.sort(function(a,b){ + if(a.type == b.type) + return strnatcasecmp(a.path, b.path); + + return a.type == 'folder' ? 1 : -1 + }); + + var elms = []; + for(var i = 0; i < data.length; i++) { + + // Folder + if(data[i].type == 'folder') { + var direlm = folderElement(data[i]); + if(data[i].expanded) { + var listelm = $('<ul/>').addClass('jqueryFileTree'); + var children = toHTML(data[i].children); + for(var a = 0; a < children.length; a++) { + $(listelm).append(children[a]); + } + $(direlm).append(listelm); + } + elms.push(direlm); + + + // File + } else { + elms.push(fileElement(data[i])); + } + } + return elms; + } + + function bindTree(t) { + // Expand / collapse + $(t).find('LI A').on('dblclick', function(e) { + e.preventDefault(); + // Folder + if( $(this).parent().hasClass('folder') ) { + + // Is collapsed. Expand + if( $(this).parent().hasClass('collapsed') ) { + // Expand + if( !o.multiFolder ) { + $(top).find('UL').slideUp({ duration: o.collapseSpeed, easing: o.collapseEasing }) + $(top).find('LI.folder').removeClass('expanded').addClass('collapsed'); + } + $(this).parent().removeClass('collapsed').addClass('expanded'); + showTree( $(this).parent(), $(this).attr('name') ); + + // Is expanded. Collapse + } else { + // Collapse + $(this).parent().removeClass('expanded').addClass('collapsed') + .children('UL').slideUp({ duration: o.collapseSpeed, easing: o.collapseEasing }); + } + } else { + h($(this).attr('name')); + } + return false; + + }).on('click', function() { + $(top).find('.vboxListItemSelected').removeClass('vboxListItemSelected'); + $(this).addClass('vboxListItemSelected'); + return false; + }); + } + // Loading message + var rootList = $('<ul />').addClass("jqueryFileTree"); + $(this).empty().append(rootList); + // Get the initial file list + showTree( rootList, o.root, true); + }); + + return this; + } + }); + +})(jQuery); + + +/* jQuery Context Menu Plugin + +Version 1.01 + +Cory S.N. LaViska +A Beautiful Site (http://abeautifulsite.net/) + +More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/ + +// +// Terms of Use +// +// This plugin is dual-licensed under the GNU General Public License +// and the MIT License and is copyright A Beautiful Site, LLC. +// + +This jQuery plugin now hardly resembles the original. +--Ian Moore + + +*/ +if(jQuery)( function() { + + $.extend($.fn, { + + contextMenu: function(o, callback) { + // Defaults + if( o.menu == undefined ) return false; + if( o.inSpeed == undefined ) o.inSpeed = 150; + if( o.outSpeed == undefined ) o.outSpeed = 75; + // 0 needs to be -1 for expected results (no fade) + if( o.inSpeed == 0 ) o.inSpeed = -1; + if( o.outSpeed == 0 ) o.outSpeed = -1; + if( o.button == undefined) o.button = 2; + if( o.clickthrough == undefined) o.clickthrough = false; + + // Loop each context menu + $(this).each( function() { + + var el = $(this); + var menu = $('#'+o.menu); + + // Simulate a true click + $(this).mousedown( function(e) { + + if( $(el).hasClass('disabled') ) return true; + + if(!( e.button == o.button || (o.button == 0 && e.button == 1 && $.browser.msie))) return; + if(o.clickthrough) $(el).trigger('click'); + var evt = e; + evt.stopPropagation(); + + $(this).mouseup( function(e) { + + if( $(this).hasClass('disabled') ) return true; + + e.stopPropagation(); + + var srcElement = $(this); + $(this).off('mouseup'); + + + if( evt.button == o.button || (o.button == 0 && evt.button == 1 && $.browser.msie)) { + + // Menu setup function + if(o.menusetup) { + o.menusetup(el); + } + // Hide context menus that may be showing + $("ul.contextMenu").hide(); + + showMenu(srcElement, menu, o.mode, e); + + $(document).one('mouseup', function() { + $(menu).fadeOut(o.outSpeed); + $("ul.contextMenu").hide(); + }); + } + }); + }); + + /* + * Initialize menu items + * + */ + var menuItems = function(menu, srcElement, level) { + + // When items are selected + $(menu).addClass('contextMenu').data({'level':level}).disableSelection().children('li').off('mouseup').on('mouseup', function(e) { + + if($(this).hasClass('disabled')) { + return; + } + + $("ul.contextMenu").hide(); + + // Callback + if( callback ) { + var aElm = $(this).children('a'); + if($(aElm)[0]) { + callback( aElm.attr('href').substr(1), $(srcElement), null, aElm); + } else { + $(this).children('.vboxMenuAcceptClick').click(); + } + } + + + }).on("mouseenter", function(e, li) { + + $('#vboxPane').trigger('contextMenuShowLevel', + {'level':$(this).parent().data('level'), 'id':$(this).parent().attr('id')} + ); + + $(menu).find('LI.vboxHover').removeClass('vboxHover'); + if($(this).hasClass('disabled')) return; + + $(this).addClass('vboxHover'); + + var subMenuId = $(this).data('subId'); + if(subMenuId) showMenu($(this),$('#'+subMenuId),'submenu',e); + + }).on("mouseleave",function() { + + $(menu).find('LI.vboxHover').removeClass('vboxHover'); + + }).children('a').off('click').on('click',function(e){ + e.preventDefault(); + return false; + }); + + // Sub menu initialization + $(menu).children('li').children('ul').each(function() { + + var plink = $(this).siblings('a').first(); + var subId = $(this).attr('id'); + if(!subId) { + var href = plink.attr('href').replace('#',''); + subId = href + '-Submenu'; + $(this).attr('id', subId); + } + $(this).addClass('contextMenu contextSubMenu').data({'level':level+1}).parent().addClass('contextMenuParent').data({'subId':subId,'level':level}); + var html = plink.html(); + plink.html('<table class="vboxInvisible" style="width:100%"><tr><td style="text-align:left">'+html+'</td><td style="text-align:right; width: 22px;"><img src="images/rightArrow.png" /></td></tr></table>'); + + // Hide menus trigger + var smenu = this; + $('#vboxPane').on('contextMenuShowLevel',function(e,c){ + if($(smenu).data('level') >= c.level && $(smenu).attr('id') != c.id) + $(smenu).hide(); + }); + + // Reloop through setup + menuItems($(this), srcElement, ++level); + + $(this).detach().appendTo($('#vboxPane')); + + + }); + + + }; + + + /* + * + * Activate menu items + * + */ + + var showMenu = function(srcElement, menu, mode, e) { + + // Check menu + if(!$(menu)[0]) { + return; + } + + // Hide all other menus at this level + $('#vboxPane').trigger('contextMenuShowLevel', {'level':$(menu).data('level'), 'id':$(menu).attr('id')}); + + // Detect mouse position + var d = {}; + + var x = null; + var y = null; + + if(mode == 'menu') { + x = $(srcElement).offset().left; + y = $(srcElement).offset().top + $(srcElement).outerHeight(); + } else if(mode == 'submenu') { + y = $(srcElement).offset().top; + x = $(srcElement).offset().left + $(srcElement).outerWidth(); + } else { + + if( self.innerHeight ) { + d.pageYOffset = self.pageYOffset; + d.pageXOffset = self.pageXOffset; + d.innerHeight = self.innerHeight; + d.innerWidth = self.innerWidth; + } else if( document.documentElement && + document.documentElement.clientHeight ) { + d.pageYOffset = document.documentElement.scrollTop; + d.pageXOffset = document.documentElement.scrollLeft; + d.innerHeight = document.documentElement.clientHeight; + d.innerWidth = document.documentElement.clientWidth; + } else if( document.body ) { + d.pageYOffset = document.body.scrollTop; + d.pageXOffset = document.body.scrollLeft; + d.innerHeight = document.body.clientHeight; + d.innerWidth = document.body.clientWidth; + } + + $(menu).css({'left':0,'top':0}); + + (e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft; + (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop; + + + } + + // shift left if submenu + if($(menu).data('level')) x-=3; + + //adjust to ensure menu is inside viewable screen + var right = x + $(menu).outerWidth(); + var bottom = y + $(menu).outerHeight(); + + var windowWidth = $(window).width() + $(window).scrollLeft()-5; + var windowHeight = $(window).height() + $(window).scrollTop()-5; + + x = (right > windowWidth) ? x - (right - windowWidth) : x; + y = (bottom > windowHeight) ? y - (bottom - windowHeight) : y; + + + $(menu).one('menuLoaded',function(){ + menuItems(menu, srcElement); + }); + + // Check for callback if nothing is present + if($(menu).children().length == 0 && $(menu).data('callback')) { + + + var m = window[$(menu).data('callback')](menu); + + // New menu returned? + if(m) { + $(m).addClass('contextSubMenu contextMenuLevel' + ($(menu).data('level')+1)).data('level',($(menu).data('level')+1)); + // Hide menus trigger + $('#vboxPane').on('contextMenuShowLevel',function(e,c){ + if($(m).data('level') >= c.level && $(m).attr('id') != c.id) $(m).hide(); + }); + + menuItems(m, srcElement, $(menu).data('level')+1); + + showMenu(srcElement, m, 'submenu', e); + + return; + } + } else { + menuItems(menu, srcElement, $(menu).data('level')); + } + + // Menu show + $(menu).css({ top: y, left: x}).show();//.fadeIn(o.inSpeed); + + + }; + + // Setup menu + menuItems(menu, el, 0); + + + // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome) + $(el).add($('UL.contextMenu')).on('contextmenu', function() { return false; }); + + }); + return $(this); + }, + + // Disable context menu items on the fly + disableContextMenuItems: function(o) { + if( o == undefined ) { + // Disable all + $(this).find('LI').addClass('disabled'); + return( $(this) ); + } + $(this).each( function() { + if( o != undefined ) { + var d = o.split(','); + for( var i = 0; i < d.length; i++ ) { + $(this).find('A[href="' + d[i] + '"]').closest('li').addClass('disabled'); + + } + } + }); + return( $(this) ); + }, + + // Enable context menu items on the fly + enableContextMenuItems: function(o) { + if( o == undefined ) { + // Enable all + $(this).find('LI.disabled').removeClass('disabled'); + return( $(this) ); + } + $(this).each( function() { + if( o != undefined ) { + var d = o.split(','); + for( var i = 0; i < d.length; i++ ) { + $(this).find('A[href="' + d[i] + '"]').closest('li').removeClass('disabled'); + + } + } + }); + return( $(this) ); + }, + + // Disable context menu(s) + disableContextMenu: function() { + $(this).each( function() { + $(this).addClass('disabled'); + }); + return( $(this) ); + }, + + // Enable context menu(s) + enableContextMenu: function() { + $(this).each( function() { + $(this).removeClass('disabled'); + }); + return( $(this) ); + }, + + // Destroy context menu(s) + destroyContextMenu: function() { + // Destroy specified context menus + $(this).each( function() { + // Disable action + $(this).off('mousedown').off('mouseup'); + }); + return( $(this) ); + } + + }); +})(jQuery); diff --git a/js/jquery.scrollTo-min.js b/js/jquery.scrollTo-min.js new file mode 100644 index 0000000..73a3341 --- /dev/null +++ b/js/jquery.scrollTo-min.js @@ -0,0 +1,11 @@ +/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 5/25/2009
+ * @author Ariel Flesler
+ * @version 1.4.2
+ *
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ */
+;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
\ No newline at end of file diff --git a/js/jquery.tipped-2.1b.min.js b/js/jquery.tipped-2.1b.min.js new file mode 100644 index 0000000..76e70c6 --- /dev/null +++ b/js/jquery.tipped-2.1b.min.js @@ -0,0 +1,31 @@ +/****** + * Tipped: A tooltip plugin for jQuery + * http://code.google.com/p/tipped/ + * + * Copyright 2010, University of Alberta + * + * Tipped is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Tipped is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License v2 + * along with Tipped. If not, see <http://www.gnu.org/licenses/gpl-2.0.html> + */ +(function(b){var g={ajaxType:"POST",cache:false,cached:{},closer:"Close",delay:0,hideDelay:0,marginX:10,marginY:10,mode:"hover",oversizeStick:true,params:{},position:"element",posX:0,posY:0,source:"title",themeroller:false,throbber:false,url:""};window.Tip={$tip:{},$content:{},timer:undefined,settings:{},$target:{},evt:false,init:function(){this.$tip=b("#tipped").length==0?b('<div id = "tipped"><div id = "tipped-content"></div><div id = "tipped-closer-wrapper" style="display:none"><span id = "tipped-closer">'+this.settings.closer+ +"</span></div>").appendTo(document.body).data("showing",false):b("#tipped");this.$content=b("#tipped-content")},setup:function(a,c,d){this.settings=c;this.$target=a;this.evt=d;this.hide(true);this._setupCloser();this._setupThemeRollerCompat();this._removeTitle();clearTimeout(this.timer)},show:function(){if(this.settings.source==="url")this._showURL();else if(this.settings.source==="title")this._display(this.$target.data("tipped").title);else if(typeof this.settings.source=="string")this._display(this.settings.source); +else if(typeof this.settings.source=="function")this._display(this.settings.source(this.$target));else typeof settings.source=="object"&&this._display(this.settings.source.html())},hide:function(a){if(arguments.length==0)a=false;if(a){this.$tip.data("showing",false).data("original","").hide();this.$content.html("")}else{this.$tip.hover(function(){clearTimeout(Tip.timer)},function(){Tip.hide(true)});this.timer=setTimeout(function(){Tip.hide(true)},Tip.settings.hideDelay)}},_setupCloser:function(a){if(arguments.length== +0)a=false;b("#tipped-closer").html(this.settings.closer).click(function(){Tip.hide(true)});this.settings.mode!="click"&&!a?b("#tipped-closer-wrapper").hide():b("#tipped-closer-wrapper").show()},_setupThemeRollerCompat:function(){if(this.settings.themeroller){this.$tip.addClass("ui-helper-hidden ui-widget ui-dialog ui-corner-all");b("#tipped-closer").addClass("ui-button ui-state-hover ui-state-default").hover(function(){b(this).addClass("ui-state-hover")},function(){b(this).removeClass("ui-state-hover")}).mousedown(function(){b(this).addClass("ui-state-active")}).mouseup(function(){b(this).removeClass("ui-state-active")})}else{this.$tip.removeClass("ui-helper-hidden ui-widget ui-dialog ui-corner-all"); +b("#tipped-closer").removeClass("ui-button ui-state-hover ui-state-default")}},_removeTitle:function(){var a=this.$target.data("tipped");if(a.title===undefined){a.title=this.$target.attr("title");this.$target.data("tipped",a)}this.$target.removeAttr("title").attr("title","")},_showURL:function(){var a=this.$tip.data("cache");if(!this.settings.cache||a===undefined||a[this.settings.url]===undefined){var c={};if(typeof this.settings.params=="function")c=this.settings.params(this.$target);else if(typeof this.settings.params== +"object")c=this.settings.params;$this=this;b.ajax({data:c,type:$this.settings.ajaxType,url:$this.settings.url,beforeSend:function(){$this.settings.throbber&&$this._display("<img src = "+$this.settings.throbber+' alt = "Loading..." />')},error:function(){$this._display("Unable to retrieve contents")},success:function(d){$this._display(d);if($this.settings.cache){var e={};e[$this.settings.url]=d;a=b.extend(a,e);$this.$tip.data("cache",a)}}})}else this._display(a[this.settings.url])},_display:function(a){this.$content.html(a); +this._setSize();this._setPosition();this.$tip.data("showing",true).data("original",this.$target).show();this._resizeAfterShow()},_setSize:function(){this.$content.css({height:"auto",width:"auto"});this.$tip.css({height:"auto",width:"auto"});if(this.$tip.outerHeight()>b(window).height()){if(this.settings.oversizeStick){this._setupCloser(true);this.$target.unbind("mouseout")}var a=this.$tip.outerHeight()-this.$tip.height();this.$tip.css("height",b(window).height()-a-10);this.$content.css({height:b(window).height()- +a-10,width:this.$tip.outerWidth()+20,overflow:"auto"})}this.$tip.outerWidth()+10>=b(window).width()&&this.$tip.css({height:this.$tip.outerHeight(),width:b(window).width()-20,overflow:"auto"})},_resizeAfterShow:function(){var a=b("#tipped-closer-wrapper");if(a.is(":visible")){a=a.outerHeight();this.$content.height(this.$tip.height()-a)}},_setPosition:function(){this.$tip.css({left:0,top:0});var a={x:0,y:0};a=this._calcInitialPosition(a);a=this._adjustPositionForWindow(a);a=this._adjustPositionForMouse(a); +this.$tip.css({left:a.x,top:a.y})},_calcInitialPosition:function(a){switch(this.settings.position){case "mouse":a.x=this.evt.pageX+this.settings.marginX;a.y=this.evt.pageY+this.settings.marginY;break;case "absolute":a.x=typeof this.settings.posX=="function"?this.settings.posX($target):this.settings.posX;a.y=typeof this.settings.posY=="function"?this.settings.posY($target):this.settings.posY;break;default:var c=this.$target.offset();a.x=c.left+this.$target.outerWidth()+this.settings.marginX;a.y=c.top+ +this.$target.outerHeight()+this.settings.marginY}return a},_adjustPositionForWindow:function(a){var c=a.x+this.$tip.outerWidth(),d=a.y+this.$tip.outerHeight(),e=b(window).width()+b(window).scrollLeft()-5,f=b(window).height()+b(window).scrollTop()-5;a.x=c>e?a.x-(c-e):a.x;a.y=d>f?a.y-(d-f):a.y;return a},_adjustPositionForMouse:function(a){if(this.settings.position!="absolute"){var c=this.evt.pageX,d=this.evt.pageY,e=this.$tip.outerWidth(),f=this.$tip.outerHeight();if(a.x<c&&a.x+e>c)if(a.y<d&&a.y+f> +d)a.x=this.settings.position=="mouse"?c-e-this.settings.marginX:this.$target.offset().left-e-this.settings.marginX}return a}};b(document).ready(function(){Tip.init()});b.fn.tipped=function(a){this.each(function(){$target=b(this);a=b.extend({},g,a);$target.data("tipped",a);if(a.mode=="hover")$target.mouseover(function(c){if(Tip.timer){clearTimeout(Tip.timer);}Tip.setup(b(this),a,c);Tip.timer = setTimeout(function(){Tip.show();},a.delay);}).mouseout(function(){if(Tip.timer){clearTimeout(Tip.timer);}Tip.hide()});else a.mode=="click"&&$target.click(function(c){clickedSettings=b(this).data("tipped");Tip.setup(b(this),clickedSettings, +c);Tip.show()})});return this};b.extend({getTrigger:function(){return $tip.data("original")}})})(jQuery);
\ No newline at end of file diff --git a/js/phpvirtualbox.js b/js/phpvirtualbox.js new file mode 100644 index 0000000..c6628ab --- /dev/null +++ b/js/phpvirtualbox.js @@ -0,0 +1,4992 @@ +/** + * @fileOverview Common classes and objects used + * @author Ian Moore (imoore76 at yahoo dot com) + * @version $Id: phpvirtualbox.js 599 2015-07-27 10:40:37Z imoore76 $ + * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com) + */ + + +/** + * Host details sections used on details tab + * + * @namespace vboxHostDetailsSections + */ +var vboxHostDetailsSections = { + + /* + * General + */ + hostgeneral: { + icon: 'machine_16px.png', + title: 'General', + settingsLink: 'General', + rows: [ + { + title: 'Name', + callback: function() { return $('#vboxPane').data('vboxConfig').name; }, + condition: function() { return $('#vboxPane').data('vboxConfig').servers.length; } + },{ + title: 'OS Type', + callback: function(d) { + return d['operatingSystem'] + ' (' + d['OSVersion'] +')'; + } + },{ + title: 'VirtualBox', + callback: function() { + return $('#vboxPane').data('vboxConfig').version.string+' ('+$('#vboxPane').data('vboxConfig').version.revision+')'; + } + },{ + title: 'Base Memory', + callback: function(d) { + return trans('<nobr>%1 MB</nobr>').replace('%1',d['memorySize']); + } + },{ + title: '', + data: '<span id="vboxHostMemUsed"><div style="background-color:#a33" id="vboxHostMemUsedPct"><div style="background-color:#a93;float:right;" id="vboxHostMemResPct"></div></div><div style="width:100%;position:relative;top:-14px;left:0px;text-align:center;"><span id="vboxHostMemUsedLblPct" style="float:left" /><span id="vboxHostMemFreeLbl" style="float:right" /></div></span>' + },{ + title: "Processor(s)", + callback: function(d) { + return d['cpus'][0] + ' (' + d['cpus'].length +')'; + } + },{ + title: '', + callback: function(d) { + + // Processor features? + var cpuFeatures = new Array(); + for(var f in d.cpuFeatures) { + if(!d.cpuFeatures[f]) continue; + cpuFeatures[cpuFeatures.length] = trans(f); + } + return cpuFeatures.join(', '); + + }, + condition: function(d) { + if(!d.cpuFeatures) return false; + for(var f in d.cpuFeatures) { + if(!d.cpuFeatures[f]) continue; + return true; + } + return false; + } + }], + + onRender: function(d) { + + // See if timer is already set + var eTimer = $('#vboxVMDetails').data('vboxHostMemInfoTimer'); + if(eTimer != null) { + $('#vboxVMDetails').data('vboxHostMemInfoTimer',null); + window.clearInterval(eTimer); + } + + + var showFree = $('#vboxPane').data('vboxConfig').hostMemInfoShowFreePct; + var memRes = $('#vboxPane').data('vboxConfig').vmMemoryOffset; + if(!memRes || parseInt(memRes) < 1) memRes = 0; + + // Memory used function + var vboxHostShowMemInfo = function(avail) { + + // If target div no longer exists, stop updating + if($('#vboxHostMemFreeLbl')[0] == null) { + var eTimer = $('#vboxVMDetails').data('vboxHostMemInfoTimer'); + $('#vboxVMDetails').data('vboxHostMemInfoTimer',null); + window.clearInterval(eTimer); + return; + } + + // Subtract reserved memory? + avail -= memRes; + avail = Math.max(0,avail); + + var mUsed = d['memorySize'] - (avail + memRes); + var mUsedPct = Math.round(parseInt((mUsed / d['memorySize']) * 100)); + var memResPct = 0; + if(memRes > 0) { + memResPct = Math.round(parseInt((memRes / d['memorySize']) * 100)); + } + + // Add tooltip with info + var tip = trans('<nobr>%1 MB</nobr>').replace('%1',mUsed); + if(memResPct) tip += ' | ' + trans('<nobr>%1 MB</nobr>').replace('%1',memRes); + tip += ' | ' + trans('<nobr>%1 MB</nobr>').replace('%1',avail); + $('#vboxHostMemUsed').tipped({'source':tip,'position':'mouse'}); + + // Update tooltip content in case tooltip is already showing + var cid = $($('#tipped').data('original')).attr('id'); + if(cid && cid == 'vboxHostMemUsed') $('#tipped-content').html(tip); + + // Width(s) + $('#vboxHostMemUsedPct').css({'width':((mUsedPct+memResPct)*2)+'px'}); + if(memRes > 0) { + $('#vboxHostMemResPct').css({'width':''+(memResPct*2)+'px'}); + } else { + $('#vboxHostMemResPct').hide(); + } + + // Labels + if(!showFree) { + $('#vboxHostMemUsedLblPct').html(trans('<nobr>%1 MB</nobr>').replace('%1',(mUsed)) + ' ('+trans('<nobr>%1%</nobr>').replace('%1',mUsedPct)+')'); + $('#vboxHostMemFreeLbl').html(trans('<nobr>%1 MB</nobr>').replace('%1',avail)); + } else { + $('#vboxHostMemUsedLblPct').html(trans('<nobr>%1 MB</nobr>').replace('%1',mUsed)); + $('#vboxHostMemFreeLbl').html('('+trans('<nobr>%1%</nobr>').replace('%1',Math.round(parseInt((avail / d['memorySize']) * 100)))+') ' + trans('<nobr>%1 MB</nobr>').replace('%1',avail)); + } + }; + + // Refresh at configured intervals + var interval = 5; + try { + interval = Math.max(3,parseInt($('#vboxPane').data('vboxConfig').hostMemInfoRefreshInterval)); + } catch (e) { + interval = 5; + } + + var vboxHostUpdateMeminfo = function() { + $.when(vboxAjaxRequest('hostGetMeminfo')).done(function(d){ + vboxHostShowMemInfo(d.responseData); + }); + }; + vboxHostUpdateMeminfo(); + + // Failsafe + if(isNaN(interval) || interval < 3) interval = 5; + + $('#vboxVMDetails').data('vboxHostMemInfoTimer',window.setInterval(vboxHostUpdateMeminfo,interval*1000)); + + } + + }, + + hostnetwork: { + title: 'Network', + icon: 'nw_16px.png', + rows: function(d) { + + var netRows = []; + + d['networkInterfaces'].sort(strnatcasecmp); + + for(var i = 0; i < d['networkInterfaces'].length; i++) { + + /* Interface Name */ + netRows[netRows.length] = { + title: d['networkInterfaces'][i].name + ' (' + trans(d['networkInterfaces'][i].status) + ')', + data: '' + }; + + + /* IPv4 Addr */ + if(d['networkInterfaces'][i].IPAddress){ + + netRows[netRows.length] = { + title: trans('IPv4 Address','UIGlobalSettingsNetwork'), + data: d['networkInterfaces'][i].IPAddress + ' / ' + d['networkInterfaces'][i].networkMask, + indented: true + }; + + } + + /* IPv6 Address */ + if(d['networkInterfaces'][i].IPV6Supported && d['networkInterfaces'][i].IPV6Address) { + + netRows[netRows.length] = { + title: trans('IPv6 Address','UIGlobalSettingsNetwork'), + data: d['networkInterfaces'][i].IPV6Address + ' / ' + d['networkInterfaces'][i].IPV6NetworkMaskPrefixLength, + indented: true + }; + } + + /* Physical info */ + netRows[netRows.length] = { + title: '', + data: trans(d['networkInterfaces'][i].mediumType) + (d['networkInterfaces'][i].hardwareAddress ? ' (' + d['networkInterfaces'][i].hardwareAddress + ')': ''), + indented: true + }; + + + } + return netRows; + } + }, + + hostdvddrives: { + title: 'DVD', + icon: 'cd_16px.png', + language_context: 'UIApplianceEditorWidget', + condition: function(d) { + return d['DVDDrives'].length; + }, + rows: function(d) { + + var dvdRows = []; + + for(var i = 0; i < d['DVDDrives'].length; i++) { + dvdRows[dvdRows.length] = { + title: vboxMedia.getName(vboxMedia.getMediumById(d['DVDDrives'][i].id)), + data: '' + }; + } + + return dvdRows; + } + }, + + hostfloppydrives: { + title: 'Floppy', + language_context: 'UIApplianceEditorWidget', + icon: "fd_16px.png", + condition: function(d) { return d['floppyDrives'].length; }, + rows: function(d) { + + var fRows = []; + + for(var i = 0; i < d['floppyDrives'].length; i++) { + + fRows[fRows.length] = { + title: vboxMedia.getName(vboxMedia.getMediumById(d['floppyDrives'][i].id)), + data: '' + }; + + } + + return fRows; + } + } +}; + +/** + * VM details sections used on details tab and snapshot pages + * + * @namespace vboxVMDetailsInfo + */ +var vboxVMDetailsSections = { + + /* + * General + */ + general: { + title: 'General', + icon: 'machine_16px.png', + settingsLink: 'General', + multiSelectDetailsTable: true, + rows: [ + { + title: 'Name', attrib: 'name' + },{ + title: 'OS Type', attrib: 'OSTypeDesc' + },{ + title: 'Guest Additions Version', attrib: 'guestAdditionsVersion' + },{ + title: 'Groups', + language_context: 'UIGDetails', + condition: function(d){ + return (d.groups.length > 1 || (d.groups.length == 1 && d.groups[0] != '/')); + }, + callback: function(d) { + if(d.groups && d.groups.length > 0) + return jQuery.map(d.groups,function(elm) { + if(elm.length > 1) return elm.substring(1); + return elm; + }).join(', '); + } + } + + ] + }, + + /* + * System + */ + system: { + title: 'System', + icon: 'chipset_16px.png', + settingsLink: 'System', + redrawMachineEvents: ['OnCPUExecutionCapChanged'], + multiSelectDetailsTable: true, + rows: [ + { + title: 'Base Memory', + callback: function(d) { + return trans('<nobr>%1 MB</nobr>').replace('%1',d['memorySize']); + } + },{ + title: "Processor(s)", + attrib: 'CPUCount', + condition: function(d) { return d.CPUCount > 1; } + },{ + title: "Execution Cap", + callback: function(d) { + return trans('<nobr>%1%</nobr>').replace('%1',parseInt(d['CPUExecutionCap'])); + }, + condition: function(d) { return d.CPUExecutionCap < 100; } + },{ + title: "Boot Order", + callback: function(d) { + var bo = new Array(); + for(var i = 0; i < d['bootOrder'].length; i++) { + bo[i] = trans(vboxDevice(d['bootOrder'][i])); + } + return bo.join(', '); + } + },{ + title: "Acceleration", + language_context: 'UIGDetails', + callback: function(d) { + var acList = []; + if(d['HWVirtExProperties'].Enabled) acList[acList.length] = trans('VT-x/AMD-V'); + if(d['HWVirtExProperties'].NestedPaging) acList[acList.length] = trans('Nested Paging'); + if(d['CpuProperties']['PAE']) acList[acList.length] = trans('PAE/NX'); + + if($('#vboxPane').data('vboxConfig').enableAdvancedConfig) { + if(d['HWVirtExProperties'].LargePages) acList[acList.length] = trans('Large Pages'); + if(d['HWVirtExProperties'].UnrestrictedExecution) acList[acList.length] = trans('VT-x unrestricted execution'); + if(d['HWVirtExProperties'].VPID) acList[acList.length] = trans('VT-x VPID'); + } + return acList.join(', '); + }, + condition: function(d) { return (d['HWVirtExProperties'].Enabled || d['CpuProperties']['PAE']); } + } + ] + }, + + /* + * Preview box + */ + preview: { + title: 'Preview', + icon: 'fullscreen_16px.png', + _resolutionCache: {}, + settingsLink: 'Display', + multiSelectDetailsTable: true, + noSnapshot: true, + noFooter: true, + _updateInterval: undefined, + _screenPadding: 17, // padding around actual screenshot in px + condition: function() { + + // Update our default updateInterval here + if(vboxVMDetailsSections.preview._updateInterval === undefined) { + // Try local data first + var updateInterval = vboxGetLocalDataItem('previewUpdateInterval'); + if(updateInterval === null || updateInterval === undefined) { + updateInterval = $('#vboxPane').data('vboxConfig').previewUpdateInterval; + if(updateInterval === null || updateInterval === undefined) { + updateInterval = 3; + } + vboxSetLocalDataItem('previewUpdateInterval', parseInt(updateInterval)); + } + vboxVMDetailsSections.preview._updateInterval = parseInt(updateInterval); + } + + return !($('#vboxPane').data('vboxConfig').noPreview); + }, + + /** + * Function triggered on VM state change + * + */ + vboxEventOnMachineStateChanged: function(eventData) { + + var timer = $('#vboxPane').data('vboxPreviewTimer-'+eventData.machineId); + if(timer) { + $('#vboxPane').data('vboxPreviewTimer-'+eventData.machineId, null); + window.clearInterval(timer); + } + + vboxVMDetailsSections.preview._drawPreview(eventData.machineId); + + // Kick off timer if VM is running + if(vboxVMStates.isRunning(eventData)) { + window.setTimeout(function(){ + $('#vboxPane').data('vboxPreviewTimer-'+eventData.machineId, window.setInterval('vboxVMDetailsSections.preview._drawPreview("'+eventData.machineId+'")',vboxVMDetailsSections.preview._updateInterval*1000)); + },vboxVMDetailsSections.preview._updateInterval*1000); + } + + }, + + /* + * + * Preivew Update Menu + * + */ + contextMenu: function() { + + var menu = $('#vboxDetailsPreviewMenu'); + if(menu[0]) return menu; + + + /* Menu List */ + var ul = $('<ul />') + .attr({'class':'contextMenu contextMenuNoBG','style':'display: none','id':'vboxDetailsPreviewMenu'}) + .click(function(){$(this).hide();}) + .on('contextmenu', function() { return false; }) + + // Menu setup for "open in new window" + .on('beforeshow', function(e, vmid) { + + var d = vboxVMDataMediator.getVMData(vmid); + + if(vboxVMStates.isRunning(d) || vboxVMStates.isSaved(d)) { + $('#vboxDetailsViewSavedSS') + .css('display','') + .data({'vmid':d.id}); + } else { + $('#vboxDetailsViewSavedSS').css('display', 'none'); + } + }); + + + // Menu item to disable update + $('<li />') + .hoverClass('vboxHover') + .append( + + $('<label />').append( + + $('<input />') + .attr({'class':'vboxRadio','type':'radio','name':'vboxPreviewRadio','value':0}) + .click(function(){ + vboxSetLocalDataItem('previewUpdateInterval','0'); + vboxVMDetailsSections.preview._updateInterval = 0; + }) + .prop('checked', parseInt(vboxVMDetailsSections.preview._updateInterval) == 0) + + ).append( + + $('<span />') + .html(trans('Update Disabled','UIVMPreviewWindow')) + ) + + ).appendTo(ul); + + + // Update intervals + var ints = [3,5,10,20,30,60]; + + // check for update interval + if(vboxVMDetailsSections.preview._updateInterval > 0 && jQuery.inArray(vboxVMDetailsSections.preview._updateInterval, ints) < 0) { + ints[ints.length] = vboxVMDetailsSections.preview._updateInterval; + } + ints.sort(function(a,b){ + if(a == b) return 0; + return (a > b ? 1: -1); + }); + + // Add each interval to menu + for(var i = 0; i < ints.length; i++) { + + var li = $('<li />'); + + if(i==0) $(li).attr('class','separator'); + + var radio = $('<input />').attr({'class':'vboxRadio','type':'radio','name':'vboxPreviewRadio','value':ints[i]}).click(function(){ + + var lastIntervalNone = (parseInt(vboxVMDetailsSections.preview._updateInterval) == 0); + + vboxSetLocalDataItem('previewUpdateInterval',$(this).val()); + vboxVMDetailsSections.preview._updateInterval = $(this).val(); + + // Kick off preview updates if the last interval was 0 + if(lastIntervalNone) { + var selVMData = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < selVMData.length; i++) { + if(vboxVMStates.isRunning(selVMData[i]) || vboxVMStates.isSaved(selVMData[i])) + vboxVMDetailsSections.preview._drawPreview(selVMData[i].id); + } + } + + + }).prop('checked', parseInt(vboxVMDetailsSections.preview._updateInterval) == ints[i]); + + $('<label />') + .append(radio) + .append( + $('<span />') + .html(trans('Every %1 seconds','UIVMPreviewWindow').replace('%1',ints[i])) + ) + .appendTo(li); + + $(ul).append(li); + + } + + /* Append "Open in new window" */ + $('<li />') + .attr({'id':'vboxDetailsViewSavedSS','class':'separator','style':'display:none;text-align: center;'}) + .click(function(){ + window.open(vboxEndpointConfig.screen+'?vm='+$(this).data('vmid')+'&full=1','vboxSC','toolbar=1,menubar=0,location=0,directories=0,status=true,resize=true'); + }).append( + $('<span />') + .html(trans('Open in new window','UIVMPreviewWindow')) + ).appendTo(ul); + + /* Hover */ + $(ul).children().hoverClass('vboxHover'); + + + $(document).click(function(e){if(e.button!=2)$(ul).hide();}); + + $('#vboxTabVMDetails').append(ul); + + return $('#vboxDetailsPreviewMenu'); + + }, + + /** + * This is run when the preview screen is drawn + */ + onRender: function(d) { + + // Not needed in canvas logic + if(isCanvasSupported()) return; + + if(!vboxVMDetailsSections.preview._updateInterval || (!vboxVMStates.isRunning(d) && !vboxVMStates.isSaved(d))) { + var timer = $('#vboxPane').data('vboxPreviewTimer-'+d.id); + if(timer) { + $('#vboxPane').data('vboxPreviewTimer-'+d.id, null); + window.clearInterval(timer); + } + vboxVMDetailsSections.preview._drawPreview(d.id); + return; + } + + vboxVMDetailsSections.preview._drawPreview(d.id); + + if(vboxVMStates.isRunning(d)) { + + var timer = $('#vboxPane').data('vboxPreviewTimer-'+d.id); + if(timer) window.clearInterval(timer); + + $('#vboxPane').data('vboxPreviewTimer-'+d.id, + window.setInterval('vboxVMDetailsSections.preview._drawPreview("'+d.id+'")', + vboxVMDetailsSections.preview._updateInterval * 1000)); + + } + }, + + /** + * Draw the preview window from VM screenshot + * + */ + _drawPreview: function(vmid) { + + // Does the target still exist? + if(!$('#vboxDetailsGeneralTable-'+vmid)[0]) { + var timer = $('#vboxPane').data('vboxPreviewTimer-'+vmid); + if(timer) window.clearInterval(timer); + $('#vboxPane').data('vboxPreviewTimer-'+vmid, null); + return; + } + + var width = $('#vboxPane').data('vboxConfig')['previewWidth']; + + // Get fresh VM data + var vm = vboxVMDataMediator.getVMData(vmid); + + var __vboxDrawPreviewImg = new Image(); + __vboxDrawPreviewImg.onload = function() { + + // Does the target still exist? + if(!$('#vboxDetailsGeneralTable-'+vmid)[0]) { + var timer = $('#vboxPane').data('vboxPreviewTimer-'+vmid); + if(timer) window.clearInterval(timer); + $('#vboxPane').data('vboxPreviewTimer-'+vmid, null); + return; + } + + // Set and cache dimensions + if(this.height > 0) { + + // If width != requested width, it is scaled + if(this.width != $('#vboxPane').data('vboxConfig')['previewWidth']) { + height = this.height * (width / this.width); + + // Not scaled + } else { + height = this.height; + } + + vboxVMDetailsSections.preview._resolutionCache[vmid] = { + 'height': height + }; + + // Height of image is 0 + } else { + + // Check for cached resolution + if(vboxVMDetailsSections.preview._resolutionCache[vmid]) { + height = vboxVMDetailsSections.preview._resolutionCache[vmid].height; + } else { + height = parseInt(width / $('#vboxPane').data('vboxConfig')['previewAspectRatio']); + } + + // Clear interval if set + var timer = $('#vboxPane').data('vboxPreviewTimer-'+vmid); + if(timer) window.clearInterval(timer); + + } + + // Get fresh VM data + var vm = vboxVMDataMediator.getVMData(vmid); + + // Return if this is stale + if(!vm) { + var timer = $('#vboxPane').data('vboxPreviewTimer-'+vmid); + if(timer) window.clearInterval(timer); + $('#vboxPane').data('vboxPreviewTimer-'+vmid, null); + return; + } + + // Canvas redraw + if(isCanvasSupported()) { + + // Reset height and width + $('#vboxPreviewCanvas-'+vmid).attr({'width':(width+(vboxVMDetailsSections.preview._screenPadding*2)),'height':(height+(vboxVMDetailsSections.preview._screenPadding*2))}); + + // Redraw preview + vboxDrawPreviewCanvas($('#vboxPreviewCanvas-'+vmid)[0], (this.height <= 1 ? null: this), vm.name, width, height); + + // HTML update + } else { + + var baseStr = 'vboxDetailsGeneralTable-'+vmid; + if(this.height <= 1) { + + + // IE uses filter + if($.browser.msie) { + $('#'+baseStr+' img.vboxDetailsPreviewImg').css({'display':'none',"filter":""}) + .attr({'src':'images/vbox/blank.gif'}).parent().css({'background':'#000'}); + } else { + $('#'+baseStr+' img.vboxDetailsPreviewImg').css({'display':'none'}).attr('src','images/vbox/blank.gif'); + } + + $('#'+baseStr+' div.vboxDetailsPreviewVMName').css('display',''); + + // Resize name? + $('#vboxDetailsGeneralTable-'+vmid+ ' div.vboxDetailsPreviewVMName span.textFill').textFill({maxFontPixels:20,'height':(height),'width':(width)}); + + + } else { + + $('#'+baseStr+' div.vboxDetailsPreviewVMName').css('display','none'); + $('#'+baseStr+' img.vboxDetailsPreviewImg').css({'display':'','height':height+'px','width':width+'px'}); + + // IE uses filter + if($.browser.msie) { + + if(vboxVMStates.isRunning(vm)) { + + // Setting background URL keeps image from being + // requested again, but does not allow us to set + // the size of the image. This is fine, since the + // image is returned in the size requested. + $('#'+baseStr+' img.vboxDetailsPreviewImg').css({"filter":""}).parent().css({'background':'url('+this.src+')'}); + + } else { + + // This causes the image to be requested again, but + // is the only way to size the background image. + // Saved preview images are not returned in the size + // requested and must be resized at runtime by + // the browser. + $('#'+baseStr+' img.vboxDetailsPreviewImg').css({"filter":"progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true', src='"+this.src+"', sizingMethod='scale')"}).parent().css({'background':'#000'}); + } + + } else { + + $('#'+baseStr+' img.vboxDetailsPreviewImg').css({'background-image':'url('+this.src+')','background-size':(width+1) +'px ' + (height+1)+'px'}); + + } + } + + + $('#'+baseStr+' div.vboxDetailsPreviewWrap').css({'height':height+'px','width':width+'px'}); + $('#'+baseStr+' img.vboxPreviewMonitor').css('width',width+'px'); + $('#'+baseStr+' img.vboxPreviewMonitorSide').css('height',height+'px'); + + + } + + }; + + // Update disabled? State not Running or Saved + if(!vboxVMDetailsSections.preview._updateInterval || (!vboxVMStates.isRunning(vm) && !vboxVMStates.isSaved(vm))) { + __vboxDrawPreviewImg.height = 0; + __vboxDrawPreviewImg.onload(); + } else { + // Running VMs get random numbers. + // Saved are based on last state change to try to let the browser cache Saved screen shots + var randid = vm.lastStateChange; + if(vboxVMStates.isRunning(vm)) { + var currentTime = new Date(); + randid = Math.floor(currentTime.getTime() / 1000); + } + __vboxDrawPreviewImg.src = vboxEndpointConfig.screen+'?width='+(width)+'&vm='+vmid+'&randid='+randid; + + } + + + + }, + + /** + * Rows wrapper + */ + rows: function(d) { + + var timer = $('#vboxPane').data('vboxPreviewTimer-'+d.id); + if(timer) window.clearInterval(timer); + $('#vboxPane').data('vboxPreviewTimer-'+d.id, null); + + return (isCanvasSupported() ? vboxVMDetailsSections.preview._rows_canvas(d): vboxVMDetailsSections.preview._rows_html(d)); + }, + + /** + * Draws preview window in HTML + */ + _rows_html: function(d) { + + var width = $('#vboxPane').data('vboxConfig')['previewWidth']; + if(!width) width = $('#vboxPane').data('vboxConfig')['previewWidth'] = 180; + width = parseInt(width); + var height = parseInt(width / $('#vboxPane').data('vboxConfig')['previewAspectRatio']); + + // Check for cached resolution + if(vboxVMDetailsSections.preview._resolutionCache[d.id]) { + width = vboxVMDetailsSections.preview._resolutionCache[d.id].width; + height = vboxVMDetailsSections.preview._resolutionCache[d.id].height; + } + + var divOut1 = "<div class='vboxDetailsPreviewVMName' style='position:absolute;overflow:hidden;padding:0px;height:"+height+"px;width:"+width+"px;"+ + "display:"+((vboxVMStates.isRunning(d) || vboxVMStates.isSaved(d)) ? 'none': '')+"' >" + + "<div style='position:relative;display:table-cell;padding:0px;vertical-align:middle;color:#fff;font-weight:bold;overflow:hidden;text-align:center;height:"+height+"px;width:"+width+"px;" + + ($.browser.msie ? "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled=\"true\", src=\"images/monitor_glossy.png\", sizingMethod=\"scale\")": "" + + "background:url(images/monitor_glossy.png) top left no-repeat;-moz-background-size:100% 100%;background-size:"+(width+1) +"px " + (height+1)+"px;-webkit-background-size:100% 100%") + + "'><span class='textFill' style='font-size: 12px;position:relative;display:inline-block;'>"+$('<div />').html(d.name).text()+"</span></div>"+ + "</div>"; + + return [ + { + data: "<tr style='vertical-align: middle'>"+ + "<td style='text-align: center' colspan='2'>"+ + "<table class='vboxInvisible vboxPreviewTable' style='margin-left:auto;margin-right:auto;'>"+ + "<tr style='vertical-align:bottom; padding:0px; margin:0px;height:17px'>"+ + "<td class='vboxInvisible' style='text-align:right;width:15px;height:17px'><img src='images/monitor_tl.png' style='width:15px;height:17px;'/></td>"+ + "<td class='vboxInvisible'><img src='images/monitor_top.png' class='vboxPreviewMonitor' style='height:17px;width:"+width+"px'/></td>"+ + "<td class='vboxInvisible' style='text-align:left;width:15px;height:17px'><img src='images/monitor_tr.png' style='width:15px;height:17px;'/></td>"+ + "</tr>"+ + "<tr style='vertical-align:top;'>"+ + "<td class='vboxInvisible' style='text-align:right;'><img src='images/monitor_left.png' style='width:15px;height:"+height+"px' class='vboxPreviewMonitorSide' /></td>"+ + "<td class='vboxInvisible' style='position:relative;'><div class='vboxDetailsPreviewWrap "+ (vboxVMStates.isSaved(d) ? 'vboxPreviewSaved': '') +"' style='width: "+width+"px; height:"+height+"px; position:relative;overflow:hidden;text-align:center;background-color:#000;border:0px;display:table;#position:relative;background-repeat:no-repeat;padding:0px;margin:0px;'>"+ + "<img class='vboxDetailsPreviewImg' src='images/monitor_glossy.png' vspace='0px' hspace='0px' "+ + "style='display:"+((vboxVMStates.isRunning(d) || vboxVMStates.isSaved(d)) ? '': 'none')+";top:0px;margin:0px;border:0px;padding;0px;"+ + "background-position:top left;background-repeat:no-repeat;"+ + "-moz-background-size:100% 100%;background-size:100% 100%;-webkit-background-size:100% 100%;background-spacing:0px 0px;"+ + "height:"+height+"px;width:"+width+"px;' />"+ + divOut1+ + "</div></td>"+ + "<td class='vboxInvisible' style='text-align:left;' ><img src='images/monitor_right.png' style='width:14px;height:"+height+"px' class='vboxPreviewMonitorSide' /></td>"+ + "</tr>"+ + "<tr style='vertical-align:top;height:17px'>"+ + "<td class='vboxInvisible' style='text-align:right;width:15px;height:17px'><img src='images/monitor_bl.png' style='width:15px;height:17px;float:right;'/></td>"+ + "<td class='vboxInvisible' style='vertical-align:top'><img src='images/monitor_bottom.png' class='vboxPreviewMonitor' style='height:17px;width:"+width+"px'/></td>"+ + "<td class='vboxInvisible' style='text-align:left;width:15px;height:17px'><img src='images/monitor_br.png' style='width:15px;height:17px;'/></td>"+ + "</tr>"+ + "</table>"+ + "</td>"+ + "</tr>", + rawRow: true + } + ]; + + }, + + /** + * Draws preview on canvas object + */ + _rows_canvas: function(d) { + + var width = $('#vboxPane').data('vboxConfig')['previewWidth']; + if(!width) width = $('#vboxPane').data('vboxConfig')['previewWidth'] = 180; + width = parseInt(width); + var height = parseInt(width / $('#vboxPane').data('vboxConfig')['previewAspectRatio']); + + // Check for cached resolution + if(vboxVMDetailsSections.preview._resolutionCache[d.id]) { + height = vboxVMDetailsSections.preview._resolutionCache[d.id].height; + } + + // Create canvas and initially draw VM name + var previewCanvas = $('<canvas />').attr({'id':'vboxPreviewCanvas-'+d.id,'width':(width+(vboxVMDetailsSections.preview._screenPadding*2)),'height':(height+(vboxVMDetailsSections.preview._screenPadding*2))}); + + vboxDrawPreviewCanvas(previewCanvas[0], null, d.name, width, height); + + // Draw screenshot if it's running or saved + if(vboxVMDetailsSections.preview._updateInterval > 0 && (vboxVMStates.isRunning(d) || vboxVMStates.isSaved(d))) { + + // Preview image kicks off timer when it is loaded + var preview = new Image(); + preview.onload = function(){ + + // Set and cache dimensions + if(this.height > 0) { + + // If width != requested width, it is scaled + if(this.width != $('#vboxPane').data('vboxConfig')['previewWidth']) { + + height = this.height * (width/this.width); + + // Not scaled + } else { + height = this.height; + } + + $('#vboxPreviewCanvas-'+d.id).attr({'width':(width+(vboxVMDetailsSections.preview._screenPadding*2)),'height':(height+(vboxVMDetailsSections.preview._screenPadding*2))}); + + + // Check for cached resolution + } else if(vboxVMDetailsSections.preview._resolutionCache[d.id]) { + height = vboxVMDetailsSections.preview._resolutionCache[d.id].height; + } else { + height = parseInt(width / $('#vboxPane').data('vboxConfig')['previewAspectRatio']); + } + + vboxVMDetailsSections.preview._resolutionCache[d.id] = {'width':width,'height':height}; + + // Draw this screen shot + vboxDrawPreviewCanvas($('#vboxPreviewCanvas-'+d.id)[0], preview, d.name, width, height); + + // Kick off timer if VM is running + if(vboxVMStates.isRunning(d)) { + window.setTimeout(function(){ + $('#vboxPane').data('vboxPreviewTimer-'+d.id, window.setInterval('vboxVMDetailsSections.preview._drawPreview("'+d.id+'")',vboxVMDetailsSections.preview._updateInterval*1000)); + },vboxVMDetailsSections.preview._updateInterval*1000); + } + }; + + + var randid = d.lastStateChange; + if(vboxVMStates.isRunning(d)) { + var currentTime = new Date(); + randid = Math.floor(currentTime.getTime() / 1000); + } + preview.src = vboxEndpointConfig.screen+'?width='+(width)+'&vm='+d.id+'&randid='+randid; + + } + + /* Return row */ + return [ { + data: $('<div />') + .attr({'class':'vboxInvisble'}) + .append(previewCanvas), + rawRow: true + }]; + + } + }, + + /* + * Display + */ + display: { + title: 'Display', + icon: 'vrdp_16px.png', + settingsLink: 'Display', + redrawMachineEvents: ['OnVRDEServerInfoChanged','OnVRDEServerChanged','OnMachineStateChanged'], + rows: [ + { + title: "Video Memory", + callback: function(d) { + return trans('<nobr>%1 MB</nobr>').replace('%1',d['VRAMSize']); + } + },{ + title: 'Remote Desktop Server Port', + callback: function(d) { + + var chost = vboxGetVRDEHost(d); + + // Get ports + var rowStr = d['VRDEServer']['ports']; + + // Just this for snapshots + if(d._isSnapshot) return rowStr; + + // Display links? + if((d['state'] == 'Running' || d['state'] == 'Paused') && d['VRDEServerInfo']) { + + if(d['VRDEServerInfo']['port'] <= 0) { + + rowStr = '<span style="text-decoration: line-through; color: #f00;">' + rowStr + '</span>'; + + // RDP + } else if(d['VRDEServer']['VRDEExtPack'].indexOf("VNC") == -1) { + rowStr = " <a href='rdp.php?host=" + chost + '&port=' + d['VRDEServerInfo']['port'] + "&id=" + d['id'] + "&vm=" + encodeURIComponent(d['name']) + "'>" + d['VRDEServerInfo']['port'] + "</a>"; + rowStr += ' <img src="images/vbox/blank.gif" style="vspace:0px;hspace:0px;height2px;width:10px;" /> (' + chost + ':' + d['VRDEServerInfo']['port'] + ')'; + // VNC + } else { + rowStr = " <a href='vnc://" + chost + ':' + d['VRDEServerInfo']['port'] + "'>" + d['VRDEServerInfo']['port'] + "</a>"; + rowStr += ' <img src="images/vbox/blank.gif" style="vspace:0px;hspace:0px;height2px;width:10px;" /> (' + chost + ':' + d['VRDEServerInfo']['port'] + ')'; + } + } else { + rowStr += ' ('+chost+')'; + } + return rowStr; + + + }, + html: true, + condition: function(d) { + + // Running and paused states have real-time console info + if(!d._isSnapshot && (d['state'] == 'Running' || d['state'] == 'Paused')) { + return d.VRDEServer && (d.VRDEServer.enabled); + } + return (d['VRDEServer'] && (d._isSnapshot || d['VRDEServer']['VRDEExtPack']) && d['VRDEServer']['enabled'] && d['VRDEServer']['ports']); + } + },{ + title: "Remote Desktop Server", + callback: function(d) { + return trans('Disabled','VBoxGlobal',null,'details report (VRDE Server)'); + }, + condition: function(d) { + return !(vboxVMDetailsSections.display.rows[1].condition(d)); + } + } + ] + }, + + /* + * Storage controllers + */ + storage: { + title: 'Storage', + icon: 'hd_16px.png', + settingsLink: 'Storage', + redrawMachineEvents: ['OnMediumChanged', 'OnMachineStateChanged'], + _refreshVMMedia: function(vmid, mid) { + + // See if medium is there + var mRefresh = true; + if(!vboxMedia.getMediumById(mid)) { + mRefresh = vboxAjaxRequest('vboxGetMedia'); + } + var l = new vboxLoader(); + l.showLoading(); + $.when(mRefresh, vboxVMDataMediator.refreshVMData(vmid)).done(function(d){ + if(d && d.responseData) $('#vboxPane').data('vboxMedia',d.responseData); + }).always(function(){ + l.removeLoading(); + }); + }, + rows: function(d) { + + var rows = new Array(); + + for(var a = 0; a < d['storageControllers'].length; a++) { + + var con = d['storageControllers'][a]; + + // Controller name + rows[rows.length] = { + title: trans('Controller: %1','UIMachineSettingsStorage').replace('%1',$('<div />').text(con.name).html()), + callback: function(){return'';} + }; + + // Each attachment. + for(var b = 0; b < d['storageControllers'][a]['mediumAttachments'].length; b++) { + + var portName = vboxStorage[d['storageControllers'][a].bus].slotName(d['storageControllers'][a]['mediumAttachments'][b].port, d['storageControllers'][a]['mediumAttachments'][b].device); + + // Medium / host device info + var medium = (d['storageControllers'][a]['mediumAttachments'][b].medium && d['storageControllers'][a]['mediumAttachments'][b].medium.id ? vboxMedia.getMediumById(d['storageControllers'][a]['mediumAttachments'][b].medium.id): null); + + // Do we need to reload media? + if(d['storageControllers'][a]['mediumAttachments'][b].medium && d['storageControllers'][a]['mediumAttachments'][b].medium.id && medium === null) { + + if(!d._isSnapshot) { + portDesc = '<a href="javascript:vboxVMDetailsSections.storage._refreshVMMedia(\''+ + d.id+"','"+d['storageControllers'][a]['mediumAttachments'][b].medium.id+"');\">"+trans('Refresh','UIVMLogViewer')+"</a>"; + + } else { + portDesc = trans('Refresh','UIVMLogViewer'); + } + + } else { + + // Get base medium (snapshot -> virtual disk file) + var it = false; + if(medium && medium.base && (medium.base != medium.id)) { + it = true; + medium = vboxMedia.getMediumById(medium.base); + } + + portDesc = vboxMedia.mediumPrint(medium,false,it); + } + + rows[rows.length] = { + title: portName, + indented: true, + data: (d['storageControllers'][a]['mediumAttachments'][b].type == 'DVD' ? trans('[CD/DVD]','UIGDetails') + ' ': '') + portDesc, + html: true + }; + + } + + } + return rows; + } + }, + + /* + * Audio + */ + audio: { + title: 'Audio', + icon: 'sound_16px.png', + settingsLink: 'Audio', + rows: [ + { + title: "Disabled", + language_context: ['VBoxGlobal', null, 'details report (audio)'], + cssClass: 'vboxDetailsNone', + condition: function(d) { return !d['audioAdapter']['enabled']; }, + data: '' + },{ + title: "Host Driver", + language_context: 'UIDetailsBlock', + callback: function(d) { + return trans(vboxAudioDriver(d['audioAdapter']['audioDriver']),'VBoxGlobal'); + }, + condition: function(d) { return d['audioAdapter']['enabled']; } + },{ + title: "Controller", + language_context: 'UIDetailsBlock', + callback: function (d) { + return trans(vboxAudioController(d['audioAdapter']['audioController']),'VBoxGlobal'); + }, + condition: function(d) { return d['audioAdapter']['enabled']; } + } + ] + }, + + /* + * Network adapters + */ + network: { + icon: 'nw_16px.png', + title: 'Network', + redrawMachineEvents: ['OnNetworkAdapterChanged','OnMachineStateChanged'], + settingsLink: 'Network', + rows: function(d) { + + var vboxDetailsTableNics = 0; + var rows = []; + + + for(var i = 0; i < d['networkAdapters'].length; i++) { + + nic = d['networkAdapters'][i]; + + // compose extra info + var adp = ''; + + if(nic.enabled) { + vboxDetailsTableNics++; + switch(nic.attachmentType) { + case 'Null': + adp = trans('Not attached','VBoxGlobal'); + break; + case 'Bridged': + adp = trans('Bridged adapter, %1').replace('%1', nic.bridgedInterface); + break; + case 'HostOnly': + adp = trans('Host-only adapter, \'%1\'').replace('%1', nic.hostOnlyInterface); + break; + case 'NAT': + // 'NATNetwork' ? + adp = trans('NAT','VBoxGlobal'); + break; + case 'Internal': + adp = trans('Internal network, \'%1\'').replace('%1', $('<div />').text(nic.internalNetwork).html()); + break; + case 'Generic': + // Check for properties + if(nic.properties) { + adp = trans('Generic driver, \'%1\' { %2 }','UIDetailsPagePrivate').replace('%1', $('<div />').text(nic.genericDriver).html()); + var np = nic.properties.split("\n"); + adp = adp.replace('%2', np.join(" ,")); + break; + } + adp = trans('Generic driver, \'%1\'','UIDetailsPagePrivate').replace('%1', $('<div />').text(nic.genericDriver).html()); + break; + case 'VDE': + adp = trans('VDE network, \'%1\'').replace('%1', $('<div />').text(nic.VDENetwork).html()); + break; + case 'NATNetwork': + adp = trans('NAT Network, \'%1\'','UIDetailsPagePrivate').replace('%1', $('<div />').text(nic.NATNetwork).html()); + break; + } + + rows[rows.length] = { + title: trans("Adapter %1").replace('%1',(i + 1)), + data: trans(vboxNetworkAdapterType(nic.adapterType)).replace(/\(.*\)/,'') + ' (' + adp + ')' + }; + } + + } + + // No enabled nics + if(vboxDetailsTableNics == 0) { + + rows[rows.length] = { + title: trans('Disabled','VBoxGlobal',null,'details report (network)'), + cssClass: 'vboxDetailsNone' + }; + + // Link nic to guest networking info? + } else if(d['state'] == 'Running') { + + rows[rows.length] = { + title: '', + data: '<a href="javascript:vboxGuestNetworkAdaptersDialogInit(\''+d['id']+'\');">('+trans('Guest Network Adapters')+')</a>', + html: true + }; + + } + + return rows; + + } + }, + + /* + * Serial Ports + */ + serialports: { + title: 'Serial Ports', + icon: 'serial_port_16px.png', + settingsLink: 'SerialPorts', + rows: function(d) { + + var rows = []; + + var vboxDetailsTableSPorts = 0; + for(var i = 0; i < d['serialPorts'].length; i++) { + + p = d['serialPorts'][i]; + + if(!p.enabled) continue; + + // compose extra info + var xtra = vboxSerialPorts.getPortName(p.IRQ,p.IOBase); + + var mode = p.hostMode; + xtra += ', ' + trans(vboxSerialMode(mode),'VBoxGlobal'); + if(mode != 'Disconnected') { + xtra += ' (' + $('<div />').text(p.path).html() + ')'; + } + + rows[rows.length] = { + title: trans("Port %1",'VBoxGlobal',null,'details report (serial ports)').replace('%1',(i + 1)), + data: xtra, + html: true + }; + + vboxDetailsTableSPorts++; + + } + + if(vboxDetailsTableSPorts == 0) { + rows[rows.length] = { + title: trans('Disabled','VBoxGlobal',null,'details report (serial ports)'), + cssClass: 'vboxDetailsNone' + }; + } + + return rows; + + } + }, + + /* + * Parallel ports + */ + parallelports: { + title: 'Parallel Ports', + language_context: 'UIDetailsPagePrivate', + icon: 'parallel_port_16px.png', + settingsLink: 'ParallelPorts', + condition: function() { return $('#vboxPane').data('vboxConfig').enableLPTConfig; }, + rows: function(d) { + + var rows = []; + + var vboxDetailsTableSPorts = 0; + for(var i = 0; i < d['parallelPorts'].length; i++) { + + p = d['parallelPorts'][i]; + + if(!p.enabled) continue; + + // compose extra info + var xtra = trans(vboxParallelPorts.getPortName(p.IRQ,p.IOBase)); + xtra += ' (' + $('<div />').text(p.path).html() + ')'; + + rows[rows.length] = { + title: trans("Port %1",'VBoxGlobal',null,'details report (parallel ports)').replace('%1',(i + 1)), + data: xtra + }; + vboxDetailsTableSPorts++; + + } + + if(vboxDetailsTableSPorts == 0) { + rows[0] = { + title: trans('Disabled','VBoxGlobal',null,'details report (parallel ports)'), + cssClass: 'vboxDetailsNone' + }; + } + return rows; + + } + }, + + /* + * USB + */ + usb: { + icon: 'usb_16px.png', + title: 'USB', + language_context: 'UIGDetails', + settingsLink: 'USB', + rows: function(d) { + + var rows = []; + + var usbEnabled = false; + var usbType = 'OHCI'; + + for(var i = 0; i < d.USBControllers.length; i++) { + var listUSBType = d.USBControllers[i].type; + if(listUSBType == 'OHCI') { + usbEnabled = true; + } + switch(listUSBType) { + case 'OHCI': + if(usbType == 'EHCI') + break; + case 'EHCI': + if(usbType == 'XHCI') + break; + default: + usbType = listUSBType; + } + } + + if(usbEnabled) { + + rows.push({ + title: trans("USB Controller", 'UIGDetails', null, 'details (usb)'), + data: usbType + }); + + var tot = 0; + var act = 0; + for(var i = 0; i < d.USBDeviceFilters.length; i++) { + tot++; + if(d.USBDeviceFilters[i].active) act++; + } + + rows.push({ + title: trans("Device Filters", 'UIGDetails', null, 'details (usb)'), + data: trans('%1 (%2 active)', 'UIGDetails', null, 'details (usb)').replace('%1',tot).replace('%2',act) + }); + + } else { + + rows.push({ + title: trans("Disabled", 'UIGDetails', null, 'details report (USB)'), + cssClass: 'vboxDetailsNone' + }); + } + + return rows; + + } + }, + + /* + * Shared folders list + */ + sharedfolders: { + title: 'Shared Folders', + language_context: 'UIDetailsPagePrivate', + icon: 'sf_16px.png', + settingsLink: 'SharedFolders', + rows: function(d) { + + if(!d['sharedFolders'] || d['sharedFolders'].length < 1) { + return [{ + title: trans('None',null,null,'details report (shared folders)'), + cssClass: 'vboxDetailsNone' + }]; + } + + return [{ + title: trans('Shared Folders', 'UIDetailsPagePrivate'), + data: d['sharedFolders'].length + }]; + } + }, + + /* + * VM Description + */ + description: { + icon: 'description_16px.png', + title: 'Description', + language_context: 'UIDetailsPagePrivate', + settingsLink: 'General:2', + rows: function(d) { + return [{ + title: '', + data: $('<tr />').attr({'class':'vboxDetailRow'}).append( + $('<td />').attr({'class':'vboxDetailDescriptionCell','colspan':'2'}) + .html(d.description.length ? $('<div />').text(d.description).html(): '<span class="vboxDetailsNone">'+trans("None",null,null,'details report (description)')+'</span>') + ), + rawRow: true + }]; + } + } +}; + +/** + * Common VM Group Actions - most of these are passed off + * to the vboxChooser object + * + * @namespace vboxVMGroupActions + */ +var vboxVMGroupActions = { + + 'newmachine': { + label: 'New Machine...', + icon: 'vm_new', + click: function(){ + vboxVMActions['new'].click(true); + }, + enabled: function() { + return $('#vboxPane').data('vboxSession').admin; + } + }, + + addmachine: { + label: 'Add Machine...', + icon: 'vm_add', + click: function() { + vboxVMActions['add'].click(true); + }, + enabled: function() { + return $('#vboxPane').data('vboxSession').admin; + } + }, + + rename: { + label: 'Rename Group...', + icon: 'vm_group_name', + enabled: function() { + if(!$('#vboxPane').data('vboxSession').admin) return false; + if(!vboxChooser._editable) return false; + var gElm = vboxChooser.getSelectedGroupElements()[0]; + if(!gElm) return false; + if($('#vboxPane').data('vboxConfig')['phpVboxGroups']) return true; + if($(gElm).find('td.vboxVMSessionOpen')[0]) return false; + return true; + }, + click: function() { + vboxChooser.renameSelectedGroup(); + } + }, + + ungroup: { + label: 'Ungroup...', + icon: 'vm_group_remove', + enabled: function() { + if(!vboxChooser._editable) return false; + if(!$('#vboxPane').data('vboxSession').admin) return false; + var gElm = vboxChooser.getSelectedGroupElements()[0]; + if(!gElm) return false; + if($('#vboxPane').data('vboxConfig')['phpVboxGroups']) return true; + if($(gElm).find('td.vboxVMSessionOpen')[0]) return false; + return true; + }, + click: function() { + + vboxChooser.unGroupSelectedGroup(); + + } + }, + + 'sort': { + label: 'Sort', + icon:'sort', + click: function() { + vboxChooser.sortSelectedGroup(); + }, + enabled: function() { + if(!vboxChooser._editable) return false; + return $('#vboxPane').data('vboxSession').admin; + } + } + +}; + +/** + * Common VM Actions - These assume that they will be run on the selected VM as + * stored in vboxChooser.getSingleSelected() + * + * @namespace vboxVMActions + */ +var vboxVMActions = { + + /** Invoke the new virtual machine wizard */ + 'new':{ + label: 'New...', + icon: 'vm_new', + click: function(fromGroup){ + new vboxWizardNewVMDialog((fromGroup ? $(vboxChooser.getSelectedGroupElements()[0]).data('vmGroupPath'): '')).run(); + } + }, + + /** Add a virtual machine via its settings file */ + add: { + label: 'Add...', + icon: 'vm_add', + click: function(){ + vboxFileBrowser($('#vboxPane').data('vboxSystemProperties').defaultMachineFolder,function(f){ + if(!f) return; + var l = new vboxLoader(); + l.add('machineAdd',function(){return;},{'file':f}); + l.onLoad = function(){ + var lm = new vboxLoader(); + lm.add('vboxGetMedia',function(d){$('#vboxPane').data('vboxMedia',d.responseData);}); + lm.run(); + }; + l.run(); + + },false,trans('Add an existing virtual machine','UIActionPool'),'images/vbox/machine_16px.png',true); + } + }, + + /** Start VM */ + start: { + label: 'Start', + name: 'start', + icon: 'vm_start', + _startedVMs: {}, + /* + * Subscribe to machine state changes to remove from _startedVMs + * + */ + _subscribedStateChanges: false, + _subscribeStateChanges: function() { + + if(vboxVMActions.start._subscribedStateChanges) + return; + + vboxVMActions.start._subscribedStateChanges = true; + + $('#vboxPane').on('vboxOnMachineStateChanged', function(e, eventData) { + + // We did not start this VM + if(!vboxVMActions.start._startedVMs[eventData.machineId]) + return; + + var vmState = {'state': eventData.state}; + if(vboxVMStates.isPaused(vmState) || vboxVMStates.isStuck(vmState) || vboxVMStates.isPoweredOff(vmState)) { + delete vboxVMActions.start._startedVMs[eventData.machineId]; + } + + }); + + }, + /* + * Subscribe to machine runtime errors to ask for medium + * encryption password(s) + */ + _subscribedRuntimeErrors: false, + _subscribeRuntimeErrors: function() { + + if(vboxVMActions.start._subscribedRuntimeErrors) + return; + + vboxVMActions.start._subscribedRuntimeErrors = true; + + // Trigger VM media encryption password dialog + $('#vboxPane').on('vboxOnRuntimeError',function(e, eventData) { + + // We did not start this VM + if(!vboxVMActions.start._startedVMs[eventData.machineId]) + return; + + // Disk encryption missing + if(eventData.id == "DrvVD_DEKMISSING") { + + // Encryption passwords are needed to start VM + var vmData = vboxVMDataMediator.getVMDetails(eventData.machineId); + vboxVMActions.start._getEncryptionPasswordsStartVM(vmData); + + return; + } + + // Display runtime error + var message = vboxVMDataMediator.getVMData(eventData.machineId).title + ' - ' + + eventData.message; + vboxAlert(message); + + + }); + + }, + /* Get passwords and start VM Logic */ + _getEncryptionPasswordsStartVM: function(vm, validIds) { + + // Encrypted media + var encIds = vboxMedia.getEncryptedMediaIds( + vboxStorage.getAttachedBaseMedia(vm) + ); + + // Get encryption password(s) + var pwPromise = vboxMediumEncryptionPasswordsDialog(vm.name, encIds, validIds); + + $.when(pwPromise).done(function(pwdata) { + + + // vboxVMActions.start._getEncryptionPasswordsStartVM(vm); + $.when(vboxAjaxRequest('consoleAddDiskEncryptionPasswords', + {'vm':vm.id,'passwords':pwdata})) + + .done(function(retData) { + + if(!retData) + return; + + var failed = retData.responseData.failed.length; + var valid = retData.responseData.accepted; + + if(failed) { + var acknowledged = vboxAlert(trans('Unable to enter password!')+ + '<p>'+retData.responseData.errors.join('<br />')+'</p>'); + + $.when(acknowledged).done(function(){ + vboxVMActions.start._getEncryptionPasswordsStartVM(vm, valid); + }) + } + // VMs will be started automatically if the password(s) supplied were correct + }) + + }).fail(function(){ + // Clicked cancel + // TODO: "Close VM" dialog + }); + + }, + /* Start a single VM */ + _startVM: function(vm) { + + $.when(vm,vboxAjaxRequest('machineSetState',{'vm':vm.id,'state':'powerUp'})) + + // VM started and / or progress op returned + .done(function(evm,d){ + + // check for progress operation + if(d && d.responseData && d.responseData.progress) { + if(vboxVMStates.isSaved(evm)) icon = 'progress_state_restore_90px.png'; + else icon = 'progress_start_90px.png'; + + vboxProgress({'progress':d.responseData.progress,'persist':d.persist}, function(){return;}, + icon, trans('Start the selected virtual machines','UIActionPool'),evm.name); + } + }); + + }, + click: function (btn) { + + // Setup + vboxVMActions.start._subscribeRuntimeErrors(); + vboxVMActions.start._subscribeStateChanges(); + + // Should the "First Run" wizard be started + //////////////////////////////////////////// + var firstRun = function(vm) { + + var frDef = $.Deferred(); + + $.when(vboxVMDataMediator.getVMDetails(vm.id)).done(function(d) { + + // Not first run? + if(d.GUI.FirstRun != 'yes') { + // Just resolve, nothing to do + frDef.resolve(d); + return; + } + + // Check for CD/DVD drive attachment that has no CD/DVD + var cdFound = false; + for(var i = 0; i < d.storageControllers.length; i++) { + for(var a = 0; a < d.storageControllers[i].mediumAttachments.length; a++) { + if(d.storageControllers[i].mediumAttachments[a].type == "DVD" && + d.storageControllers[i].mediumAttachments[a].medium == null) { + cdFound = true; + break; + } + } + } + + // No CD/DVD attachment + if(!cdFound) { + // Just resolve, nothing to do + frDef.resolve(d); + return; + } + + // First time run + $.when(d, new vboxWizardFirstRunDialog(d).run()).done(function(vm2start){ + frDef.resolve(vm2start); + }); + + + }); + return frDef.promise(); + }; + + // Start each eligable selected vm + ////////////////////////////////////// + var startVMs = function() { + + var vms = vboxChooser.getSelectedVMsData(); + var vmsToStart = []; + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isPaused(vms[i]) || vboxVMStates.isPoweredOff(vms[i]) || vboxVMStates.isSaved(vms[i])) { + vmsToStart[vmsToStart.length] = vms[i]; + } + + } + + (function runVMsToStart(vms){ + + (vms.length && $.when(firstRun(vms.shift())).done(function(vm){ + + // Save the fact that we started this VM + vboxVMActions.start._startedVMs[vm.id] = true; + + vboxVMActions.start._startVM(vm); + + // Loop + runVMsToStart(vms); + + })); + })(vmsToStart); + }; + + // Check for memory limit + // Paused VMs are already using all their memory + if($('#vboxPane').data('vboxConfig').vmMemoryStartLimitWarn) { + + var freeMem = 0; + var baseMem = 0; + + // Host memory needs to be checked + var loadData = [vboxAjaxRequest('hostGetMeminfo')]; + + // Load details of each machine to get memory info + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isPoweredOff(vms[i]) || vboxVMStates.isSaved(vms[i])) + loadData[loadData.length] = vboxVMDataMediator.getVMDataCombined(vms[i].id); + } + + // Show loading screen while this is occuring + var l = new vboxLoader('vboxHostMemCheck'); + l.showLoading(); + + // Load all needed data + $.when.apply($, loadData).done(function() { + + // Remove loading screen + l.removeLoading(); + + // First result is host memory info + freeMem = arguments[0].responseData; + + // Add memory of each VM + for(var i = 1; i < arguments.length; i++) { + + // Paused VMs are already using their memory + if(vboxVMStates.isPaused(arguments[i])) continue; + + // memory + a little bit of overhead + baseMem += (arguments[i].memorySize + 50); + } + + // subtract offset + if($('#vboxPane').data('vboxConfig').vmMemoryOffset) + freeMem -= $('#vboxPane').data('vboxConfig').vmMemoryOffset; + + // Memory breaches warning threshold + if(baseMem >= freeMem) { + var buttons = {}; + buttons[trans('Yes','QIMessageBox')] = function(){ + $(this).remove(); + startVMs(); + }; + freeMem = Math.max(0,freeMem); + vboxConfirm('<p>The selected virtual machine(s) require(s) <b><i>approximately</b></i> ' + baseMem + + 'MB of memory, but your VirtualBox host only has ' + freeMem + 'MB '+ + ($('#vboxPane').data('vboxConfig').vmMemoryOffset ? ' (-'+$('#vboxPane').data('vboxConfig').vmMemoryOffset+'MB)': '') + + ' free.</p><p>Are you sure you want to start the virtual machine(s)?</p>',buttons,trans('No','QIMessageBox')); + + // Memory is fine. Start vms. + } else { + startVMs(); + } + + }); + + // No memory limit warning configured + } else { + startVMs(); + } + + + }, + enabled: function () { + return (vboxChooser.isSelectedInState('Paused') || vboxChooser.isSelectedInState('PoweredOff') || vboxChooser.isSelectedInState('Saved')); + } + }, + + /** Invoke VM settings dialog */ + settings: { + label: 'Settings...', + icon: 'vm_settings', + click: function(){ + + vboxVMsettingsDialog(vboxChooser.getSingleSelectedId()); + }, + enabled: function () { + return vboxChooser && vboxChooser.selectionMode == vboxSelectionModeSingleVM && + (vboxChooser.isSelectedInState('Running') || vboxChooser.isSelectedInState('Paused') || vboxChooser.isSelectedInState('Editable')); + } + }, + + /** Clone a VM */ + clone: { + label: 'Clone...', + icon: 'vm_clone', + click: function(){ + new vboxWizardCloneVMDialog({vm:vboxChooser.getSingleSelected()}).run(); + }, + enabled: function () { + return (vboxChooser.selectionMode == vboxSelectionModeSingleVM && vboxChooser.isSelectedInState('PoweredOff')); + } + }, + + /** Refresh a VM's details */ + refresh: { + label: 'Refresh', + language_context: 'UIVMLogViewer', + icon:'refresh', + click:function(){ + + var vmid = vboxChooser.getSingleSelectedId(); + + var l = new vboxLoader(); + l.showLoading(); + $.when(vboxVMDataMediator.refreshVMData(vmid)).done(function(){ + l.removeLoading(); + }); + + }, + enabled: function () {return(vboxChooser.selectedVMs.length ==1);} + }, + + /** Delete / Remove a VM */ + remove: { + label: 'Remove...', + icon:'vm_delete', + click:function(){ + + /////////////////// + // Remove VMs + ////////////////// + var removeCopies = function() { + + var vmList = []; + var vmNames = []; + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isPoweredOff(vms[i]) && vboxChooser.vmHasUnselectedCopy(vms[i].id)) { + vmList[vmList.length] = vms[i].id; + vmNames[vmNames.length] = vms[i].name; + } + } + + if(vmList.length) { + + var rcDef = $.Deferred(); + + var buttons = {}; + buttons[trans('Remove', 'UIMessageCenter')] = function() { + $(this).empty().remove(); + vboxChooser.removeVMs(vmList); + rcDef.resolve(); + } + + vmNames = '<b>'+vmNames.join('</b>, <b>')+'</b>'; + var q = trans('<p>You are about to remove following virtual machine items from the machine list:</p><p><b>%1</b></p><p>Do you wish to proceed?</p>','UIMessageCenter').replace('%1',vmNames); + + vboxConfirm(q,buttons,undefined,function(){ + rcDef.resolve(); + }); + + + return rcDef.promise(); + } + + return true; + + } + + ////////////////// + // Unregister VMs + /////////////////// + $.when(removeCopies()).done(function() { + + var unregisterVMs = function(keepFiles, vms) { + + var vms = vboxChooser.getSelectedVMsData(); + + for(var i = 0; i < vms.length; i++) { + + if(vboxVMStates.isPoweredOff(vms[i]) || vboxVMStates.isInaccessible(vms[i])) { + + // Remove each selected vm + $.when(vms[i].name, vboxAjaxRequest('machineRemove', + {'vm':vms[i].id,'delete':(keepFiles ? '0': '1')})) + .done(function(vmname, d){ + // check for progress operation + if(d && d.responseData && d.responseData.progress) { + vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(){return;},'progress_delete_90px.png', + trans('Remove the selected virtual machines', 'UIActionPool'), vmname); + } + }); + } + } + }; + var buttons = {}; + buttons[trans('Delete all files','UIMessageCenter')] = function(){ + $(this).empty().remove(); + unregisterVMs(false); + }; + buttons[trans('Remove only','UIMessageCenter')] = function(){ + $(this).empty().remove(); + unregisterVMs(true); + }; + + + var vmNames = []; + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if((vboxVMStates.isPoweredOff(vms[i]) || vboxVMStates.isInaccessible(vms[i])) && !vboxChooser.vmHasUnselectedCopy(vms[i].id)) { + vmNames[vmNames.length] = vms[i].name; + } + } + + if(vmNames.length) { + + vmNames = '<b>'+vmNames.join('</b>, <b>')+'</b>'; + var q = trans('<p>You are about to remove following virtual machines from the machine list:</p><p>%1</p><p>Would you like to delete the files containing the virtual machine from your hard disk as well? Doing this will also remove the files containing the machine\'s virtual hard disks if they are not in use by another machine.</p>','UIMessageCenter').replace('%1',vmNames); + + vboxConfirm(q,buttons); + + } + + }); + + }, + enabled: function () { + if(!vboxChooser._editable) return false; + return (vboxChooser.isSelectedInState('PoweredOff') || vboxChooser.isSelectedInState('Inaccessible')); + } + }, + + /** Create a group from VM * */ + group: { + label: 'Group', + icon: 'vm_group_create', + click: function() { + vboxChooser.groupSelectedItems(); + }, + enabled: function() { + + if(!$('#vboxPane').data('vboxSession').admin) + return false; + + if (!vboxChooser || (vboxChooser.getSingleSelectedId() == 'host')) + return false; + + if(!vboxChooser._editable) return false; + + return vboxChooser.isSelectedInState('Editable'); + + } + }, + + /** Discard VM State */ + discard: { + label: 'Discard saved state...', + icon: 'vm_discard', + click: function(){ + + var buttons = {}; + buttons[trans('Discard','UIMessageCenter')] = function(){ + $(this).empty().remove(); + + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isSaved(vms[i])) { + vboxAjaxRequest('machineSetState',{'vm':vms[i].id,'state':'discardSavedState'}); + } + } + }; + var vmNames = []; + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isSaved(vms[i])) { + vmNames[vmNames.length] = vms[i].name; + } + } + + if(vmNames.length) { + + vmNames = '<b>'+vmNames.join('</b>, <b>')+'</b>'; + + vboxConfirm(trans('<p>Are you sure you want to discard the saved state of the following virtual machines?</p><p><b>%1</b></p><p>This operation is equivalent to resetting or powering off the machine without doing a proper shutdown of the guest OS.</p>','UIMessageCenter').replace('%1',vmNames),buttons); + } + }, + enabled:function(){ + return vboxChooser.isSelectedInState('Saved'); + } + }, + + /** Install Guest Additions **/ + guestAdditionsInstall: { + label: 'Install Guest Additions...', + icon: 'guesttools', + click: function(vmid, mount_only) { + + if(!vmid) + vmid = vboxChooser.getSingleSelected().id; + + $.when(vboxAjaxRequest('consoleGuestAdditionsInstall',{'vm':vmid,'mount_only':mount_only})).done(function(d){ + + // Progress operation returned. Guest Additions are being updated. + if(d && d.responseData && d.responseData.progress) { + + vboxProgress({'progress':d.responseData.progress,'persist':d.persist,'catcherrs':1},function(d){ + + // Error updating guest additions + if(!d.responseData.result && d.responseData.error && d.responseData.error.err) { + if(d.responseData.error.err != 'VBOX_E_NOT_SUPPORTED') { + vboxAlert({'error':trans('Failed to update Guest Additions. The Guest Additions installation image will be mounted to provide a manual installation.','UIMessageCenter'),'details':d.responseData.error.err+"\n"+d.responseData.error.message}); + } + vboxVMActions['guestAdditionsInstall'].click(vmid, true); + return; + } + },'progress_install_guest_additions_90px.png',trans('Install Guest Additions...','UIActionPool').replace(/\./g,'')); + + // Media was mounted + } else if(d.responseData && d.responseData.result && d.responseData.result == 'mounted') { + + // Media must be refreshed + var ml = new vboxLoader(); + ml.add('vboxGetMedia',function(dat){$('#vboxPane').data('vboxMedia',dat.responseData);}); + ml.run(); + + if(d.responseData.errored) + vboxAlert(trans('Failed to update Guest Additions. The Guest Additions installation image will be mounted to provide a manual installation.','UIMessageCenter')); + + // There's no CDROM drive + } else if(d.responseData && d.responseData.result && d.responseData.result == 'nocdrom') { + + var vm = vboxVMDataMediator.getVMData(vmid); + vboxAlert(trans("<p>Could not insert the VirtualBox Guest Additions " + + "installer CD image into the virtual machine <b>%1</b>, as the machine " + + "has no CD/DVD-ROM drives. Please add a drive using the " + + "storage page of the virtual machine settings dialog.</p>",'UIMessageCenter').replace('%1',vm.name)); + + // Can't find guest additions + } else if (d.responseData && d.responseData.result && d.responseData.result == 'noadditions') { + + var s1 = '('+trans('None','VBoxGlobal')+')'; + var s2 = s1; + + if(d.responseData.sources && d.responseData.sources.length) { + if(d.responseData.sources[0]) s1 = d.responseData.sources[0]; + if(d.responseData.sources[1]) s2 = d.responseData.sources[1]; + } + var q = trans('<p>Could not find the VirtualBox Guest Additions CD image file <nobr><b>%1</b></nobr> or <nobr><b>%2</b>.</nobr></p><p>Do you wish to download this CD image from the Internet?</p>','UIMessageCenter').replace('%1',s1).replace('%2',s2); + var b = {}; + b[trans('Yes','QIMessageBox')] = function() { + var url = 'http://download.virtualbox.org/virtualbox/%1/VBoxGuestAdditions_%2.iso'; + url = url.replace('%1',$('#vboxPane').data('vboxConfig').version.string.replace('_OSE','')); + url = url.replace('%2',$('#vboxPane').data('vboxConfig').version.string.replace('_OSE','')); + $(this).remove(); + window.open(url); + }; + vboxConfirm(q,b,trans('No','QIMessageBox')); + } + }); + + } + + }, + + /** Show VM Logs */ + logs: { + label: 'Show Log...', + icon: 'vm_show_logs', + click: function(){ + vboxShowLogsDialogInit(vboxChooser.getSingleSelected()); + }, + enabled:function(){ + return (vboxChooser.getSingleSelectedId() && vboxChooser.getSingleSelectedId() != 'host'); + } + }, + + /** Save the current VM State */ + savestate: { + label: 'Save State', + icon: 'vm_save_state', + stop_action: true, + enabled: function(){ + return (vboxChooser.isSelectedInState('Running') || vboxChooser.isSelectedInState('Paused')); + }, + click: function() { + + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i]) || vboxVMStates.isPaused(vms[i])) + vboxVMActions.powerAction('savestate','Save the machine state of the selected virtual machines', vms[i]); + } + } + }, + + /** Send ACPI Power Button to VM */ + powerbutton: { + label: 'ACPI Shutdown', + icon: 'vm_shutdown', + stop_action: true, + enabled: function(){ + return vboxChooser.isSelectedInState('Running'); + }, + click: function() { + var buttons = {}; + buttons[trans('ACPI Shutdown','UIMessageCenter')] = function() { + $(this).empty().remove(); + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i])) + vboxVMActions.powerAction('powerbutton','Send the ACPI Power Button press event to the virtual machine', vms[i]); + } + }; + var vmNames = []; + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i])) { + vmNames[vmNames.length] = vms[i].name; + } + } + + if(vmNames.length) { + + vmNames = '<b>'+vmNames.join('</b>, <b>')+'</b>'; + + vboxConfirm(trans("<p>Do you really want to send an ACPI shutdown signal " + + "to the following virtual machines?</p><p><b>%1</b></p>",'UIMessageCenter').replace('%1', vmNames),buttons); + } + } + }, + + /** Pause a running VM */ + pause: { + label: 'Pause', + icon: 'vm_pause', + enabled: function(){ + return vboxChooser.isSelectedInState('Running'); + }, + click: function() { + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i])) + vboxVMActions.powerAction('pause','Suspend the execution of the selected virtual machines', vms[i]); + } + } + }, + + /** Power off a VM */ + powerdown: { + label: 'Power Off', + icon: 'vm_poweroff', + stop_action: true, + enabled: function() { + return (vboxChooser.isSelectedInState('Running') || vboxChooser.isSelectedInState('Paused') || vboxChooser.isSelectedInState('Stuck')); + }, + click: function() { + + var buttons = {}; + buttons[trans('Power Off','UIActionPool')] = function() { + $(this).empty().remove(); + + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i]) || vboxVMStates.isPaused(vms[i]) || vboxVMStates.isStuck(vms[i])) + vboxVMActions.powerAction('powerdown','Power off the selected virtual machines', vms[i]); + } + }; + + var vmNames = []; + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i]) || vboxVMStates.isPaused(vms[i]) || vboxVMStates.isStuck(vms[i])) { + vmNames[vmNames.length] = vms[i].name; + } + } + + if(vmNames.length) { + + vmNames = '<b>'+vmNames.join('</b>, <b>')+'</b>'; + + vboxConfirm(trans("<p>Do you really want to power off the following virtual machines?</p>" + + "<p><b>%1</b></p><p>This will cause any unsaved data in applications " + + "running inside it to be lost.</p>", 'UIMessageCenter').replace('%1', vmNames), buttons); + } + + } + }, + + /** Reset a VM */ + reset: { + label: 'Reset', + icon: 'vm_reset', + enabled: function(){ + return vboxChooser.isSelectedInState('Running'); + }, + click: function() { + var buttons = {}; + buttons[trans('Reset','UIActionPool')] = function() { + $(this).remove(); + + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i])) + vboxVMActions.powerAction('reset','Reset the selected virtual machines', vms[i]); + } + }; + + var vmNames = []; + var vms = vboxChooser.getSelectedVMsData(); + for(var i = 0; i < vms.length; i++) { + if(vboxVMStates.isRunning(vms[i])) { + vmNames[vmNames.length] = vms[i].name; + } + } + + if(vmNames.length) { + + vmNames = '<b>'+vmNames.join('</b>, <b>')+'</b>'; + + vboxConfirm(trans("<p>Do you really want to reset the following virtual machines?</p><p><b>%1</b></p><p>This will cause any unsaved data in applications "+ + "running inside it to be lost.</p>",'UIMessageCenter').replace('%1',vmNames),buttons); + } + } + }, + + /** Stop actions list */ + stop_actions: ['savestate','powerbutton','powerdown'], + + /** Stop a VM */ + stop: { + name: 'stop', + label: 'Stop', + language_context: 'VBoxSelectorWnd', + icon: 'vm_shutdown', + menu: true, + click: function () { return true; /* handled by stop context menu */ }, + enabled: function () { + return (vboxChooser.isSelectedInState('Running') || vboxChooser.isSelectedInState('Paused') || vboxChooser.isSelectedInState('Stuck')); + } + }, + + /** Power Action Helper function */ + powerAction: function(pa,pt,vm){ + icon =null; + errorMsg = null; + switch(pa) { + case 'powerdown': + fn = 'powerDown'; + icon='progress_poweroff_90px.png'; + break; + case 'powerbutton': + fn = 'powerButton'; + errorMsg = trans('Failed to send the ACPI Power Button press event to the virtual machine <b>%1</b>.','UIMessageCenter'); + break; + case 'savestate': + fn = 'saveState'; + icon='progress_state_save_90px.png'; + break; + case 'pause': + fn = 'pause'; + break; + case 'reset': + fn = 'reset'; + break; + default: + return; + } + + $.when(vboxAjaxRequest('machineSetState',{'vm':vm.id,'state':fn})).done(function(d){ + if(!(d && d.success) && errorMsg) { + vboxAlert(errorMsg.replace('%1', vm.name)); + return; + } + // check for progress operation + if(d && d.responseData && d.responseData.progress) { + vboxProgress({'progress':d.responseData.progress,'persist':d.persist},function(){ + return; + },icon,trans(pt,'UIActionPool'), vm.name); + return; + } + }); + + } +}; + + +/** + * Common Media functions object + * + * @namespace vboxMedia + */ +var vboxMedia = { + + /** + * Get encryption settings for medium + */ + getEncryptionSettings: function(m) { + if(m && m.encryptionSettings) { + return m.encryptionSettings + } + return null; + }, + + /** + * Return a list of encrypted media and associated + * encryption ids + */ + getEncryptedMedia: function(media) { + var encMedia = []; + for(var i = 0; i < media.length; i++) { + var e = vboxMedia.getEncryptionSettings(media[i]); + if(!e) continue; + encMedia.push({ + medium: media[i].id, + id: e.id + }); + } + return encMedia; + }, + + /** + * Return list of IDs and cypers for media list + */ + getEncryptedMediaIds: function(media) { + var encryptIds = []; + var idsSeen = []; + for(var i = 0; i < media.length; i++) { + var e = vboxMedia.getEncryptionSettings(media[i]); + if(!e) continue; + if(jQuery.inArray(e.id, idsSeen) > -1) continue; + idsSeen.push(e.id); + encryptIds.push({id: e.id, cipher: e.cipher}) + } + return encryptIds; + }, + + /** + * Return true if medium is a host drive + */ + isHostDrive: function(m) { + return (m && m.hostDrive) + }, + + /** + * Return a printable string for medium m + * + * @static + */ + mediumPrint: function(m,nosize,usehtml) { + var name = vboxMedia.getName(m); + if(nosize || !m || m.hostDrive) return name; + return name + ' (' + (m.deviceType == 'HardDisk' ? (usehtml ? '<i>': '') + trans(m.type,'VBoxGlobal') + (usehtml ? '</i>': '') + ', ': '') + vboxMbytesConvert(m.logicalSize) + ')'; + }, + + /** + * Return printable medium name + * + * @static + */ + getName: function(m) { + if(!m) return trans('Empty','VBoxGlobal'); + if(m.hostDrive) { + if (m.description && m.name) { + return trans('Host Drive %1 (%2)','VBoxGlobal').replace('%1',m.description).replace('%2',m.name); + } else if (m.location) { + return trans('Host Drive \'%1\'','VBoxGlobal').replace('%1',m.location); + } else { + return trans('Host Drive','VBoxGlobal'); + } + } + return m.name; + }, + + /** + * Return printable medium type + * + * @static + */ + getType: function(m) { + if(!m || !m.type) return trans('Normal','VBoxGlobal'); + if(m.type == 'Normal' && m.base && m.base != m.id) return trans('Differencing','VBoxGlobal'); + return trans(m.type,'VBoxGlobal'); + }, + + /** + * Return printable medium format + * + * @static + */ + getFormat: function (m) { + if(!m) return ''; + switch(m.format.toLowerCase()) { + case 'vdi': + return trans('VDI (VirtualBox Disk Image)','UIWizardNewVD'); + case 'vmdk': + return trans('VMDK (Virtual Machine Disk)','UIWizardNewVD'); + case 'vhd': + return trans('VHD (Virtual Hard Disk)','UIWizardNewVD'); + case 'parallels': + case 'hdd': + return trans('HDD (Parallels Hard Disk)','UIWizardNewVD'); + case 'qed': + return trans('QED (QEMU enhanced disk)','UIWizardNewVD'); + case 'qcow': + return trans('QCOW (QEMU Copy-On-Write)','UIWizardNewVD'); + } + return m.format; + }, + + /** + * Return true if a medium format supports + */ + formatSupportsSplit: function(format) { + + var format = format.toLowerCase(); + + var mfs = $('#vboxPane').data('vboxSystemProperties').mediumFormats; + + for(var i = 0; i < mfs.length; i++) { + if(mfs[i].id.toLowerCase() == format) { + return (jQuery.inArray('CreateSplit2G',mfs[i].capabilities) > -1); + } + } + return false; + }, + + /** + * Return printable virtual hard disk variant + * + * @static + */ + getHardDiskVariant: function(m) { + + var variants = $('#vboxPane').data('vboxMediumVariants'); + + +/* + * [Standard] => 0 [VmdkSplit2G] => 1 [VmdkRawDisk] => 2 [VmdkStreamOptimized] => + * 4 [VmdkESX] => 8 [Fixed] => 65536 [Diff] => 131072 [NoCreateDir] => + * 1073741824 + */ + + switch(m.variant) { + + case variants.Standard: + return trans("Dynamically allocated storage", "VBoxGlobal"); + case (variants.Standard | variants.Diff): + return trans("Dynamically allocated differencing storage", "VBoxGlobal"); + case (variants.Standard | variants.Fixed): + return trans("Fixed size storage", "VBoxGlobal"); + case (variants.Standard | variants.VmdkSplit2G): + return trans("Dynamically allocated storage split into files of less than 2GB", "VBoxGlobal"); + case (variants.Standard | variants.VmdkSplit2G | variants.Diff): + return trans("Dynamically allocated differencing storage split into files of less than 2GB", "VBoxGlobal"); + case (variants.Standard | variants.Fixed | variants.VmdkSplit2G): + return trans("Fixed size storage split into files of less than 2GB", "VBoxGlobal"); + case (variants.Standard | variants.VmdkStreamOptimized): + return trans("Dynamically allocated compressed storage", "VBoxGlobal"); + case (variants.Standard | variants.VmdkStreamOptimized | variants.Diff): + return trans("Dynamically allocated differencing compressed storage", "VBoxGlobal"); + case (variants.Standard | variants.Fixed | variants.VmdkESX): + return trans("Fixed size ESX storage", "VBoxGlobal"); + case (variants.Standard | variants.Fixed | variants.VmdkRawDisk): + return trans("Fixed size storage on raw disk", "VBoxGlobal"); + default: + return trans("Dynamically allocated storage", "VBoxGlobal"); + } + + }, + + /** + * Return media and drives available for attachment type + * + * @static + */ + mediaForAttachmentType: function(t,children) { + + var media = new Array(); + + // DVD Drives + if(t == 'DVD') { media = media.concat($('#vboxPane').data('vboxHostDetails').DVDDrives); + // Floppy Drives + } else if(t == 'Floppy') { + media = media.concat($('#vboxPane').data('vboxHostDetails').floppyDrives); + } + + // media + return media.concat(vboxTraverse($('#vboxPane').data('vboxMedia'),'deviceType',t,true,(children ? 'children': ''))); + }, + + /** + * Return a medium by its location + * + * @static + */ + getMediumByLocation: function(p) { + // Fix this in windows version + if($('#vboxPane').data('vboxConfig').DSEP == '\\') + p = p.replace('\\.','/.'); + return vboxTraverse($('#vboxPane').data('vboxMedia'),'location',p,false,'children'); + }, + + /** + * Return a medium by its name, ignoring case and + * extension + * + * @static + */ + getMediumByName: function(n) { + var meds = $('#vboxPane').data('vboxMedia'); + for(var i = 0; i < meds.length; i++) { + if(n.toLowerCase() == meds[i].name.replace(/\.[^\.]+$/, "").toLowerCase()) + return meds[i]; + } + return null; + }, + + /** + * Elect a new hard disk name + */ + electHardDiskName: function(rootName, start) { + + /* Go through list of media and pick new hd name */ + var number = (start ? start: 1); + var HDname = (rootName ? rootName: 'NewVirtualDisk'); + var RetName = ''; + var found = false; + do { + RetName = HDname + (number++); + found = vboxMedia.getMediumByName(RetName); + } while(found); + + return RetName; + }, + + /** + * Return a medium by its ID + * + * @static + */ + getMediumById: function(id) { + return vboxTraverse($('#vboxPane').data('vboxMedia').concat($('#vboxPane').data('vboxHostDetails').DVDDrives.concat($('#vboxPane').data('vboxHostDetails').floppyDrives)),'id',id,false,'children'); + }, + + /** + * Return a printable list of machines and snapshots this a medium is + * attached to + * + * @static + */ + attachedTo: function(m,nullOnNone) { + var s = new Array(); + if(!m.attachedTo || !m.attachedTo.length) return (nullOnNone ? null: '<i>'+trans('Not Attached')+'</i>'); + for(var i = 0; i < m.attachedTo.length; i++) { + s[s.length] = m.attachedTo[i].machine + (m.attachedTo[i].snapshots.length ? ' (' + m.attachedTo[i].snapshots.join(', ') + ')': ''); + } + return s.join(', '); + }, + + /** + * Update recent media menu and global recent media list + * + * @static + */ + updateRecent: function(m, skipPathAdd) { + + // Only valid media that is not a host drive or iSCSI + if(!m || !m.location || m.hostDrive || m.format == 'iSCSI') return false; + + // Update recent path + if(!skipPathAdd) { + vboxAjaxRequest('vboxRecentMediaPathSave',{'type':m.deviceType,'folder':vboxDirname(m.location)}); + $('#vboxPane').data('vboxRecentMediaPaths')[m.deviceType] = vboxDirname(m.location); + } + + // Update recent media + // /////////////////////// + + // find position (if any) in current list + var pos = jQuery.inArray(m.location,$('#vboxPane').data('vboxRecentMedia')[m.deviceType]); + + // Medium is already at first position, return + if(pos == 0) return false; + + // Exists and not in position 0, remove from list + if(pos > 0) { + $('#vboxPane').data('vboxRecentMedia')[m.deviceType].splice(pos,1); + } + + // Add to list + $('#vboxPane').data('vboxRecentMedia')[m.deviceType].splice(0,0,m.location); + + // Pop() until list only contains 5 items + while($('#vboxPane').data('vboxRecentMedia')[m.deviceType].length > 5) { + $('#vboxPane').data('vboxRecentMedia')[m.deviceType].pop(); + } + + // Update Recent Media in background + vboxAjaxRequest('vboxRecentMediaSave',{'type':m.deviceType,'list':$('#vboxPane').data('vboxRecentMedia')[m.deviceType]}); + + return true; + + }, + + /** + * List of actions performed on Media in phpVirtualBox + * + * @static + * @namespace + */ + actions: { + + /** + * Choose existing medium file + * + * @static + */ + choose: function(path,type,callback) { + + if(!path) path = $('#vboxPane').data('vboxRecentMediaPaths')[type]; + + title = null; + icon = null; + switch(type) { + case 'HardDisk': + title = trans('Choose a virtual hard disk file...','UIMachineSettingsStorage'); + icon = 'images/vbox/hd_16px.png'; + break; + case 'Floppy': + title = trans('Choose a virtual floppy disk file...','UIMachineSettingsStorage'); + icon = 'images/vbox/fd_16px.png'; + break; + case 'DVD': + title = trans('Choose a virtual CD/DVD disk file...','UIMachineSettingsStorage'); + icon = 'images/vbox/cd_16px.png'; + break; + } + vboxFileBrowser(path,function(f){ + if(!f) return; + var med = vboxMedia.getMediumByLocation(f); + if(med && med.deviceType == type) { + vboxMedia.updateRecent(med); + callback(med); + return; + } else if(med) { + return; + } + var ml = new vboxLoader(); + ml.add('mediumAdd',function(ret){ + var l = new vboxLoader(); + if(ret && ret.responseData.id) { + var med = vboxMedia.getMediumById(ret.responseData.id); + // Not registered yet. Refresh media. + if(!med) + l.add('vboxGetMedia',function(dret){$('#vboxPane').data('vboxMedia',dret.responseData);}); + } + l.onLoad = function() { + if(ret && ret.responseData.id) { + var med = vboxMedia.getMediumById(ret.responseData.id); + if(med && med.deviceType == type) { + vboxMedia.updateRecent(med); + callback(med); + return; + } + } + }; + l.run(); + },{'path':f,'type':type}); + ml.run(); + },false,title,icon); + } // </ choose > + + } // </ actions > +}; + + + +/** + * Base Wizard class (new HardDisk, VM, etc..) + * + * @class vboxWizard + * @constructor + */ +function vboxWizard() { + + var self = this; + + /* Number of wizard steps */ + this.steps = 0; + + /* Wizard name - used to determine form name and HTML pane to load */ + this.name = ''; + + /* Title of wizard */ + this.title = ''; + + /* Wizard dialog icon image */ + this.icon = null; + + /* Width and height for Simple mode */ + this.width = 700; + this.height = 400; + + /* Width and height for expert mode */ + this.widthAdvanced = 600; + this.heightAdvanced = 450; + + /* Background image */ + this.bg = null; + + /* Text on Back button */ + this.backText = trans('Back','QIArrowSplitter'); + + /* Text on Next button */ + this.nextText = trans('Next','QIArrowSplitter'); + + /* Text on cancel button */ + this.cancelText = trans('Cancel','QIMessageBox'); + + /* Text on finish button */ + this.finishText = 'Finish'; + + /* Translation context */ + this.context = ''; + + /* Arrow on back button */ + this.backArrow = $('<div />').html('«').text(); + + /* Arrow on Next button */ + this.nextArrow = $('<div />').html('»').text(); + + /* Mode of wizard */ + this.mode = 'simple'; + + /* Data to load */ + this.data = []; + + /* Form object held to get values */ + this.form = null; + + /* Reference to dialog object created */ + this.dialog = null; + + /* Deferred object resolved when complete */ + this.completed = $.Deferred(); + + /* Function to be run on cancel */ + this.onCancel = null; + + /* Function to run on finish */ + this.onFinish = function() { + + if(self.completed.state() == 'pending') + self.completed.resolve(); + + $(self.dialog).empty().remove(); + }; + + /** + * Initialize / display wizard + * + * @memberOf vboxWizard + * @name vboxWizard.run + * @returns {Object} deferred promise + */ + this.run = function() { + + // Set mode + this.mode = (vboxGetLocalDataItem('vboxWizardMode'+this.name) == 'a' ? 'advanced': ''); + + this.dialog = $('<div />').attr({'id':this.name+'Dialog','style':'display: none','class':'vboxWizard'}); + + this.form = $('<form />').attr({'name':('frm'+this.name),'style':'height:100%;margin:0px;padding:0px;border:0px;'}) + .on('submit',function(e){ + self.displayNext(); + e.stopPropagation(); + e.preventDefault(); + return false; + }); + + // main table + var tbl = $('<table />').attr({'class':'vboxWizard','style':'height: 100%; margin:0px; padding:0px;border:0px;'}); + var tr = $('<tr />'); + + + var td = $('<td />').attr({'id':this.name+'Content','class':'vboxWizardContent'}); + + if(this.bg) { + $(this.dialog).css({'background':'url('+this.bg+') ' + ((this.mode == 'advanced' ? this.widthAdvanced: this.width) - 360) +'px -60px no-repeat','background-color':'#fff'}); + } + + // Title and content table + $('<h3 />').attr('id',this.name+'Title').html(this.title).appendTo(td); + + $(tr).append(td).appendTo(tbl); + + this.form.append(tbl); + this.dialog.append(this.form).appendTo($('#vboxPane')); + + // load data and panes + var l = new vboxLoader(this.name+'Loader'); + for(var i = 0; i < this.data.length; i++) { + l.add(this.data[i].fn,this.data[i].callback,(this.data[i].args ? this.data[i].args: undefined)); + } + l.addFileToDOM('panes/'+this.name+(this.mode == 'advanced' ? 'Advanced': '')+'.html',$('#'+this.name+'Content')); + + l.onLoad = function(){ + + // Show / Hide description button + if(!self.stepButtons) self.stepButtons = []; + if(!self.noAdvanced) { + + self.stepButtons = jQuery.merge([{ + + name: trans((self.mode == 'advanced' ? 'Show Description': 'Hide Description'), 'UIWizard'), + click: function() { + + // Unbind any old resize handlers + $('#'+self.name+'Dialog').off('dialogresizestop'); + + // Check mode + if(self.mode != 'advanced') { + + // Now in advanced mode + self.mode = 'advanced'; + + // Hide title, remove current content and add + // advanced content + $('#'+self.name+'Title').hide().siblings().empty().remove(); + + // Hold old number of steps + self.simpleSteps = self.steps; + + // resize dialog + $('#'+self.name+'Dialog').dialog('option', 'width', self.widthAdvanced) + .dialog('option', 'height', self.heightAdvanced) + .css({'background':'url('+self.bg+') ' + ((self.mode == 'advanced' ? self.widthAdvanced: self.width) - 360) +'px -60px no-repeat','background-color':'#fff'}); + + + + var vl = new vboxLoader(); + vl.addFileToDOM('panes/'+self.name+'Advanced.html',$('#'+self.name+'Content')); + vl.onLoad = function() { + + // Change this button text + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+trans('Hide Description', 'UIWizard')+'")') + .html(trans('Show Description', 'UIWizard')); + + for(var i = 0; i < self.stepButtons.length; i++) { + if(self.stepButtons[i].name == trans('Hide Description', 'UIWizard')) { + self.stepButtons[i].name = trans('Show Description', 'UIWizard'); + } + + } + + // Hide back button + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.backArrow + ' '+self.backText+'")').parent().hide(); + + // Translations and setup + vboxInitDisplay(self.name+'Content',self.context); + + self.steps = 1; + + // Go to last step + self.displayStep(1); + + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.finishText+'")').parent().focus(); + + }; + vl.run(); + + } else { + + // Now in simple mode + self.mode = 'simple'; + + // Remove current content and show simple content + $('#'+self.name+'Title').show().siblings().empty().remove(); + + // resize dialog + $('#'+self.name+'Dialog').dialog('option', 'width', self.width) + .dialog('option', 'height', self.height) + .css({'background':'url('+self.bg+') ' + ((self.mode == 'advanced' ? self.widthAdvanced: self.width) - 360) +'px -60px no-repeat','background-color':'#fff'}); + + + // Reset old number of steps + self.steps = self.simpleSteps; + + var vl = new vboxLoader(); + vl.addFileToDOM('panes/'+self.name+'.html',$('#'+self.name+'Content')); + vl.onLoad = function() { + + // Change this button text + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane') + .find('span:contains("'+trans('Show Description', 'UIWizard')+'")') + .html(trans('Hide Description', 'UIWizard')); + + for(var i = 0; i < self.stepButtons.length; i++) { + if(self.stepButtons[i].name == trans('Show Description', 'UIWizard')) { + self.stepButtons[i].name = trans('Hide Description', 'UIWizard'); + } + + } + + // Translations + vboxInitDisplay(self.name+'Content',self.context); + + // Show back button + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.backArrow + ' '+self.backText+'")').parent().show(); + + self.steps = self.simpleSteps; + + self.displayStep(1); + + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.nextArrow+'")').parent().focus(); + + + }; + vl.run(); + } + + vboxSetLocalDataItem('vboxWizardMode'+self.name, (self.mode == 'advanced' ? 'a': '')); + + + }, + steps: [1] + }], self.stepButtons); + + } + + + // buttons + var buttons = { }; + + if(self.stepButtons) { + for(var i = 0; i < self.stepButtons.length; i++) { + buttons[self.stepButtons[i].name] = self.stepButtons[i].click; + } + } + + if(!self.noAdvanced || self.steps > 1) + buttons[self.backArrow + ' '+self.backText] = self.displayPrev; + + buttons[(self.steps > 1 ? self.nextText +' '+self.nextArrow: self.finishText)] = self.displayNext; + buttons[self.cancelText] = self.cancel; + + // Translations + vboxInitDisplay(self.name+'Content',self.context); + + $(self.dialog).dialog({ + 'closeOnEscape':true, + 'width':(self.mode == 'advanced' ? self.widthAdvanced: self.width), + 'height':(self.mode == 'advanced' ? self.heightAdvanced: self.height), + 'buttons':buttons, + 'modal':true, + 'autoOpen':true, + 'stack':true, + 'dialogClass':'vboxDialogContent vboxWizard', + 'open': function() { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.nextArrow+'")').parent().focus(); + }, + 'title':(self.icon ? '<img src="images/vbox/'+self.icon+ ( (self.icon.indexOf('.png') == -1) ? '_16px.png': '') +'" class="vboxDialogTitleIcon" /> ': '') + self.title + + }).on('dialogclose', function(){ + + // Reject if still pending + if(self.completed.state() == 'pending') + self.completed.reject(); + + $(this).empty().remove(); + + }).on('keyup',function(e) { + + if (e.keyCode == 13) { + + self.displayNext(); + e.stopPropagation(); + e.preventDefault(); + return false; + } + }); + + // Setup if in advanced mode + if(self.mode == 'advanced') { + + // Hold old number of steps + self.simpleSteps = self.steps; + self.steps = 1; + + // Hide title + $('#'+self.name+'Title').hide(); + + // Hide back button + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.backArrow + ' '+self.backText+'")').parent().hide(); + } + + self.displayStep(1); + }; + l.run(); + + return self.completed.promise(); + }; + + /** + * Cancel wizard + * + * @memberOf vboxWizard + */ + this.cancel = function() { + + // Check for onCancel function + if(self.onCancel) { + self.onCancel(); + } + + // Reject if still pending + if(self.completed.state() == 'pending') + self.completed.reject(); + + $(self.dialog).empty().remove(); + }; + + /** + * Display a step + * + * @memberOf vboxWizard + * @param {Integer} + * step - step to display + */ + this.displayStep = function(step) { + self._curStep = step; + for(var i = 0; i < self.steps; i++) { + $('#'+self.name+'Step'+(i+1)).css({'display':'none'}); + } + /* update buttons */ + if(self.stepButtons) { + for(var i = 0; i < self.stepButtons.length; i++) { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.stepButtons[i].name+'")').parent().css({'display':((step == self.steps && self.stepButtons[i].steps[0]==-1) || jQuery.inArray(step,self.stepButtons[i].steps) > -1 ? '': 'none')}); + } + } + if(step == 1 && step != self.steps) { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.backText+'")').parent().addClass('disabled').blur(); + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.finishText+'")').html($('<div />').text((self.steps > 1 ? self.nextText+' '+self.nextArrow: self.finishText)).html()); + } else { + + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.backText+'")').parent().removeClass('disabled'); + + if(step == self.steps) { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.nextArrow+'")').html($('<div />').text(self.finishText).html()); + } else { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.finishText+'")').html($('<div />').text(self.nextText+' '+self.nextArrow).html()); + } + } + $('#'+self.name+'Title').html(trans($('#'+self.name+'Step'+step).attr('title'),self.context)); + $('#'+self.name+'Step'+step).css({'display':''}); + + $('#'+self.name+'Step'+step).trigger('show',self); + + }; + + /** + * Set current wizard step to be the last step in list + * + * @memberOf vboxWizard + */ + this.setLast = function() { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.nextText+'")').html($('<div />').text(self.finishText).html()); + self._origSteps = self.steps; + self.steps = self._curStep; + }; + + /** + * Unset the current wizard step so that it is not forced to be the last one + * in the list + * + * @memberOf vboxWizard + */ + this.unsetLast = function() { + $('#'+self.name+'Dialog').parent().find('.ui-dialog-buttonpane').find('span:contains("'+self.finishText+'")').html($('<div />').text(self.nextText+' '+self.nextArrow).html()); + if(self._origSteps) self.steps = self._origSteps; + }; + + /** + * Display previous step + * + * @memberOf vboxWizard + */ + this.displayPrev = function() { + if(self._curStep <= 1) return; + self.displayStep(self._curStep - 1); + }; + + /** + * Display next step + * + * @memberOf vboxWizard + */ + this.displayNext = function() { + if(self._curStep >= self.steps) { + self.onFinish(); + return; + } + self.displayStep(self._curStep + 1); + }; + +} + +/** + * Common toolbar class + * + * @constructor + * @class vboxToolbar + * @param {Array} buttons - buttons to add to toolbar + */ +function vboxToolbar(buttons) { + + var self = this; + this.buttons = buttons; + this.size = 22; + this.addHeight = 24; + this.lastItem = null; + this.buttonStyle = ''; + this.enabled = true; + this.mutliSelect = false; // true if multiple items are selected + this._buttonElements = {}; // button elements by name + + /** + * Add buttons to this object + * @param {Array} buttons - buttons to add to toolbar + */ + this.addButtons = function(buttons) { + this.buttons = buttons; + } + + /** + * Update buttons to be enabled / disabled + * + * @memberOf vboxToolbar + * @param {Object|Null} + * item - item to check + */ + this.update = function(item) { + + // Event target or manually passed item + self.lastItem = item; + + if(!self.enabled) return; + + for(var i = 0; i < self.buttons.length; i++) { + if(self.buttons[i].enabled && !self.buttons[i].enabled(self.lastItem)) { + self.disableButton(self.buttons[i]); + } else { + self.enableButton(self.buttons[i]); + } + } + }; + + /** + * Enable entire toolbar. Calls self.update() + * + * @memberOf vboxToolbar + * @param {Object} + * e - event + * @param {Object} + * item - item to pass to update + */ + this.enable = function(e, item) { + self.enabled = true; + self.update((item||self.lastItem)); + }; + + /** + * Disable entire toolbar + * + * @memberOf vboxToolbar + */ + this.disable = function() { + self.enabled = false; + for(var i = 0; i < self.buttons.length; i++) { + self.disableButton(self.buttons[i]); + } + }; + + /** + * Enable a single button + * + * @memberOf vboxToolbar + * @param {Object} + * b - button to enable + */ + this.enableButton = function(b) { + this._buttonElements[b.name].addClass('vboxEnabled').removeClass('vboxDisabled disabled').children('img.vboxToolbarImg').attr('src','images/vbox/'+b.icon+'_'+self.size+'px.png'); + }; + + /** + * Disable a single button + * + * @memberOf vboxToolbar + * @param {Object} + * b - button to disable + */ + this.disableButton = function(b) { + this._buttonElements[b.name].addClass('vboxDisabled disabled').removeClass('vboxEnabled').children('img.vboxToolbarImg').attr('src','images/vbox/'+b.icon+'_disabled_'+self.size+'px.png').trigger('mouseleave'); + }; + + /** + * Set button label + * + * @memberOf vboxToolbar + * @param {String} + * bname - name of button to set label for + * @param {String} + * l - new label for button + */ + this.setButtonLabel = function(bname,l) { + this._buttonElements[b.name].find('span.vboxToolbarButtonLabel').html(l); + }; + + /** + * Return the button element by name + * + * @param {String} + * bname - button name + * @returns {HTMLNode} + */ + this.getButtonElement = function(bname) { + return this._buttonElements[bname] + }; + + /** + * Generate HTML element for button + * + * @memberOf vboxToolbar + * @param {Object} + * b - button object containing various button parameters + * @return {HTMLNode} button element + */ + this.buttonElement = function(b) { + + // Pre-load disabled version of icon if enabled function exists + if(b.enabled) { + var a = new Image(); + a.src = "images/vbox/"+b.icon+"_disabled_"+self.size+"px.png"; + } + + // TD + var td = $('<td />').attr({'class':'vboxToolbarButton ui-corner-all vboxEnabled vboxToolbarButton'+self.size, + 'style':self.buttonStyle+'; min-width: '+(self.size+12)+'px;' + }).html('<img src="images/vbox/'+b.icon+'_'+self.size+'px.png" class="vboxToolbarImg" style="height:'+self.size+'px;width:'+self.size+'px;"/><br /><span class="vboxToolbarButtonLabel">' + String(b.toolbar_label ? b.toolbar_label: b.label).replace(/\.+$/g,'')+'</span>').on('click',function(){ + if($(this).hasClass('vboxDisabled')) return; + $(this).data('toolbar').click($(this).data('name')); + // store data + }).data(b); + + if(!self.noHover) { + $(td).hover( + function(){if($(this).hasClass('vboxEnabled')){$(this).addClass('vboxToolbarButtonHover');}}, + function(){$(this).removeClass('vboxToolbarButtonHover');} + ).mousedown(function(e){ + if($.browser.msie && e.button == 1) e.button = 0; + if(e.button != 0 || $(this).hasClass('vboxDisabled')) return true; + $(this).addClass('vboxToolbarButtonDown'); + + var e = jQuery.Event("mouseup", {button:0}); + $(this).siblings().trigger(e); + + var btn = $(this); + $(document).one('mouseup',function(){ + $(btn).removeClass('vboxToolbarButtonDown'); + }); + }); + } + + return td; + + }; + + /** + * Render buttons to HTML node where id = id param + * + * @memberOf vboxToolbar + * @param {String|Object} + * node - HTMLNode or id to add buttons to + */ + this.renderTo = function(node) { + + if(typeof(node) == 'string') { + node = $('#'+node); + } + + self.height = self.size + self.addHeight; + + // Create table + var tbl = $('<table />').attr({'class':'vboxToolbar vboxToolbar'+this.size}); + var tr = $('<tr />'); + + for(var i = 0; i < self.buttons.length; i++) { + + if(self.buttons[i].separator) { + $('<td />').attr({'class':'vboxToolbarSeparator'}).html('<br />').appendTo(tr); + } + + self.buttons[i].toolbar = self; + self._buttonElements[self.buttons[i].name] = self.buttonElement(self.buttons[i]); + $(tr).append(self._buttonElements[self.buttons[i].name]); + + + } + + $(tbl).append(tr); + $(node).append(tbl).addClass('vboxToolbar vboxToolbar'+this.size).on('disable',self.disable).on('enable',self.enable); + + // If button can be enabled / disabled, disable by default + for(var i = 0; i < self.buttons.length; i++) { + if(self.buttons[i].enabled) { + self.disableButton(self.buttons[i]); + } + } + + return this; + }; + + /** + * Return button by name + * + * @memberOf vboxToolbar + * @param {String} + * n - button name + * @return {Object} button + */ + this.getButtonByName = function(n) { + for(var i = 0; i < self.buttons.length; i++) { + if(self.buttons[i].name == n) + return self.buttons[i]; + } + return null; + }; + + /** + * Trigger click event on button who's name = btn param + * + * @memberOf vboxToolbar + * @param {String} + * btn - name of button + * @return return value of .click() function performed on button + */ + this.click = function(btn) { + var b = self.getButtonByName(btn); + return b.click(btn); + }; + +} + +/** + * Toolbar class for single button + * + * @constructor + * @class vboxToolbarSmall + * @super vboxToolbar + * @param {Object} buttons - button for toolbar +*/ +function vboxToolbarSingle(button) { + + this.parentClass = vboxToolbarSmall; + this.parentClass(); + this.buttons = [ button ]; + this.disabledString = 'disabled' + this._buttonElement = this.buttonElement; /* copy orig */ + + /** + * Generate HTML element for button + * + * @memberOf vboxToolbarSingle + * @param {Object} + * b - button object containing various button parameters + * @return {HTMLNode} button element + */ + this.buttonElement = function(b) { + return this._buttonElement(b).attr({'title':String(b.toolbar_label ? b.toolbar_label: b.label)}); + } + +} + +/** + * Toolbar class for a small toolbar + * + * @constructor + * @class vboxToolbarSmall + * @super vboxToolbar + * @param {Array} + * buttons - list of buttons for toolbar + */ +function vboxToolbarSmall(buttons) { + + var self = this; + this.parentClass = vboxToolbar; + this.parentClass(); + this.selected = null; + this.buttons = buttons; + this.lastItem = null; + this.buttonStyle = ''; + this.enabled = true; + this.size = 16; + this.disabledString = 'disabled'; + this.buttonCSS = {}; + + /** + * Enable a single button + * + * @memberOf vboxToolbarSmall + * @param {Object} + * b - button to enable + * @return null + */ + this.enableButton = function(b) { + if(b.noDisabledIcon) + this._buttonElements[b.name].css('display','').prop('disabled',false); + else + this._buttonElements[b.name].css('background-image','url(images/vbox/' + b.icon + '_'+self.size+'px.png)').prop('disabled',false); + }; + /** + * Disable a single button + * + * @memberOf vboxToolbarSmall + * @param {Object} + * b - button to disable + * @return null + */ + this.disableButton = function(b) { + if(b.noDisabledIcon) + this._buttonElements[b.name].css('display','none').prop('disabled',false).removeClass('vboxToolbarSmallButtonHover').addClass('vboxToolbarSmallButton').trigger('mouseleave'); + else + this._buttonElements[b.name].css('background-image','url(images/vbox/' + b.icon + '_'+self.disabledString+'_'+self.size+'px.png)').prop('disabled',true).removeClass('vboxToolbarSmallButtonHover').addClass('vboxToolbarSmallButton').trigger('mouseleave'); + }; + + /** + * Add CSS to be applied to button + * + * @param {String} + * b button name + * @param {Object} + * css css to be applied to button + */ + this.addButtonCSS = function(b, css) { + self.buttonCSS[b] = css; + }; + + /** + * Generate HTML element for button + * + * @memberOf vboxToolbarSmall + * @param {Object} + * b - button object containing various button parameters + * @return {HTMLNode} button element + */ + this.buttonElement = function(b) { + + // Pre-load disabled version of icon if enabled function exists + if(b.enabled && !b.noDisabledIcon) { + var a = new Image(); + a.src = "images/vbox/" + b.icon + '_'+self.disabledString+'_'+self.size+'px.png'; + } + + var btn = $('<input />').attr({'type':'button','value':'', + 'class':'vboxImgButton vboxToolbarSmallButton ui-corner-all', + 'title':String(b.toolbar_label ? b.toolbar_label: b.label).replace(/\.+$/g,''), + 'style':self.buttonStyle+' background-image: url(images/vbox/' + b.icon + '_'+self.size+'px.png);' + }).click(b.click); + + if(!self.noHover) { + $(btn).hover( + function(){if(!$(this).prop('disabled')){$(this).addClass('vboxToolbarSmallButtonHover').removeClass('vboxToolbarSmallButton');}}, + function(){$(this).addClass('vboxToolbarSmallButton').removeClass('vboxToolbarSmallButtonHover');} + ); + + } + + // Check for button specific CSS + if(self.buttonCSS[b.name]) btn.css(self.buttonCSS[b.name]); + + return btn; + + }; + + /** + * Render buttons to HTML node where id = id param + * + * @memberOf vboxToolbarSmall + * @param {String|Object} + * targetElm - HTMLNode or id to add buttons to + * @return null + */ + this.renderTo = function(targetElm) { + + if(typeof(targetElm) == 'string') { + targetElm = $('#'+targetElm); + } + + if(!self.buttonStyle) + self.buttonStyle = 'height: ' + (self.size+8) + 'px; width: ' + (self.size+8) + 'px; '; + + for(var i = 0; i < self.buttons.length; i++) { + + if(self.buttons[i].separator) { + $(targetElm).append($('<hr />').attr({'style':'display: inline','class':'vboxToolbarSmall vboxSeparatorLine'})); + } + + this._buttonElements[self.buttons[i].name] = self.buttonElement(self.buttons[i]); + $(targetElm).append(this._buttonElements[self.buttons[i].name]); + + } + + $(targetElm).attr({'name':self.name}).addClass('vboxToolbarSmall vboxEnablerTrigger vboxToolbarSmall'+self.size).on('disable',self.disable).on('enable',self.enable); + + return this; + + }; + +} + +/** + * Media menu button class + * + * @constructor + * @class vboxButtonMediaMenu + * @param {String} type - type of media to display + * @param {Function} callback - callback to run when media is selected + * @param {String} mediumPath - path to use when selecting media + */ +function vboxButtonMediaMenu(type,callback,mediumPath) { + + var self = this; + this.buttonStyle = ''; + this.enabled = true; + this.size = 16; + this.disabledString = 'disabled'; + this.type = type; + this.lastItem = null; + this._buttonElement = null; // holds button node + + /** vboxMediaMenu to display when button is clicked */ + this.mediaMenu = new vboxMediaMenu(type,callback,mediumPath); + + /* Static button type list */ + this.buttons = { + + HardDisk: { + name: 'mselecthdbtn', + label: trans('Set up the virtual hard disk','UIMachineSettingsStorage'), + icon: 'hd', + click: function () { + return; + } + }, + + DVD: { + name: 'mselectcdbtn', + label: trans('Set up the virtual CD/DVD drive','UIMachineSettingsStorage'), + icon: 'cd', + click: function () { + return; + } + }, + + Floppy: { + name: 'mselectfdbtn', + label: trans('Set up the virtual floppy drive','UIMachineSettingsStorage'), + icon: 'fd', + click: function () { + return; + } + } + }; + + // Set button based on passed type + this.button = self.buttons[self.type]; + + /** + * Update button to be enabled / disabled + * + * @memberOf vboxButtonMediaMenu + * @param {Object|Null} + * target - item to test in button's enabled() fuction + * @param {Object|Null} + * item - item to test in button's enabled() fuction + * @return null + */ + this.update = function(target,item) { + + if(!self.enabled) return; + + self.lastItem = (item||target); + + if(self.button.enabled && !self.button.enabled(self.lastItem)) { + self.disableButton(); + } else { + self.enableButton(); + } + }; + /** + * Enable this button + * + * @memberOf vboxButtonMediaMenu + * @return null + */ + this.enableButton = function() { + var b = self.button; + this._buttonElement.css('background-image','url(images/vbox/' + b.icon + '_'+self.size+'px.png)').removeClass('vboxDisabled').html('<img src="images/downArrow.png" style="margin:0px;padding:0px;float:right;width:6px;height:6px;" />'); + }; + /** + * Disable this button + * + * @memberOf vboxButtonMediaMenu + * @return null + */ + this.disableButton = function() { + var b = self.button; + this._buttonElement.css('background-image','url(images/vbox/' + b.icon + '_'+self.disabledString+'_'+self.size+'px.png)').removeClass('vboxToolbarSmallButtonHover').addClass('vboxDisabled').html('').trigger('mouseleave'); + }; + + /** + * Enable button and menu + * + * @memberOf vboxButtonMediaMenu + * @param {Object} e event object + * @param {Mixed} item test item passed to buttons .enabled() functions + * @return null + */ + this.enable = function(e, item) { + self.enabled = true; + self.update((item||self.lastItem)); + self.getButtonElm().enableContextMenu(); + }; + + /** + * Disable button and menu + * + * @memberOf vboxButtonMediaMenu + * @return null + */ + this.disable = function() { + self.enabled = false; + self.disableButton(); + self.getButtonElm().disableContextMenu(); + }; + + + /** + * Generate HTML element for button + * + * @memberOf vboxButtonMediaMenu + * @return {HTMLNode} + */ + this.buttonElement = function() { + + var b = self.button; + + // Pre-load disabled version of icon if enabled function exists + if(b.enabled) { + var a = new Image(); + a.src = "images/vbox/" + b.icon + "_" + self.disabledString + "_" + self.size + "px.png"; + } + + return $('<td />').attr({'type':'button','value':'', + 'class':'vboxImgButton vboxToolbarSmallButton vboxButtonMenuButton ui-corner-all', + 'title':b.label, + 'style':self.buttonStyle+' background-image: url(images/vbox/' + b.icon + '_'+self.size+'px.png);text-align:right;vertical-align:bottom;' + }).click(function(e){ + if($(this).hasClass('vboxDisabled')) return; + $(this).addClass('vboxButtonMenuButtonDown'); + var tbtn = $(this); + e.stopPropagation(); + e.preventDefault(); + $(document).one('mouseup',function(){ + $(tbtn).removeClass('vboxButtonMenuButtonDown'); + }); + }).html('<img src="images/downArrow.png" style="margin:0px;padding:0px;float:right;width:6px;height:6px;" />').hover( + function(){if(!$(this).hasClass('vboxDisabled')){$(this).addClass('vboxToolbarSmallButtonHover');}}, + function(){$(this).removeClass('vboxToolbarSmallButtonHover');} + ); + + + }; + + /** + * Return a jquery object containing button element. + * + * @memberOf vboxButtonMediaMenu + * @return {Object} jQuery object containing button element + */ + this.getButtonElm = function () { + return this._buttonElement; + }; + + /** + * Render button to element with id + * + * @memberOf vboxButtonMediaMenu + * @param {String|Object} + * targetElm - HTMLNode node or id to add button to + */ + this.renderTo = function(targetElm) { + + if(typeof(targetElm) == 'string') + targetElm = $('#'+targetElm); + + if(!self.buttonStyle) + self.buttonStyle = 'height: ' + (self.size + ($.browser.msie || $.browser.webkit ? 3: 7)) + 'px; width: ' + (self.size+10) + 'px; '; + + this._buttonElement = self.buttonElement(); + + var tbl = $('<table />').attr({'style':'border:0px;margin:0px;padding:0px;'+self.buttonStyle}); + $('<tr />').css({'vertical-align':'bottom'}).append(this._buttonElement).appendTo(tbl); + + $(targetElm).attr({'name':self.name}).addClass('vboxToolbarSmall vboxButtonMenu vboxEnablerTrigger').on('disable',self.disable).on('enable',self.enable).append(tbl); + + // Generate and attach menu + self.mediaMenu.menuElement(); + + self.getButtonElm().contextMenu({ + menu: self.mediaMenu.menu_id(), + mode:'menu', + button: 0 + },self.mediaMenu.menuCallback); + + + }; + + /** + * Update media menu + * + * @see vboxMediaMenu.menuUpdateMedia + */ + this.menuUpdateMedia = self.mediaMenu.menuUpdateMedia; + +} + +/** + * Media menu class + * + * @constructor + * @class vboxMediaMenu + * @param {String} + * type - type of media to display + * @param {Function} + * callback - callback function to run when medium is selected + * @param {String} + * mediumPath - path to use when selecting media + */ +function vboxMediaMenu(type,callback,mediumPath) { + + var self = this; + this.type = type; + this.callback = callback; + this.mediumPath = mediumPath; + this.removeEnabled = true; + + /** + * Generate menu element ID + * + * @memberOf vboxMediaMenu + * @return {String} string to use for menu node id + */ + this.menu_id = function(){ + return 'vboxMediaListMenu'+self.type; + }; + + /** + * Generate menu element + * + * @memberOf vboxMediaMenu + * @return {HTMLNode} menu element + */ + this.menuElement = function() { + + // Pointer already held + if(self._menuElm) return self._menuElm; + + var id = self.menu_id(); + + // Hold pointer + self._menu = new vboxMenu(id,id); + + // Add menu + self._menu.addMenu(self.menuGetDefaults()); + + // Update recent list + self.menuUpdateRecent(); + + self._menu.update(); + + self._menuElm = $('#'+self.menu_id()); + + return self._menuElm; + }; + + /** + * Generate and return host drives + * + * @memberOf vboxMediaMenu + * @return {Array} array of objects that can be added to menu + */ + this.menuGetDrives = function() { + + var menu = []; + + // Add host drives + var meds = vboxMedia.mediaForAttachmentType(self.type); + for(var i =0; i < meds.length; i++) { + if(!meds[i].hostDrive) continue; + menu[menu.length] = {'name':meds[i].id,'label':vboxMedia.getName(meds[i])}; + } + + return menu; + + }; + + + /** + * List of default menu items to use for media of type self.type + * + * @memberOf vboxMediaMenu + * @return {Array} List of default menu items to use for media of type + * self.type + */ + this.menuGetDefaults = function () { + + menus = []; + + switch(self.type) { + + // HardDisk defaults + case 'HardDisk': + + // create hard disk + menus[menus.length] = {'name':'createD','icon':'hd_new','label':trans('Create a new hard disk...','UIMachineSettingsStorage')}; + + // choose hard disk + menus[menus.length] = {'name':'chooseD','icon':'select_file','label':trans('Choose a virtual hard disk file...','UIMachineSettingsStorage')}; + + // Add VMM? + if($('#vboxPane').data('vboxConfig').enableAdvancedConfig) { + menus[menus.length] = {'name':'vmm','icon':'diskimage','label':trans('Virtual Media Manager...','UIActionPool')}; + } + + // recent list place holder + menus[menus.length] = {'name':'vboxMediumRecentBefore','cssClass':'vboxMediumRecentBefore','enabled':function(){return false;},'hide_on_disabled':true}; + + break; + + // CD/DVD Defaults + case 'DVD': + + // Choose disk image + menus[menus.length] = {'name':'chooseD','icon':'select_file','label':trans('Choose a virtual CD/DVD disk file...','UIMachineSettingsStorage')}; + + // Add VMM? + if($('#vboxPane').data('vboxConfig').enableAdvancedConfig) { + menus[menus.length] = {'name':'vmm','icon':'diskimage','label':trans('Virtual Media Manager...','UIActionPool')}; + } + + // Add host drives + menus = menus.concat(self.menuGetDrives()); + + // Add remove drive + menus[menus.length] = {'name':'removeD','icon':'cd_unmount','cssClass':'vboxMediumRecentBefore', + 'label':trans('Remove disk from virtual drive','UIMachineSettingsStorage'),'separator':true, + 'enabled':function(){return self.removeEnabled;}}; + + break; + + // Floppy defaults + default: + + // Choose disk image + menus[menus.length] = {'name':'chooseD','icon':'select_file','label':trans('Choose a virtual floppy disk file...','UIMachineSettingsStorage')}; + + // Add VMM? + if($('#vboxPane').data('vboxConfig').enableAdvancedConfig) { + menus[menus.length] = {'name':'vmm','icon':'diskimage','label':trans('Virtual Media Manager...','UIActionPool')}; + } + + // Add host drives + menus = menus.concat(self.menuGetDrives()); + + // Add remove drive + menus[menus.length] = {'name':'removeD','icon':'fd_unmount','cssClass':'vboxMediumRecentBefore', + 'label':trans('Remove disk from virtual drive','UIMachineSettingsStorage'),'separator':true, + 'enabled':function(){return self.removeEnabled;}}; + + break; + + } + + return menus; + + }; + + /** + * Update "recent" media list menu items + * + * @memberOf vboxMediaMenu + */ + this.menuUpdateRecent = function() { + + var elm = $('#'+self.menu_id()); + var list = $('#vboxPane').data('vboxRecentMedia')[self.type]; + elm.children('li.vboxMediumRecent').remove(); + var ins = elm.children('li.vboxMediumRecentBefore').last(); + for(var i = 0; i < list.length; i++) { + if(!list[i]) continue; + if(!vboxMedia.getMediumByLocation(list[i])) continue; + + $('<li />').attr({'class':'vboxMediumRecent'}).append( + $('<a />').attr({ + 'href': '#path:'+list[i], + 'title': list[i] + }).text(vboxBasename(list[i])) + ).insertBefore(ins); + } + }; + + /** + * Update media checkbox and "remove image from disk" menu item + * + * @memberOf vboxMediaMenu + * @param {String} + * medium - medium attached to controller + * @return null + */ + this.menuUpdateMedia = function(medium) { + self.removeEnabled = (medium ? true: false); + if(!self._menu) self.menuElement(); + else self._menu.update(); + // Remove all 'attached' spans + var elm = $('#'+self.menu_id()); + $(elm).find('a.vboxCheckMark').removeClass('vboxCheckMark').children('span.vboxCheckMark').remove(); + if(medium) { + if(medium.hostDrive) { + $(elm).find('a[href="#'+medium.id+'"]').addClass('vboxCheckMark').prepend($('<span />').attr({'class':'vboxCheckMark'}).html('✓')); + } else { + $(elm).find('a[href="#path:'+medium.location+'"]').addClass('vboxCheckMark').prepend($('<span />').attr({'class':'vboxCheckMark'}).html('✓')); + } + } + }; + + /** + * Update recent media menu and global recent media list + * + * @memberOf vboxMediaMenu + * @param {Object} + * m - medium object + * @param {Boolean} + * skipPathAdd - don't add medium's path to vbox's list of recent + * media paths + */ + this.updateRecent = function(m, skipPathAdd) { + + if(vboxMedia.updateRecent(m, skipPathAdd)) { // returns true if + // recent media list has + // changed + // Update menu + self.menuUpdateRecent(); + } + }; + + /** + * Function called when menu item is selected + * + * @memberOf vboxMediaMenu + * @param {String} + * action - menu item's href value (text in a href="#...") + */ + this.menuCallback = function(action) { + + switch(action) { + + // Create hard disk + case 'createD': + $.when(new vboxWizardNewHDDialog({'path':(self.mediumPath ? self.mediumPath: $('#vboxPane').data('vboxRecentMediaPaths')[self.type])+$('#vboxPane').data('vboxConfig').DSEP}).run()) + .done(function(id){ + if(!id) return; + var med = vboxMedia.getMediumById(id); + self.callback(med); + self.menuUpdateRecent(med); + }); + break; + + // VMM + case 'vmm': + // vboxVMMDialog(select,type,hideDiff,mPath) + $.when(vboxVMMDialog(true,self.type,true,(self.mediumPath ? self.mediumPath: $('#vboxPane').data('vboxRecentMediaPaths')[self.type]))).done(function(m){ + if(m) { + self.callback(vboxMedia.getMediumById(m)); + self.menuUpdateRecent(); + } + }); + break; + + // Choose medium file + case 'chooseD': + + vboxMedia.actions.choose(self.mediumPath,self.type,function(med){ + self.callback(med); + self.menuUpdateRecent(); + }); + + break; + + // Existing medium was selected + default: + if(action.indexOf('path:') == 0) { + var path = action.substring(5); + var med = vboxMedia.getMediumByLocation(path); + if(med && med.deviceType == self.type) { + self.callback(med); + self.updateRecent(med,true); + } + return; + } + var med = vboxMedia.getMediumById(action); + self.callback(med); + self.updateRecent(med,true); + } + }; + + +} + + + + +/** + * Menu class for use with context or button menus + * + * @constructor + * @class vboxMenu + * @param {String} + * name - name of menu + * @param {String} + * id - optional HTMLNode id of menu to use + * @param {Array} + * menuItems - list of menu items to add + */ +function vboxMenu(name, id, menuItems) { + + var self = this; + + this.name = name; + this.menuItems = {}; + this.iconStringDisabled = '_disabled'; + this.id = id; + + /** + * return menu id + * + * @memberOf vboxMenu + * @return {String} the HTMLNode id of this menu + */ + this.menuId = function() { + if(self.id) return self.id; + return self.name + 'Menu'; + }; + + /** + * Add menu to menu object + * + * @memberOf vboxMenu + * @param {Object} + * m - menu configuration object + */ + this.addMenu = function(m) { + $('#vboxPane').append(self.menuElement(m,self.menuId())); + }; + + /** + * Traverse menu configuration object and generate a + * <UL> + * containing menu items + * + * @memberOf vboxMenu + * @param {Object} + * m - menu configuration object + * @param {String} + * mid - the optional id to use for the generated HTMLNode + * @return {HTMLNode} menu + * <UL> + * node containing menu items and submenus + */ + this.menuElement = function(m,mid) { + + var ul = null; + + if(mid) { + ul = $('#'+mid); + if(ul && ul.length) { + ul.empty(); + } else { + ul = $('<ul />').attr({'id':mid,'style':'display: none;'}); + } + } else { + ul = $('<ul />').attr({'style':'display: none;'}); + } + + ul.addClass('contextMenu'); + + for(var i in m) { + + if(typeof m[i] == 'function') continue; + + // get menu item + var item = self.menuItem(m[i]); + + // Add to menu list + self.menuItems[m[i].name] = m[i]; + + // Children? + if(m[i].children && m[i].children.length) { + item.append(self.menuElement(m[i].children, self.menuId()+'-submenu-' + i)); + } + + ul.append(item); + + } + + return ul; + + }; + + /** + * Menu click callback + * + * @memberOf vboxMenu + * @param {Integer} + * i - menu item index number + * @param {Object} + * item - optional selected item + * @return return value of menu item's click() function + */ + this.menuClickCallback = function(i, item) { + return self.menuItems[i].click(item); + }; + + /** + * generate menu item HTML + * + * @memberOf vboxMenu + * @param {Object} + * i - menu item's configuration object + * @return {HTMLNode} + * <li> containing menu item + */ + this.menuItem = function(i) { + + return $('<li />').addClass((i.separator ? 'separator': '')).addClass((i.cssClass ? i.cssClass: '')).append($('<a />') + .html(i.label) + .attr({ + 'style': (i.icon ? 'background-image: url('+self.menuIcon(i,false)+')': ''), + 'id': self.name+i.name,'href':'#'+i.name + })); + + }; + + /** + * Return a URL to use for menu item's icon + * + * @memberOf vboxMenu + * @param {Object} + * i - menu item configuration object + * @param {Boolean} + * disabled - whether or not the icon should be disabled + * @return {String} url to icon to use + */ + this.menuIcon = function(i,disabled) { + + if(!i.icon) return ''; + + return 'images/vbox/' + i.icon + (disabled ? self.iconStringDisabled: '') + '_16px.png'; + + }; + + /** + * Update all menu items + * + * @memberOf vboxMenu + * @param {Object} + * testObj - object used to test for enabled() + * @return null + */ + this.update = function(testObj) { + + for(var i in self.menuItems) { + + // If enabled function doesn't exist, there's nothing to do + if(!self.menuItems[i].enabled) continue; + + var mi = $('#'+self.name+i); + + // Disabled + if(!self.menuItems[i].enabled(testObj)) { + + if(self.menuItems[i].hide_on_disabled) { + mi.parent().hide(); + } else { + self.disableItem(i,mi); + } + + // Enabled + } else { + if(self.menuItems[i].hide_on_disabled) { + mi.parent().show(); + } else { + self.enableItem(i,mi); + } + } + + } + }; + + /** + * Disable a single menu item + * + * @memberOf vboxMenu + * @param {String} + * i - menu item's name + * @param {Object} + * mi - optional menu item HTMLNode or jQuery object + */ + this.disableItem = function(i, mi) { + if(!mi) mi = $('#'+self.name+i); + if(self.menuItems[i].icon) + mi.css({'background-image':'url('+self.menuIcon(self.menuItems[i],true)+')'}).parent().addClass('disabled'); + else + mi.parent().addClass('disabled'); + + }; + + /** + * Enable a single menu item + * + * @memberOf vboxMenu + * @param {String} + * i - menu item's name + * @param {Object} + * mi - optional menu item HTMLNode or jQuery object + */ + this.enableItem = function(i, mi) { + if(!mi) mi = $('#'+self.name+i); + if(self.menuItems[i].icon) + mi.css({'background-image':'url('+self.menuIcon(self.menuItems[i],false)+')'}).parent().removeClass('disabled'); + else + mi.parent().removeClass('disabled'); + }; + + + // Just add menu items if there were passed + if(menuItems) self.addMenu(menuItems); + +} + +/** + * Menu bar class + * + * @constructor + * @class vboxMenuBar + * @param {String} + * name - name of this menu bar + */ +function vboxMenuBar(name) { + + var self = this; + this.name = name; + this.menus = new Array(); + this.menuClick = {}; + this.iconStringDisabled = '_disabled'; + + /** + * Add a menu to this object + * + * @memberOf vboxMenuBar + * @param {Object} + * m - menu configuration object + * @return void + */ + this.addMenu = function(m) { + + // Create menu object + m.menuObj = new vboxMenu(m.name); + + // Propagate config + m.menuObj.iconStringDisabled = self.iconStringDisabled; + + // Add menu + m.menuObj.addMenu(m.menu); + self.menus[self.menus.length] = m; + + }; + + /** + * Render menu bar to element identified by ID + * + * @memberOf vboxMenuBar + * @param {String} + * id - HTMLNode id of node to add menu bar to + */ + this.renderTo = function(id) { + + $('#'+id).prepend($('<div />').attr({'class':'vboxMenuBar','id':self.name+'MenuBar'})); + + for(var i = 0; i < self.menus.length; i++) { + $('#'+self.name+'MenuBar').append( + $('<span />').attr({'id':'vboxMenuBarMenu'+self.name+self.menus[i].name}).html(self.menus[i].label) + .contextMenu({ + menu: self.menus[i].menuObj.menuId(), + button: 0, + mode: 'menu', + menusetup: function(el) { + $(el).parent().data('vboxMenubarActive', true); + $(document).one('mousedown',function(){ + $(el).parent().data('vboxMenubarActive', false); + }); + } + }, + self.menus[i].menuObj.menuClickCallback + ).hover( + function(){ + $(this).addClass('vboxBordered'); + if($(this).parent().data('vboxMenubarActive')) { + + // Hide any showing menu + var e = jQuery.Event("mouseup", {button:0}); + $(this).trigger(e); + var e = jQuery.Event("mousedown", {button:0}); + $(this).trigger(e); + var e = jQuery.Event("mouseup", {button:0}); + $(this).trigger(e); + } + }, + function(){ + $(this).removeClass('vboxBordered'); + } + ).disableSelection() + ); + } + }; + + + /** + * Update Menu items + * + * @memberOf vboxMenuBar + * @param {Object} + * item - item to use in menu configuration items' update() test + * @return void + */ + this.update = function(item) { + + + for(var i = 0; i < self.menus.length; i++) { + + // check for enabled function on entire menu object + if(self.menus[i].enabled) { + if(self.menus[i].enabled(item)) { + $('#vboxMenuBarMenu'+self.name+self.menus[i].name).show(); + } else { + $('#vboxMenuBarMenu'+self.name+self.menus[i].name).hide(); + continue; + } + } + self.menus[i].menuObj.update(item); + } + + }; + + +} + +/** + * Loads data, scripts, and HTML files and optionally displays "Loading ..." + * screen until all items have completed loading + * + * @param {String} name - unique name for this loader. used to generate id + * of "Loading..." div + * @constructor + * @class vboxLoader + */ +function vboxLoader(name) { + + if(!name) name = ''; + var self = this; + this._load = []; + this.onLoad = null; + this._loadStarted = {}; + this.hideRoot = false; + this.noLoadingScreen = false; + this.name = name; + + this._data = []; + this._files = []; + + /** + * Add data item to list of items to load + * + * @memberOf vboxLoader + * @param {String} + * dataFunction - function to pass to vboxAjaxRequest() + * @param {Function} + * callback - callback to run when data is returned + * @param {Object} + * params - params to pass to vboxAjaxRequest() + * @see vboxAjaxRequest() + */ + this.add = function(dataFunction, callback, params) { + if(!this.name) this.name = dataFunction + 'Loader'; + this._data[this._data.length] = vboxAjaxRequest(dataFunction,params).done(callback); + }; + + /** + * Add file to list of items to load + * + * @memberOf vboxLoader + * @param {String} + * file - URL of file to load + * @param {Function} + * callback - callback to run when file is loaded + * @see vboxAjaxRequest() + */ + this.addFile = function(file,callback) { + this._files[this._files.length] = { + 'callback': callback, + 'file': file + }; + }; + + /** + * Add file to list of items to load. Append resulting file to element. + * + * @memberOf vboxLoader + * @param {String} + * file - URL of file to load + * @param {jQueryObject} + * elm - element to append file to + */ + this.addFileToDOM = function(file,elm) { + if(elm === undefined) elm = $('#vboxPane'); + var callback = function(f){elm.append(f);}; + self.addFile(file,callback); + }; + + /** + * Show loading screen + * + */ + this.showLoading = function() { + + var div = $('<div />').attr({'id':'vboxLoaderDialog'+self.name,'title':'','style':'display: none;','class':'vboxLoaderDialog'}); + + var tbl = $('<table />'); + var tr = $('<tr />'); + + $('<td />').attr('class', 'vboxLoaderSpinner').html('<img src="images/spinner.gif" width="36" height="39" />').appendTo(tr); + + $('<td />').attr('class','vboxLoaderText').html(trans('Loading ...','UIVMDesktop')).appendTo(tr); + + $(tbl).append(tr).appendTo(div); + + if(self.hideRoot) + $('#vboxPane').css('display', 'none'); + + $(div).dialog({ + 'dialogClass': 'vboxLoaderDialog', + 'width': 'auto', + 'height': 65, + 'modal': true, + 'resizable': false, + 'draggable': false, + 'closeOnEscape': false, + 'buttons': {} + }); + + }; + + /** + * Hide loading screen + */ + this.removeLoading = function() { + $('#vboxLoaderDialog'+self.name).empty().remove(); + }; + + /** + * Load data and optionally present "Loading..." screen + * + * @memberOf vboxLoader + * @return null + */ + this.run = function() { + + if(!self.noLoadingScreen) { + self.showLoading(); + } + + // Data first + $.when.apply($, self._data).done(function() { + + // files + for(var i = 0; i < self._files.length; i++) { + self._files[i] = jQuery.get(self._files[i]['file'],self._files[i]['callback']).fail(function(d) { + + // Check for error HTTP status + if(d && d.status && (String(d.status).substring(0,1) == '4' || String(d.status).substring(0,1) == '5')) { + var err = {error: 'HTTP error: ' + d.status + ' ' + d.statusText,details:''}; + for(var i in d) { + if(typeof(d[i]) == 'function' || typeof(d[i]) == 'object') continue; + err.details += i + ': "' + d[i] + '"' + "\n"; + } + vboxAlert(err); + } + + }); + } + + $.when.apply($, self._files).done(function() { + self._stop(); + }); + + }); + + }; + + /** + * Remove loading screen and show body + * + * @memberOf vboxLoader + */ + this._stop = function() { + + if(self.onLoad) self.onLoad(self); + + if(!self.noLoadingScreen) self.removeLoading(); + + if(self.hideRoot) $('#vboxPane').css('display', ''); + + if(self.onShow) self.onShow(); + }; + +} + +/** + * Serial port namespace + * + * @namespace vboxSerialPorts + */ +var vboxSerialPorts = { + + ports: [ + { 'name':"COM1", 'irq':4, 'port':'0x3F8' }, + { 'name':"COM2", 'irq':3, 'port':'0x2F8' }, + { 'name':"COM3", 'irq':4, 'port':'0x3E8' }, + { 'name':"COM4", 'irq':3, 'port':'0x2E8' }, + ], + + /** + * Return port name based on irq and port + * + * @param {Integer} + * irq - irq number + * @param {String} + * port - IO port + * @return {String} port name + */ + getPortName: function(irq,port) { + for(var i = 0; i < vboxSerialPorts.ports.length; i++) { + if(vboxSerialPorts.ports[i].irq == irq && vboxSerialPorts.ports[i].port.toUpperCase() == port.toUpperCase()) + return vboxSerialPorts.ports[i].name; + } + return 'User-defined'; + } + +}; + +/** + * LPT port namespace + * + * @namespace vboxParallelPorts + */ +var vboxParallelPorts = { + + ports: [ + { 'name':"LPT1", 'irq':7, 'port':'0x3BC' }, + { 'name':"LPT2", 'irq':5, 'port':'0x378' }, + { 'name':"LPT3", 'irq':5, 'port':'0x278' } + ], + + /** + * Return port name based on irq and port + * + * @param {Integer} + * irq - irq number + * @param {String} + * port - IO port + * @return {String} port name + */ + getPortName: function(irq,port) { + for(var i = 0; i < vboxParallelPorts.ports.length; i++) { + if(vboxParallelPorts.ports[i].irq == irq && vboxParallelPorts.ports[i].port.toUpperCase() == port.toUpperCase()) + return vboxParallelPorts.ports[i].name; + } + return 'User-defined'; + } + +}; + + +/** + * Common VM storage / controller functions namespace + * + * @namespace vboxStorage + * +5.133.2 getDefaultIoCacheSettingForStorageController +5.133.3 getDeviceTypesForStorageBus +5.133.4 getMaxDevicesPerPortForStorageBus +5.133.5 getMaxInstancesOfStorageBus + + */ +var vboxStorage = { + + + /** + * Return list of bus types + * + * @memberOf vboxStorage + * @static + * @return {Array} list of all storage bus types + */ + getBusTypes: function() { + var busts = []; + for(var i in vboxStorage) { + if(typeof i == 'function') continue; + if(!vboxStorage[i].maxPortCount) continue; + busts[busts.length] = i; + } + return busts; + }, + + /** + * Return list of attached media for storage + * controllers of a VM + */ + getAttachedBaseMedia: function(vm) { + + var media = []; + + for(var a = 0; a < vm.storageControllers.length; a++) { + + var attch = vm.storageControllers[a].mediumAttachments; + + for(var b = 0; b < attch.length; b++) { + var m = attch[b].medium; + if(!m) continue; + media.push(vboxMedia.getMediumById(m.base ? m.base: m.id)); + } + } + + return media; + + }, + + /** + * Return icon name for bus + * + * @memberOf vboxStorage + * @param {Object} ma - medium attachment object + * @return {Array} options list + */ + getMAOptions: function(ma) { + + switch(ma.type) { + case 'HardDisk': + var opts = [{ + label: trans('Solid-state Drive','UIMachineSettingsStorage'), + attrib: 'nonRotational' + }]; + if($('#vboxPane').data('vboxConfig').enableHDFlushConfig) { + opts.push({ + label: 'Ignore Flush Requests', + attrib: 'ignoreFlush', + runningEnabled: true, + }); + } + return opts; + case 'DVD': + // Host drive + if(vboxMedia.isHostDrive(ma.medium)) { + return [{ + label: trans('Passthrough','UIMachineSettingsStorage'), + attrib: 'passthrough' + }]; + } + // Image + return [{ + label: trans('Live CD/DVD','UIMachineSettingsStorage'), + attrib: 'temporaryEject', + runningEnabled: true + }]; + default: + return [] + } + }, + + /** + * Get medium attachment options for storage controller + * + * @memberOf vboxStorage + * @param {Object} sc - storage controller object + * @return {Array} options list + */ + getMAOptionsForSC: function(sc) { + if(sc.bus == 'SATA' || sc.bus == 'USB') { + return [{ + label: trans('Hot-pluggable','UIMachineSettingsStorage'), + attrib: 'hotPluggable' + }]; + } + return []; + }, + + /** + * Return icon name for bus + * + * @memberOf vboxStorage + * @param {String} bus - bus type + * @return {String} icon name + */ + getBusIconName: function(bus) { + if(vboxStorage[bus].displayInherit) bus = vboxStorage[bus].displayInherit + return bus.toLowerCase(); + }, + + IDE: { + maxPortCount: 2, + limitOneInstance: true, + maxDevicesPerPortCount: 2, + types :['PIIX3','PIIX4','ICH6' ], + ignoreFlush: true, + slotName: function(p,d) { + switch(p+'-'+d) { + case '0-0': return (trans('IDE Primary Master','VBoxGlobal')); + case '0-1': return (trans('IDE Primary Slave','VBoxGlobal')); + case '1-0': return (trans('IDE Secondary Master','VBoxGlobal')); + case '1-1': return (trans('IDE Secondary Slave','VBoxGlobal')); + } + }, + driveTypes: ['dvd','disk'], + slots: function() { return { + '0-0': (trans('IDE Primary Master','VBoxGlobal')), + '0-1': (trans('IDE Primary Slave','VBoxGlobal')), + '1-0': (trans('IDE Secondary Master','VBoxGlobal')), + '1-1': (trans('IDE Secondary Slave','VBoxGlobal')) + }; + } + }, + + SATA: { + maxPortCount: 30, + maxDevicesPerPortCount: 1, + ignoreFlush: true, + types: ['IntelAhci'], + driveTypes: ['dvd','disk'], + slotName: function(p,d) { return trans('SATA Port %1','VBoxGlobal').replace('%1',p); }, + slots: function() { + var s = {}; + for(var i = 0; i < 30; i++) { + s[i+'-0'] = trans('SATA Port %1','VBoxGlobal').replace('%1',i); + } + return s; + } + }, + + SCSI: { + maxPortCount: 16, + maxDevicesPerPortCount: 1, + driveTypes: ['dvd','disk'], + types: ['LsiLogic','BusLogic'], + ignoreFlush: true, + slotName: function(p,d) { return trans('SCSI Port %1','VBoxGlobal').replace('%1',p); }, + slots: function() { + var s = {}; + for(var i = 0; i < 16; i++) { + s[i+'-0'] = trans('SCSI Port %1','VBoxGlobal').replace('%1',i); + } + return s; + } + }, + SAS: { + maxPortCount: 8, + maxDevicesPerPortCount: 1, + types: ['LsiLogicSas'], + driveTypes: ['dvd','disk'], + slotName: function(p,d) { return trans('SAS Port %1','VBoxGlobal').replace('%1',p); }, + slots: function() { + var s = {}; + for(var i = 0; i < 8; i++) { + s[i+'-0'] = trans('SAS Port %1','VBoxGlobal').replace('%1',i); + } + return s; + }, + displayInherit: 'SATA' + }, + + + Floppy: { + maxPortCount: 1, + limitOneInstance: true, + maxDevicesPerPortCount: 2, + types: ['I82078'], + driveTypes: ['floppy'], + slotName: function(p,d) { return trans('Floppy Device %1','VBoxGlobal').replace('%1',d); }, + slots: function() { return { '0-0':trans('Floppy Device %1','VBoxGlobal').replace('%1','0'), '0-1' :trans('Floppy Device %1','VBoxGlobal').replace('%1','1') }; } + }, + + USB: { + maxPortCount: 8, + maxDevicesPerPortCount: 1, + types: ['USB'], + driveTypes: ['dvd','disk'], + slotName: function(p,d) { return trans('USB Port %1','VBoxGlobal').replace('%1',p); }, + slots: function() { + var s = {}; + for(var i = 0; i < 8; i++) { + s[i+'-0'] = trans('USB Port %1','VBoxGlobal').replace('%1',i); + } + return s; + } + } +}; + +/** + * Storage Controller Types conversions + * + * @param {String} + * c - storage controller type + * @return {String} string used for translation + */ +function vboxStorageControllerType(c) { + switch(c) { + case 'LsiLogic': return 'Lsilogic'; + case 'LsiLogicSas': return 'LsiLogic SAS'; + case 'IntelAhci': return 'AHCI'; + } + return c; +} +/** + * Serial port mode conversions + * + * @param {String} + * m - serial port mode + * @return {String} string used for translation + */ +function vboxSerialMode(m) { + switch(m) { + case 'HostPipe': return 'Host Pipe'; + case 'HostDevice': return 'Host Device'; + case 'RawFile': return 'Raw File'; + } + return m; +} + +/** + * Network adapter type conversions + * + * @param {String} + * t - network adapter type + * @return {String} string used for translation + */ +function vboxNetworkAdapterType(t) { + switch(t) { + case 'Am79C970A': return 'PCnet-PCI II (Am79C970A)'; + case 'Am79C973': return 'PCnet-FAST III (Am79C973)'; + case 'I82540EM': return 'Intel PRO/1000 MT Desktop (82540EM)'; + case 'I82543GC': return 'Intel PRO/1000 T Server (82543GC)'; + case 'I82545EM': return 'Intel PRO/1000 MT Server (82545EM)'; + case 'Virtio': return 'Paravirtualized Network (virtio-net)'; + } +} + +/** + * Audio controller conversions + * + * @param {String} + * c - audio controller type + * @return {String} string used for translation + */ +function vboxAudioController(c) { + switch(c) { + case 'AC97': return 'ICH AC97'; + case 'SB16': return 'SoundBlaster 16'; + case 'HDA': return 'Intel HD Audio'; + } +} +/** + * Audio driver conversions + * + * @param {String} + * d - audio driver type + * @return {String} string used for translation + */ +function vboxAudioDriver(d) { + switch(d) { + case 'OSS': return 'OSS Audio Driver'; + case 'ALSA': return 'ALSA Audio Driver'; + case 'Pulse': return 'PulseAudio'; + case 'WinMM': return 'Windows Multimedia'; + case 'DirectSound': return 'Windows DirectSound'; + case 'Null': return 'Null Audio Driver'; + case 'SolAudio': return 'Solaris Audio'; + } + return d; +} +/** + * VM storage device conversions + * + * @param {String} + * d - storage device type + * @return {String} string used for translation + */ +function vboxDevice(d) { + switch(d) { + case 'DVD': return 'CD/DVD-ROM'; + case 'HardDisk': return 'Hard Disk'; + } + return d; +} + +/** + * VM State functions namespace + * + * @namespace vboxVMStates + */ +var vboxVMStates = { + + /* Return whether or not vm is running */ + isRunning: function(vm) { + return (vm && jQuery.inArray(vm.state, ['Running','LiveSnapshotting','Teleporting']) > -1); + }, + + /* Return whether or not vm is inaccessible */ + isInaccessible: function(vm) { + return (vm && !vm.accessible); + }, + + /* Return whether or not a vm is stuck */ + isStuck: function (vm) { + return (vm && vm.state == 'Stuck'); + }, + + /* Whether or not a vm is paused */ + isPaused: function(vm) { + return (vm && jQuery.inArray(vm.state, ['Paused','TeleportingPausedVM']) > -1); + }, + + /* True if vm is powered off */ + isPoweredOff: function(vm) { + return (vm && jQuery.inArray(vm.state, ['PoweredOff','Saved','Teleported', 'Aborted']) > -1); + }, + + /* True if vm is saved */ + isSaved: function(vm) { + return (vm && vm.state == 'Saved'); + }, + + /* True if vm is editable */ + isEditable: function(vm) { + return (vm && vm.sessionState == 'Unlocked'); + }, + + /* True if one VM in list matches item */ + isOne: function(test, vmlist) { + + for(var i = 0; i < vmlist.length; i++) { + if(vboxVMStates['is'+test](vmlist[i])) + return true; + } + return false; + }, + + /* Convert Machine state to translatable state */ + convert: function(state) { + switch(state) { + case 'PoweredOff': return 'Powered Off'; + case 'LiveSnapshotting': return 'Live Snapshotting'; + case 'TeleportingPausedVM': return 'Teleporting Paused VM'; + case 'TeleportingIn': return 'Teleporting In'; + case 'TakingLiveSnapshot': return 'Taking Live Snapshot'; + case 'RestoringSnapshot': return 'Restoring Snapshot'; + case 'DeletingSnapshot': return 'Deleting Snapshot'; + case 'SettingUp': return 'Setting Up'; + default: return state; + } + } +}; + diff --git a/js/utils.js b/js/utils.js new file mode 100644 index 0000000..b5a8262 --- /dev/null +++ b/js/utils.js @@ -0,0 +1,1375 @@ +/**
+ * @fileOverview Common utilities
+ * @author Ian Moore (imoore76 at yahoo dot com)
+ * @version $Id: utils.js 599 2015-07-27 10:40:37Z imoore76 $
+ * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
+ * - unless otherwise noted in fuction
+ */
+
+/**
+ *
+ * Prevent ESC key from stopping background AJAX requests
+ *
+ */
+$(document).ready(function(){
+ $(window).keydown(function(i){if(i.keyCode&&i.keyCode===27){
+ i.preventDefault();
+ try {
+ var flash = RDPWebClient.getFlashById("FlashRDP");
+ flash.keyboardSendScancodes('01');
+ } catch (e) {
+ //alert(e.message);
+ }
+ }});
+ $(document).keydown(function(i){if(i.keyCode&&i.keyCode===27){
+ i.preventDefault();
+ try {
+ var flash = RDPWebClient.getFlashById("FlashRDP");
+ flash.keyboardSendScancodes('01');
+ } catch (e) {
+ //alert(e.message);
+ }
+ }});
+});
+
+/**
+ * Traverse a tree and return matching nodes.
+ * @param {Object} tree - tree to traverse
+ * @param {String} prop - node property to match
+ * @param {Mixed} val - value that node property must match
+ * @param {Boolean} all - return all results rather than stopping at first matching node (optional)
+ * @param {String} children - search node children in property named by this argument (optional)
+ * @return all matched nodes | first matched node | null
+ */
+function vboxTraverse(tree,prop,val,all,children) {
+ var leafs = new Array();
+ for(var a in tree) {
+ if(tree[a][prop] == val) {
+ if(!all) return tree[a];
+ leafs[leafs.length] = tree[a];
+ }
+ if(children && tree[a][children] && tree[a][children].length) {
+ var c = vboxTraverse(tree[a][children],prop,val,all,children);
+ if(!all && c) { return c; }
+ else if(c && c.length) {
+ leafs = leafs.concat(c);
+ }
+ }
+ }
+ return (all ? leafs : null);
+}
+
+/**
+ * Performs AJAX request, alert()'s returned errors
+ *
+ * @param {String} fn - AJAX function to call
+ * @param {Object} params - params to pass to AJAX call
+ * @return {Object} deferred promise
+ */
+function vboxAjaxRequest(fn,params,config) {
+
+ // Promise for data
+ var def = $.Deferred();
+
+ // Fatal error previously occurred
+ if($('#vboxPane').data('vboxFatalError'))
+ return def.reject();
+
+ var data = {
+ 'fn': fn,
+ 'params': params ? params : null,
+ 'persist': config && config.persist ? config.persist : null
+ };
+
+ $.when($.post(vboxEndpointConfig.api, JSON.stringify(data), undefined,"json")
+
+ // Run on error
+ .fail(function(d,etext,xlr,d2) {
+
+ // Fatal error previously occurred
+ if($('#vboxPane').data('vboxFatalError')) return null;
+
+ if(etext != 'error') {
+
+ // Halt on parse errors
+ if(etext.search(/parse/i) > -1) {
+ $('#vboxPane').data('vboxFatalError',1);
+ }
+
+ if(window.console && window.console.log)
+ window.console.log(etext + ': '+ d.responseText);
+
+ vboxAlert({'error':'Ajax error: ' + etext,'details':d.responseText},{'width':'400px'});
+
+ } else {
+
+ // Check for error HTTP status
+ if(d && d.status && (String(d.status).substring(0,1) == '4' || String(d.status).substring(0,1) == '5')) {
+ var err = {error:'<div align="center">HTTP error: ' + d.status + ' ' + d.statusText+"</div>",details:''};
+ for(var i in d) {
+ if(typeof(d[i]) == 'function' || typeof(d[i]) == 'object') continue;
+ err.details += i + ': "' + d[i] + '"' + "\n";
+ }
+ phpVirtualBoxFailure(err);
+
+ } else {
+ phpVirtualBoxFailure('<div align="center">(General communication failure)');
+ }
+ }
+
+ return null;
+
+ // Filter out data and display error messages
+ }).pipe(function(d){
+
+ // Fatal error previously occurred
+ if($('#vboxPane').data('vboxFatalError')) {
+ return null;
+ }
+
+ // Append debug output to console
+ if(d && d.messages && window.console && window.console.log) {
+ for(var i = 0; i < d.messages.length; i++) {
+ window.console.log(d.messages[i]);
+ }
+ }
+
+ if(d.errors.length > 0) {
+
+
+ for(var i = 0; i < d.errors.length; i++) {
+
+ // Handle fatal and connection errors
+ if(d.errors[i].fatal || d.errors[i].connection) {
+
+ // Multiple Servers check
+ if(d.errors[i].connection && $('#vboxPane').data('vboxConfig') ) {
+
+ $('#vboxPane').data('vboxFatalError',1);
+ $('#vboxPane').css({'display':'none'});
+
+ s='';
+ if($('#vboxPane').data('vboxConfig').servers && $('#vboxPane').data('vboxConfig').servers.length) {
+ var servers = $('#vboxPane').data('vboxConfig').servers;
+ for(var a = 0; a < servers.length; a++) {
+ servers[a] = "<a href='?server="+servers[a].name+"'>"+$('<div />').html(servers[a].name).text()+"</a>";
+ }
+ s = '<div style="display: block">'+trans('Server List','phpVirtualBox')+': '+servers.join(', ')+'</div>';
+ }
+ if(s) vboxAlert(s);
+ vboxAlert(d.errors[i],{'width':'400px'});
+ vboxAlert('<p>'+trans('An error occurred communicating with your vboxwebsrv. No more requests will be sent by phpVirtualBox until the error is corrected and this page is refreshed. The details of this connection error should be displayed in a subsequent dialog box.','phpVirtualBox')+'</p>'+s,{'width':'50%'});
+
+
+
+ // Ignore connection errors until we have config data unless this was a login attempt
+ } else if(!d.errors[i].connection || fn == 'login') {
+
+ // If we have config data, and the error is fatal, halt processing
+ if(d.errors[i].fatal && $('#vboxPane').data('vboxConfig')) {
+ $('#vboxPane').data('vboxFatalError',1);
+ $('#vboxPane').css({'display':'none'});
+ }
+
+ vboxAlert(d.errors[i],{'width':'400px'});
+
+ }
+
+ } else {
+
+ // Error from normal request
+ vboxAlert(d.errors[i],{'width':'400px'});
+ }
+
+ } // </ foreach error >
+
+ } // </ if errors.length >
+
+ return (d && d.data ? d.data : null);
+
+ })
+ ).done(function(d) {
+ if(d) def.resolve(d);
+ else def.reject();
+ }).fail(function(){
+ def.reject();
+ });
+
+ return def.promise();
+}
+
+/**
+ * Return VRDE host address of VM
+ * @param {Object} vm - virtual machine object
+ * @return {String} VRDE host for VM
+ */
+function vboxGetVRDEHost(vm) {
+ var chost = ($('#vboxPane').data('vboxConfig').consoleHost ? $('#vboxPane').data('vboxConfig').consoleHost : (vm && vm.VRDEServer && vm.VRDEServer.netAddress ? vm.VRDEServer.netAddress : null));
+ if(!chost) {
+ // Set to host
+ chost = $('#vboxPane').data('vboxConfig').host;
+ // Check for localhost / 127.0.0.1
+ if(!chost || chost == 'localhost' || chost == '127.0.0.1')
+ chost = location.hostname;
+ }
+ return chost;
+}
+
+/**
+ * Return the correct icon string relative to images/vbox/ for the guest OS type
+ * @param {String} osTypeId - guest OS type id
+ * @return {String} icon file name
+ */
+function vboxGuestOSTypeIcon(osTypeId) {
+
+ var strIcon = "os_other.png";
+ switch (osTypeId)
+ {
+ case "Other": strIcon = "os_other.png"; break;
+ case "DOS": strIcon = "os_dos.png"; break;
+ case "Netware": strIcon = "os_netware.png"; break;
+ case "L4": strIcon = "os_l4.png"; break;
+ case "Windows31": strIcon = "os_win31.png"; break;
+ case "Windows95": strIcon = "os_win95.png"; break;
+ case "Windows98": strIcon = "os_win98.png"; break;
+ case "WindowsMe": strIcon = "os_winme.png"; break;
+ case "WindowsNT4": strIcon = "os_winnt4.png"; break;
+ case "Windows2000": strIcon = "os_win2k.png"; break;
+ case "WindowsXP": strIcon = "os_winxp.png"; break;
+ case "WindowsXP_64": strIcon = "os_winxp_64.png"; break;
+ case "Windows2003": strIcon = "os_win2k3.png"; break;
+ case "Windows2003_64": strIcon = "os_win2k3_64.png"; break;
+ case "WindowsVista": strIcon = "os_winvista.png"; break;
+ case "WindowsVista_64": strIcon = "os_winvista_64.png"; break;
+ case "Windows2008": strIcon = "os_win2k8.png"; break;
+ case "Windows2008_64": strIcon = "os_win2k8_64.png"; break;
+ case "Windows7": strIcon = "os_win7.png"; break;
+ case "Windows7_64": strIcon = "os_win7_64.png"; break;
+ case "Windows8": strIcon = "os_win8.png"; break;
+ case "Windows8_64": strIcon = "os_win8_64.png"; break;
+ case "Windows81": strIcon = "os_win81.png"; break;
+ case "Windows81_64": strIcon = "os_win81_64.png"; break;
+ case "Windows10": strIcon = "os_win10.png"; break
+ case "Windows10_64": strIcon = "os_win10.png"; break
+ case "WindowsNT_64":
+ case "WindowsNT": strIcon = "os_win_other.png"; break;
+ case "Windows2012_64": strIcon = "os_win2k12_64.png"; break;
+ case "OS2Warp3": strIcon = "os_os2warp3.png"; break;
+ case "OS2Warp4": strIcon = "os_os2warp4.png"; break;
+ case "OS2Warp45": strIcon = "os_os2warp45.png"; break;
+ case "OS2eCS": strIcon = "os_os2ecs.png"; break;
+ case "OS2": strIcon = "os_os2_other.png"; break;
+ case "Linux_64":
+ case "Linux": strIcon = "os_linux_other.png"; break;
+ case "Linux22": strIcon = "os_linux22.png"; break;
+ case "Linux24": strIcon = "os_linux24.png"; break;
+ case "Linux24_64": strIcon = "os_linux24_64.png"; break;
+ case "Linux26": strIcon = "os_linux26.png"; break;
+ case "Linux26_64": strIcon = "os_linux26_64.png"; break;
+ case "ArchLinux": strIcon = "os_archlinux.png"; break;
+ case "ArchLinux_64": strIcon = "os_archlinux_64.png"; break;
+ case "Debian": strIcon = "os_debian.png"; break;
+ case "Debian_64": strIcon = "os_debian_64.png"; break;
+ case "OpenSUSE": strIcon = "os_opensuse.png"; break;
+ case "OpenSUSE_64": strIcon = "os_opensuse_64.png"; break;
+ case "Fedora": strIcon = "os_fedora.png"; break;
+ case "Fedora_64": strIcon = "os_fedora_64.png"; break;
+ case "Gentoo": strIcon = "os_gentoo.png"; break;
+ case "Gentoo_64": strIcon = "os_gentoo_64.png"; break;
+ case "Mandriva": strIcon = "os_mandriva.png"; break;
+ case "Mandriva_64": strIcon = "os_mandriva_64.png"; break;
+ case "RedHat": strIcon = "os_redhat.png"; break;
+ case "RedHat_64": strIcon = "os_redhat_64.png"; break;
+ case "Turbolinux": strIcon = "os_turbolinux.png"; break;
+ case "Turbolinux_64": strIcon = "os_turbolinux_64.png"; break;
+ case "Ubuntu": strIcon = "os_ubuntu.png"; break;
+ case "Ubuntu_64": strIcon = "os_ubuntu_64.png"; break;
+ case "Xandros": strIcon = "os_xandros.png"; break;
+ case "Xandros_64": strIcon = "os_xandros_64.png"; break;
+ case "FreeBSD": strIcon = "os_freebsd.png"; break;
+ case "FreeBSD_64": strIcon = "os_freebsd_64.png"; break;
+ case "OpenBSD": strIcon = "os_openbsd.png"; break;
+ case "OpenBSD_64": strIcon = "os_openbsd_64.png"; break;
+ case "NetBSD": strIcon = "os_netbsd.png"; break;
+ case "NetBSD_64": strIcon = "os_netbsd_64.png"; break;
+ case "Solaris": strIcon = "os_solaris.png"; break;
+ case "Solaris_64": strIcon = "os_solaris_64.png"; break;
+ case "Solaris11_64": strIcon = "os_oraclesolaris_64.png"; break;
+ case "OpenSolaris": strIcon = "os_oraclesolaris.png"; break;
+ case "OpenSolaris_64": strIcon = "os_oraclesolaris_64.png"; break;
+ case "QNX": strIcon = "os_qnx.png"; break;
+ case "MacOS106":
+ case 'MacOS': strIcon = "os_macosx.png"; break;
+ case "MacOS106_64":
+ case 'MacOS_64': strIcon = "os_macosx_64.png"; break;
+ case 'Oracle': strIcon = "os_oracle.png"; break;
+ case 'Oracle_64': strIcon = "os_oracle_64.png"; break;
+ case 'JRockitVE': strIcon = 'os_jrockitve.png'; break;
+ case "VirtualBox_Host": strIcon = "os_virtualbox.png"; break;
+
+ default:
+ break;
+ }
+ return strIcon;
+}
+
+/**
+ * Return the correct icon relative to images/vbox/ for the VM state.
+ * @param {String} state - virtual machine state
+ * @return {String} icon file name
+ */
+function vboxMachineStateIcon(state)
+{
+ var strIcon = "state_powered_off_16px.png";
+ var strNoIcon = "state_running_16px.png";
+
+ switch (state)
+ {
+ case "PoweredOff": strIcon = "state_powered_off_16px.png"; break;
+ case "Saved": strIcon = "state_saved_16px.png"; break;
+ case "Saving": strIcon = "state_saving_16px.png"; break;
+ case "Snapshotting": strIcon = "snapshot_offline_16px.png"; break;
+ case "LiveSnapshotting": strIcon = "snapshot_online_16px.png"; break;
+ case "Aborted": strIcon = "state_aborted_16px.png"; break;
+ case "Running": strIcon = "state_running_16px.png"; break;
+ case "Paused": strIcon = "state_paused_16px.png"; break;
+ case "Stuck": strIcon = "state_stuck_16px.png"; break;
+ case "Saving": strIcon = "state_discarding_16px.png"; break;
+ case "Restoring": strIcon = "vm_settings_16px.png"; break;
+ case "RestoringSnapshot": strIcon = "discard_cur_state_16px.png"; break;
+ case "DeletingSnapshot": strIcon = "state_discarding_16px.png"; break;
+ case "Hosting" : strIcon = "vm_settings_16px.png"; break;
+ case "Inaccessible": strIcon = "state_aborted_16px.png"; break;
+ default:
+ strIcon = strNoIcon;
+ }
+
+ return strIcon;
+
+}
+
+/**
+ * File or Folder browser dialog
+ * @param {String} root - path to initial folder or file
+ * @param {Function} fn - callback function to run when OK is clicked on dialog
+ * @param {Boolean} foldersonly - only display / allow selection of folders (optional)
+ * @param {String} title - title of dialog (optional)
+ * @param {String} icon - URL to icon (optional)
+ * @param {Boolean} strictFiles - only allow the OK button to be clicked when a file is selected (optional)
+ */
+function vboxFileBrowser(root,fn,foldersonly,title,icon,strictFiles) {
+
+ var buttons = { };
+ buttons[trans('OK','QIMessageBox')] = function(f) {
+
+ if(strictFiles && $('#vboxBrowseFolderList').find('.vboxListItemSelected').first().parent().hasClass('directory')) {
+ $('#vboxBrowseFolderList').find('.vboxListItemSelected').first().trigger('dblclick');
+ return;
+ }
+
+ if(typeof f != 'string') {
+ f = $('#vboxBrowseFolderList').find('.vboxListItemSelected').first().attr('name');
+ }
+ $('#vboxBrowseFolder').trigger('close').empty().remove();
+ fn(f);
+ };
+ buttons[trans('Cancel','QIMessageBox')] = function() { fn(null); $('#vboxBrowseFolder').trigger('close').empty().remove(); };
+
+ var d1 = $('<div />').attr({'id':'vboxBrowseFolder','class':'vboxDialogContent','style':'display:none'});
+
+ $('<div />').attr({'id':'vboxBrowseFolderList'}).fileTree({ 'root': (root ? root : '/'),'dirsOnly':foldersonly,'loadMessage':trans('Loading ...','UIVMDesktop'),'scrollTo':'#vboxBrowseFolder'},function(f){
+ buttons[trans('OK','QIMessageBox')](f);
+ }).appendTo(d1);
+
+ $(d1).dialog({'closeOnEscape':true,'width':400,'height':600,'buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="'+(icon ? icon : 'images/jqueryFileTree/'+(foldersonly ? 'folder_open' : 'file')+'.png') + '" class="vboxDialogTitleIcon" /> ' + (title ? title : trans((foldersonly ? 'Select Folder' : 'Select File')))}).on("dialogbeforeclose",function(){
+ $(this).parent().find('span:contains("'+trans('Cancel','QIMessageBox')+'")').trigger('click');
+ });
+
+}
+/**
+ * Convert megabytes to human readable string
+ * @param {Integer} mb - megabytes
+ * @return {String} human readable size representation (e.g. 2 GB, 500 MB, etc..)
+ */
+function vboxMbytesConvert(mb) {return vboxBytesConvert(parseFloat(mb) * 1024 * 1024);}
+/**
+ * Convert bytes to human readable string
+ * @param {Integer} bytes - bytes
+ * @return {String} human readable size representation (e.g. 2 GB, 500 MB, etc..)
+ */
+function vboxBytesConvert(bytes) {
+ var ext = new Array('B','KB','MB','GB','TB');
+ var unitCount;
+ for(unitCount=0; bytes >= 1024 && unitCount < ext.length; unitCount++) bytes = parseFloat(parseFloat(bytes)/1024);
+
+ return Math.round(parseFloat(bytes)*Math.pow(10,2))/Math.pow(10,2) + " " + trans(ext[unitCount], 'VBoxGlobal');
+}
+/**
+ * Parse str param into megabytes
+ * @param {String} str - size string (2 TB, 500 MB, etc..) to parse
+ * @return {Integer} megabytes
+ */
+function vboxConvertMbytes(str) {
+ str = str.replace(' ',' ');
+ str = str.split(' ',2);
+ if(!str[1]) str[1] = trans('MB','VBoxGlobal');
+ var ext = new Array(trans('B','VBoxGlobal'),trans('KB','VBoxGlobal'),trans('MB','VBoxGlobal'),trans('GB','VBoxGlobal'),trans('TB','VBoxGlobal'));
+ var index = jQuery.inArray(str[1],ext);
+ if(index == -1) index = 2;
+ switch(index) {
+ case 0:
+ return ((str[0] / 1024) / 1024);
+ break;
+ case 1:
+ return (str[0] / 1024);
+ break;
+ case 3:
+ return (str[0] * 1024);
+ break;
+ case 4:
+ return (str[0] * 1024 * 1024);
+ break;
+ default:
+ return (str[0]);
+ }
+
+}
+
+
+/**
+ * Display alert Dialog
+ * @param {String|Object} e - message to display or object containing error message and details
+ * @param {Object} xtraOpts - extra options to apply to alert jquery dialog (optional)
+ * @see jQuery.dialog()
+ */
+function vboxAlert(e,xtraOpts) {
+
+ var acknowledged = $.Deferred();
+
+ var msg = '';
+
+ if(typeof e == 'object') msg = e.error;
+ else msg = e;
+
+ // Convert to <p>
+ if(msg[0] != '<') msg = '<p>'+msg+'</p>';
+
+ var div = $('<div />').attr({'class':'vboxDialogContent vboxAlert'}).html('<img src="images/50px-Warning_icon.svg.png" style="float: left; padding: 10px; height: 50px; width: 50px;" height="50" width="50" />'+msg);
+
+
+ if(typeof e == 'object' && e.details) {
+
+ // Details can contain HTML entities
+ e.details = $('<div />').html(e.details).text();
+
+ var p = $('<p />').attr({'style':'text-align: center'});
+ $('<a />').attr({'href':'#'}).html(trans('Details','QIMessageBox')).click(function(){
+ $(this).parent().parent().dialog('option',{'height':400,'position':'center'});
+ $(this).parent().siblings(".vboxAlert").css({"display":""});
+ $(this).parent().css({'padding':'0px','margin':'0px'});
+ $(this).parent().siblings(".vboxAlert").siblings().empty().remove();
+ return false;
+ }).appendTo(p);
+
+ $(div).append(p);
+
+ var ddet = $('<div />').attr({'style':'display: none; height: 100%; width: auto;','class':'vboxAlert'});
+ $('<textarea />').attr({'spellcheck':'false','wrap':'off','readonly':'true'}).val(e.details).appendTo($('<form />').appendTo(ddet));
+ $(div).append(ddet);
+ }
+
+
+
+ var buttons = { };
+ buttons[trans('OK','QIMessageBox')] = function(f) {
+ $(this).trigger('close').empty().remove();
+ acknowledged.resolve();
+ };
+
+ var dialogOpts = {'closeOnEscape':false,'width':600,'height':'auto','buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="images/vbox/OSE/about_16px.png" class="vboxDialogTitleIcon" /> phpVirtualBox'};
+
+ if(typeof xtraOpts == "object") {
+ for(var i in xtraOpts) {
+ dialogOpts[i] = xtraOpts[i];
+ }
+ }
+
+ $(div).dialog(dialogOpts);
+
+ return acknowledged;
+
+}
+/**
+ * Confirmation dialog
+ * @param {String} q - question to ask
+ * @param {Object} buttons -buttons to display on confirmation dialog
+ * @param {String} cancelText - string displayed on Cancel button. Defaults to 'Cancel'
+ * @param {Function} onCancel - function to run onCancel
+ * @return {HTMLNode}
+ * @see jQuery.dialog()
+ */
+function vboxConfirm(q,buttons,cancelText,onCancel) {
+
+ var div = $('<div />').attr({'class':'vboxDialogContent','style':'display: none; width: 500px;'}).html('<img src="images/50px-Question_icon.svg.png" style="height: 50px; width: 50px; float: left; padding: 10px;" height="50" width="50" />'+q);
+
+ if(!cancelText) cancelText = trans('Cancel','QIMessageBox');
+
+ buttons[cancelText] = function() { $(this).remove(); if(onCancel) { onCancel(); }};
+
+ $(div).dialog({'closeOnEscape':false,'width':500,'height':'auto','buttons':buttons,'modal':true,'autoOpen':true,'dialogClass':'vboxDialogContent','title':'<img src="images/vbox/OSE/about_16px.png" class="vboxDialogTitleIcon" /> phpVirtualBox'});
+
+ return $(div);
+}
+
+/**
+ * Initialize common UI items
+ * @param {String|HTMLNode} root - root HTML Node or node ID to initialize
+ * @param {String} context - language context to use for translations
+ * @see trans()
+ */
+function vboxInitDisplay(root,context) {
+
+ if(typeof root == 'string')
+ root = $('#'+root);
+
+ /*
+ * Sliders
+ */
+
+ $(root).find('div.slider').each(function(){
+
+ if($(this).hasClass('translateglob')) {
+ $(this).closest('table').find(".translate").html(function(i,h){return trans($('<div />').html(h).text(),'VBoxGlobal');}).removeClass('translate');
+ }
+ var frm = $(this).data('form');
+ if($(this).data('display')) {
+ var fn = $(this).data('display');
+ $(this).slider('option','slide',function(event,ui){
+ document.forms[frm].elements[event.target.id + 'Value'].value = fn(ui.value);
+ }).slider('option','change',function(event,ui){
+ document.forms[frm].elements[event.target.id + 'Value'].value = fn(ui.value);
+ });
+ } else {
+ $(this).slider('option','slide',function(event,ui){
+ document.forms[frm].elements[event.target.id + 'Value'].value = ui.value;
+ }).slider('option','change',function(event,ui){
+ document.forms[frm].elements[event.target.id + 'Value'].value = ui.value;
+ });
+ }
+
+ // Slider scale (ticks)
+ $(this).children("div.sliderScale").each(function(){
+
+ var min = $(this).parent().slider('option','min');
+ var max = $(this).parent().slider('option','max');
+
+ var diff = Math.min((max - min),50);
+ var tdw = Math.round(100 / diff);
+
+ var tr = $('<tr />');
+
+ for(var a = 0; a < diff; a++) {
+ $(tr).append($('<td />').attr({'style':'width: '+ tdw + '%'}));
+ }
+ $('<table />').attr({'class':'sliderScale'}).append(tr).appendTo(this);
+
+ });
+
+ // save value
+ $(this).slider('value',$(this).slider('value'));
+
+ // Min / Max labels
+ if(!$(this).data('noMinMaxLabels')) {
+ var min = $(this).slider('option','min');
+ var max = $(this).slider('option','max');
+ $(this).closest('table').find('.vboxSliderMin').html(function(i,h){return ' ' + trans(h,context,min,$(this).attr('title')).replace('%1',min);});
+ $(this).closest('table').find('.vboxSliderMax').html(function(i,h){return ' ' + trans(h,context,max,$(this).attr('title')).replace('%1',max);});
+ }
+ });
+
+
+ /*
+ * Translations
+ */
+ $(root).find(".translate").html(function(i,h){return trans($('<div />').html(h).text(),context);}).removeClass('translate');
+
+ /*
+ * Setup Tabs
+ */
+ $(root).find(".vboxTabbed").tabs();
+
+
+ /* Image buttons */
+ if(!jQuery.browser.msie) {
+
+ $(root).find('input.vboxImgButton').on('mousedown',function(){
+
+ var xy = $(this).css('backgroundPosition').split(' ');
+
+ if(!$(this).data('startX')) $(this).data('startX', parseInt(xy[0]));
+ if(!$(this).data('startY')) $(this).data('startY', parseInt(xy[1]));
+
+ $(this).css('backgroundPosition',(parseInt($(this).data('startX'))+1)+'px '+(parseInt($(this).data('startY'))+1)+'px');
+
+ var btn = this;
+ $(document).one('mouseup',function(){
+ $(btn).css('backgroundPosition',$(btn).data('startX')+'px '+$(btn).data('startY')+'px');
+ });
+
+ });
+
+ }
+
+ /*
+ *
+ * Enable / disable sections (Remote Display, Audio, Network Adapters, usb)
+ *
+ */
+
+ $(root).find('input.vboxEnablerCheckbox').on('click', function(e) {
+
+ var roottbl = $(this).closest('table');
+
+ $(roottbl).find('input:not(.vboxEnablerCheckbox)').prop('disabled',!this.checked);
+ $(roottbl).find('select:not(.vboxEnablerIgnore)').prop('disabled',!this.checked);
+ (this.checked ? $(roottbl).find('th').removeClass('vboxDisabled') : $(roottbl).find('th:not(.vboxEnablerIgnore)').addClass('vboxDisabled'));
+ (this.checked ? $(roottbl).find('.vboxEnablerListen').removeClass('vboxDisabled') : $(roottbl).find('.vboxEnablerListen').addClass('vboxDisabled'));
+
+ // Find any enabler / disabler listeners
+ $(roottbl).find('.vboxEnablerTrigger').trigger(this.checked ? 'enable' : 'disable');
+
+
+ });
+
+
+ /*
+ * Tooltips
+ */
+ $(root).find('.vboxToolbarSmallButton').tipped({'source':'title','mode':'hover'});
+
+
+ /*
+ * File / Folder browsers
+ */
+ if($('#vboxPane').data('vboxConfig').browserDisable) {
+ $(root).find('table td.vboxFileFolderInput input.vboxImgButton').hide();
+ }
+
+
+}
+
+/**
+ * Color VISIBLE children rows of parent elm
+ * @param {HTMLNode} elm - element who's children to color
+ * @param {Boolean} startOdd - start on the 2nd child (optional)
+ * @param {String} headerClass - if child node has headerClass class, consider it a header and skip coloring (optional)
+ */
+function vboxColorRows(elm,startOdd,headerClass) {
+ var odd = 0;
+ if(startOdd) odd = 1;
+ $(elm).children().each(function(i){
+ if(headerClass && $(this).hasClass(headerClass)) {
+ odd = (startOdd ? 1 : 0);
+ return;
+ }
+ if($(this).css('display') == 'none' || $(this).hasClass('vboxListItemDisabled')) return;
+ (odd++ % 2 ? $(this).addClass('vboxOddRow') : $(this).removeClass('vboxOddRow'));
+ });
+}
+
+/**
+ * Return an HTML div node sized to parent with overflow hidden
+ * @param {HTMLNode} p - node to add div to
+ * @return {HTMLNode}
+ */
+function vboxDivOverflowHidden(p) {
+ var w = $(p).innerWidth();
+ w -= parseInt($(p).css('padding-right'));
+ w -= parseInt($(p).css('padding-left'));
+ return $('<div />').css({'width':(w-4)+'px','overflow':'hidden','padding':'0px','margin':'0px','border':'0px'});
+}
+
+
+/**
+ * Show progress dialog and periodically poll the progress' status
+ *
+ * @param {String} prequest - request object passed to ajax
+ * @param {Function} callback - function to run on progress completion
+ * @param {String} icon - URL of image to display on progress operation dialog (optional)
+ * @param {String} title - title of progress operation dialog (optional)
+ * @param {String} target - contextual target of progress operation
+ * @param {Boolean} blocking - true if progress operation should block other ops
+ * @see vboxconnector::progressGet()
+ */
+function vboxProgress(prequest,callback,icon,title,target,blocking) {
+
+ // Fix title
+ title = title.replace('\.+$','');
+
+ // Sanitize target
+ target = $('<div />').text(target).html();
+
+ // Sanitize progress request data
+ var persist = prequest.persist;
+ prequest = {
+ 'progress' : prequest.progress,
+ 'catcherrs' : prequest.catcherrs
+ };
+
+ // Blocking creates a dialog
+ if(!blocking) {
+
+ vboxProgressCreateListElement(prequest,icon,title,target,callback);
+
+ $.when(prequest, vboxAjaxRequest('progressGet',prequest,{'persist':persist})).done(vboxProgressUpdate);
+
+ } else {
+
+ vboxProgressCreateDialog(prequest,icon,title,target,callback);
+
+ $.when(prequest, vboxAjaxRequest('progressGet',prequest,{'persist':persist})).done(vboxProgressUpdateModal);
+ }
+
+
+
+}
+
+/**
+ * Generate modal progress dialog
+ *
+ * @param {Object} prequest - progress operation request object
+ * @param {String} icon - URL of image to display on progress operation dialog (optional)
+ * @param {String} title - title of progress operation dialog (optional)
+ * @param {String} target - contextual target of progress operation
+ * @param {Function} callback - function to run on progress completion
+ * @see vboxconnector::progressGet()
+ */
+function vboxProgressCreateDialog(prequest,icon,title,target,callback) {
+
+ // Shorthand
+ var pid = prequest.progress;
+
+ var div = $('<div />').attr({'id':'vboxProgress'+pid,'title':(title ? title : 'phpVirtualBox'),'style':'text-align: center'});
+
+ var tbl = $('<table />').css({'width':'100%'});
+ var tr = $('<tr />').css({'vertical-align':'middle'});
+ var td = $('<td />').css({'padding':'0px','text-align':'left','width':'1px'});
+ if(icon) {
+ $('<img />').css({'margin':'4px'}).attr({'src':'images/vbox/'+icon,'height':'90','width':'90'}).appendTo(td);
+ }
+ $(tr).append(td);
+
+ var td = $('<td />').css({'text-align':'center','padding':'4px'}).append($('<div />').attr({'id':'vboxProgressBar'+pid,'margin':'4px'}).progressbar({ value: 1 }));
+
+ $('<div />').attr({'id':'vboxProgressText'+pid}).html('<img src="images/spinner.gif" />').appendTo(td);
+
+ // Cancel button
+ $('<div />').attr({'id':'vboxProgressCancel'+pid}).css({'display':'none','padding':'8px'}).append(
+
+ $('<input />').attr('type','button').val(trans('Cancel','QIMessageBox')).data({'pid':pid}).click(function(){
+ this.disabled = 'disabled';
+ vboxAjaxRequest('progressCancel',prequest);
+ })
+ ).appendTo(td);
+
+
+ $(tbl).append($(tr).append(td)).appendTo(div);
+
+ // Append placeholder for list element
+ $('#vboxProgressOps').prepend($('<div />').addClass('vboxProgressOpElement').css({'display':'none'}).attr({'id':'vboxProgressPlaceholder'+pid}));
+
+ $(div).data({
+ 'vboxCallback':callback,
+ 'vboxIcon' : icon,
+ 'vboxTitle' : title,
+ 'vboxTarget' : target
+ }).dialog({'width':400,'height':'auto','closeOnEscape':false,'modal':true,'resizable':false,'draggable':true,'closeOnEscape':false,'buttons':{}});
+
+
+}
+
+/**
+ * Generate progress list element and append it
+ *
+ * @param {Object} prequest - progress operation request object
+ * @param {String} icon - URL of image to display on progress operation dialog (optional)
+ * @param {String} title - title of progress operation dialog (optional)
+ * @param {String} target - contextual target of progress operation
+ * @param {Function} callback - function to run on progress completion
+ * @see vboxconnector::progressGet()
+ */
+function vboxProgressCreateListElement(prequest,icon,title,target,callback) {
+
+ // Shorthand
+ var pid = prequest.progress;
+
+ var div = $('<div />').attr({'id':'vboxProgress'+pid}).addClass('vboxProgressOpElement');
+
+ var divOpTitle = $('<div />').addClass('vboxProgressOpTitle');
+
+ if(icon) {
+ $('<img />').attr({'src':'images/vbox/'+icon,'height':'16','width':'16'}).appendTo(divOpTitle);
+ }
+
+ // Title
+ if($('#vboxPane').data('vboxConfig').servers.length) {
+ title = $('#vboxPane').data('vboxConfig').name + ': ' + title;
+ }
+
+ $(divOpTitle).append(title + (target ? ' (' + target + ')' : '')).appendTo(div);
+
+ // Progress bar
+ $('<div />').addClass('vboxProgressBarContainer').append(
+ $('<div />').attr({'id':'vboxProgressBar'+pid}).progressbar({ value: 1 })
+ ).appendTo(div);
+
+ // Progress text
+ $('<div />').addClass('vboxProgressOpText').append(
+ $('<span />').attr({'id':'vboxProgressText'+pid}).html('<img src="images/spinner.gif" height=12 width=12/>')
+ ).appendTo(div);
+
+ // Cancel button
+ $('<div />').addClass('vboxProgressOpCancel').append(
+ $('<input />').attr({'id':'vboxProgressCancel'+pid,'type':'button'}).val(trans('Cancel','UIProgressDialog')).data({'pid':pid})
+ .click(function(){
+ this.disabled = 'disabled';
+ vboxAjaxRequest('progressCancel',prequest);
+ })
+ .css({'margin':'0px'})
+ ).appendTo(div);
+
+ $(div).data({'vboxCallback':callback})
+
+ if($('#vboxProgressPlaceholder'+pid)[0]) {
+ $('#vboxProgressPlaceholder'+pid).replaceWith(div);
+ } else {
+ $('#vboxProgressOps').prepend(div);
+ }
+
+
+}
+
+/**
+ * OnUnload warning shown when an operation is in progress
+ * @return {String} warning message indicating operation is in progress
+ */
+function vboxOpInProgressCheck() {
+ if($('#vboxProgressOps').children('div.vboxProgressOpElement:not(.vboxProgressComplete)').addClass('vboxProgressRunning').length) {
+ return trans('Warning: A VirtualBox internal operation is in progress. Closing this window or navigating away from this web page may cause unexpected and undesirable results. Please wait for the operation to complete.','phpVirtualBox');
+ }
+}
+
+/**
+ * Update progress dialog box. Callback run from vboxAjaxRequest
+ *
+ * @param {Object} prequest - progress operation data passed to ajax call
+ * @param {Object} data - data returned from progressGet AJAX call
+ */
+function vboxProgressUpdateModal(prequest, data) {
+ vboxProgressUpdate(prequest,data,true);
+}
+
+/**
+ * Update progress dialog box or progress list row with % completed
+ *
+ * @param {Object} prequest - progress operation data passed to ajax call
+ * @param {Object} d - data returned from progressGet AJAX call
+ * @param {Boolean} modal - true if updating modal dialog
+ * @see vboxconnector::progressGet()
+ */
+function vboxProgressUpdate(prequest,d,modal) {
+
+ // Shorthand
+ var pid = prequest.progress;
+
+ // check for completed progress
+ if(!d || !d.responseData || !d.responseData['progress'] || !d.responseData['info'] || d.responseData['info']['completed'] || d.responseData['info']['canceled']) {
+
+ if(d && d.responseData['info'] && d.responseData['info']['canceled'])
+ vboxAlert(trans('Operation Canceled','phpVirtualBox'),{'width':'300px','height':'auto'});
+
+ var callback = $("#vboxProgress"+pid).data('vboxCallback');
+
+ $("#vboxProgressBar"+pid).progressbar({ value: 100 });
+
+ if(modal) {
+
+ var icon = $("#vboxProgress"+pid).data('vboxIcon');
+ var title = $("#vboxProgress"+pid).data('vboxTitle');
+ var target = $("#vboxProgress"+pid).data('vboxTarget');
+
+ $("#vboxProgress"+pid).empty().remove();
+
+ if(callback) callback(d);
+
+ // Now append to list
+ vboxProgressCreateListElement(prequest,icon,title,target);
+ vboxProgressUpdate(prequest);
+
+ } else {
+
+ var sdate = new Date();
+ $("#vboxProgressText"+pid).html(sdate.toLocaleString());
+ $('#vboxProgressCancel'+pid).remove();
+
+ if(callback) callback(d);
+ }
+
+ $("#vboxProgress"+pid).addClass('vboxProgressComplete').removeClass('vboxProgressRunning');
+
+ // Remove data
+ $("#vboxProgress"+pid).removeData([
+ 'vboxCallback',
+ 'vboxIcon',
+ 'vboxTitle',
+ 'vboxTarget'
+ ]);
+
+ // Check for max elements
+ if($('#vboxPane').data('vboxConfig').maxProgressList) {
+ var maxList = $('#vboxPane').data('vboxConfig').maxProgressList;
+ try {
+ maxList = Math.max(2,parseInt(maxList));
+ } catch (e) {
+ maxList = 5;
+ }
+ if(maxList > 0) $('#vboxProgressOps').children('div.vboxProgressComplete').slice(maxList).remove();
+
+ }
+
+ return;
+ }
+
+ // update percent
+ $("#vboxProgressBar"+pid).progressbar({ value: d.responseData.info.percent });
+ $("#vboxProgressText"+pid).html(d.responseData.info.percent+'%'+(modal ? '<br />' : ' ') + d.responseData.info.operationDescription);
+
+ // Cancelable?
+ if(d.responseData.info.cancelable) {
+ $('#vboxProgressCancel'+pid).show();
+ }
+
+ // Get request
+ var def = $.Deferred();
+ def.done(function(){
+
+ $.when(prequest, vboxAjaxRequest('progressGet', prequest, {'persist': d.persist}))
+ .done((modal ? vboxProgressUpdateModal : vboxProgressUpdate));
+
+ });
+ window.setTimeout(def.resolve, 2000);
+
+}
+
+/**
+ * Position element to mouse event
+ * @param {HTMLNode} elm - HTML node to position
+ * @param {Event} e - Event to position to
+ */
+function vboxPositionEvent(elm,e) {
+
+ var d = {};
+
+ if( self.innerHeight ) {
+ d.pageYOffset = self.pageYOffset;
+ d.pageXOffset = self.pageXOffset;
+ d.innerHeight = self.innerHeight;
+ d.innerWidth = self.innerWidth;
+ } else if( document.documentElement &&
+ document.documentElement.clientHeight ) {
+ d.pageYOffset = document.documentElement.scrollTop;
+ d.pageXOffset = document.documentElement.scrollLeft;
+ d.innerHeight = document.documentElement.clientHeight;
+ d.innerWidth = document.documentElement.clientWidth;
+ } else if( document.body ) {
+ d.pageYOffset = document.body.scrollTop;
+ d.pageXOffset = document.body.scrollLeft;
+ d.innerHeight = document.body.clientHeight;
+ d.innerWidth = document.body.clientWidth;
+ }
+
+ $(elm).css({'left':0,'top':0});
+
+ (e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;
+ (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;
+
+ //adjust to ensure element is inside viewable screen
+ var right = x + $(elm).outerWidth();
+ var bottom = y + $(elm).outerHeight();
+
+ var windowWidth = $(window).width() + $(window).scrollLeft()-5;
+ var windowHeight = $(window).height() + $(window).scrollTop()-5;
+
+ x = (right > windowWidth) ? x - (right - windowWidth) : x;
+ y = (bottom > windowHeight) ? y - (bottom - windowHeight) : y;
+
+ $(elm).css({ top: y, left: x });
+}
+
+/**
+ * Position element inside visible window
+ * @param {HTMLNode} elm - element
+ */
+function vboxPositionToWindow(elm) {
+
+ var offset = $(elm).offset();
+ var x = offset.left;
+ var y = offset.top;
+
+ //adjust to ensure menu is inside viewable screen
+ var right = x + $(elm).outerWidth();
+ var bottom = y + $(elm).outerHeight();
+
+ var windowWidth = $(window).width() + $(window).scrollLeft();
+ var windowHeight = $(window).height() + $(window).scrollTop();
+
+ x = (right > windowWidth) ? x - (right - windowWidth) : x;
+ y = (bottom > windowHeight) ? y - (bottom - windowHeight) : y;
+
+ $(elm).css({'top':y,'left':x});
+
+}
+
+/*
+ * keycode input validation functions
+ */
+/**
+ * Return true if k param is a number
+ * @param {Integer} k - keycode
+ * @return {Boolean}
+ */
+function vboxValidateNum(k) {
+ return ((k >= 96 && k <= 105)||(k >= 48 && k <= 57));
+}
+/**
+ * Return true if k param is a number or '.'
+ * @param {Integer} k - keycode
+ * @return {Boolean}
+ */
+function vboxValidateIP(k) {
+ return (vboxValidateNum(k) || k == 190 || k == 110 || k == 59 || k==78);
+}
+/**
+ * Return true if k param is a valid control code (shift, backspace, etc..)
+ * @param {Integer} k - keycode
+ * @return {Boolean}
+ */
+function vboxValidateCtrl(k) {
+ switch(k) {
+ case 8: // backspace
+ case 37: // left | right
+ case 39:
+ case 27: // esc
+ case 16: // shift
+ case 17: // ctrl
+ case 35: // end
+ case 36: // home
+ case 46: // del
+ case 144: // numlock
+ case 20: // capslock
+ case 18: // alt
+ return true;
+ }
+ return false;
+}
+
+/** Parse Cookies and populate $('#vboxPane').data('vboxCookies') */
+function vboxParseCookies() {
+ if($('#vboxPane').data('vboxCookiesParsed')) return;
+ var cookies = {};
+ var c = document.cookie.split('; ');
+ for(var i = 0; i < c.length; i++) {
+ var nv = c[i].split('=');
+ cookies[nv[0]] = nv[1];
+ }
+ $('#vboxPane').data('vboxCookies', cookies);
+ $('#vboxPane').data('vboxCookiesParsed',true);
+}
+
+/**
+ * General application failure
+ * @param {String|Object} msg - Optional extra message appended to error
+ * or error object passed to vboxAlert
+ */
+function phpVirtualBoxFailure(msg) {
+ if($('#vboxPane').data('vboxFatalError')) return;
+ $('#vboxPane').data('vboxFatalError', 1);
+ $('#vboxPane').css({'display':'none'});
+ $('#vboxPane').trigger('phpVirtualBoxFailure');
+ if(typeof(msg) == 'string') {
+ vboxAlert(trans('There was an error obtaining the list of registered virtual machines from VirtualBox. Make sure vboxwebsrv is running and that the settings in config.php are correct.<p>The list of virtual machines will not begin auto-refreshing again until this page is reloaded.</p>','phpVirtualBox')+(msg ? msg : ''));
+ } else {
+ msg.error = trans('There was an error obtaining the list of registered virtual machines from VirtualBox. Make sure vboxwebsrv is running and that the settings in config.php are correct.<p>The list of virtual machines will not begin auto-refreshing again until this page is reloaded.</p>','phpVirtualBox') + msg.error;
+ vboxAlert(msg);
+ }
+}
+
+/**
+ * Set a cookie and update $('#vboxPane').data('vboxCookies')
+ * @param {String} k - cookie key
+ * @param {any} v - cookie value
+ * @param {Date} expire - when cookie should expire
+ */
+function vboxSetCookie(k,v,expire) {
+ var exp = (v ? (expire ? expire : new Date(2020,12,24)) : new Date().setDate(new Date().getDate() - 1));
+ document.cookie = k+"="+v+"; expires="+exp.toGMTString()+"; path=/";
+ $('#vboxPane').data('vboxCookies')[k] = v;
+}
+
+/**
+ * Set a local data item using the local storage mechanism
+ * and upate $('#vboxPane').data('vboxCookies');
+ * @param {String} k - data item key
+ * @param {any} v - data item value
+ * @param {Boolean} nocookies - do not fall back to cookies
+ */
+function vboxSetLocalDataItem(k,v,nocookies) {
+
+ // fall back to normal cookie
+ if(typeof(Storage)==="undefined") {
+ if(!nocookies) vboxSetCookie(k,v);
+ return;
+ }
+ // Remove item?
+ if(v) {
+ localStorage.setItem(k,v.toString());
+ } else {
+ localStorage.removeItem(k);
+ }
+}
+
+/**
+ * Get a local data item using the local storage mechanism
+ * @param {String} k - data item key
+ * @return {mixed} data item value
+ */
+function vboxGetLocalDataItem(k) {
+
+ // fall back to normal cookie
+ if(typeof(Storage)==="undefined") {
+ return $('#vboxPane').data('vboxCookies')[k];
+ }
+ return localStorage.getItem(k);
+
+}
+/**
+ * Strip file name from path
+ * @param {String} p - path
+ * @return {String} path minus file name
+ */
+function vboxDirname(p) {
+ var pos = p.lastIndexOf($('#vboxPane').data('vboxConfig').DSEP);
+ if(pos > -1) {
+ return p.substring(0,pos);
+ }
+ return p;
+}
+/**
+ * Strip dir name from path
+ * @param {String} p - path
+ * @return {String} file name portion of path
+ */
+function vboxBasename(p) {
+ var pos = p.lastIndexOf($('#vboxPane').data('vboxConfig').DSEP);
+ if(pos > -1) {
+ return p.substring((pos+1));
+ }
+ return p;
+}
+
+/**
+ * Return a time or date+time string depending on
+ * how much time has elapsed
+ * @param {Integer} t - seconds since 1/1/1970 0:0:0
+ * @param {String} replaceTime - optional string to return replacing time
+ * @param {String} replaceDateTime - optional string to return replace date_time
+ * @return {String} time or date+time string
+ */
+function vboxDateTimeString(t, replaceTime, replaceDateTime) {
+
+ var sdate = new Date(t*1000);
+ if((new Date().getTime() - sdate.getTime())/1000 > 86400
+ || new Date().getDate() != sdate.getDate()) {
+ return (replaceDateTime ? replaceDateTime.replace('%1',sdate.toLocaleString()) : sdate.toLocaleString());
+ }
+ return (replaceTime ? replaceTime.replace('%1',sdate.toLocaleTimeString()) : sdate.toLocaleTimeString());
+}
+
+/**
+ * Calculate scrollbar width
+ * @return {Integer} width of scrollbar
+ *
+ * http://www.alexandre-gomes.com/?p=115
+ *
+ */
+var getScrollbarWidth = function() {
+
+ var inner = document.createElement('p');
+ inner.style.width = "100%";
+ inner.style.height = "200px";
+
+ var outer = document.createElement('div');
+ outer.style.position = "absolute";
+ outer.style.top = "0px";
+ outer.style.left = "0px";
+ outer.style.visibility = "hidden";
+ outer.style.width = "200px";
+ outer.style.height = "150px";
+ outer.style.overflow = "hidden";
+ outer.appendChild (inner);
+
+ document.body.appendChild (outer);
+ var w1 = inner.offsetWidth;
+ outer.style.overflow = 'scroll';
+ var w2 = inner.offsetWidth;
+ if (w1 == w2) w2 = outer.clientWidth;
+
+ document.body.removeChild (outer);
+
+ return (w1 - w2);
+
+};
+
+/**
+ * Returns the result of case-insensitive string comparison using 'natural' algorithm comparing str1 to str2
+ * @param {String} str1 - 1st string
+ * @param {String} str2 - 2nd string
+ * @return {Integer} integer for use in list sorting comparison
+ */
+function strnatcasecmp(str1, str2) {
+ // Returns the result of case-insensitive string comparison using 'natural' algorithm
+ //
+ // version: 1004.2314
+ // discuss at: http://phpjs.org/functions/strnatcasecmp // + original by: Martin Pool
+ // + reimplemented by: Pierre-Luc Paour
+ // + reimplemented by: Kristof Coomans (SCK-CEN (Belgian Nucleair Research Centre))
+ // + reimplemented by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // * example 1: strnatcasecmp(10, 1);
+ // * returns 1: 1
+ // * example 1: strnatcasecmp('1', '10');
+ // * returns 1: -1
+ var a = (str1+'').toLowerCase(); var b = (str2+'').toLowerCase();
+
+ var isWhitespaceChar = function (a) {
+ return a.charCodeAt(0) <= 32;
+ };
+ var isDigitChar = function (a) {
+ var charCode = a.charCodeAt(0);
+ return ( charCode >= 48 && charCode <= 57 );
+ };
+ var compareRight = function (a,b) {
+ var bias = 0;
+ var ia = 0;
+ var ib = 0;
+ var ca;
+ var cb;
+
+ // The longest run of digits wins. That aside, the greatest // value wins, but we can't know that it will until we've scanned
+ // both numbers to know that they have the same magnitude, so we
+ // remember it in BIAS.
+ for (;; ia++, ib++) {
+ ca = a.charAt(ia); cb = b.charAt(ib);
+
+ if (!isDigitChar(ca) &&
+ !isDigitChar(cb)) {
+ return bias; } else if (!isDigitChar(ca)) {
+ return -1;
+ } else if (!isDigitChar(cb)) {
+ return +1;
+ } else if (ca < cb) { if (bias == 0) {
+ bias = -1;
+ }
+ } else if (ca > cb) {
+ if (bias == 0) { bias = +1;
+ }
+ } else if (ca == 0 && cb == 0) {
+ return bias;
+ } }
+ };
+
+ var ia = 0, ib = 0;
+ var nza = 0, nzb = 0; var ca, cb;
+ var result;
+
+ while (true) {
+ // only count the number of zeroes leading the last number compared nza = nzb = 0;
+
+ ca = a.charAt(ia);
+ cb = b.charAt(ib);
+ // skip over leading spaces or zeros
+ while (isWhitespaceChar( ca ) || ca =='0') {
+ if (ca == '0') {
+ nza++;
+ } else { // only count consecutive zeroes
+ nza = 0;
+ }
+
+ ca = a.charAt(++ia); }
+
+ while (isWhitespaceChar( cb ) || cb == '0') {
+ if (cb == '0') {
+ nzb++; } else {
+ // only count consecutive zeroes
+ nzb = 0;
+ }
+ cb = b.charAt(++ib);
+ }
+
+ // process run of digits
+ if (isDigitChar(ca) && isDigitChar(cb)) { if ((result = compareRight(a.substring(ia), b.substring(ib))) != 0) {
+ return result;
+ }
+ }
+ if (ca == 0 && cb == 0) {
+ // The strings compare the same. Perhaps the caller
+ // will want to call strcmp to break the tie.
+ return nza - nzb;
+ }
+ if (ca < cb) {
+ return -1;
+ } else if (ca > cb) {
+ return +1; }
+
+ ++ia; ++ib;
+ }
+}
+
+/** Filter prototype for older browsers
+ * https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter
+ */
+if (!Array.prototype.filter)
+{
+ Array.prototype.filter = function(fun /*, thisp */)
+ {
+ "use strict";
+
+ if (this == null)
+ throw new TypeError();
+
+ var t = Object(this);
+ var len = t.length >>> 0;
+ if (typeof fun != "function")
+ throw new TypeError();
+
+ var res = [];
+ var thisp = arguments[1];
+ for (var i = 0; i < len; i++)
+ {
+ if (i in t)
+ {
+ var val = t[i]; // in case fun mutates this
+ if (fun.call(thisp, val, i, t))
+ res.push(val);
+ }
+ }
+
+ return res;
+ };
+}
+
+$(document).ready(function() {
+
+ // Don't unload while progress operation is .. in progress
+ window.onbeforeunload = vboxOpInProgressCheck;
+
+});
|