Commit a2ddae30a98cd32163795a7ff4a317a0e0ba48ab

Authored by 潘钊
1 parent ede24294

update

Showing 52 changed files with 7566 additions and 60 deletions
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/core.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Core 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/ui-core/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define( [ "jquery" ], factory );
  16 + } else {
  17 +
  18 + // Browser globals
  19 + factory( jQuery );
  20 + }
  21 +}(function( $ ) {
  22 +
  23 +// $.ui might exist from components with no dependencies, e.g., $.ui.position
  24 +$.ui = $.ui || {};
  25 +
  26 +$.extend( $.ui, {
  27 + version: "1.11.1",
  28 +
  29 + keyCode: {
  30 + BACKSPACE: 8,
  31 + COMMA: 188,
  32 + DELETE: 46,
  33 + DOWN: 40,
  34 + END: 35,
  35 + ENTER: 13,
  36 + ESCAPE: 27,
  37 + HOME: 36,
  38 + LEFT: 37,
  39 + PAGE_DOWN: 34,
  40 + PAGE_UP: 33,
  41 + PERIOD: 190,
  42 + RIGHT: 39,
  43 + SPACE: 32,
  44 + TAB: 9,
  45 + UP: 38
  46 + }
  47 +});
  48 +
  49 +// plugins
  50 +$.fn.extend({
  51 + scrollParent: function( includeHidden ) {
  52 + var position = this.css( "position" ),
  53 + excludeStaticParent = position === "absolute",
  54 + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/,
  55 + scrollParent = this.parents().filter( function() {
  56 + var parent = $( this );
  57 + if ( excludeStaticParent && parent.css( "position" ) === "static" ) {
  58 + return false;
  59 + }
  60 + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) );
  61 + }).eq( 0 );
  62 +
  63 + return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
  64 + },
  65 +
  66 + uniqueId: (function() {
  67 + var uuid = 0;
  68 +
  69 + return function() {
  70 + return this.each(function() {
  71 + if ( !this.id ) {
  72 + this.id = "ui-id-" + ( ++uuid );
  73 + }
  74 + });
  75 + };
  76 + })(),
  77 +
  78 + removeUniqueId: function() {
  79 + return this.each(function() {
  80 + if ( /^ui-id-\d+$/.test( this.id ) ) {
  81 + $( this ).removeAttr( "id" );
  82 + }
  83 + });
  84 + }
  85 +});
  86 +
  87 +// selectors
  88 +function focusable( element, isTabIndexNotNaN ) {
  89 + var map, mapName, img,
  90 + nodeName = element.nodeName.toLowerCase();
  91 + if ( "area" === nodeName ) {
  92 + map = element.parentNode;
  93 + mapName = map.name;
  94 + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
  95 + return false;
  96 + }
  97 + img = $( "img[usemap='#" + mapName + "']" )[ 0 ];
  98 + return !!img && visible( img );
  99 + }
  100 + return ( /input|select|textarea|button|object/.test( nodeName ) ?
  101 + !element.disabled :
  102 + "a" === nodeName ?
  103 + element.href || isTabIndexNotNaN :
  104 + isTabIndexNotNaN) &&
  105 + // the element and all of its ancestors must be visible
  106 + visible( element );
  107 +}
  108 +
  109 +function visible( element ) {
  110 + return $.expr.filters.visible( element ) &&
  111 + !$( element ).parents().addBack().filter(function() {
  112 + return $.css( this, "visibility" ) === "hidden";
  113 + }).length;
  114 +}
  115 +
  116 +$.extend( $.expr[ ":" ], {
  117 + data: $.expr.createPseudo ?
  118 + $.expr.createPseudo(function( dataName ) {
  119 + return function( elem ) {
  120 + return !!$.data( elem, dataName );
  121 + };
  122 + }) :
  123 + // support: jQuery <1.8
  124 + function( elem, i, match ) {
  125 + return !!$.data( elem, match[ 3 ] );
  126 + },
  127 +
  128 + focusable: function( element ) {
  129 + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
  130 + },
  131 +
  132 + tabbable: function( element ) {
  133 + var tabIndex = $.attr( element, "tabindex" ),
  134 + isTabIndexNaN = isNaN( tabIndex );
  135 + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
  136 + }
  137 +});
  138 +
  139 +// support: jQuery <1.8
  140 +if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
  141 + $.each( [ "Width", "Height" ], function( i, name ) {
  142 + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
  143 + type = name.toLowerCase(),
  144 + orig = {
  145 + innerWidth: $.fn.innerWidth,
  146 + innerHeight: $.fn.innerHeight,
  147 + outerWidth: $.fn.outerWidth,
  148 + outerHeight: $.fn.outerHeight
  149 + };
  150 +
  151 + function reduce( elem, size, border, margin ) {
  152 + $.each( side, function() {
  153 + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
  154 + if ( border ) {
  155 + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
  156 + }
  157 + if ( margin ) {
  158 + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
  159 + }
  160 + });
  161 + return size;
  162 + }
  163 +
  164 + $.fn[ "inner" + name ] = function( size ) {
  165 + if ( size === undefined ) {
  166 + return orig[ "inner" + name ].call( this );
  167 + }
  168 +
  169 + return this.each(function() {
  170 + $( this ).css( type, reduce( this, size ) + "px" );
  171 + });
  172 + };
  173 +
  174 + $.fn[ "outer" + name] = function( size, margin ) {
  175 + if ( typeof size !== "number" ) {
  176 + return orig[ "outer" + name ].call( this, size );
  177 + }
  178 +
  179 + return this.each(function() {
  180 + $( this).css( type, reduce( this, size, true, margin ) + "px" );
  181 + });
  182 + };
  183 + });
  184 +}
  185 +
  186 +// support: jQuery <1.8
  187 +if ( !$.fn.addBack ) {
  188 + $.fn.addBack = function( selector ) {
  189 + return this.add( selector == null ?
  190 + this.prevObject : this.prevObject.filter( selector )
  191 + );
  192 + };
  193 +}
  194 +
  195 +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
  196 +if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
  197 + $.fn.removeData = (function( removeData ) {
  198 + return function( key ) {
  199 + if ( arguments.length ) {
  200 + return removeData.call( this, $.camelCase( key ) );
  201 + } else {
  202 + return removeData.call( this );
  203 + }
  204 + };
  205 + })( $.fn.removeData );
  206 +}
  207 +
  208 +// deprecated
  209 +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
  210 +
  211 +$.fn.extend({
  212 + focus: (function( orig ) {
  213 + return function( delay, fn ) {
  214 + return typeof delay === "number" ?
  215 + this.each(function() {
  216 + var elem = this;
  217 + setTimeout(function() {
  218 + $( elem ).focus();
  219 + if ( fn ) {
  220 + fn.call( elem );
  221 + }
  222 + }, delay );
  223 + }) :
  224 + orig.apply( this, arguments );
  225 + };
  226 + })( $.fn.focus ),
  227 +
  228 + disableSelection: (function() {
  229 + var eventType = "onselectstart" in document.createElement( "div" ) ?
  230 + "selectstart" :
  231 + "mousedown";
  232 +
  233 + return function() {
  234 + return this.bind( eventType + ".ui-disableSelection", function( event ) {
  235 + event.preventDefault();
  236 + });
  237 + };
  238 + })(),
  239 +
  240 + enableSelection: function() {
  241 + return this.unbind( ".ui-disableSelection" );
  242 + },
  243 +
  244 + zIndex: function( zIndex ) {
  245 + if ( zIndex !== undefined ) {
  246 + return this.css( "zIndex", zIndex );
  247 + }
  248 +
  249 + if ( this.length ) {
  250 + var elem = $( this[ 0 ] ), position, value;
  251 + while ( elem.length && elem[ 0 ] !== document ) {
  252 + // Ignore z-index if position is set to a value where z-index is ignored by the browser
  253 + // This makes behavior of this function consistent across browsers
  254 + // WebKit always returns auto if the element is positioned
  255 + position = elem.css( "position" );
  256 + if ( position === "absolute" || position === "relative" || position === "fixed" ) {
  257 + // IE returns 0 when zIndex is not specified
  258 + // other browsers return a string
  259 + // we ignore the case of nested elements with an explicit value of 0
  260 + // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
  261 + value = parseInt( elem.css( "zIndex" ), 10 );
  262 + if ( !isNaN( value ) && value !== 0 ) {
  263 + return value;
  264 + }
  265 + }
  266 + elem = elem.parent();
  267 + }
  268 + }
  269 +
  270 + return 0;
  271 + }
  272 +});
  273 +
  274 +// $.ui.plugin is deprecated. Use $.widget() extensions instead.
  275 +$.ui.plugin = {
  276 + add: function( module, option, set ) {
  277 + var i,
  278 + proto = $.ui[ module ].prototype;
  279 + for ( i in set ) {
  280 + proto.plugins[ i ] = proto.plugins[ i ] || [];
  281 + proto.plugins[ i ].push( [ option, set[ i ] ] );
  282 + }
  283 + },
  284 + call: function( instance, name, args, allowDisconnected ) {
  285 + var i,
  286 + set = instance.plugins[ name ];
  287 +
  288 + if ( !set ) {
  289 + return;
  290 + }
  291 +
  292 + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
  293 + return;
  294 + }
  295 +
  296 + for ( i = 0; i < set.length; i++ ) {
  297 + if ( instance.options[ set[ i ][ 0 ] ] ) {
  298 + set[ i ][ 1 ].apply( instance.element, args );
  299 + }
  300 + }
  301 + }
  302 +};
  303 +
  304 +}));
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/mouse.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Mouse 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/mouse/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define([
  16 + "jquery",
  17 + "./widget"
  18 + ], factory );
  19 + } else {
  20 +
  21 + // Browser globals
  22 + factory( jQuery );
  23 + }
  24 +}(function( $ ) {
  25 +
  26 +var mouseHandled = false;
  27 +$( document ).mouseup( function() {
  28 + mouseHandled = false;
  29 +});
  30 +
  31 +return $.widget("ui.mouse", {
  32 + version: "1.11.1",
  33 + options: {
  34 + cancel: "input,textarea,button,select,option",
  35 + distance: 1,
  36 + delay: 0
  37 + },
  38 + _mouseInit: function() {
  39 + var that = this;
  40 +
  41 + this.element
  42 + .bind("mousedown." + this.widgetName, function(event) {
  43 + return that._mouseDown(event);
  44 + })
  45 + .bind("click." + this.widgetName, function(event) {
  46 + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {
  47 + $.removeData(event.target, that.widgetName + ".preventClickEvent");
  48 + event.stopImmediatePropagation();
  49 + return false;
  50 + }
  51 + });
  52 +
  53 + this.started = false;
  54 + },
  55 +
  56 + // TODO: make sure destroying one instance of mouse doesn't mess with
  57 + // other instances of mouse
  58 + _mouseDestroy: function() {
  59 + this.element.unbind("." + this.widgetName);
  60 + if ( this._mouseMoveDelegate ) {
  61 + this.document
  62 + .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate)
  63 + .unbind("mouseup." + this.widgetName, this._mouseUpDelegate);
  64 + }
  65 + },
  66 +
  67 + _mouseDown: function(event) {
  68 + // don't let more than one widget handle mouseStart
  69 + if ( mouseHandled ) {
  70 + return;
  71 + }
  72 +
  73 + // we may have missed mouseup (out of window)
  74 + (this._mouseStarted && this._mouseUp(event));
  75 +
  76 + this._mouseDownEvent = event;
  77 +
  78 + var that = this,
  79 + btnIsLeft = (event.which === 1),
  80 + // event.target.nodeName works around a bug in IE 8 with
  81 + // disabled inputs (#7620)
  82 + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);
  83 + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
  84 + return true;
  85 + }
  86 +
  87 + this.mouseDelayMet = !this.options.delay;
  88 + if (!this.mouseDelayMet) {
  89 + this._mouseDelayTimer = setTimeout(function() {
  90 + that.mouseDelayMet = true;
  91 + }, this.options.delay);
  92 + }
  93 +
  94 + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
  95 + this._mouseStarted = (this._mouseStart(event) !== false);
  96 + if (!this._mouseStarted) {
  97 + event.preventDefault();
  98 + return true;
  99 + }
  100 + }
  101 +
  102 + // Click event may never have fired (Gecko & Opera)
  103 + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {
  104 + $.removeData(event.target, this.widgetName + ".preventClickEvent");
  105 + }
  106 +
  107 + // these delegates are required to keep context
  108 + this._mouseMoveDelegate = function(event) {
  109 + return that._mouseMove(event);
  110 + };
  111 + this._mouseUpDelegate = function(event) {
  112 + return that._mouseUp(event);
  113 + };
  114 +
  115 + this.document
  116 + .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  117 + .bind( "mouseup." + this.widgetName, this._mouseUpDelegate );
  118 +
  119 + event.preventDefault();
  120 +
  121 + mouseHandled = true;
  122 + return true;
  123 + },
  124 +
  125 + _mouseMove: function(event) {
  126 + // IE mouseup check - mouseup happened when mouse was out of window
  127 + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {
  128 + return this._mouseUp(event);
  129 +
  130 + // Iframe mouseup check - mouseup occurred in another document
  131 + } else if ( !event.which ) {
  132 + return this._mouseUp( event );
  133 + }
  134 +
  135 + if (this._mouseStarted) {
  136 + this._mouseDrag(event);
  137 + return event.preventDefault();
  138 + }
  139 +
  140 + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
  141 + this._mouseStarted =
  142 + (this._mouseStart(this._mouseDownEvent, event) !== false);
  143 + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
  144 + }
  145 +
  146 + return !this._mouseStarted;
  147 + },
  148 +
  149 + _mouseUp: function(event) {
  150 + this.document
  151 + .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate )
  152 + .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate );
  153 +
  154 + if (this._mouseStarted) {
  155 + this._mouseStarted = false;
  156 +
  157 + if (event.target === this._mouseDownEvent.target) {
  158 + $.data(event.target, this.widgetName + ".preventClickEvent", true);
  159 + }
  160 +
  161 + this._mouseStop(event);
  162 + }
  163 +
  164 + mouseHandled = false;
  165 + return false;
  166 + },
  167 +
  168 + _mouseDistanceMet: function(event) {
  169 + return (Math.max(
  170 + Math.abs(this._mouseDownEvent.pageX - event.pageX),
  171 + Math.abs(this._mouseDownEvent.pageY - event.pageY)
  172 + ) >= this.options.distance
  173 + );
  174 + },
  175 +
  176 + _mouseDelayMet: function(/* event */) {
  177 + return this.mouseDelayMet;
  178 + },
  179 +
  180 + // These are placeholder methods, to be overriden by extending plugin
  181 + _mouseStart: function(/* event */) {},
  182 + _mouseDrag: function(/* event */) {},
  183 + _mouseStop: function(/* event */) {},
  184 + _mouseCapture: function(/* event */) { return true; }
  185 +});
  186 +
  187 +}));
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/resizable.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Resizable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/resizable/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define([
  16 + "jquery",
  17 + "./core",
  18 + "./mouse",
  19 + "./widget"
  20 + ], factory );
  21 + } else {
  22 +
  23 + // Browser globals
  24 + factory( jQuery );
  25 + }
  26 +}(function( $ ) {
  27 +
  28 +$.widget("ui.resizable", $.ui.mouse, {
  29 + version: "1.11.1",
  30 + widgetEventPrefix: "resize",
  31 + options: {
  32 + alsoResize: false,
  33 + animate: false,
  34 + animateDuration: "slow",
  35 + animateEasing: "swing",
  36 + aspectRatio: false,
  37 + autoHide: false,
  38 + containment: false,
  39 + ghost: false,
  40 + grid: false,
  41 + handles: "e,s,se",
  42 + helper: false,
  43 + maxHeight: null,
  44 + maxWidth: null,
  45 + minHeight: 10,
  46 + minWidth: 10,
  47 + // See #7960
  48 + zIndex: 90,
  49 +
  50 + // callbacks
  51 + resize: null,
  52 + start: null,
  53 + stop: null
  54 + },
  55 +
  56 + _num: function( value ) {
  57 + return parseInt( value, 10 ) || 0;
  58 + },
  59 +
  60 + _isNumber: function( value ) {
  61 + return !isNaN( parseInt( value, 10 ) );
  62 + },
  63 +
  64 + _hasScroll: function( el, a ) {
  65 +
  66 + if ( $( el ).css( "overflow" ) === "hidden") {
  67 + return false;
  68 + }
  69 +
  70 + var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",
  71 + has = false;
  72 +
  73 + if ( el[ scroll ] > 0 ) {
  74 + return true;
  75 + }
  76 +
  77 + // TODO: determine which cases actually cause this to happen
  78 + // if the element doesn't have the scroll set, see if it's possible to
  79 + // set the scroll
  80 + el[ scroll ] = 1;
  81 + has = ( el[ scroll ] > 0 );
  82 + el[ scroll ] = 0;
  83 + return has;
  84 + },
  85 +
  86 + _create: function() {
  87 +
  88 + var n, i, handle, axis, hname,
  89 + that = this,
  90 + o = this.options;
  91 + this.element.addClass("ui-resizable");
  92 +
  93 + $.extend(this, {
  94 + _aspectRatio: !!(o.aspectRatio),
  95 + aspectRatio: o.aspectRatio,
  96 + originalElement: this.element,
  97 + _proportionallyResizeElements: [],
  98 + _helper: o.helper || o.ghost || o.animate ? o.helper || "ui-resizable-helper" : null
  99 + });
  100 +
  101 + // Wrap the element if it cannot hold child nodes
  102 + if (this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
  103 +
  104 + this.element.wrap(
  105 + $("<div class='ui-wrapper' style='overflow: hidden;'></div>").css({
  106 + position: this.element.css("position"),
  107 + width: this.element.outerWidth(),
  108 + height: this.element.outerHeight(),
  109 + top: this.element.css("top"),
  110 + left: this.element.css("left")
  111 + })
  112 + );
  113 +
  114 + this.element = this.element.parent().data(
  115 + "ui-resizable", this.element.resizable( "instance" )
  116 + );
  117 +
  118 + this.elementIsWrapper = true;
  119 +
  120 + this.element.css({
  121 + marginLeft: this.originalElement.css("marginLeft"),
  122 + marginTop: this.originalElement.css("marginTop"),
  123 + marginRight: this.originalElement.css("marginRight"),
  124 + marginBottom: this.originalElement.css("marginBottom")
  125 + });
  126 + this.originalElement.css({
  127 + marginLeft: 0,
  128 + marginTop: 0,
  129 + marginRight: 0,
  130 + marginBottom: 0
  131 + });
  132 + // support: Safari
  133 + // Prevent Safari textarea resize
  134 + this.originalResizeStyle = this.originalElement.css("resize");
  135 + this.originalElement.css("resize", "none");
  136 +
  137 + this._proportionallyResizeElements.push( this.originalElement.css({
  138 + position: "static",
  139 + zoom: 1,
  140 + display: "block"
  141 + }) );
  142 +
  143 + // support: IE9
  144 + // avoid IE jump (hard set the margin)
  145 + this.originalElement.css({ margin: this.originalElement.css("margin") });
  146 +
  147 + this._proportionallyResize();
  148 + }
  149 +
  150 + this.handles = o.handles ||
  151 + ( !$(".ui-resizable-handle", this.element).length ?
  152 + "e,s,se" : {
  153 + n: ".ui-resizable-n",
  154 + e: ".ui-resizable-e",
  155 + s: ".ui-resizable-s",
  156 + w: ".ui-resizable-w",
  157 + se: ".ui-resizable-se",
  158 + sw: ".ui-resizable-sw",
  159 + ne: ".ui-resizable-ne",
  160 + nw: ".ui-resizable-nw"
  161 + } );
  162 +
  163 + if (this.handles.constructor === String) {
  164 +
  165 + if ( this.handles === "all") {
  166 + this.handles = "n,e,s,w,se,sw,ne,nw";
  167 + }
  168 +
  169 + n = this.handles.split(",");
  170 + this.handles = {};
  171 +
  172 + for (i = 0; i < n.length; i++) {
  173 +
  174 + handle = $.trim(n[i]);
  175 + hname = "ui-resizable-" + handle;
  176 + axis = $("<div class='ui-resizable-handle " + hname + "'></div>");
  177 +
  178 + axis.css({ zIndex: o.zIndex });
  179 +
  180 + // TODO : What's going on here?
  181 + if ("se" === handle) {
  182 + axis.addClass("ui-icon ui-icon-gripsmall-diagonal-se");
  183 + }
  184 +
  185 + this.handles[handle] = ".ui-resizable-" + handle;
  186 + this.element.append(axis);
  187 + }
  188 +
  189 + }
  190 +
  191 + this._renderAxis = function(target) {
  192 +
  193 + var i, axis, padPos, padWrapper;
  194 +
  195 + target = target || this.element;
  196 +
  197 + for (i in this.handles) {
  198 +
  199 + if (this.handles[i].constructor === String) {
  200 + this.handles[i] = this.element.children( this.handles[ i ] ).first().show();
  201 + }
  202 +
  203 + if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
  204 +
  205 + axis = $(this.handles[i], this.element);
  206 +
  207 + padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
  208 +
  209 + padPos = [ "padding",
  210 + /ne|nw|n/.test(i) ? "Top" :
  211 + /se|sw|s/.test(i) ? "Bottom" :
  212 + /^e$/.test(i) ? "Right" : "Left" ].join("");
  213 +
  214 + target.css(padPos, padWrapper);
  215 +
  216 + this._proportionallyResize();
  217 +
  218 + }
  219 +
  220 + // TODO: What's that good for? There's not anything to be executed left
  221 + if (!$(this.handles[i]).length) {
  222 + continue;
  223 + }
  224 + }
  225 + };
  226 +
  227 + // TODO: make renderAxis a prototype function
  228 + this._renderAxis(this.element);
  229 +
  230 + this._handles = $(".ui-resizable-handle", this.element)
  231 + .disableSelection();
  232 +
  233 + this._handles.mouseover(function() {
  234 + if (!that.resizing) {
  235 + if (this.className) {
  236 + axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
  237 + }
  238 + that.axis = axis && axis[1] ? axis[1] : "se";
  239 + }
  240 + });
  241 +
  242 + if (o.autoHide) {
  243 + this._handles.hide();
  244 + $(this.element)
  245 + .addClass("ui-resizable-autohide")
  246 + .mouseenter(function() {
  247 + if (o.disabled) {
  248 + return;
  249 + }
  250 + $(this).removeClass("ui-resizable-autohide");
  251 + that._handles.show();
  252 + })
  253 + .mouseleave(function() {
  254 + if (o.disabled) {
  255 + return;
  256 + }
  257 + if (!that.resizing) {
  258 + $(this).addClass("ui-resizable-autohide");
  259 + that._handles.hide();
  260 + }
  261 + });
  262 + }
  263 +
  264 + this._mouseInit();
  265 +
  266 + },
  267 +
  268 + _destroy: function() {
  269 +
  270 + this._mouseDestroy();
  271 +
  272 + var wrapper,
  273 + _destroy = function(exp) {
  274 + $(exp)
  275 + .removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
  276 + .removeData("resizable")
  277 + .removeData("ui-resizable")
  278 + .unbind(".resizable")
  279 + .find(".ui-resizable-handle")
  280 + .remove();
  281 + };
  282 +
  283 + // TODO: Unwrap at same DOM position
  284 + if (this.elementIsWrapper) {
  285 + _destroy(this.element);
  286 + wrapper = this.element;
  287 + this.originalElement.css({
  288 + position: wrapper.css("position"),
  289 + width: wrapper.outerWidth(),
  290 + height: wrapper.outerHeight(),
  291 + top: wrapper.css("top"),
  292 + left: wrapper.css("left")
  293 + }).insertAfter( wrapper );
  294 + wrapper.remove();
  295 + }
  296 +
  297 + this.originalElement.css("resize", this.originalResizeStyle);
  298 + _destroy(this.originalElement);
  299 +
  300 + return this;
  301 + },
  302 +
  303 + _mouseCapture: function(event) {
  304 + var i, handle,
  305 + capture = false;
  306 +
  307 + for (i in this.handles) {
  308 + handle = $(this.handles[i])[0];
  309 + if (handle === event.target || $.contains(handle, event.target)) {
  310 + capture = true;
  311 + }
  312 + }
  313 +
  314 + return !this.options.disabled && capture;
  315 + },
  316 +
  317 + _mouseStart: function(event) {
  318 +
  319 + var curleft, curtop, cursor,
  320 + o = this.options,
  321 + el = this.element;
  322 +
  323 + this.resizing = true;
  324 +
  325 + this._renderProxy();
  326 +
  327 + curleft = this._num(this.helper.css("left"));
  328 + curtop = this._num(this.helper.css("top"));
  329 +
  330 + if (o.containment) {
  331 + curleft += $(o.containment).scrollLeft() || 0;
  332 + curtop += $(o.containment).scrollTop() || 0;
  333 + }
  334 +
  335 + this.offset = this.helper.offset();
  336 + this.position = { left: curleft, top: curtop };
  337 +
  338 + this.size = this._helper ? {
  339 + width: this.helper.width(),
  340 + height: this.helper.height()
  341 + } : {
  342 + width: el.width(),
  343 + height: el.height()
  344 + };
  345 +
  346 + this.originalSize = this._helper ? {
  347 + width: el.outerWidth(),
  348 + height: el.outerHeight()
  349 + } : {
  350 + width: el.width(),
  351 + height: el.height()
  352 + };
  353 +
  354 + this.sizeDiff = {
  355 + width: el.outerWidth() - el.width(),
  356 + height: el.outerHeight() - el.height()
  357 + };
  358 +
  359 + this.originalPosition = { left: curleft, top: curtop };
  360 + this.originalMousePosition = { left: event.pageX, top: event.pageY };
  361 +
  362 + this.aspectRatio = (typeof o.aspectRatio === "number") ?
  363 + o.aspectRatio :
  364 + ((this.originalSize.width / this.originalSize.height) || 1);
  365 +
  366 + cursor = $(".ui-resizable-" + this.axis).css("cursor");
  367 + $("body").css("cursor", cursor === "auto" ? this.axis + "-resize" : cursor);
  368 +
  369 + el.addClass("ui-resizable-resizing");
  370 + this._propagate("start", event);
  371 + return true;
  372 + },
  373 +
  374 + _mouseDrag: function(event) {
  375 +
  376 + var data, props,
  377 + smp = this.originalMousePosition,
  378 + a = this.axis,
  379 + dx = (event.pageX - smp.left) || 0,
  380 + dy = (event.pageY - smp.top) || 0,
  381 + trigger = this._change[a];
  382 +
  383 + this._updatePrevProperties();
  384 +
  385 + if (!trigger) {
  386 + return false;
  387 + }
  388 +
  389 + data = trigger.apply(this, [ event, dx, dy ]);
  390 +
  391 + this._updateVirtualBoundaries(event.shiftKey);
  392 + if (this._aspectRatio || event.shiftKey) {
  393 + data = this._updateRatio(data, event);
  394 + }
  395 +
  396 + data = this._respectSize(data, event);
  397 +
  398 + this._updateCache(data);
  399 +
  400 + this._propagate("resize", event);
  401 +
  402 + props = this._applyChanges();
  403 +
  404 + if ( !this._helper && this._proportionallyResizeElements.length ) {
  405 + this._proportionallyResize();
  406 + }
  407 +
  408 + if ( !$.isEmptyObject( props ) ) {
  409 + this._updatePrevProperties();
  410 + this._trigger( "resize", event, this.ui() );
  411 + this._applyChanges();
  412 + }
  413 +
  414 + return false;
  415 + },
  416 +
  417 + _mouseStop: function(event) {
  418 +
  419 + this.resizing = false;
  420 + var pr, ista, soffseth, soffsetw, s, left, top,
  421 + o = this.options, that = this;
  422 +
  423 + if (this._helper) {
  424 +
  425 + pr = this._proportionallyResizeElements;
  426 + ista = pr.length && (/textarea/i).test(pr[0].nodeName);
  427 + soffseth = ista && this._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height;
  428 + soffsetw = ista ? 0 : that.sizeDiff.width;
  429 +
  430 + s = {
  431 + width: (that.helper.width() - soffsetw),
  432 + height: (that.helper.height() - soffseth)
  433 + };
  434 + left = (parseInt(that.element.css("left"), 10) +
  435 + (that.position.left - that.originalPosition.left)) || null;
  436 + top = (parseInt(that.element.css("top"), 10) +
  437 + (that.position.top - that.originalPosition.top)) || null;
  438 +
  439 + if (!o.animate) {
  440 + this.element.css($.extend(s, { top: top, left: left }));
  441 + }
  442 +
  443 + that.helper.height(that.size.height);
  444 + that.helper.width(that.size.width);
  445 +
  446 + if (this._helper && !o.animate) {
  447 + this._proportionallyResize();
  448 + }
  449 + }
  450 +
  451 + $("body").css("cursor", "auto");
  452 +
  453 + this.element.removeClass("ui-resizable-resizing");
  454 +
  455 + this._propagate("stop", event);
  456 +
  457 + if (this._helper) {
  458 + this.helper.remove();
  459 + }
  460 +
  461 + return false;
  462 +
  463 + },
  464 +
  465 + _updatePrevProperties: function() {
  466 + this.prevPosition = {
  467 + top: this.position.top,
  468 + left: this.position.left
  469 + };
  470 + this.prevSize = {
  471 + width: this.size.width,
  472 + height: this.size.height
  473 + };
  474 + },
  475 +
  476 + _applyChanges: function() {
  477 + var props = {};
  478 +
  479 + if ( this.position.top !== this.prevPosition.top ) {
  480 + props.top = this.position.top + "px";
  481 + }
  482 + if ( this.position.left !== this.prevPosition.left ) {
  483 + props.left = this.position.left + "px";
  484 + }
  485 + if ( this.size.width !== this.prevSize.width ) {
  486 + props.width = this.size.width + "px";
  487 + }
  488 + if ( this.size.height !== this.prevSize.height ) {
  489 + props.height = this.size.height + "px";
  490 + }
  491 +
  492 + this.helper.css( props );
  493 +
  494 + return props;
  495 + },
  496 +
  497 + _updateVirtualBoundaries: function(forceAspectRatio) {
  498 + var pMinWidth, pMaxWidth, pMinHeight, pMaxHeight, b,
  499 + o = this.options;
  500 +
  501 + b = {
  502 + minWidth: this._isNumber(o.minWidth) ? o.minWidth : 0,
  503 + maxWidth: this._isNumber(o.maxWidth) ? o.maxWidth : Infinity,
  504 + minHeight: this._isNumber(o.minHeight) ? o.minHeight : 0,
  505 + maxHeight: this._isNumber(o.maxHeight) ? o.maxHeight : Infinity
  506 + };
  507 +
  508 + if (this._aspectRatio || forceAspectRatio) {
  509 + pMinWidth = b.minHeight * this.aspectRatio;
  510 + pMinHeight = b.minWidth / this.aspectRatio;
  511 + pMaxWidth = b.maxHeight * this.aspectRatio;
  512 + pMaxHeight = b.maxWidth / this.aspectRatio;
  513 +
  514 + if (pMinWidth > b.minWidth) {
  515 + b.minWidth = pMinWidth;
  516 + }
  517 + if (pMinHeight > b.minHeight) {
  518 + b.minHeight = pMinHeight;
  519 + }
  520 + if (pMaxWidth < b.maxWidth) {
  521 + b.maxWidth = pMaxWidth;
  522 + }
  523 + if (pMaxHeight < b.maxHeight) {
  524 + b.maxHeight = pMaxHeight;
  525 + }
  526 + }
  527 + this._vBoundaries = b;
  528 + },
  529 +
  530 + _updateCache: function(data) {
  531 + this.offset = this.helper.offset();
  532 + if (this._isNumber(data.left)) {
  533 + this.position.left = data.left;
  534 + }
  535 + if (this._isNumber(data.top)) {
  536 + this.position.top = data.top;
  537 + }
  538 + if (this._isNumber(data.height)) {
  539 + this.size.height = data.height;
  540 + }
  541 + if (this._isNumber(data.width)) {
  542 + this.size.width = data.width;
  543 + }
  544 + },
  545 +
  546 + _updateRatio: function( data ) {
  547 +
  548 + var cpos = this.position,
  549 + csize = this.size,
  550 + a = this.axis;
  551 +
  552 + if (this._isNumber(data.height)) {
  553 + data.width = (data.height * this.aspectRatio);
  554 + } else if (this._isNumber(data.width)) {
  555 + data.height = (data.width / this.aspectRatio);
  556 + }
  557 +
  558 + if (a === "sw") {
  559 + data.left = cpos.left + (csize.width - data.width);
  560 + data.top = null;
  561 + }
  562 + if (a === "nw") {
  563 + data.top = cpos.top + (csize.height - data.height);
  564 + data.left = cpos.left + (csize.width - data.width);
  565 + }
  566 +
  567 + return data;
  568 + },
  569 +
  570 + _respectSize: function( data ) {
  571 +
  572 + var o = this._vBoundaries,
  573 + a = this.axis,
  574 + ismaxw = this._isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width),
  575 + ismaxh = this._isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
  576 + isminw = this._isNumber(data.width) && o.minWidth && (o.minWidth > data.width),
  577 + isminh = this._isNumber(data.height) && o.minHeight && (o.minHeight > data.height),
  578 + dw = this.originalPosition.left + this.originalSize.width,
  579 + dh = this.position.top + this.size.height,
  580 + cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
  581 + if (isminw) {
  582 + data.width = o.minWidth;
  583 + }
  584 + if (isminh) {
  585 + data.height = o.minHeight;
  586 + }
  587 + if (ismaxw) {
  588 + data.width = o.maxWidth;
  589 + }
  590 + if (ismaxh) {
  591 + data.height = o.maxHeight;
  592 + }
  593 +
  594 + if (isminw && cw) {
  595 + data.left = dw - o.minWidth;
  596 + }
  597 + if (ismaxw && cw) {
  598 + data.left = dw - o.maxWidth;
  599 + }
  600 + if (isminh && ch) {
  601 + data.top = dh - o.minHeight;
  602 + }
  603 + if (ismaxh && ch) {
  604 + data.top = dh - o.maxHeight;
  605 + }
  606 +
  607 + // Fixing jump error on top/left - bug #2330
  608 + if (!data.width && !data.height && !data.left && data.top) {
  609 + data.top = null;
  610 + } else if (!data.width && !data.height && !data.top && data.left) {
  611 + data.left = null;
  612 + }
  613 +
  614 + return data;
  615 + },
  616 +
  617 + _getPaddingPlusBorderDimensions: function( element ) {
  618 + var i = 0,
  619 + widths = [],
  620 + borders = [
  621 + element.css( "borderTopWidth" ),
  622 + element.css( "borderRightWidth" ),
  623 + element.css( "borderBottomWidth" ),
  624 + element.css( "borderLeftWidth" )
  625 + ],
  626 + paddings = [
  627 + element.css( "paddingTop" ),
  628 + element.css( "paddingRight" ),
  629 + element.css( "paddingBottom" ),
  630 + element.css( "paddingLeft" )
  631 + ];
  632 +
  633 + for ( ; i < 4; i++ ) {
  634 + widths[ i ] = ( parseInt( borders[ i ], 10 ) || 0 );
  635 + widths[ i ] += ( parseInt( paddings[ i ], 10 ) || 0 );
  636 + }
  637 +
  638 + return {
  639 + height: widths[ 0 ] + widths[ 2 ],
  640 + width: widths[ 1 ] + widths[ 3 ]
  641 + };
  642 + },
  643 +
  644 + _proportionallyResize: function() {
  645 +
  646 + if (!this._proportionallyResizeElements.length) {
  647 + return;
  648 + }
  649 +
  650 + var prel,
  651 + i = 0,
  652 + element = this.helper || this.element;
  653 +
  654 + for ( ; i < this._proportionallyResizeElements.length; i++) {
  655 +
  656 + prel = this._proportionallyResizeElements[i];
  657 +
  658 + // TODO: Seems like a bug to cache this.outerDimensions
  659 + // considering that we are in a loop.
  660 + if (!this.outerDimensions) {
  661 + this.outerDimensions = this._getPaddingPlusBorderDimensions( prel );
  662 + }
  663 +
  664 + prel.css({
  665 + height: (element.height() - this.outerDimensions.height) || 0,
  666 + width: (element.width() - this.outerDimensions.width) || 0
  667 + });
  668 +
  669 + }
  670 +
  671 + },
  672 +
  673 + _renderProxy: function() {
  674 +
  675 + var el = this.element, o = this.options;
  676 + this.elementOffset = el.offset();
  677 +
  678 + if (this._helper) {
  679 +
  680 + this.helper = this.helper || $("<div style='overflow:hidden;'></div>");
  681 +
  682 + this.helper.addClass(this._helper).css({
  683 + width: this.element.outerWidth() - 1,
  684 + height: this.element.outerHeight() - 1,
  685 + position: "absolute",
  686 + left: this.elementOffset.left + "px",
  687 + top: this.elementOffset.top + "px",
  688 + zIndex: ++o.zIndex //TODO: Don't modify option
  689 + });
  690 +
  691 + this.helper
  692 + .appendTo("body")
  693 + .disableSelection();
  694 +
  695 + } else {
  696 + this.helper = this.element;
  697 + }
  698 +
  699 + },
  700 +
  701 + _change: {
  702 + e: function(event, dx) {
  703 + return { width: this.originalSize.width + dx };
  704 + },
  705 + w: function(event, dx) {
  706 + var cs = this.originalSize, sp = this.originalPosition;
  707 + return { left: sp.left + dx, width: cs.width - dx };
  708 + },
  709 + n: function(event, dx, dy) {
  710 + var cs = this.originalSize, sp = this.originalPosition;
  711 + return { top: sp.top + dy, height: cs.height - dy };
  712 + },
  713 + s: function(event, dx, dy) {
  714 + return { height: this.originalSize.height + dy };
  715 + },
  716 + se: function(event, dx, dy) {
  717 + return $.extend(this._change.s.apply(this, arguments),
  718 + this._change.e.apply(this, [ event, dx, dy ]));
  719 + },
  720 + sw: function(event, dx, dy) {
  721 + return $.extend(this._change.s.apply(this, arguments),
  722 + this._change.w.apply(this, [ event, dx, dy ]));
  723 + },
  724 + ne: function(event, dx, dy) {
  725 + return $.extend(this._change.n.apply(this, arguments),
  726 + this._change.e.apply(this, [ event, dx, dy ]));
  727 + },
  728 + nw: function(event, dx, dy) {
  729 + return $.extend(this._change.n.apply(this, arguments),
  730 + this._change.w.apply(this, [ event, dx, dy ]));
  731 + }
  732 + },
  733 +
  734 + _propagate: function(n, event) {
  735 + $.ui.plugin.call(this, n, [ event, this.ui() ]);
  736 + (n !== "resize" && this._trigger(n, event, this.ui()));
  737 + },
  738 +
  739 + plugins: {},
  740 +
  741 + ui: function() {
  742 + return {
  743 + originalElement: this.originalElement,
  744 + element: this.element,
  745 + helper: this.helper,
  746 + position: this.position,
  747 + size: this.size,
  748 + originalSize: this.originalSize,
  749 + originalPosition: this.originalPosition
  750 + };
  751 + }
  752 +
  753 +});
  754 +
  755 +/*
  756 + * Resizable Extensions
  757 + */
  758 +
  759 +$.ui.plugin.add("resizable", "animate", {
  760 +
  761 + stop: function( event ) {
  762 + var that = $(this).resizable( "instance" ),
  763 + o = that.options,
  764 + pr = that._proportionallyResizeElements,
  765 + ista = pr.length && (/textarea/i).test(pr[0].nodeName),
  766 + soffseth = ista && that._hasScroll(pr[0], "left") ? 0 : that.sizeDiff.height,
  767 + soffsetw = ista ? 0 : that.sizeDiff.width,
  768 + style = { width: (that.size.width - soffsetw), height: (that.size.height - soffseth) },
  769 + left = (parseInt(that.element.css("left"), 10) +
  770 + (that.position.left - that.originalPosition.left)) || null,
  771 + top = (parseInt(that.element.css("top"), 10) +
  772 + (that.position.top - that.originalPosition.top)) || null;
  773 +
  774 + that.element.animate(
  775 + $.extend(style, top && left ? { top: top, left: left } : {}), {
  776 + duration: o.animateDuration,
  777 + easing: o.animateEasing,
  778 + step: function() {
  779 +
  780 + var data = {
  781 + width: parseInt(that.element.css("width"), 10),
  782 + height: parseInt(that.element.css("height"), 10),
  783 + top: parseInt(that.element.css("top"), 10),
  784 + left: parseInt(that.element.css("left"), 10)
  785 + };
  786 +
  787 + if (pr && pr.length) {
  788 + $(pr[0]).css({ width: data.width, height: data.height });
  789 + }
  790 +
  791 + // propagating resize, and updating values for each animation step
  792 + that._updateCache(data);
  793 + that._propagate("resize", event);
  794 +
  795 + }
  796 + }
  797 + );
  798 + }
  799 +
  800 +});
  801 +
  802 +$.ui.plugin.add( "resizable", "containment", {
  803 +
  804 + start: function() {
  805 + var element, p, co, ch, cw, width, height,
  806 + that = $( this ).resizable( "instance" ),
  807 + o = that.options,
  808 + el = that.element,
  809 + oc = o.containment,
  810 + ce = ( oc instanceof $ ) ? oc.get( 0 ) : ( /parent/.test( oc ) ) ? el.parent().get( 0 ) : oc;
  811 +
  812 + if ( !ce ) {
  813 + return;
  814 + }
  815 +
  816 + that.containerElement = $( ce );
  817 +
  818 + if ( /document/.test( oc ) || oc === document ) {
  819 + that.containerOffset = {
  820 + left: 0,
  821 + top: 0
  822 + };
  823 + that.containerPosition = {
  824 + left: 0,
  825 + top: 0
  826 + };
  827 +
  828 + that.parentData = {
  829 + element: $( document ),
  830 + left: 0,
  831 + top: 0,
  832 + width: $( document ).width(),
  833 + height: $( document ).height() || document.body.parentNode.scrollHeight
  834 + };
  835 + } else {
  836 + element = $( ce );
  837 + p = [];
  838 + $([ "Top", "Right", "Left", "Bottom" ]).each(function( i, name ) {
  839 + p[ i ] = that._num( element.css( "padding" + name ) );
  840 + });
  841 +
  842 + that.containerOffset = element.offset();
  843 + that.containerPosition = element.position();
  844 + that.containerSize = {
  845 + height: ( element.innerHeight() - p[ 3 ] ),
  846 + width: ( element.innerWidth() - p[ 1 ] )
  847 + };
  848 +
  849 + co = that.containerOffset;
  850 + ch = that.containerSize.height;
  851 + cw = that.containerSize.width;
  852 + width = ( that._hasScroll ( ce, "left" ) ? ce.scrollWidth : cw );
  853 + height = ( that._hasScroll ( ce ) ? ce.scrollHeight : ch ) ;
  854 +
  855 + that.parentData = {
  856 + element: ce,
  857 + left: co.left,
  858 + top: co.top,
  859 + width: width,
  860 + height: height
  861 + };
  862 + }
  863 + },
  864 +
  865 + resize: function( event ) {
  866 + var woset, hoset, isParent, isOffsetRelative,
  867 + that = $( this ).resizable( "instance" ),
  868 + o = that.options,
  869 + co = that.containerOffset,
  870 + cp = that.position,
  871 + pRatio = that._aspectRatio || event.shiftKey,
  872 + cop = {
  873 + top: 0,
  874 + left: 0
  875 + },
  876 + ce = that.containerElement,
  877 + continueResize = true;
  878 +
  879 + if ( ce[ 0 ] !== document && ( /static/ ).test( ce.css( "position" ) ) ) {
  880 + cop = co;
  881 + }
  882 +
  883 + if ( cp.left < ( that._helper ? co.left : 0 ) ) {
  884 + that.size.width = that.size.width +
  885 + ( that._helper ?
  886 + ( that.position.left - co.left ) :
  887 + ( that.position.left - cop.left ) );
  888 +
  889 + if ( pRatio ) {
  890 + that.size.height = that.size.width / that.aspectRatio;
  891 + continueResize = false;
  892 + }
  893 + that.position.left = o.helper ? co.left : 0;
  894 + }
  895 +
  896 + if ( cp.top < ( that._helper ? co.top : 0 ) ) {
  897 + that.size.height = that.size.height +
  898 + ( that._helper ?
  899 + ( that.position.top - co.top ) :
  900 + that.position.top );
  901 +
  902 + if ( pRatio ) {
  903 + that.size.width = that.size.height * that.aspectRatio;
  904 + continueResize = false;
  905 + }
  906 + that.position.top = that._helper ? co.top : 0;
  907 + }
  908 +
  909 + isParent = that.containerElement.get( 0 ) === that.element.parent().get( 0 );
  910 + isOffsetRelative = /relative|absolute/.test( that.containerElement.css( "position" ) );
  911 +
  912 + if ( isParent && isOffsetRelative ) {
  913 + that.offset.left = that.parentData.left + that.position.left;
  914 + that.offset.top = that.parentData.top + that.position.top;
  915 + } else {
  916 + that.offset.left = that.element.offset().left;
  917 + that.offset.top = that.element.offset().top;
  918 + }
  919 +
  920 + woset = Math.abs( that.sizeDiff.width +
  921 + (that._helper ?
  922 + that.offset.left - cop.left :
  923 + (that.offset.left - co.left)) );
  924 +
  925 + hoset = Math.abs( that.sizeDiff.height +
  926 + (that._helper ?
  927 + that.offset.top - cop.top :
  928 + (that.offset.top - co.top)) );
  929 +
  930 + if ( woset + that.size.width >= that.parentData.width ) {
  931 + that.size.width = that.parentData.width - woset;
  932 + if ( pRatio ) {
  933 + that.size.height = that.size.width / that.aspectRatio;
  934 + continueResize = false;
  935 + }
  936 + }
  937 +
  938 + if ( hoset + that.size.height >= that.parentData.height ) {
  939 + that.size.height = that.parentData.height - hoset;
  940 + if ( pRatio ) {
  941 + that.size.width = that.size.height * that.aspectRatio;
  942 + continueResize = false;
  943 + }
  944 + }
  945 +
  946 + if ( !continueResize ){
  947 + that.position.left = that.prevPosition.left;
  948 + that.position.top = that.prevPosition.top;
  949 + that.size.width = that.prevSize.width;
  950 + that.size.height = that.prevSize.height;
  951 + }
  952 + },
  953 +
  954 + stop: function() {
  955 + var that = $( this ).resizable( "instance" ),
  956 + o = that.options,
  957 + co = that.containerOffset,
  958 + cop = that.containerPosition,
  959 + ce = that.containerElement,
  960 + helper = $( that.helper ),
  961 + ho = helper.offset(),
  962 + w = helper.outerWidth() - that.sizeDiff.width,
  963 + h = helper.outerHeight() - that.sizeDiff.height;
  964 +
  965 + if ( that._helper && !o.animate && ( /relative/ ).test( ce.css( "position" ) ) ) {
  966 + $( this ).css({
  967 + left: ho.left - cop.left - co.left,
  968 + width: w,
  969 + height: h
  970 + });
  971 + }
  972 +
  973 + if ( that._helper && !o.animate && ( /static/ ).test( ce.css( "position" ) ) ) {
  974 + $( this ).css({
  975 + left: ho.left - cop.left - co.left,
  976 + width: w,
  977 + height: h
  978 + });
  979 + }
  980 + }
  981 +});
  982 +
  983 +$.ui.plugin.add("resizable", "alsoResize", {
  984 +
  985 + start: function() {
  986 + var that = $(this).resizable( "instance" ),
  987 + o = that.options,
  988 + _store = function(exp) {
  989 + $(exp).each(function() {
  990 + var el = $(this);
  991 + el.data("ui-resizable-alsoresize", {
  992 + width: parseInt(el.width(), 10), height: parseInt(el.height(), 10),
  993 + left: parseInt(el.css("left"), 10), top: parseInt(el.css("top"), 10)
  994 + });
  995 + });
  996 + };
  997 +
  998 + if (typeof(o.alsoResize) === "object" && !o.alsoResize.parentNode) {
  999 + if (o.alsoResize.length) {
  1000 + o.alsoResize = o.alsoResize[0];
  1001 + _store(o.alsoResize);
  1002 + } else {
  1003 + $.each(o.alsoResize, function(exp) {
  1004 + _store(exp);
  1005 + });
  1006 + }
  1007 + } else {
  1008 + _store(o.alsoResize);
  1009 + }
  1010 + },
  1011 +
  1012 + resize: function(event, ui) {
  1013 + var that = $(this).resizable( "instance" ),
  1014 + o = that.options,
  1015 + os = that.originalSize,
  1016 + op = that.originalPosition,
  1017 + delta = {
  1018 + height: (that.size.height - os.height) || 0,
  1019 + width: (that.size.width - os.width) || 0,
  1020 + top: (that.position.top - op.top) || 0,
  1021 + left: (that.position.left - op.left) || 0
  1022 + },
  1023 +
  1024 + _alsoResize = function(exp, c) {
  1025 + $(exp).each(function() {
  1026 + var el = $(this), start = $(this).data("ui-resizable-alsoresize"), style = {},
  1027 + css = c && c.length ?
  1028 + c :
  1029 + el.parents(ui.originalElement[0]).length ?
  1030 + [ "width", "height" ] :
  1031 + [ "width", "height", "top", "left" ];
  1032 +
  1033 + $.each(css, function(i, prop) {
  1034 + var sum = (start[prop] || 0) + (delta[prop] || 0);
  1035 + if (sum && sum >= 0) {
  1036 + style[prop] = sum || null;
  1037 + }
  1038 + });
  1039 +
  1040 + el.css(style);
  1041 + });
  1042 + };
  1043 +
  1044 + if (typeof(o.alsoResize) === "object" && !o.alsoResize.nodeType) {
  1045 + $.each(o.alsoResize, function(exp, c) {
  1046 + _alsoResize(exp, c);
  1047 + });
  1048 + } else {
  1049 + _alsoResize(o.alsoResize);
  1050 + }
  1051 + },
  1052 +
  1053 + stop: function() {
  1054 + $(this).removeData("resizable-alsoresize");
  1055 + }
  1056 +});
  1057 +
  1058 +$.ui.plugin.add("resizable", "ghost", {
  1059 +
  1060 + start: function() {
  1061 +
  1062 + var that = $(this).resizable( "instance" ), o = that.options, cs = that.size;
  1063 +
  1064 + that.ghost = that.originalElement.clone();
  1065 + that.ghost
  1066 + .css({
  1067 + opacity: 0.25,
  1068 + display: "block",
  1069 + position: "relative",
  1070 + height: cs.height,
  1071 + width: cs.width,
  1072 + margin: 0,
  1073 + left: 0,
  1074 + top: 0
  1075 + })
  1076 + .addClass("ui-resizable-ghost")
  1077 + .addClass(typeof o.ghost === "string" ? o.ghost : "");
  1078 +
  1079 + that.ghost.appendTo(that.helper);
  1080 +
  1081 + },
  1082 +
  1083 + resize: function() {
  1084 + var that = $(this).resizable( "instance" );
  1085 + if (that.ghost) {
  1086 + that.ghost.css({
  1087 + position: "relative",
  1088 + height: that.size.height,
  1089 + width: that.size.width
  1090 + });
  1091 + }
  1092 + },
  1093 +
  1094 + stop: function() {
  1095 + var that = $(this).resizable( "instance" );
  1096 + if (that.ghost && that.helper) {
  1097 + that.helper.get(0).removeChild(that.ghost.get(0));
  1098 + }
  1099 + }
  1100 +
  1101 +});
  1102 +
  1103 +$.ui.plugin.add("resizable", "grid", {
  1104 +
  1105 + resize: function() {
  1106 + var outerDimensions,
  1107 + that = $(this).resizable( "instance" ),
  1108 + o = that.options,
  1109 + cs = that.size,
  1110 + os = that.originalSize,
  1111 + op = that.originalPosition,
  1112 + a = that.axis,
  1113 + grid = typeof o.grid === "number" ? [ o.grid, o.grid ] : o.grid,
  1114 + gridX = (grid[0] || 1),
  1115 + gridY = (grid[1] || 1),
  1116 + ox = Math.round((cs.width - os.width) / gridX) * gridX,
  1117 + oy = Math.round((cs.height - os.height) / gridY) * gridY,
  1118 + newWidth = os.width + ox,
  1119 + newHeight = os.height + oy,
  1120 + isMaxWidth = o.maxWidth && (o.maxWidth < newWidth),
  1121 + isMaxHeight = o.maxHeight && (o.maxHeight < newHeight),
  1122 + isMinWidth = o.minWidth && (o.minWidth > newWidth),
  1123 + isMinHeight = o.minHeight && (o.minHeight > newHeight);
  1124 +
  1125 + o.grid = grid;
  1126 +
  1127 + if (isMinWidth) {
  1128 + newWidth += gridX;
  1129 + }
  1130 + if (isMinHeight) {
  1131 + newHeight += gridY;
  1132 + }
  1133 + if (isMaxWidth) {
  1134 + newWidth -= gridX;
  1135 + }
  1136 + if (isMaxHeight) {
  1137 + newHeight -= gridY;
  1138 + }
  1139 +
  1140 + if (/^(se|s|e)$/.test(a)) {
  1141 + that.size.width = newWidth;
  1142 + that.size.height = newHeight;
  1143 + } else if (/^(ne)$/.test(a)) {
  1144 + that.size.width = newWidth;
  1145 + that.size.height = newHeight;
  1146 + that.position.top = op.top - oy;
  1147 + } else if (/^(sw)$/.test(a)) {
  1148 + that.size.width = newWidth;
  1149 + that.size.height = newHeight;
  1150 + that.position.left = op.left - ox;
  1151 + } else {
  1152 + if ( newHeight - gridY <= 0 || newWidth - gridX <= 0) {
  1153 + outerDimensions = that._getPaddingPlusBorderDimensions( this );
  1154 + }
  1155 +
  1156 + if ( newHeight - gridY > 0 ) {
  1157 + that.size.height = newHeight;
  1158 + that.position.top = op.top - oy;
  1159 + } else {
  1160 + newHeight = gridY - outerDimensions.height;
  1161 + that.size.height = newHeight;
  1162 + that.position.top = op.top + os.height - newHeight;
  1163 + }
  1164 + if ( newWidth - gridX > 0 ) {
  1165 + that.size.width = newWidth;
  1166 + that.position.left = op.left - ox;
  1167 + } else {
  1168 + newWidth = gridY - outerDimensions.height;
  1169 + that.size.width = newWidth;
  1170 + that.position.left = op.left + os.width - newWidth;
  1171 + }
  1172 + }
  1173 + }
  1174 +
  1175 +});
  1176 +
  1177 +return $.ui.resizable;
  1178 +
  1179 +}));
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/accordion.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Accordion 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/accordion/#theming
  10 + */
  11 +.ui-accordion .ui-accordion-header {
  12 + display: block;
  13 + cursor: pointer;
  14 + position: relative;
  15 + margin: 2px 0 0 0;
  16 + padding: .5em .5em .5em .7em;
  17 + min-height: 0; /* support: IE7 */
  18 + font-size: 100%;
  19 +}
  20 +.ui-accordion .ui-accordion-icons {
  21 + padding-left: 2.2em;
  22 +}
  23 +.ui-accordion .ui-accordion-icons .ui-accordion-icons {
  24 + padding-left: 2.2em;
  25 +}
  26 +.ui-accordion .ui-accordion-header .ui-accordion-header-icon {
  27 + position: absolute;
  28 + left: .5em;
  29 + top: 50%;
  30 + margin-top: -8px;
  31 +}
  32 +.ui-accordion .ui-accordion-content {
  33 + padding: 1em 2.2em;
  34 + border-top: 0;
  35 + overflow: auto;
  36 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/all.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + */
  11 +@import "base.css";
  12 +@import "theme.css";
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/autocomplete.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Autocomplete 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/autocomplete/#theming
  10 + */
  11 +.ui-autocomplete {
  12 + position: absolute;
  13 + top: 0;
  14 + left: 0;
  15 + cursor: default;
  16 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/base.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + */
  11 +@import url("core.css");
  12 +
  13 +@import url("accordion.css");
  14 +@import url("autocomplete.css");
  15 +@import url("button.css");
  16 +@import url("datepicker.css");
  17 +@import url("dialog.css");
  18 +@import url("draggable.css");
  19 +@import url("menu.css");
  20 +@import url("progressbar.css");
  21 +@import url("resizable.css");
  22 +@import url("selectable.css");
  23 +@import url("selectmenu.css");
  24 +@import url("sortable.css");
  25 +@import url("slider.css");
  26 +@import url("spinner.css");
  27 +@import url("tabs.css");
  28 +@import url("tooltip.css");
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/button.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Button 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/button/#theming
  10 + */
  11 +.ui-button {
  12 + display: inline-block;
  13 + position: relative;
  14 + padding: 0;
  15 + line-height: normal;
  16 + margin-right: .1em;
  17 + cursor: pointer;
  18 + vertical-align: middle;
  19 + text-align: center;
  20 + overflow: visible; /* removes extra width in IE */
  21 +}
  22 +.ui-button,
  23 +.ui-button:link,
  24 +.ui-button:visited,
  25 +.ui-button:hover,
  26 +.ui-button:active {
  27 + text-decoration: none;
  28 +}
  29 +/* to make room for the icon, a width needs to be set here */
  30 +.ui-button-icon-only {
  31 + width: 2.2em;
  32 +}
  33 +/* button elements seem to need a little more width */
  34 +button.ui-button-icon-only {
  35 + width: 2.4em;
  36 +}
  37 +.ui-button-icons-only {
  38 + width: 3.4em;
  39 +}
  40 +button.ui-button-icons-only {
  41 + width: 3.7em;
  42 +}
  43 +
  44 +/* button text element */
  45 +.ui-button .ui-button-text {
  46 + display: block;
  47 + line-height: normal;
  48 +}
  49 +.ui-button-text-only .ui-button-text {
  50 + padding: .4em 1em;
  51 +}
  52 +.ui-button-icon-only .ui-button-text,
  53 +.ui-button-icons-only .ui-button-text {
  54 + padding: .4em;
  55 + text-indent: -9999999px;
  56 +}
  57 +.ui-button-text-icon-primary .ui-button-text,
  58 +.ui-button-text-icons .ui-button-text {
  59 + padding: .4em 1em .4em 2.1em;
  60 +}
  61 +.ui-button-text-icon-secondary .ui-button-text,
  62 +.ui-button-text-icons .ui-button-text {
  63 + padding: .4em 2.1em .4em 1em;
  64 +}
  65 +.ui-button-text-icons .ui-button-text {
  66 + padding-left: 2.1em;
  67 + padding-right: 2.1em;
  68 +}
  69 +/* no icon support for input elements, provide padding by default */
  70 +input.ui-button {
  71 + padding: .4em 1em;
  72 +}
  73 +
  74 +/* button icon element(s) */
  75 +.ui-button-icon-only .ui-icon,
  76 +.ui-button-text-icon-primary .ui-icon,
  77 +.ui-button-text-icon-secondary .ui-icon,
  78 +.ui-button-text-icons .ui-icon,
  79 +.ui-button-icons-only .ui-icon {
  80 + position: absolute;
  81 + top: 50%;
  82 + margin-top: -8px;
  83 +}
  84 +.ui-button-icon-only .ui-icon {
  85 + left: 50%;
  86 + margin-left: -8px;
  87 +}
  88 +.ui-button-text-icon-primary .ui-button-icon-primary,
  89 +.ui-button-text-icons .ui-button-icon-primary,
  90 +.ui-button-icons-only .ui-button-icon-primary {
  91 + left: .5em;
  92 +}
  93 +.ui-button-text-icon-secondary .ui-button-icon-secondary,
  94 +.ui-button-text-icons .ui-button-icon-secondary,
  95 +.ui-button-icons-only .ui-button-icon-secondary {
  96 + right: .5em;
  97 +}
  98 +
  99 +/* button sets */
  100 +.ui-buttonset {
  101 + margin-right: 7px;
  102 +}
  103 +.ui-buttonset .ui-button {
  104 + margin-left: 0;
  105 + margin-right: -.3em;
  106 +}
  107 +
  108 +/* workarounds */
  109 +/* reset extra padding in Firefox, see h5bp.com/l */
  110 +input.ui-button::-moz-focus-inner,
  111 +button.ui-button::-moz-focus-inner {
  112 + border: 0;
  113 + padding: 0;
  114 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/core.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + */
  11 +
  12 +/* Layout helpers
  13 +----------------------------------*/
  14 +.ui-helper-hidden {
  15 + display: none;
  16 +}
  17 +.ui-helper-hidden-accessible {
  18 + border: 0;
  19 + clip: rect(0 0 0 0);
  20 + height: 1px;
  21 + margin: -1px;
  22 + overflow: hidden;
  23 + padding: 0;
  24 + position: absolute;
  25 + width: 1px;
  26 +}
  27 +.ui-helper-reset {
  28 + margin: 0;
  29 + padding: 0;
  30 + border: 0;
  31 + outline: 0;
  32 + line-height: 1.3;
  33 + text-decoration: none;
  34 + font-size: 100%;
  35 + list-style: none;
  36 +}
  37 +.ui-helper-clearfix:before,
  38 +.ui-helper-clearfix:after {
  39 + content: "";
  40 + display: table;
  41 + border-collapse: collapse;
  42 +}
  43 +.ui-helper-clearfix:after {
  44 + clear: both;
  45 +}
  46 +.ui-helper-clearfix {
  47 + min-height: 0; /* support: IE7 */
  48 +}
  49 +.ui-helper-zfix {
  50 + width: 100%;
  51 + height: 100%;
  52 + top: 0;
  53 + left: 0;
  54 + position: absolute;
  55 + opacity: 0;
  56 + filter:Alpha(Opacity=0); /* support: IE8 */
  57 +}
  58 +
  59 +.ui-front {
  60 + z-index: 100;
  61 +}
  62 +
  63 +
  64 +/* Interaction Cues
  65 +----------------------------------*/
  66 +.ui-state-disabled {
  67 + cursor: default !important;
  68 +}
  69 +
  70 +
  71 +/* Icons
  72 +----------------------------------*/
  73 +
  74 +/* states and images */
  75 +.ui-icon {
  76 + display: block;
  77 + text-indent: -99999px;
  78 + overflow: hidden;
  79 + background-repeat: no-repeat;
  80 +}
  81 +
  82 +
  83 +/* Misc visuals
  84 +----------------------------------*/
  85 +
  86 +/* Overlays */
  87 +.ui-widget-overlay {
  88 + position: fixed;
  89 + top: 0;
  90 + left: 0;
  91 + width: 100%;
  92 + height: 100%;
  93 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/datepicker.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Datepicker 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/datepicker/#theming
  10 + */
  11 +.ui-datepicker {
  12 + width: 17em;
  13 + padding: .2em .2em 0;
  14 + display: none;
  15 +}
  16 +.ui-datepicker .ui-datepicker-header {
  17 + position: relative;
  18 + padding: .2em 0;
  19 +}
  20 +.ui-datepicker .ui-datepicker-prev,
  21 +.ui-datepicker .ui-datepicker-next {
  22 + position: absolute;
  23 + top: 2px;
  24 + width: 1.8em;
  25 + height: 1.8em;
  26 +}
  27 +.ui-datepicker .ui-datepicker-prev-hover,
  28 +.ui-datepicker .ui-datepicker-next-hover {
  29 + top: 1px;
  30 +}
  31 +.ui-datepicker .ui-datepicker-prev {
  32 + left: 2px;
  33 +}
  34 +.ui-datepicker .ui-datepicker-next {
  35 + right: 2px;
  36 +}
  37 +.ui-datepicker .ui-datepicker-prev-hover {
  38 + left: 1px;
  39 +}
  40 +.ui-datepicker .ui-datepicker-next-hover {
  41 + right: 1px;
  42 +}
  43 +.ui-datepicker .ui-datepicker-prev span,
  44 +.ui-datepicker .ui-datepicker-next span {
  45 + display: block;
  46 + position: absolute;
  47 + left: 50%;
  48 + margin-left: -8px;
  49 + top: 50%;
  50 + margin-top: -8px;
  51 +}
  52 +.ui-datepicker .ui-datepicker-title {
  53 + margin: 0 2.3em;
  54 + line-height: 1.8em;
  55 + text-align: center;
  56 +}
  57 +.ui-datepicker .ui-datepicker-title select {
  58 + font-size: 1em;
  59 + margin: 1px 0;
  60 +}
  61 +.ui-datepicker select.ui-datepicker-month,
  62 +.ui-datepicker select.ui-datepicker-year {
  63 + width: 45%;
  64 +}
  65 +.ui-datepicker table {
  66 + width: 100%;
  67 + font-size: .9em;
  68 + border-collapse: collapse;
  69 + margin: 0 0 .4em;
  70 +}
  71 +.ui-datepicker th {
  72 + padding: .7em .3em;
  73 + text-align: center;
  74 + font-weight: bold;
  75 + border: 0;
  76 +}
  77 +.ui-datepicker td {
  78 + border: 0;
  79 + padding: 1px;
  80 +}
  81 +.ui-datepicker td span,
  82 +.ui-datepicker td a {
  83 + display: block;
  84 + padding: .2em;
  85 + text-align: right;
  86 + text-decoration: none;
  87 +}
  88 +.ui-datepicker .ui-datepicker-buttonpane {
  89 + background-image: none;
  90 + margin: .7em 0 0 0;
  91 + padding: 0 .2em;
  92 + border-left: 0;
  93 + border-right: 0;
  94 + border-bottom: 0;
  95 +}
  96 +.ui-datepicker .ui-datepicker-buttonpane button {
  97 + float: right;
  98 + margin: .5em .2em .4em;
  99 + cursor: pointer;
  100 + padding: .2em .6em .3em .6em;
  101 + width: auto;
  102 + overflow: visible;
  103 +}
  104 +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current {
  105 + float: left;
  106 +}
  107 +
  108 +/* with multiple calendars */
  109 +.ui-datepicker.ui-datepicker-multi {
  110 + width: auto;
  111 +}
  112 +.ui-datepicker-multi .ui-datepicker-group {
  113 + float: left;
  114 +}
  115 +.ui-datepicker-multi .ui-datepicker-group table {
  116 + width: 95%;
  117 + margin: 0 auto .4em;
  118 +}
  119 +.ui-datepicker-multi-2 .ui-datepicker-group {
  120 + width: 50%;
  121 +}
  122 +.ui-datepicker-multi-3 .ui-datepicker-group {
  123 + width: 33.3%;
  124 +}
  125 +.ui-datepicker-multi-4 .ui-datepicker-group {
  126 + width: 25%;
  127 +}
  128 +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,
  129 +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header {
  130 + border-left-width: 0;
  131 +}
  132 +.ui-datepicker-multi .ui-datepicker-buttonpane {
  133 + clear: left;
  134 +}
  135 +.ui-datepicker-row-break {
  136 + clear: both;
  137 + width: 100%;
  138 + font-size: 0;
  139 +}
  140 +
  141 +/* RTL support */
  142 +.ui-datepicker-rtl {
  143 + direction: rtl;
  144 +}
  145 +.ui-datepicker-rtl .ui-datepicker-prev {
  146 + right: 2px;
  147 + left: auto;
  148 +}
  149 +.ui-datepicker-rtl .ui-datepicker-next {
  150 + left: 2px;
  151 + right: auto;
  152 +}
  153 +.ui-datepicker-rtl .ui-datepicker-prev:hover {
  154 + right: 1px;
  155 + left: auto;
  156 +}
  157 +.ui-datepicker-rtl .ui-datepicker-next:hover {
  158 + left: 1px;
  159 + right: auto;
  160 +}
  161 +.ui-datepicker-rtl .ui-datepicker-buttonpane {
  162 + clear: right;
  163 +}
  164 +.ui-datepicker-rtl .ui-datepicker-buttonpane button {
  165 + float: left;
  166 +}
  167 +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,
  168 +.ui-datepicker-rtl .ui-datepicker-group {
  169 + float: right;
  170 +}
  171 +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,
  172 +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header {
  173 + border-right-width: 0;
  174 + border-left-width: 1px;
  175 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/dialog.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Dialog 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/dialog/#theming
  10 + */
  11 +.ui-dialog {
  12 + overflow: hidden;
  13 + position: absolute;
  14 + top: 0;
  15 + left: 0;
  16 + padding: .2em;
  17 + outline: 0;
  18 +}
  19 +.ui-dialog .ui-dialog-titlebar {
  20 + padding: .4em 1em;
  21 + position: relative;
  22 +}
  23 +.ui-dialog .ui-dialog-title {
  24 + float: left;
  25 + margin: .1em 0;
  26 + white-space: nowrap;
  27 + width: 90%;
  28 + overflow: hidden;
  29 + text-overflow: ellipsis;
  30 +}
  31 +.ui-dialog .ui-dialog-titlebar-close {
  32 + position: absolute;
  33 + right: .3em;
  34 + top: 50%;
  35 + width: 20px;
  36 + margin: -10px 0 0 0;
  37 + padding: 1px;
  38 + height: 20px;
  39 +}
  40 +.ui-dialog .ui-dialog-content {
  41 + position: relative;
  42 + border: 0;
  43 + padding: .5em 1em;
  44 + background: none;
  45 + overflow: auto;
  46 +}
  47 +.ui-dialog .ui-dialog-buttonpane {
  48 + text-align: left;
  49 + border-width: 1px 0 0 0;
  50 + background-image: none;
  51 + margin-top: .5em;
  52 + padding: .3em 1em .5em .4em;
  53 +}
  54 +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset {
  55 + float: right;
  56 +}
  57 +.ui-dialog .ui-dialog-buttonpane button {
  58 + margin: .5em .4em .5em 0;
  59 + cursor: pointer;
  60 +}
  61 +.ui-dialog .ui-resizable-se {
  62 + width: 12px;
  63 + height: 12px;
  64 + right: -5px;
  65 + bottom: -5px;
  66 + background-position: 16px 16px;
  67 +}
  68 +.ui-draggable .ui-dialog-titlebar {
  69 + cursor: move;
  70 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/draggable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Draggable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-draggable-handle {
  10 + -ms-touch-action: none;
  11 + touch-action: none;
  12 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_flat_0_aaaaaa_40x100.png 0 → 100644

180 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_flat_75_ffffff_40x100.png 0 → 100644

178 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_55_fbf9ee_1x400.png 0 → 100644

120 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_65_ffffff_1x400.png 0 → 100644

105 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_75_dadada_1x400.png 0 → 100644

111 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_75_e6e6e6_1x400.png 0 → 100644

110 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_glass_95_fef1ec_1x400.png 0 → 100644

119 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png 0 → 100644

101 Bytes

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_222222_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_2e83ff_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_454545_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_888888_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/images/ui-icons_cd0a0a_256x240.png 0 → 100644

4.27 KB

src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/menu.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Menu 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/menu/#theming
  10 + */
  11 +.ui-menu {
  12 + list-style: none;
  13 + padding: 0;
  14 + margin: 0;
  15 + display: block;
  16 + outline: none;
  17 +}
  18 +.ui-menu .ui-menu {
  19 + position: absolute;
  20 +}
  21 +.ui-menu .ui-menu-item {
  22 + position: relative;
  23 + margin: 0;
  24 + padding: 3px 1em 3px .4em;
  25 + cursor: pointer;
  26 + min-height: 0; /* support: IE7 */
  27 + /* support: IE10, see #8844 */
  28 + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7");
  29 +}
  30 +.ui-menu .ui-menu-divider {
  31 + margin: 5px 0;
  32 + height: 0;
  33 + font-size: 0;
  34 + line-height: 0;
  35 + border-width: 1px 0 0 0;
  36 +}
  37 +.ui-menu .ui-state-focus,
  38 +.ui-menu .ui-state-active {
  39 + margin: -1px;
  40 +}
  41 +
  42 +/* icon support */
  43 +.ui-menu-icons {
  44 + position: relative;
  45 +}
  46 +.ui-menu-icons .ui-menu-item {
  47 + padding-left: 2em;
  48 +}
  49 +
  50 +/* left-aligned */
  51 +.ui-menu .ui-icon {
  52 + position: absolute;
  53 + top: 0;
  54 + bottom: 0;
  55 + left: .2em;
  56 + margin: auto 0;
  57 +}
  58 +
  59 +/* right-aligned */
  60 +.ui-menu .ui-menu-icon {
  61 + left: auto;
  62 + right: 0;
  63 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/progressbar.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Progressbar 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/progressbar/#theming
  10 + */
  11 +.ui-progressbar {
  12 + height: 2em;
  13 + text-align: left;
  14 + overflow: hidden;
  15 +}
  16 +.ui-progressbar .ui-progressbar-value {
  17 + margin: -1px;
  18 + height: 100%;
  19 +}
  20 +.ui-progressbar .ui-progressbar-overlay {
  21 + background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw==");
  22 + height: 100%;
  23 + filter: alpha(opacity=25); /* support: IE8 */
  24 + opacity: 0.25;
  25 +}
  26 +.ui-progressbar-indeterminate .ui-progressbar-value {
  27 + background-image: none;
  28 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/resizable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Resizable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-resizable {
  10 + position: relative;
  11 +}
  12 +.ui-resizable-handle {
  13 + position: absolute;
  14 + font-size: 0.1px;
  15 + display: block;
  16 + -ms-touch-action: none;
  17 + touch-action: none;
  18 +}
  19 +.ui-resizable-disabled .ui-resizable-handle,
  20 +.ui-resizable-autohide .ui-resizable-handle {
  21 + display: none;
  22 +}
  23 +.ui-resizable-n {
  24 + cursor: n-resize;
  25 + height: 7px;
  26 + width: 100%;
  27 + top: -5px;
  28 + left: 0;
  29 +}
  30 +.ui-resizable-s {
  31 + cursor: s-resize;
  32 + height: 7px;
  33 + width: 100%;
  34 + bottom: -5px;
  35 + left: 0;
  36 +}
  37 +.ui-resizable-e {
  38 + cursor: e-resize;
  39 + width: 7px;
  40 + right: -5px;
  41 + top: 0;
  42 + height: 100%;
  43 +}
  44 +.ui-resizable-w {
  45 + cursor: w-resize;
  46 + width: 7px;
  47 + left: -5px;
  48 + top: 0;
  49 + height: 100%;
  50 +}
  51 +.ui-resizable-se {
  52 + cursor: se-resize;
  53 + width: 12px;
  54 + height: 12px;
  55 + right: 1px;
  56 + bottom: 1px;
  57 +}
  58 +.ui-resizable-sw {
  59 + cursor: sw-resize;
  60 + width: 9px;
  61 + height: 9px;
  62 + left: -5px;
  63 + bottom: -5px;
  64 +}
  65 +.ui-resizable-nw {
  66 + cursor: nw-resize;
  67 + width: 9px;
  68 + height: 9px;
  69 + left: -5px;
  70 + top: -5px;
  71 +}
  72 +.ui-resizable-ne {
  73 + cursor: ne-resize;
  74 + width: 9px;
  75 + height: 9px;
  76 + right: -5px;
  77 + top: -5px;
  78 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/selectable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Selectable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-selectable {
  10 + -ms-touch-action: none;
  11 + touch-action: none;
  12 +}
  13 +.ui-selectable-helper {
  14 + position: absolute;
  15 + z-index: 100;
  16 + border: 1px dotted black;
  17 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/selectmenu.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Selectmenu 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/selectmenu/#theming
  10 + */
  11 +.ui-selectmenu-menu {
  12 + padding: 0;
  13 + margin: 0;
  14 + position: absolute;
  15 + top: 0;
  16 + left: 0;
  17 + display: none;
  18 +}
  19 +.ui-selectmenu-menu .ui-menu {
  20 + overflow: auto;
  21 + /* Support: IE7 */
  22 + overflow-x: hidden;
  23 + padding-bottom: 1px;
  24 +}
  25 +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup {
  26 + font-size: 1em;
  27 + font-weight: bold;
  28 + line-height: 1.5;
  29 + padding: 2px 0.4em;
  30 + margin: 0.5em 0 0 0;
  31 + height: auto;
  32 + border: 0;
  33 +}
  34 +.ui-selectmenu-open {
  35 + display: block;
  36 +}
  37 +.ui-selectmenu-button {
  38 + display: inline-block;
  39 + overflow: hidden;
  40 + position: relative;
  41 + text-decoration: none;
  42 + cursor: pointer;
  43 +}
  44 +.ui-selectmenu-button span.ui-icon {
  45 + right: 0.5em;
  46 + left: auto;
  47 + margin-top: -8px;
  48 + position: absolute;
  49 + top: 50%;
  50 +}
  51 +.ui-selectmenu-button span.ui-selectmenu-text {
  52 + text-align: left;
  53 + padding: 0.4em 2.1em 0.4em 1em;
  54 + display: block;
  55 + line-height: 1.4;
  56 + overflow: hidden;
  57 + text-overflow: ellipsis;
  58 + white-space: nowrap;
  59 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/slider.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Slider 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/slider/#theming
  10 + */
  11 +.ui-slider {
  12 + position: relative;
  13 + text-align: left;
  14 +}
  15 +.ui-slider .ui-slider-handle {
  16 + position: absolute;
  17 + z-index: 2;
  18 + width: 1.2em;
  19 + height: 1.2em;
  20 + cursor: default;
  21 + -ms-touch-action: none;
  22 + touch-action: none;
  23 +}
  24 +.ui-slider .ui-slider-range {
  25 + position: absolute;
  26 + z-index: 1;
  27 + font-size: .7em;
  28 + display: block;
  29 + border: 0;
  30 + background-position: 0 0;
  31 +}
  32 +
  33 +/* support: IE8 - See #6727 */
  34 +.ui-slider.ui-state-disabled .ui-slider-handle,
  35 +.ui-slider.ui-state-disabled .ui-slider-range {
  36 + filter: inherit;
  37 +}
  38 +
  39 +.ui-slider-horizontal {
  40 + height: .8em;
  41 +}
  42 +.ui-slider-horizontal .ui-slider-handle {
  43 + top: -.3em;
  44 + margin-left: -.6em;
  45 +}
  46 +.ui-slider-horizontal .ui-slider-range {
  47 + top: 0;
  48 + height: 100%;
  49 +}
  50 +.ui-slider-horizontal .ui-slider-range-min {
  51 + left: 0;
  52 +}
  53 +.ui-slider-horizontal .ui-slider-range-max {
  54 + right: 0;
  55 +}
  56 +
  57 +.ui-slider-vertical {
  58 + width: .8em;
  59 + height: 100px;
  60 +}
  61 +.ui-slider-vertical .ui-slider-handle {
  62 + left: -.3em;
  63 + margin-left: 0;
  64 + margin-bottom: -.6em;
  65 +}
  66 +.ui-slider-vertical .ui-slider-range {
  67 + left: 0;
  68 + width: 100%;
  69 +}
  70 +.ui-slider-vertical .ui-slider-range-min {
  71 + bottom: 0;
  72 +}
  73 +.ui-slider-vertical .ui-slider-range-max {
  74 + top: 0;
  75 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/sortable.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Sortable 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + */
  9 +.ui-sortable-handle {
  10 + -ms-touch-action: none;
  11 + touch-action: none;
  12 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/spinner.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Spinner 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/spinner/#theming
  10 + */
  11 +.ui-spinner {
  12 + position: relative;
  13 + display: inline-block;
  14 + overflow: hidden;
  15 + padding: 0;
  16 + vertical-align: middle;
  17 +}
  18 +.ui-spinner-input {
  19 + border: none;
  20 + background: none;
  21 + color: inherit;
  22 + padding: 0;
  23 + margin: .2em 0;
  24 + vertical-align: middle;
  25 + margin-left: .4em;
  26 + margin-right: 22px;
  27 +}
  28 +.ui-spinner-button {
  29 + width: 16px;
  30 + height: 50%;
  31 + font-size: .5em;
  32 + padding: 0;
  33 + margin: 0;
  34 + text-align: center;
  35 + position: absolute;
  36 + cursor: default;
  37 + display: block;
  38 + overflow: hidden;
  39 + right: 0;
  40 +}
  41 +/* more specificity required here to override default borders */
  42 +.ui-spinner a.ui-spinner-button {
  43 + border-top: none;
  44 + border-bottom: none;
  45 + border-right: none;
  46 +}
  47 +/* vertically center icon */
  48 +.ui-spinner .ui-icon {
  49 + position: absolute;
  50 + margin-top: -8px;
  51 + top: 50%;
  52 + left: 0;
  53 +}
  54 +.ui-spinner-up {
  55 + top: 0;
  56 +}
  57 +.ui-spinner-down {
  58 + bottom: 0;
  59 +}
  60 +
  61 +/* TR overrides */
  62 +.ui-spinner .ui-icon-triangle-1-s {
  63 + /* need to fix icons sprite */
  64 + background-position: -65px -16px;
  65 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/tabs.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Tabs 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/tabs/#theming
  10 + */
  11 +.ui-tabs {
  12 + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
  13 + padding: .2em;
  14 +}
  15 +.ui-tabs .ui-tabs-nav {
  16 + margin: 0;
  17 + padding: .2em .2em 0;
  18 +}
  19 +.ui-tabs .ui-tabs-nav li {
  20 + list-style: none;
  21 + float: left;
  22 + position: relative;
  23 + top: 0;
  24 + margin: 1px .2em 0 0;
  25 + border-bottom-width: 0;
  26 + padding: 0;
  27 + white-space: nowrap;
  28 +}
  29 +.ui-tabs .ui-tabs-nav .ui-tabs-anchor {
  30 + float: left;
  31 + padding: .5em 1em;
  32 + text-decoration: none;
  33 +}
  34 +.ui-tabs .ui-tabs-nav li.ui-tabs-active {
  35 + margin-bottom: -1px;
  36 + padding-bottom: 1px;
  37 +}
  38 +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,
  39 +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,
  40 +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor {
  41 + cursor: text;
  42 +}
  43 +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor {
  44 + cursor: pointer;
  45 +}
  46 +.ui-tabs .ui-tabs-panel {
  47 + display: block;
  48 + border-width: 0;
  49 + padding: 1em 1.4em;
  50 + background: none;
  51 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/theme.css 0 → 100644
  1 +/*!
  2 + * jQuery UI CSS Framework 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/category/theming/
  10 + *
  11 + * To view and modify this theme, visit http://jqueryui.com/themeroller/
  12 + */
  13 +
  14 +
  15 +/* Component containers
  16 +----------------------------------*/
  17 +.ui-widget {
  18 + font-family: Verdana,Arial,sans-serif/*{ffDefault}*/;
  19 + font-size: 1.1em/*{fsDefault}*/;
  20 +}
  21 +.ui-widget .ui-widget {
  22 + font-size: 1em;
  23 +}
  24 +.ui-widget input,
  25 +.ui-widget select,
  26 +.ui-widget textarea,
  27 +.ui-widget button {
  28 + font-family: Verdana,Arial,sans-serif/*{ffDefault}*/;
  29 + font-size: 1em;
  30 +}
  31 +.ui-widget-content {
  32 + border: 1px solid #aaaaaa/*{borderColorContent}*/;
  33 + background: #ffffff/*{bgColorContent}*/ url("images/ui-bg_flat_75_ffffff_40x100.png")/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;
  34 + color: #222222/*{fcContent}*/;
  35 +}
  36 +.ui-widget-content a {
  37 + color: #222222/*{fcContent}*/;
  38 +}
  39 +.ui-widget-header {
  40 + border: 1px solid #aaaaaa/*{borderColorHeader}*/;
  41 + background: #cccccc/*{bgColorHeader}*/ url("images/ui-bg_highlight-soft_75_cccccc_1x100.png")/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;
  42 + color: #222222/*{fcHeader}*/;
  43 + font-weight: bold;
  44 +}
  45 +.ui-widget-header a {
  46 + color: #222222/*{fcHeader}*/;
  47 +}
  48 +
  49 +/* Interaction states
  50 +----------------------------------*/
  51 +.ui-state-default,
  52 +.ui-widget-content .ui-state-default,
  53 +.ui-widget-header .ui-state-default {
  54 + border: 1px solid #d3d3d3/*{borderColorDefault}*/;
  55 + background: #e6e6e6/*{bgColorDefault}*/ url("images/ui-bg_glass_75_e6e6e6_1x400.png")/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;
  56 + font-weight: normal/*{fwDefault}*/;
  57 + color: #555555/*{fcDefault}*/;
  58 +}
  59 +.ui-state-default a,
  60 +.ui-state-default a:link,
  61 +.ui-state-default a:visited {
  62 + color: #555555/*{fcDefault}*/;
  63 + text-decoration: none;
  64 +}
  65 +.ui-state-hover,
  66 +.ui-widget-content .ui-state-hover,
  67 +.ui-widget-header .ui-state-hover,
  68 +.ui-state-focus,
  69 +.ui-widget-content .ui-state-focus,
  70 +.ui-widget-header .ui-state-focus {
  71 + border: 1px solid #999999/*{borderColorHover}*/;
  72 + background: #dadada/*{bgColorHover}*/ url("images/ui-bg_glass_75_dadada_1x400.png")/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;
  73 + font-weight: normal/*{fwDefault}*/;
  74 + color: #212121/*{fcHover}*/;
  75 +}
  76 +.ui-state-hover a,
  77 +.ui-state-hover a:hover,
  78 +.ui-state-hover a:link,
  79 +.ui-state-hover a:visited,
  80 +.ui-state-focus a,
  81 +.ui-state-focus a:hover,
  82 +.ui-state-focus a:link,
  83 +.ui-state-focus a:visited {
  84 + color: #212121/*{fcHover}*/;
  85 + text-decoration: none;
  86 +}
  87 +.ui-state-active,
  88 +.ui-widget-content .ui-state-active,
  89 +.ui-widget-header .ui-state-active {
  90 + border: 1px solid #aaaaaa/*{borderColorActive}*/;
  91 + background: #ffffff/*{bgColorActive}*/ url("images/ui-bg_glass_65_ffffff_1x400.png")/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;
  92 + font-weight: normal/*{fwDefault}*/;
  93 + color: #212121/*{fcActive}*/;
  94 +}
  95 +.ui-state-active a,
  96 +.ui-state-active a:link,
  97 +.ui-state-active a:visited {
  98 + color: #212121/*{fcActive}*/;
  99 + text-decoration: none;
  100 +}
  101 +
  102 +/* Interaction Cues
  103 +----------------------------------*/
  104 +.ui-state-highlight,
  105 +.ui-widget-content .ui-state-highlight,
  106 +.ui-widget-header .ui-state-highlight {
  107 + border: 1px solid #fcefa1/*{borderColorHighlight}*/;
  108 + background: #fbf9ee/*{bgColorHighlight}*/ url("images/ui-bg_glass_55_fbf9ee_1x400.png")/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;
  109 + color: #363636/*{fcHighlight}*/;
  110 +}
  111 +.ui-state-highlight a,
  112 +.ui-widget-content .ui-state-highlight a,
  113 +.ui-widget-header .ui-state-highlight a {
  114 + color: #363636/*{fcHighlight}*/;
  115 +}
  116 +.ui-state-error,
  117 +.ui-widget-content .ui-state-error,
  118 +.ui-widget-header .ui-state-error {
  119 + border: 1px solid #cd0a0a/*{borderColorError}*/;
  120 + background: #fef1ec/*{bgColorError}*/ url("images/ui-bg_glass_95_fef1ec_1x400.png")/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;
  121 + color: #cd0a0a/*{fcError}*/;
  122 +}
  123 +.ui-state-error a,
  124 +.ui-widget-content .ui-state-error a,
  125 +.ui-widget-header .ui-state-error a {
  126 + color: #cd0a0a/*{fcError}*/;
  127 +}
  128 +.ui-state-error-text,
  129 +.ui-widget-content .ui-state-error-text,
  130 +.ui-widget-header .ui-state-error-text {
  131 + color: #cd0a0a/*{fcError}*/;
  132 +}
  133 +.ui-priority-primary,
  134 +.ui-widget-content .ui-priority-primary,
  135 +.ui-widget-header .ui-priority-primary {
  136 + font-weight: bold;
  137 +}
  138 +.ui-priority-secondary,
  139 +.ui-widget-content .ui-priority-secondary,
  140 +.ui-widget-header .ui-priority-secondary {
  141 + opacity: .7;
  142 + filter:Alpha(Opacity=70); /* support: IE8 */
  143 + font-weight: normal;
  144 +}
  145 +.ui-state-disabled,
  146 +.ui-widget-content .ui-state-disabled,
  147 +.ui-widget-header .ui-state-disabled {
  148 + opacity: .35;
  149 + filter:Alpha(Opacity=35); /* support: IE8 */
  150 + background-image: none;
  151 +}
  152 +.ui-state-disabled .ui-icon {
  153 + filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */
  154 +}
  155 +
  156 +/* Icons
  157 +----------------------------------*/
  158 +
  159 +/* states and images */
  160 +.ui-icon {
  161 + width: 16px;
  162 + height: 16px;
  163 +}
  164 +.ui-icon,
  165 +.ui-widget-content .ui-icon {
  166 + background-image: url("images/ui-icons_222222_256x240.png")/*{iconsContent}*/;
  167 +}
  168 +.ui-widget-header .ui-icon {
  169 + background-image: url("images/ui-icons_222222_256x240.png")/*{iconsHeader}*/;
  170 +}
  171 +.ui-state-default .ui-icon {
  172 + background-image: url("images/ui-icons_888888_256x240.png")/*{iconsDefault}*/;
  173 +}
  174 +.ui-state-hover .ui-icon,
  175 +.ui-state-focus .ui-icon {
  176 + background-image: url("images/ui-icons_454545_256x240.png")/*{iconsHover}*/;
  177 +}
  178 +.ui-state-active .ui-icon {
  179 + background-image: url("images/ui-icons_454545_256x240.png")/*{iconsActive}*/;
  180 +}
  181 +.ui-state-highlight .ui-icon {
  182 + background-image: url("images/ui-icons_2e83ff_256x240.png")/*{iconsHighlight}*/;
  183 +}
  184 +.ui-state-error .ui-icon,
  185 +.ui-state-error-text .ui-icon {
  186 + background-image: url("images/ui-icons_cd0a0a_256x240.png")/*{iconsError}*/;
  187 +}
  188 +
  189 +/* positioning */
  190 +.ui-icon-blank { background-position: 16px 16px; }
  191 +.ui-icon-carat-1-n { background-position: 0 0; }
  192 +.ui-icon-carat-1-ne { background-position: -16px 0; }
  193 +.ui-icon-carat-1-e { background-position: -32px 0; }
  194 +.ui-icon-carat-1-se { background-position: -48px 0; }
  195 +.ui-icon-carat-1-s { background-position: -64px 0; }
  196 +.ui-icon-carat-1-sw { background-position: -80px 0; }
  197 +.ui-icon-carat-1-w { background-position: -96px 0; }
  198 +.ui-icon-carat-1-nw { background-position: -112px 0; }
  199 +.ui-icon-carat-2-n-s { background-position: -128px 0; }
  200 +.ui-icon-carat-2-e-w { background-position: -144px 0; }
  201 +.ui-icon-triangle-1-n { background-position: 0 -16px; }
  202 +.ui-icon-triangle-1-ne { background-position: -16px -16px; }
  203 +.ui-icon-triangle-1-e { background-position: -32px -16px; }
  204 +.ui-icon-triangle-1-se { background-position: -48px -16px; }
  205 +.ui-icon-triangle-1-s { background-position: -64px -16px; }
  206 +.ui-icon-triangle-1-sw { background-position: -80px -16px; }
  207 +.ui-icon-triangle-1-w { background-position: -96px -16px; }
  208 +.ui-icon-triangle-1-nw { background-position: -112px -16px; }
  209 +.ui-icon-triangle-2-n-s { background-position: -128px -16px; }
  210 +.ui-icon-triangle-2-e-w { background-position: -144px -16px; }
  211 +.ui-icon-arrow-1-n { background-position: 0 -32px; }
  212 +.ui-icon-arrow-1-ne { background-position: -16px -32px; }
  213 +.ui-icon-arrow-1-e { background-position: -32px -32px; }
  214 +.ui-icon-arrow-1-se { background-position: -48px -32px; }
  215 +.ui-icon-arrow-1-s { background-position: -64px -32px; }
  216 +.ui-icon-arrow-1-sw { background-position: -80px -32px; }
  217 +.ui-icon-arrow-1-w { background-position: -96px -32px; }
  218 +.ui-icon-arrow-1-nw { background-position: -112px -32px; }
  219 +.ui-icon-arrow-2-n-s { background-position: -128px -32px; }
  220 +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
  221 +.ui-icon-arrow-2-e-w { background-position: -160px -32px; }
  222 +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
  223 +.ui-icon-arrowstop-1-n { background-position: -192px -32px; }
  224 +.ui-icon-arrowstop-1-e { background-position: -208px -32px; }
  225 +.ui-icon-arrowstop-1-s { background-position: -224px -32px; }
  226 +.ui-icon-arrowstop-1-w { background-position: -240px -32px; }
  227 +.ui-icon-arrowthick-1-n { background-position: 0 -48px; }
  228 +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
  229 +.ui-icon-arrowthick-1-e { background-position: -32px -48px; }
  230 +.ui-icon-arrowthick-1-se { background-position: -48px -48px; }
  231 +.ui-icon-arrowthick-1-s { background-position: -64px -48px; }
  232 +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
  233 +.ui-icon-arrowthick-1-w { background-position: -96px -48px; }
  234 +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
  235 +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
  236 +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
  237 +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
  238 +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
  239 +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
  240 +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
  241 +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
  242 +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
  243 +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
  244 +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
  245 +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
  246 +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
  247 +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
  248 +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
  249 +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
  250 +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
  251 +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
  252 +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
  253 +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
  254 +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
  255 +.ui-icon-arrow-4 { background-position: 0 -80px; }
  256 +.ui-icon-arrow-4-diag { background-position: -16px -80px; }
  257 +.ui-icon-extlink { background-position: -32px -80px; }
  258 +.ui-icon-newwin { background-position: -48px -80px; }
  259 +.ui-icon-refresh { background-position: -64px -80px; }
  260 +.ui-icon-shuffle { background-position: -80px -80px; }
  261 +.ui-icon-transfer-e-w { background-position: -96px -80px; }
  262 +.ui-icon-transferthick-e-w { background-position: -112px -80px; }
  263 +.ui-icon-folder-collapsed { background-position: 0 -96px; }
  264 +.ui-icon-folder-open { background-position: -16px -96px; }
  265 +.ui-icon-document { background-position: -32px -96px; }
  266 +.ui-icon-document-b { background-position: -48px -96px; }
  267 +.ui-icon-note { background-position: -64px -96px; }
  268 +.ui-icon-mail-closed { background-position: -80px -96px; }
  269 +.ui-icon-mail-open { background-position: -96px -96px; }
  270 +.ui-icon-suitcase { background-position: -112px -96px; }
  271 +.ui-icon-comment { background-position: -128px -96px; }
  272 +.ui-icon-person { background-position: -144px -96px; }
  273 +.ui-icon-print { background-position: -160px -96px; }
  274 +.ui-icon-trash { background-position: -176px -96px; }
  275 +.ui-icon-locked { background-position: -192px -96px; }
  276 +.ui-icon-unlocked { background-position: -208px -96px; }
  277 +.ui-icon-bookmark { background-position: -224px -96px; }
  278 +.ui-icon-tag { background-position: -240px -96px; }
  279 +.ui-icon-home { background-position: 0 -112px; }
  280 +.ui-icon-flag { background-position: -16px -112px; }
  281 +.ui-icon-calendar { background-position: -32px -112px; }
  282 +.ui-icon-cart { background-position: -48px -112px; }
  283 +.ui-icon-pencil { background-position: -64px -112px; }
  284 +.ui-icon-clock { background-position: -80px -112px; }
  285 +.ui-icon-disk { background-position: -96px -112px; }
  286 +.ui-icon-calculator { background-position: -112px -112px; }
  287 +.ui-icon-zoomin { background-position: -128px -112px; }
  288 +.ui-icon-zoomout { background-position: -144px -112px; }
  289 +.ui-icon-search { background-position: -160px -112px; }
  290 +.ui-icon-wrench { background-position: -176px -112px; }
  291 +.ui-icon-gear { background-position: -192px -112px; }
  292 +.ui-icon-heart { background-position: -208px -112px; }
  293 +.ui-icon-star { background-position: -224px -112px; }
  294 +.ui-icon-link { background-position: -240px -112px; }
  295 +.ui-icon-cancel { background-position: 0 -128px; }
  296 +.ui-icon-plus { background-position: -16px -128px; }
  297 +.ui-icon-plusthick { background-position: -32px -128px; }
  298 +.ui-icon-minus { background-position: -48px -128px; }
  299 +.ui-icon-minusthick { background-position: -64px -128px; }
  300 +.ui-icon-close { background-position: -80px -128px; }
  301 +.ui-icon-closethick { background-position: -96px -128px; }
  302 +.ui-icon-key { background-position: -112px -128px; }
  303 +.ui-icon-lightbulb { background-position: -128px -128px; }
  304 +.ui-icon-scissors { background-position: -144px -128px; }
  305 +.ui-icon-clipboard { background-position: -160px -128px; }
  306 +.ui-icon-copy { background-position: -176px -128px; }
  307 +.ui-icon-contact { background-position: -192px -128px; }
  308 +.ui-icon-image { background-position: -208px -128px; }
  309 +.ui-icon-video { background-position: -224px -128px; }
  310 +.ui-icon-script { background-position: -240px -128px; }
  311 +.ui-icon-alert { background-position: 0 -144px; }
  312 +.ui-icon-info { background-position: -16px -144px; }
  313 +.ui-icon-notice { background-position: -32px -144px; }
  314 +.ui-icon-help { background-position: -48px -144px; }
  315 +.ui-icon-check { background-position: -64px -144px; }
  316 +.ui-icon-bullet { background-position: -80px -144px; }
  317 +.ui-icon-radio-on { background-position: -96px -144px; }
  318 +.ui-icon-radio-off { background-position: -112px -144px; }
  319 +.ui-icon-pin-w { background-position: -128px -144px; }
  320 +.ui-icon-pin-s { background-position: -144px -144px; }
  321 +.ui-icon-play { background-position: 0 -160px; }
  322 +.ui-icon-pause { background-position: -16px -160px; }
  323 +.ui-icon-seek-next { background-position: -32px -160px; }
  324 +.ui-icon-seek-prev { background-position: -48px -160px; }
  325 +.ui-icon-seek-end { background-position: -64px -160px; }
  326 +.ui-icon-seek-start { background-position: -80px -160px; }
  327 +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
  328 +.ui-icon-seek-first { background-position: -80px -160px; }
  329 +.ui-icon-stop { background-position: -96px -160px; }
  330 +.ui-icon-eject { background-position: -112px -160px; }
  331 +.ui-icon-volume-off { background-position: -128px -160px; }
  332 +.ui-icon-volume-on { background-position: -144px -160px; }
  333 +.ui-icon-power { background-position: 0 -176px; }
  334 +.ui-icon-signal-diag { background-position: -16px -176px; }
  335 +.ui-icon-signal { background-position: -32px -176px; }
  336 +.ui-icon-battery-0 { background-position: -48px -176px; }
  337 +.ui-icon-battery-1 { background-position: -64px -176px; }
  338 +.ui-icon-battery-2 { background-position: -80px -176px; }
  339 +.ui-icon-battery-3 { background-position: -96px -176px; }
  340 +.ui-icon-circle-plus { background-position: 0 -192px; }
  341 +.ui-icon-circle-minus { background-position: -16px -192px; }
  342 +.ui-icon-circle-close { background-position: -32px -192px; }
  343 +.ui-icon-circle-triangle-e { background-position: -48px -192px; }
  344 +.ui-icon-circle-triangle-s { background-position: -64px -192px; }
  345 +.ui-icon-circle-triangle-w { background-position: -80px -192px; }
  346 +.ui-icon-circle-triangle-n { background-position: -96px -192px; }
  347 +.ui-icon-circle-arrow-e { background-position: -112px -192px; }
  348 +.ui-icon-circle-arrow-s { background-position: -128px -192px; }
  349 +.ui-icon-circle-arrow-w { background-position: -144px -192px; }
  350 +.ui-icon-circle-arrow-n { background-position: -160px -192px; }
  351 +.ui-icon-circle-zoomin { background-position: -176px -192px; }
  352 +.ui-icon-circle-zoomout { background-position: -192px -192px; }
  353 +.ui-icon-circle-check { background-position: -208px -192px; }
  354 +.ui-icon-circlesmall-plus { background-position: 0 -208px; }
  355 +.ui-icon-circlesmall-minus { background-position: -16px -208px; }
  356 +.ui-icon-circlesmall-close { background-position: -32px -208px; }
  357 +.ui-icon-squaresmall-plus { background-position: -48px -208px; }
  358 +.ui-icon-squaresmall-minus { background-position: -64px -208px; }
  359 +.ui-icon-squaresmall-close { background-position: -80px -208px; }
  360 +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
  361 +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
  362 +.ui-icon-grip-solid-vertical { background-position: -32px -224px; }
  363 +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
  364 +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
  365 +.ui-icon-grip-diagonal-se { background-position: -80px -224px; }
  366 +
  367 +
  368 +/* Misc visuals
  369 +----------------------------------*/
  370 +
  371 +/* Corner radius */
  372 +.ui-corner-all,
  373 +.ui-corner-top,
  374 +.ui-corner-left,
  375 +.ui-corner-tl {
  376 + border-top-left-radius: 4px/*{cornerRadius}*/;
  377 +}
  378 +.ui-corner-all,
  379 +.ui-corner-top,
  380 +.ui-corner-right,
  381 +.ui-corner-tr {
  382 + border-top-right-radius: 4px/*{cornerRadius}*/;
  383 +}
  384 +.ui-corner-all,
  385 +.ui-corner-bottom,
  386 +.ui-corner-left,
  387 +.ui-corner-bl {
  388 + border-bottom-left-radius: 4px/*{cornerRadius}*/;
  389 +}
  390 +.ui-corner-all,
  391 +.ui-corner-bottom,
  392 +.ui-corner-right,
  393 +.ui-corner-br {
  394 + border-bottom-right-radius: 4px/*{cornerRadius}*/;
  395 +}
  396 +
  397 +/* Overlays */
  398 +.ui-widget-overlay {
  399 + background: #aaaaaa/*{bgColorOverlay}*/ url("images/ui-bg_flat_0_aaaaaa_40x100.png")/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;
  400 + opacity: .3/*{opacityOverlay}*/;
  401 + filter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/; /* support: IE8 */
  402 +}
  403 +.ui-widget-shadow {
  404 + margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/;
  405 + padding: 8px/*{thicknessShadow}*/;
  406 + background: #aaaaaa/*{bgColorShadow}*/ url("images/ui-bg_flat_0_aaaaaa_40x100.png")/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;
  407 + opacity: .3/*{opacityShadow}*/;
  408 + filter: Alpha(Opacity=30)/*{opacityFilterShadow}*/; /* support: IE8 */
  409 + border-radius: 8px/*{cornerRadiusShadow}*/;
  410 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/themes/base/tooltip.css 0 → 100644
  1 +/*!
  2 + * jQuery UI Tooltip 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/tooltip/#theming
  10 + */
  11 +.ui-tooltip {
  12 + padding: 8px;
  13 + position: absolute;
  14 + z-index: 9999;
  15 + max-width: 300px;
  16 + -webkit-box-shadow: 0 0 5px #aaa;
  17 + box-shadow: 0 0 5px #aaa;
  18 +}
  19 +body .ui-tooltip {
  20 + border-width: 2px;
  21 +}
src/main/resources/static/real_control_v2/assets/plugins/jquery.ui/widget.js 0 → 100644
  1 +/*!
  2 + * jQuery UI Widget 1.11.1
  3 + * http://jqueryui.com
  4 + *
  5 + * Copyright 2014 jQuery Foundation and other contributors
  6 + * Released under the MIT license.
  7 + * http://jquery.org/license
  8 + *
  9 + * http://api.jqueryui.com/jQuery.widget/
  10 + */
  11 +(function( factory ) {
  12 + if ( typeof define === "function" && define.amd ) {
  13 +
  14 + // AMD. Register as an anonymous module.
  15 + define( [ "jquery" ], factory );
  16 + } else {
  17 +
  18 + // Browser globals
  19 + factory( jQuery );
  20 + }
  21 +}(function( $ ) {
  22 +
  23 +var widget_uuid = 0,
  24 + widget_slice = Array.prototype.slice;
  25 +
  26 +$.cleanData = (function( orig ) {
  27 + return function( elems ) {
  28 + var events, elem, i;
  29 + for ( i = 0; (elem = elems[i]) != null; i++ ) {
  30 + try {
  31 +
  32 + // Only trigger remove when necessary to save time
  33 + events = $._data( elem, "events" );
  34 + if ( events && events.remove ) {
  35 + $( elem ).triggerHandler( "remove" );
  36 + }
  37 +
  38 + // http://bugs.jquery.com/ticket/8235
  39 + } catch( e ) {}
  40 + }
  41 + orig( elems );
  42 + };
  43 +})( $.cleanData );
  44 +
  45 +$.widget = function( name, base, prototype ) {
  46 + var fullName, existingConstructor, constructor, basePrototype,
  47 + // proxiedPrototype allows the provided prototype to remain unmodified
  48 + // so that it can be used as a mixin for multiple widgets (#8876)
  49 + proxiedPrototype = {},
  50 + namespace = name.split( "." )[ 0 ];
  51 +
  52 + name = name.split( "." )[ 1 ];
  53 + fullName = namespace + "-" + name;
  54 +
  55 + if ( !prototype ) {
  56 + prototype = base;
  57 + base = $.Widget;
  58 + }
  59 +
  60 + // create selector for plugin
  61 + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
  62 + return !!$.data( elem, fullName );
  63 + };
  64 +
  65 + $[ namespace ] = $[ namespace ] || {};
  66 + existingConstructor = $[ namespace ][ name ];
  67 + constructor = $[ namespace ][ name ] = function( options, element ) {
  68 + // allow instantiation without "new" keyword
  69 + if ( !this._createWidget ) {
  70 + return new constructor( options, element );
  71 + }
  72 +
  73 + // allow instantiation without initializing for simple inheritance
  74 + // must use "new" keyword (the code above always passes args)
  75 + if ( arguments.length ) {
  76 + this._createWidget( options, element );
  77 + }
  78 + };
  79 + // extend with the existing constructor to carry over any static properties
  80 + $.extend( constructor, existingConstructor, {
  81 + version: prototype.version,
  82 + // copy the object used to create the prototype in case we need to
  83 + // redefine the widget later
  84 + _proto: $.extend( {}, prototype ),
  85 + // track widgets that inherit from this widget in case this widget is
  86 + // redefined after a widget inherits from it
  87 + _childConstructors: []
  88 + });
  89 +
  90 + basePrototype = new base();
  91 + // we need to make the options hash a property directly on the new instance
  92 + // otherwise we'll modify the options hash on the prototype that we're
  93 + // inheriting from
  94 + basePrototype.options = $.widget.extend( {}, basePrototype.options );
  95 + $.each( prototype, function( prop, value ) {
  96 + if ( !$.isFunction( value ) ) {
  97 + proxiedPrototype[ prop ] = value;
  98 + return;
  99 + }
  100 + proxiedPrototype[ prop ] = (function() {
  101 + var _super = function() {
  102 + return base.prototype[ prop ].apply( this, arguments );
  103 + },
  104 + _superApply = function( args ) {
  105 + return base.prototype[ prop ].apply( this, args );
  106 + };
  107 + return function() {
  108 + var __super = this._super,
  109 + __superApply = this._superApply,
  110 + returnValue;
  111 +
  112 + this._super = _super;
  113 + this._superApply = _superApply;
  114 +
  115 + returnValue = value.apply( this, arguments );
  116 +
  117 + this._super = __super;
  118 + this._superApply = __superApply;
  119 +
  120 + return returnValue;
  121 + };
  122 + })();
  123 + });
  124 + constructor.prototype = $.widget.extend( basePrototype, {
  125 + // TODO: remove support for widgetEventPrefix
  126 + // always use the name + a colon as the prefix, e.g., draggable:start
  127 + // don't prefix for widgets that aren't DOM-based
  128 + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
  129 + }, proxiedPrototype, {
  130 + constructor: constructor,
  131 + namespace: namespace,
  132 + widgetName: name,
  133 + widgetFullName: fullName
  134 + });
  135 +
  136 + // If this widget is being redefined then we need to find all widgets that
  137 + // are inheriting from it and redefine all of them so that they inherit from
  138 + // the new version of this widget. We're essentially trying to replace one
  139 + // level in the prototype chain.
  140 + if ( existingConstructor ) {
  141 + $.each( existingConstructor._childConstructors, function( i, child ) {
  142 + var childPrototype = child.prototype;
  143 +
  144 + // redefine the child widget using the same prototype that was
  145 + // originally used, but inherit from the new version of the base
  146 + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
  147 + });
  148 + // remove the list of existing child constructors from the old constructor
  149 + // so the old child constructors can be garbage collected
  150 + delete existingConstructor._childConstructors;
  151 + } else {
  152 + base._childConstructors.push( constructor );
  153 + }
  154 +
  155 + $.widget.bridge( name, constructor );
  156 +
  157 + return constructor;
  158 +};
  159 +
  160 +$.widget.extend = function( target ) {
  161 + var input = widget_slice.call( arguments, 1 ),
  162 + inputIndex = 0,
  163 + inputLength = input.length,
  164 + key,
  165 + value;
  166 + for ( ; inputIndex < inputLength; inputIndex++ ) {
  167 + for ( key in input[ inputIndex ] ) {
  168 + value = input[ inputIndex ][ key ];
  169 + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
  170 + // Clone objects
  171 + if ( $.isPlainObject( value ) ) {
  172 + target[ key ] = $.isPlainObject( target[ key ] ) ?
  173 + $.widget.extend( {}, target[ key ], value ) :
  174 + // Don't extend strings, arrays, etc. with objects
  175 + $.widget.extend( {}, value );
  176 + // Copy everything else by reference
  177 + } else {
  178 + target[ key ] = value;
  179 + }
  180 + }
  181 + }
  182 + }
  183 + return target;
  184 +};
  185 +
  186 +$.widget.bridge = function( name, object ) {
  187 + var fullName = object.prototype.widgetFullName || name;
  188 + $.fn[ name ] = function( options ) {
  189 + var isMethodCall = typeof options === "string",
  190 + args = widget_slice.call( arguments, 1 ),
  191 + returnValue = this;
  192 +
  193 + // allow multiple hashes to be passed on init
  194 + options = !isMethodCall && args.length ?
  195 + $.widget.extend.apply( null, [ options ].concat(args) ) :
  196 + options;
  197 +
  198 + if ( isMethodCall ) {
  199 + this.each(function() {
  200 + var methodValue,
  201 + instance = $.data( this, fullName );
  202 + if ( options === "instance" ) {
  203 + returnValue = instance;
  204 + return false;
  205 + }
  206 + if ( !instance ) {
  207 + return $.error( "cannot call methods on " + name + " prior to initialization; " +
  208 + "attempted to call method '" + options + "'" );
  209 + }
  210 + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
  211 + return $.error( "no such method '" + options + "' for " + name + " widget instance" );
  212 + }
  213 + methodValue = instance[ options ].apply( instance, args );
  214 + if ( methodValue !== instance && methodValue !== undefined ) {
  215 + returnValue = methodValue && methodValue.jquery ?
  216 + returnValue.pushStack( methodValue.get() ) :
  217 + methodValue;
  218 + return false;
  219 + }
  220 + });
  221 + } else {
  222 + this.each(function() {
  223 + var instance = $.data( this, fullName );
  224 + if ( instance ) {
  225 + instance.option( options || {} );
  226 + if ( instance._init ) {
  227 + instance._init();
  228 + }
  229 + } else {
  230 + $.data( this, fullName, new object( options, this ) );
  231 + }
  232 + });
  233 + }
  234 +
  235 + return returnValue;
  236 + };
  237 +};
  238 +
  239 +$.Widget = function( /* options, element */ ) {};
  240 +$.Widget._childConstructors = [];
  241 +
  242 +$.Widget.prototype = {
  243 + widgetName: "widget",
  244 + widgetEventPrefix: "",
  245 + defaultElement: "<div>",
  246 + options: {
  247 + disabled: false,
  248 +
  249 + // callbacks
  250 + create: null
  251 + },
  252 + _createWidget: function( options, element ) {
  253 + element = $( element || this.defaultElement || this )[ 0 ];
  254 + this.element = $( element );
  255 + this.uuid = widget_uuid++;
  256 + this.eventNamespace = "." + this.widgetName + this.uuid;
  257 + this.options = $.widget.extend( {},
  258 + this.options,
  259 + this._getCreateOptions(),
  260 + options );
  261 +
  262 + this.bindings = $();
  263 + this.hoverable = $();
  264 + this.focusable = $();
  265 +
  266 + if ( element !== this ) {
  267 + $.data( element, this.widgetFullName, this );
  268 + this._on( true, this.element, {
  269 + remove: function( event ) {
  270 + if ( event.target === element ) {
  271 + this.destroy();
  272 + }
  273 + }
  274 + });
  275 + this.document = $( element.style ?
  276 + // element within the document
  277 + element.ownerDocument :
  278 + // element is window or document
  279 + element.document || element );
  280 + this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
  281 + }
  282 +
  283 + this._create();
  284 + this._trigger( "create", null, this._getCreateEventData() );
  285 + this._init();
  286 + },
  287 + _getCreateOptions: $.noop,
  288 + _getCreateEventData: $.noop,
  289 + _create: $.noop,
  290 + _init: $.noop,
  291 +
  292 + destroy: function() {
  293 + this._destroy();
  294 + // we can probably remove the unbind calls in 2.0
  295 + // all event bindings should go through this._on()
  296 + this.element
  297 + .unbind( this.eventNamespace )
  298 + .removeData( this.widgetFullName )
  299 + // support: jquery <1.6.3
  300 + // http://bugs.jquery.com/ticket/9413
  301 + .removeData( $.camelCase( this.widgetFullName ) );
  302 + this.widget()
  303 + .unbind( this.eventNamespace )
  304 + .removeAttr( "aria-disabled" )
  305 + .removeClass(
  306 + this.widgetFullName + "-disabled " +
  307 + "ui-state-disabled" );
  308 +
  309 + // clean up events and states
  310 + this.bindings.unbind( this.eventNamespace );
  311 + this.hoverable.removeClass( "ui-state-hover" );
  312 + this.focusable.removeClass( "ui-state-focus" );
  313 + },
  314 + _destroy: $.noop,
  315 +
  316 + widget: function() {
  317 + return this.element;
  318 + },
  319 +
  320 + option: function( key, value ) {
  321 + var options = key,
  322 + parts,
  323 + curOption,
  324 + i;
  325 +
  326 + if ( arguments.length === 0 ) {
  327 + // don't return a reference to the internal hash
  328 + return $.widget.extend( {}, this.options );
  329 + }
  330 +
  331 + if ( typeof key === "string" ) {
  332 + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
  333 + options = {};
  334 + parts = key.split( "." );
  335 + key = parts.shift();
  336 + if ( parts.length ) {
  337 + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
  338 + for ( i = 0; i < parts.length - 1; i++ ) {
  339 + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
  340 + curOption = curOption[ parts[ i ] ];
  341 + }
  342 + key = parts.pop();
  343 + if ( arguments.length === 1 ) {
  344 + return curOption[ key ] === undefined ? null : curOption[ key ];
  345 + }
  346 + curOption[ key ] = value;
  347 + } else {
  348 + if ( arguments.length === 1 ) {
  349 + return this.options[ key ] === undefined ? null : this.options[ key ];
  350 + }
  351 + options[ key ] = value;
  352 + }
  353 + }
  354 +
  355 + this._setOptions( options );
  356 +
  357 + return this;
  358 + },
  359 + _setOptions: function( options ) {
  360 + var key;
  361 +
  362 + for ( key in options ) {
  363 + this._setOption( key, options[ key ] );
  364 + }
  365 +
  366 + return this;
  367 + },
  368 + _setOption: function( key, value ) {
  369 + this.options[ key ] = value;
  370 +
  371 + if ( key === "disabled" ) {
  372 + this.widget()
  373 + .toggleClass( this.widgetFullName + "-disabled", !!value );
  374 +
  375 + // If the widget is becoming disabled, then nothing is interactive
  376 + if ( value ) {
  377 + this.hoverable.removeClass( "ui-state-hover" );
  378 + this.focusable.removeClass( "ui-state-focus" );
  379 + }
  380 + }
  381 +
  382 + return this;
  383 + },
  384 +
  385 + enable: function() {
  386 + return this._setOptions({ disabled: false });
  387 + },
  388 + disable: function() {
  389 + return this._setOptions({ disabled: true });
  390 + },
  391 +
  392 + _on: function( suppressDisabledCheck, element, handlers ) {
  393 + var delegateElement,
  394 + instance = this;
  395 +
  396 + // no suppressDisabledCheck flag, shuffle arguments
  397 + if ( typeof suppressDisabledCheck !== "boolean" ) {
  398 + handlers = element;
  399 + element = suppressDisabledCheck;
  400 + suppressDisabledCheck = false;
  401 + }
  402 +
  403 + // no element argument, shuffle and use this.element
  404 + if ( !handlers ) {
  405 + handlers = element;
  406 + element = this.element;
  407 + delegateElement = this.widget();
  408 + } else {
  409 + element = delegateElement = $( element );
  410 + this.bindings = this.bindings.add( element );
  411 + }
  412 +
  413 + $.each( handlers, function( event, handler ) {
  414 + function handlerProxy() {
  415 + // allow widgets to customize the disabled handling
  416 + // - disabled as an array instead of boolean
  417 + // - disabled class as method for disabling individual parts
  418 + if ( !suppressDisabledCheck &&
  419 + ( instance.options.disabled === true ||
  420 + $( this ).hasClass( "ui-state-disabled" ) ) ) {
  421 + return;
  422 + }
  423 + return ( typeof handler === "string" ? instance[ handler ] : handler )
  424 + .apply( instance, arguments );
  425 + }
  426 +
  427 + // copy the guid so direct unbinding works
  428 + if ( typeof handler !== "string" ) {
  429 + handlerProxy.guid = handler.guid =
  430 + handler.guid || handlerProxy.guid || $.guid++;
  431 + }
  432 +
  433 + var match = event.match( /^([\w:-]*)\s*(.*)$/ ),
  434 + eventName = match[1] + instance.eventNamespace,
  435 + selector = match[2];
  436 + if ( selector ) {
  437 + delegateElement.delegate( selector, eventName, handlerProxy );
  438 + } else {
  439 + element.bind( eventName, handlerProxy );
  440 + }
  441 + });
  442 + },
  443 +
  444 + _off: function( element, eventName ) {
  445 + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
  446 + element.unbind( eventName ).undelegate( eventName );
  447 + },
  448 +
  449 + _delay: function( handler, delay ) {
  450 + function handlerProxy() {
  451 + return ( typeof handler === "string" ? instance[ handler ] : handler )
  452 + .apply( instance, arguments );
  453 + }
  454 + var instance = this;
  455 + return setTimeout( handlerProxy, delay || 0 );
  456 + },
  457 +
  458 + _hoverable: function( element ) {
  459 + this.hoverable = this.hoverable.add( element );
  460 + this._on( element, {
  461 + mouseenter: function( event ) {
  462 + $( event.currentTarget ).addClass( "ui-state-hover" );
  463 + },
  464 + mouseleave: function( event ) {
  465 + $( event.currentTarget ).removeClass( "ui-state-hover" );
  466 + }
  467 + });
  468 + },
  469 +
  470 + _focusable: function( element ) {
  471 + this.focusable = this.focusable.add( element );
  472 + this._on( element, {
  473 + focusin: function( event ) {
  474 + $( event.currentTarget ).addClass( "ui-state-focus" );
  475 + },
  476 + focusout: function( event ) {
  477 + $( event.currentTarget ).removeClass( "ui-state-focus" );
  478 + }
  479 + });
  480 + },
  481 +
  482 + _trigger: function( type, event, data ) {
  483 + var prop, orig,
  484 + callback = this.options[ type ];
  485 +
  486 + data = data || {};
  487 + event = $.Event( event );
  488 + event.type = ( type === this.widgetEventPrefix ?
  489 + type :
  490 + this.widgetEventPrefix + type ).toLowerCase();
  491 + // the original event may come from any element
  492 + // so we need to reset the target on the new event
  493 + event.target = this.element[ 0 ];
  494 +
  495 + // copy original event properties over to the new event
  496 + orig = event.originalEvent;
  497 + if ( orig ) {
  498 + for ( prop in orig ) {
  499 + if ( !( prop in event ) ) {
  500 + event[ prop ] = orig[ prop ];
  501 + }
  502 + }
  503 + }
  504 +
  505 + this.element.trigger( event, data );
  506 + return !( $.isFunction( callback ) &&
  507 + callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
  508 + event.isDefaultPrevented() );
  509 + }
  510 +};
  511 +
  512 +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
  513 + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
  514 + if ( typeof options === "string" ) {
  515 + options = { effect: options };
  516 + }
  517 + var hasOptions,
  518 + effectName = !options ?
  519 + method :
  520 + options === true || typeof options === "number" ?
  521 + defaultEffect :
  522 + options.effect || defaultEffect;
  523 + options = options || {};
  524 + if ( typeof options === "number" ) {
  525 + options = { duration: options };
  526 + }
  527 + hasOptions = !$.isEmptyObject( options );
  528 + options.complete = callback;
  529 + if ( options.delay ) {
  530 + element.delay( options.delay );
  531 + }
  532 + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
  533 + element[ method ]( options );
  534 + } else if ( effectName !== method && element[ effectName ] ) {
  535 + element[ effectName ]( options.duration, options.easing, callback );
  536 + } else {
  537 + element.queue(function( next ) {
  538 + $( this )[ method ]();
  539 + if ( callback ) {
  540 + callback.call( element[ 0 ] );
  541 + }
  542 + next();
  543 + });
  544 + }
  545 + };
  546 +});
  547 +
  548 +return $.widget;
  549 +
  550 +}));
src/main/resources/static/real_control_v2/assets/plugins/spectrum/spectrum.css 0 → 100644
  1 +/***
  2 +Spectrum Colorpicker v1.8.0
  3 +https://github.com/bgrins/spectrum
  4 +Author: Brian Grinstead
  5 +License: MIT
  6 +***/
  7 +
  8 +.sp-container {
  9 + position:absolute;
  10 + top:0;
  11 + left:0;
  12 + display:inline-block;
  13 + *display: inline;
  14 + *zoom: 1;
  15 + /* https://github.com/bgrins/spectrum/issues/40 */
  16 + z-index: 9999994;
  17 + overflow: hidden;
  18 +}
  19 +.sp-container.sp-flat {
  20 + position: relative;
  21 +}
  22 +
  23 +/* Fix for * { box-sizing: border-box; } */
  24 +.sp-container,
  25 +.sp-container * {
  26 + -webkit-box-sizing: content-box;
  27 + -moz-box-sizing: content-box;
  28 + box-sizing: content-box;
  29 +}
  30 +
  31 +/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */
  32 +.sp-top {
  33 + position:relative;
  34 + width: 100%;
  35 + display:inline-block;
  36 +}
  37 +.sp-top-inner {
  38 + position:absolute;
  39 + top:0;
  40 + left:0;
  41 + bottom:0;
  42 + right:0;
  43 +}
  44 +.sp-color {
  45 + position: absolute;
  46 + top:0;
  47 + left:0;
  48 + bottom:0;
  49 + right:20%;
  50 +}
  51 +.sp-hue {
  52 + position: absolute;
  53 + top:0;
  54 + right:0;
  55 + bottom:0;
  56 + left:84%;
  57 + height: 100%;
  58 +}
  59 +
  60 +.sp-clear-enabled .sp-hue {
  61 + top:33px;
  62 + height: 77.5%;
  63 +}
  64 +
  65 +.sp-fill {
  66 + padding-top: 80%;
  67 +}
  68 +.sp-sat, .sp-val {
  69 + position: absolute;
  70 + top:0;
  71 + left:0;
  72 + right:0;
  73 + bottom:0;
  74 +}
  75 +
  76 +.sp-alpha-enabled .sp-top {
  77 + margin-bottom: 18px;
  78 +}
  79 +.sp-alpha-enabled .sp-alpha {
  80 + display: block;
  81 +}
  82 +.sp-alpha-handle {
  83 + position:absolute;
  84 + top:-4px;
  85 + bottom: -4px;
  86 + width: 6px;
  87 + left: 50%;
  88 + cursor: pointer;
  89 + border: 1px solid black;
  90 + background: white;
  91 + opacity: .8;
  92 +}
  93 +.sp-alpha {
  94 + display: none;
  95 + position: absolute;
  96 + bottom: -14px;
  97 + right: 0;
  98 + left: 0;
  99 + height: 8px;
  100 +}
  101 +.sp-alpha-inner {
  102 + border: solid 1px #333;
  103 +}
  104 +
  105 +.sp-clear {
  106 + display: none;
  107 +}
  108 +
  109 +.sp-clear.sp-clear-display {
  110 + background-position: center;
  111 +}
  112 +
  113 +.sp-clear-enabled .sp-clear {
  114 + display: block;
  115 + position:absolute;
  116 + top:0px;
  117 + right:0;
  118 + bottom:0;
  119 + left:84%;
  120 + height: 28px;
  121 +}
  122 +
  123 +/* Don't allow text selection */
  124 +.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button {
  125 + -webkit-user-select:none;
  126 + -moz-user-select: -moz-none;
  127 + -o-user-select:none;
  128 + user-select: none;
  129 +}
  130 +
  131 +.sp-container.sp-input-disabled .sp-input-container {
  132 + display: none;
  133 +}
  134 +.sp-container.sp-buttons-disabled .sp-button-container {
  135 + display: none;
  136 +}
  137 +.sp-container.sp-palette-buttons-disabled .sp-palette-button-container {
  138 + display: none;
  139 +}
  140 +.sp-palette-only .sp-picker-container {
  141 + display: none;
  142 +}
  143 +.sp-palette-disabled .sp-palette-container {
  144 + display: none;
  145 +}
  146 +
  147 +.sp-initial-disabled .sp-initial {
  148 + display: none;
  149 +}
  150 +
  151 +
  152 +/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */
  153 +.sp-sat {
  154 + background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0)));
  155 + background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0));
  156 + background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
  157 + background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
  158 + background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0));
  159 + background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0));
  160 + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)";
  161 + filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81');
  162 +}
  163 +.sp-val {
  164 + background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0)));
  165 + background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0));
  166 + background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
  167 + background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
  168 + background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0));
  169 + background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0));
  170 + -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)";
  171 + filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000');
  172 +}
  173 +
  174 +.sp-hue {
  175 + background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  176 + background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  177 + background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  178 + background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000));
  179 + background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  180 + background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%);
  181 +}
  182 +
  183 +/* IE filters do not support multiple color stops.
  184 + Generate 6 divs, line them up, and do two color gradients for each.
  185 + Yes, really.
  186 + */
  187 +.sp-1 {
  188 + height:17%;
  189 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00');
  190 +}
  191 +.sp-2 {
  192 + height:16%;
  193 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00');
  194 +}
  195 +.sp-3 {
  196 + height:17%;
  197 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff');
  198 +}
  199 +.sp-4 {
  200 + height:17%;
  201 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff');
  202 +}
  203 +.sp-5 {
  204 + height:16%;
  205 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff');
  206 +}
  207 +.sp-6 {
  208 + height:17%;
  209 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000');
  210 +}
  211 +
  212 +.sp-hidden {
  213 + display: none !important;
  214 +}
  215 +
  216 +/* Clearfix hack */
  217 +.sp-cf:before, .sp-cf:after { content: ""; display: table; }
  218 +.sp-cf:after { clear: both; }
  219 +.sp-cf { *zoom: 1; }
  220 +
  221 +/* Mobile devices, make hue slider bigger so it is easier to slide */
  222 +@media (max-device-width: 480px) {
  223 + .sp-color { right: 40%; }
  224 + .sp-hue { left: 63%; }
  225 + .sp-fill { padding-top: 60%; }
  226 +}
  227 +.sp-dragger {
  228 + border-radius: 5px;
  229 + height: 5px;
  230 + width: 5px;
  231 + border: 1px solid #fff;
  232 + background: #000;
  233 + cursor: pointer;
  234 + position:absolute;
  235 + top:0;
  236 + left: 0;
  237 +}
  238 +.sp-slider {
  239 + position: absolute;
  240 + top:0;
  241 + cursor:pointer;
  242 + height: 3px;
  243 + left: -1px;
  244 + right: -1px;
  245 + border: 1px solid #000;
  246 + background: white;
  247 + opacity: .8;
  248 +}
  249 +
  250 +/*
  251 +Theme authors:
  252 +Here are the basic themeable display options (colors, fonts, global widths).
  253 +See http://bgrins.github.io/spectrum/themes/ for instructions.
  254 +*/
  255 +
  256 +.sp-container {
  257 + border-radius: 0;
  258 + background-color: #ECECEC;
  259 + border: solid 1px #f0c49B;
  260 + padding: 0;
  261 +}
  262 +.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear {
  263 + font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif;
  264 + -webkit-box-sizing: border-box;
  265 + -moz-box-sizing: border-box;
  266 + -ms-box-sizing: border-box;
  267 + box-sizing: border-box;
  268 +}
  269 +.sp-top {
  270 + margin-bottom: 3px;
  271 +}
  272 +.sp-color, .sp-hue, .sp-clear {
  273 + border: solid 1px #666;
  274 +}
  275 +
  276 +/* Input */
  277 +.sp-input-container {
  278 + float:right;
  279 + width: 100px;
  280 + margin-bottom: 4px;
  281 +}
  282 +.sp-initial-disabled .sp-input-container {
  283 + width: 100%;
  284 +}
  285 +.sp-input {
  286 + font-size: 12px !important;
  287 + border: 1px inset;
  288 + padding: 4px 5px;
  289 + margin: 0;
  290 + width: 100%;
  291 + background:transparent;
  292 + border-radius: 3px;
  293 + color: #222;
  294 +}
  295 +.sp-input:focus {
  296 + border: 1px solid orange;
  297 +}
  298 +.sp-input.sp-validation-error {
  299 + border: 1px solid red;
  300 + background: #fdd;
  301 +}
  302 +.sp-picker-container , .sp-palette-container {
  303 + float:left;
  304 + position: relative;
  305 + padding: 10px;
  306 + padding-bottom: 300px;
  307 + margin-bottom: -290px;
  308 +}
  309 +.sp-picker-container {
  310 + width: 172px;
  311 + border-left: solid 1px #fff;
  312 +}
  313 +
  314 +/* Palettes */
  315 +.sp-palette-container {
  316 + border-right: solid 1px #ccc;
  317 +}
  318 +
  319 +.sp-palette-only .sp-palette-container {
  320 + border: 0;
  321 +}
  322 +
  323 +.sp-palette .sp-thumb-el {
  324 + display: block;
  325 + position:relative;
  326 + float:left;
  327 + width: 24px;
  328 + height: 15px;
  329 + margin: 3px;
  330 + cursor: pointer;
  331 + border:solid 2px transparent;
  332 +}
  333 +.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active {
  334 + border-color: orange;
  335 +}
  336 +.sp-thumb-el {
  337 + position:relative;
  338 +}
  339 +
  340 +/* Initial */
  341 +.sp-initial {
  342 + float: left;
  343 + border: solid 1px #333;
  344 +}
  345 +.sp-initial span {
  346 + width: 30px;
  347 + height: 25px;
  348 + border:none;
  349 + display:block;
  350 + float:left;
  351 + margin:0;
  352 +}
  353 +
  354 +.sp-initial .sp-clear-display {
  355 + background-position: center;
  356 +}
  357 +
  358 +/* Buttons */
  359 +.sp-palette-button-container,
  360 +.sp-button-container {
  361 + float: right;
  362 +}
  363 +
  364 +/* Replacer (the little preview div that shows up instead of the <input>) */
  365 +.sp-replacer {
  366 + margin:0;
  367 + overflow:hidden;
  368 + cursor:pointer;
  369 + padding: 4px;
  370 + display:inline-block;
  371 + *zoom: 1;
  372 + *display: inline;
  373 + border: solid 1px #91765d;
  374 + background: #eee;
  375 + color: #333;
  376 + vertical-align: middle;
  377 +}
  378 +.sp-replacer:hover, .sp-replacer.sp-active {
  379 + border-color: #F0C49B;
  380 + color: #111;
  381 +}
  382 +.sp-replacer.sp-disabled {
  383 + cursor:default;
  384 + border-color: silver;
  385 + color: silver;
  386 +}
  387 +.sp-dd {
  388 + padding: 2px 0;
  389 + height: 16px;
  390 + line-height: 16px;
  391 + float:left;
  392 + font-size:10px;
  393 +}
  394 +.sp-preview {
  395 + position:relative;
  396 + width:25px;
  397 + height: 20px;
  398 + border: solid 1px #222;
  399 + margin-right: 5px;
  400 + float:left;
  401 + z-index: 0;
  402 +}
  403 +
  404 +.sp-palette {
  405 + *width: 220px;
  406 + max-width: 220px;
  407 +}
  408 +.sp-palette .sp-thumb-el {
  409 + width:16px;
  410 + height: 16px;
  411 + margin:2px 1px;
  412 + border: solid 1px #d0d0d0;
  413 +}
  414 +
  415 +.sp-container {
  416 + padding-bottom:0;
  417 +}
  418 +
  419 +
  420 +/* Buttons: http://hellohappy.org/css3-buttons/ */
  421 +.sp-container button {
  422 + background-color: #eeeeee;
  423 + background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc);
  424 + background-image: -moz-linear-gradient(top, #eeeeee, #cccccc);
  425 + background-image: -ms-linear-gradient(top, #eeeeee, #cccccc);
  426 + background-image: -o-linear-gradient(top, #eeeeee, #cccccc);
  427 + background-image: linear-gradient(to bottom, #eeeeee, #cccccc);
  428 + border: 1px solid #ccc;
  429 + border-bottom: 1px solid #bbb;
  430 + border-radius: 3px;
  431 + color: #333;
  432 + font-size: 14px;
  433 + line-height: 1;
  434 + padding: 5px 4px;
  435 + text-align: center;
  436 + text-shadow: 0 1px 0 #eee;
  437 + vertical-align: middle;
  438 +}
  439 +.sp-container button:hover {
  440 + background-color: #dddddd;
  441 + background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb);
  442 + background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb);
  443 + background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb);
  444 + background-image: -o-linear-gradient(top, #dddddd, #bbbbbb);
  445 + background-image: linear-gradient(to bottom, #dddddd, #bbbbbb);
  446 + border: 1px solid #bbb;
  447 + border-bottom: 1px solid #999;
  448 + cursor: pointer;
  449 + text-shadow: 0 1px 0 #ddd;
  450 +}
  451 +.sp-container button:active {
  452 + border: 1px solid #aaa;
  453 + border-bottom: 1px solid #888;
  454 + -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  455 + -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  456 + -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  457 + -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  458 + box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee;
  459 +}
  460 +.sp-cancel {
  461 + font-size: 11px;
  462 + color: #d93f3f !important;
  463 + margin:0;
  464 + padding:2px;
  465 + margin-right: 5px;
  466 + vertical-align: middle;
  467 + text-decoration:none;
  468 +
  469 +}
  470 +.sp-cancel:hover {
  471 + color: #d93f3f !important;
  472 + text-decoration: underline;
  473 +}
  474 +
  475 +
  476 +.sp-palette span:hover, .sp-palette span.sp-thumb-active {
  477 + border-color: #000;
  478 +}
  479 +
  480 +.sp-preview, .sp-alpha, .sp-thumb-el {
  481 + position:relative;
  482 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==);
  483 +}
  484 +.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner {
  485 + display:block;
  486 + position:absolute;
  487 + top:0;left:0;bottom:0;right:0;
  488 +}
  489 +
  490 +.sp-palette .sp-thumb-inner {
  491 + background-position: 50% 50%;
  492 + background-repeat: no-repeat;
  493 +}
  494 +
  495 +.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner {
  496 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=);
  497 +}
  498 +
  499 +.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner {
  500 + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=);
  501 +}
  502 +
  503 +.sp-clear-display {
  504 + background-repeat:no-repeat;
  505 + background-position: center;
  506 + background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==);
  507 +}
src/main/resources/static/real_control_v2/assets/plugins/spectrum/spectrum.js 0 → 100644
  1 +// Spectrum Colorpicker v1.8.0
  2 +// https://github.com/bgrins/spectrum
  3 +// Author: Brian Grinstead
  4 +// License: MIT
  5 +
  6 +(function (factory) {
  7 + "use strict";
  8 +
  9 + if (typeof define === 'function' && define.amd) { // AMD
  10 + define(['jquery'], factory);
  11 + }
  12 + else if (typeof exports == "object" && typeof module == "object") { // CommonJS
  13 + module.exports = factory(require('jquery'));
  14 + }
  15 + else { // Browser
  16 + factory(jQuery);
  17 + }
  18 +})(function($, undefined) {
  19 + "use strict";
  20 +
  21 + var defaultOpts = {
  22 +
  23 + // Callbacks
  24 + beforeShow: noop,
  25 + move: noop,
  26 + change: noop,
  27 + show: noop,
  28 + hide: noop,
  29 +
  30 + // Options
  31 + color: false,
  32 + flat: false,
  33 + showInput: false,
  34 + allowEmpty: false,
  35 + showButtons: true,
  36 + clickoutFiresChange: true,
  37 + showInitial: false,
  38 + showPalette: false,
  39 + showPaletteOnly: false,
  40 + hideAfterPaletteSelect: false,
  41 + togglePaletteOnly: false,
  42 + showSelectionPalette: true,
  43 + localStorageKey: false,
  44 + appendTo: "body",
  45 + maxSelectionSize: 7,
  46 + cancelText: "cancel",
  47 + chooseText: "choose",
  48 + togglePaletteMoreText: "more",
  49 + togglePaletteLessText: "less",
  50 + clearText: "Clear Color Selection",
  51 + noColorSelectedText: "No Color Selected",
  52 + preferredFormat: false,
  53 + className: "", // Deprecated - use containerClassName and replacerClassName instead.
  54 + containerClassName: "",
  55 + replacerClassName: "",
  56 + showAlpha: false,
  57 + theme: "sp-light",
  58 + palette: [["#ffffff", "#000000", "#ff0000", "#ff8000", "#ffff00", "#008000", "#0000ff", "#4b0082", "#9400d3"]],
  59 + selectionPalette: [],
  60 + disabled: false,
  61 + offset: null
  62 + },
  63 + spectrums = [],
  64 + IE = !!/msie/i.exec( window.navigator.userAgent ),
  65 + rgbaSupport = (function() {
  66 + function contains( str, substr ) {
  67 + return !!~('' + str).indexOf(substr);
  68 + }
  69 +
  70 + var elem = document.createElement('div');
  71 + var style = elem.style;
  72 + style.cssText = 'background-color:rgba(0,0,0,.5)';
  73 + return contains(style.backgroundColor, 'rgba') || contains(style.backgroundColor, 'hsla');
  74 + })(),
  75 + replaceInput = [
  76 + "<div class='sp-replacer'>",
  77 + "<div class='sp-preview'><div class='sp-preview-inner'></div></div>",
  78 + "<div class='sp-dd'>&#9660;</div>",
  79 + "</div>"
  80 + ].join(''),
  81 + markup = (function () {
  82 +
  83 + // IE does not support gradients with multiple stops, so we need to simulate
  84 + // that for the rainbow slider with 8 divs that each have a single gradient
  85 + var gradientFix = "";
  86 + if (IE) {
  87 + for (var i = 1; i <= 6; i++) {
  88 + gradientFix += "<div class='sp-" + i + "'></div>";
  89 + }
  90 + }
  91 +
  92 + return [
  93 + "<div class='sp-container sp-hidden'>",
  94 + "<div class='sp-palette-container'>",
  95 + "<div class='sp-palette sp-thumb sp-cf'></div>",
  96 + "<div class='sp-palette-button-container sp-cf'>",
  97 + "<button type='button' class='sp-palette-toggle'></button>",
  98 + "</div>",
  99 + "</div>",
  100 + "<div class='sp-picker-container'>",
  101 + "<div class='sp-top sp-cf'>",
  102 + "<div class='sp-fill'></div>",
  103 + "<div class='sp-top-inner'>",
  104 + "<div class='sp-color'>",
  105 + "<div class='sp-sat'>",
  106 + "<div class='sp-val'>",
  107 + "<div class='sp-dragger'></div>",
  108 + "</div>",
  109 + "</div>",
  110 + "</div>",
  111 + "<div class='sp-clear sp-clear-display'>",
  112 + "</div>",
  113 + "<div class='sp-hue'>",
  114 + "<div class='sp-slider'></div>",
  115 + gradientFix,
  116 + "</div>",
  117 + "</div>",
  118 + "<div class='sp-alpha'><div class='sp-alpha-inner'><div class='sp-alpha-handle'></div></div></div>",
  119 + "</div>",
  120 + "<div class='sp-input-container sp-cf'>",
  121 + "<input class='sp-input' type='text' spellcheck='false' />",
  122 + "</div>",
  123 + "<div class='sp-initial sp-thumb sp-cf'></div>",
  124 + "<div class='sp-button-container sp-cf'>",
  125 + "<a class='sp-cancel' href='#'></a>",
  126 + "<button type='button' class='sp-choose'></button>",
  127 + "</div>",
  128 + "</div>",
  129 + "</div>"
  130 + ].join("");
  131 + })();
  132 +
  133 + function paletteTemplate (p, color, className, opts) {
  134 + var html = [];
  135 + for (var i = 0; i < p.length; i++) {
  136 + var current = p[i];
  137 + if(current) {
  138 + var tiny = tinycolor(current);
  139 + var c = tiny.toHsl().l < 0.5 ? "sp-thumb-el sp-thumb-dark" : "sp-thumb-el sp-thumb-light";
  140 + c += (tinycolor.equals(color, current)) ? " sp-thumb-active" : "";
  141 + var formattedString = tiny.toString(opts.preferredFormat || "rgb");
  142 + var swatchStyle = rgbaSupport ? ("background-color:" + tiny.toRgbString()) : "filter:" + tiny.toFilter();
  143 + html.push('<span title="' + formattedString + '" data-color="' + tiny.toRgbString() + '" class="' + c + '"><span class="sp-thumb-inner" style="' + swatchStyle + ';" /></span>');
  144 + } else {
  145 + var cls = 'sp-clear-display';
  146 + html.push($('<div />')
  147 + .append($('<span data-color="" style="background-color:transparent;" class="' + cls + '"></span>')
  148 + .attr('title', opts.noColorSelectedText)
  149 + )
  150 + .html()
  151 + );
  152 + }
  153 + }
  154 + return "<div class='sp-cf " + className + "'>" + html.join('') + "</div>";
  155 + }
  156 +
  157 + function hideAll() {
  158 + for (var i = 0; i < spectrums.length; i++) {
  159 + if (spectrums[i]) {
  160 + spectrums[i].hide();
  161 + }
  162 + }
  163 + }
  164 +
  165 + function instanceOptions(o, callbackContext) {
  166 + var opts = $.extend({}, defaultOpts, o);
  167 + opts.callbacks = {
  168 + 'move': bind(opts.move, callbackContext),
  169 + 'change': bind(opts.change, callbackContext),
  170 + 'show': bind(opts.show, callbackContext),
  171 + 'hide': bind(opts.hide, callbackContext),
  172 + 'beforeShow': bind(opts.beforeShow, callbackContext)
  173 + };
  174 +
  175 + return opts;
  176 + }
  177 +
  178 + function spectrum(element, o) {
  179 +
  180 + var opts = instanceOptions(o, element),
  181 + flat = opts.flat,
  182 + showSelectionPalette = opts.showSelectionPalette,
  183 + localStorageKey = opts.localStorageKey,
  184 + theme = opts.theme,
  185 + callbacks = opts.callbacks,
  186 + resize = throttle(reflow, 10),
  187 + visible = false,
  188 + isDragging = false,
  189 + dragWidth = 0,
  190 + dragHeight = 0,
  191 + dragHelperHeight = 0,
  192 + slideHeight = 0,
  193 + slideWidth = 0,
  194 + alphaWidth = 0,
  195 + alphaSlideHelperWidth = 0,
  196 + slideHelperHeight = 0,
  197 + currentHue = 0,
  198 + currentSaturation = 0,
  199 + currentValue = 0,
  200 + currentAlpha = 1,
  201 + palette = [],
  202 + paletteArray = [],
  203 + paletteLookup = {},
  204 + selectionPalette = opts.selectionPalette.slice(0),
  205 + maxSelectionSize = opts.maxSelectionSize,
  206 + draggingClass = "sp-dragging",
  207 + shiftMovementDirection = null;
  208 +
  209 + var doc = element.ownerDocument,
  210 + body = doc.body,
  211 + boundElement = $(element),
  212 + disabled = false,
  213 + container = $(markup, doc).addClass(theme),
  214 + pickerContainer = container.find(".sp-picker-container"),
  215 + dragger = container.find(".sp-color"),
  216 + dragHelper = container.find(".sp-dragger"),
  217 + slider = container.find(".sp-hue"),
  218 + slideHelper = container.find(".sp-slider"),
  219 + alphaSliderInner = container.find(".sp-alpha-inner"),
  220 + alphaSlider = container.find(".sp-alpha"),
  221 + alphaSlideHelper = container.find(".sp-alpha-handle"),
  222 + textInput = container.find(".sp-input"),
  223 + paletteContainer = container.find(".sp-palette"),
  224 + initialColorContainer = container.find(".sp-initial"),
  225 + cancelButton = container.find(".sp-cancel"),
  226 + clearButton = container.find(".sp-clear"),
  227 + chooseButton = container.find(".sp-choose"),
  228 + toggleButton = container.find(".sp-palette-toggle"),
  229 + isInput = boundElement.is("input"),
  230 + isInputTypeColor = isInput && boundElement.attr("type") === "color" && inputTypeColorSupport(),
  231 + shouldReplace = isInput && !flat,
  232 + replacer = (shouldReplace) ? $(replaceInput).addClass(theme).addClass(opts.className).addClass(opts.replacerClassName) : $([]),
  233 + offsetElement = (shouldReplace) ? replacer : boundElement,
  234 + previewElement = replacer.find(".sp-preview-inner"),
  235 + initialColor = opts.color || (isInput && boundElement.val()),
  236 + colorOnShow = false,
  237 + currentPreferredFormat = opts.preferredFormat,
  238 + clickoutFiresChange = !opts.showButtons || opts.clickoutFiresChange,
  239 + isEmpty = !initialColor,
  240 + allowEmpty = opts.allowEmpty && !isInputTypeColor;
  241 +
  242 + function applyOptions() {
  243 +
  244 + if (opts.showPaletteOnly) {
  245 + opts.showPalette = true;
  246 + }
  247 +
  248 + toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);
  249 +
  250 + if (opts.palette) {
  251 + palette = opts.palette.slice(0);
  252 + paletteArray = $.isArray(palette[0]) ? palette : [palette];
  253 + paletteLookup = {};
  254 + for (var i = 0; i < paletteArray.length; i++) {
  255 + for (var j = 0; j < paletteArray[i].length; j++) {
  256 + var rgb = tinycolor(paletteArray[i][j]).toRgbString();
  257 + paletteLookup[rgb] = true;
  258 + }
  259 + }
  260 + }
  261 +
  262 + container.toggleClass("sp-flat", flat);
  263 + container.toggleClass("sp-input-disabled", !opts.showInput);
  264 + container.toggleClass("sp-alpha-enabled", opts.showAlpha);
  265 + container.toggleClass("sp-clear-enabled", allowEmpty);
  266 + container.toggleClass("sp-buttons-disabled", !opts.showButtons);
  267 + container.toggleClass("sp-palette-buttons-disabled", !opts.togglePaletteOnly);
  268 + container.toggleClass("sp-palette-disabled", !opts.showPalette);
  269 + container.toggleClass("sp-palette-only", opts.showPaletteOnly);
  270 + container.toggleClass("sp-initial-disabled", !opts.showInitial);
  271 + container.addClass(opts.className).addClass(opts.containerClassName);
  272 +
  273 + reflow();
  274 + }
  275 +
  276 + function initialize() {
  277 +
  278 + if (IE) {
  279 + container.find("*:not(input)").attr("unselectable", "on");
  280 + }
  281 +
  282 + applyOptions();
  283 +
  284 + if (shouldReplace) {
  285 + boundElement.after(replacer).hide();
  286 + }
  287 +
  288 + if (!allowEmpty) {
  289 + clearButton.hide();
  290 + }
  291 +
  292 + if (flat) {
  293 + boundElement.after(container).hide();
  294 + }
  295 + else {
  296 +
  297 + var appendTo = opts.appendTo === "parent" ? boundElement.parent() : $(opts.appendTo);
  298 + if (appendTo.length !== 1) {
  299 + appendTo = $("body");
  300 + }
  301 +
  302 + appendTo.append(container);
  303 + }
  304 +
  305 + updateSelectionPaletteFromStorage();
  306 +
  307 + offsetElement.on("click.spectrum touchstart.spectrum", function (e) {
  308 + if (!disabled) {
  309 + toggle();
  310 + }
  311 +
  312 + e.stopPropagation();
  313 +
  314 + if (!$(e.target).is("input")) {
  315 + e.preventDefault();
  316 + }
  317 + });
  318 +
  319 + if(boundElement.is(":disabled") || (opts.disabled === true)) {
  320 + disable();
  321 + }
  322 +
  323 + // Prevent clicks from bubbling up to document. This would cause it to be hidden.
  324 + container.click(stopPropagation);
  325 +
  326 + // Handle user typed input
  327 + textInput.change(setFromTextInput);
  328 + textInput.on("paste", function () {
  329 + setTimeout(setFromTextInput, 1);
  330 + });
  331 + textInput.keydown(function (e) { if (e.keyCode == 13) { setFromTextInput(); } });
  332 +
  333 + cancelButton.text(opts.cancelText);
  334 + cancelButton.on("click.spectrum", function (e) {
  335 + e.stopPropagation();
  336 + e.preventDefault();
  337 + revert();
  338 + hide();
  339 + });
  340 +
  341 + clearButton.attr("title", opts.clearText);
  342 + clearButton.on("click.spectrum", function (e) {
  343 + e.stopPropagation();
  344 + e.preventDefault();
  345 + isEmpty = true;
  346 + move();
  347 +
  348 + if(flat) {
  349 + //for the flat style, this is a change event
  350 + updateOriginalInput(true);
  351 + }
  352 + });
  353 +
  354 + chooseButton.text(opts.chooseText);
  355 + chooseButton.on("click.spectrum", function (e) {
  356 + e.stopPropagation();
  357 + e.preventDefault();
  358 +
  359 + if (IE && textInput.is(":focus")) {
  360 + textInput.trigger('change');
  361 + }
  362 +
  363 + if (isValid()) {
  364 + updateOriginalInput(true);
  365 + hide();
  366 + }
  367 + });
  368 +
  369 + toggleButton.text(opts.showPaletteOnly ? opts.togglePaletteMoreText : opts.togglePaletteLessText);
  370 + toggleButton.on("click.spectrum", function (e) {
  371 + e.stopPropagation();
  372 + e.preventDefault();
  373 +
  374 + opts.showPaletteOnly = !opts.showPaletteOnly;
  375 +
  376 + // To make sure the Picker area is drawn on the right, next to the
  377 + // Palette area (and not below the palette), first move the Palette
  378 + // to the left to make space for the picker, plus 5px extra.
  379 + // The 'applyOptions' function puts the whole container back into place
  380 + // and takes care of the button-text and the sp-palette-only CSS class.
  381 + if (!opts.showPaletteOnly && !flat) {
  382 + container.css('left', '-=' + (pickerContainer.outerWidth(true) + 5));
  383 + }
  384 + applyOptions();
  385 + });
  386 +
  387 + draggable(alphaSlider, function (dragX, dragY, e) {
  388 + currentAlpha = (dragX / alphaWidth);
  389 + isEmpty = false;
  390 + if (e.shiftKey) {
  391 + currentAlpha = Math.round(currentAlpha * 10) / 10;
  392 + }
  393 +
  394 + move();
  395 + }, dragStart, dragStop);
  396 +
  397 + draggable(slider, function (dragX, dragY) {
  398 + currentHue = parseFloat(dragY / slideHeight);
  399 + isEmpty = false;
  400 + if (!opts.showAlpha) {
  401 + currentAlpha = 1;
  402 + }
  403 + move();
  404 + }, dragStart, dragStop);
  405 +
  406 + draggable(dragger, function (dragX, dragY, e) {
  407 +
  408 + // shift+drag should snap the movement to either the x or y axis.
  409 + if (!e.shiftKey) {
  410 + shiftMovementDirection = null;
  411 + }
  412 + else if (!shiftMovementDirection) {
  413 + var oldDragX = currentSaturation * dragWidth;
  414 + var oldDragY = dragHeight - (currentValue * dragHeight);
  415 + var furtherFromX = Math.abs(dragX - oldDragX) > Math.abs(dragY - oldDragY);
  416 +
  417 + shiftMovementDirection = furtherFromX ? "x" : "y";
  418 + }
  419 +
  420 + var setSaturation = !shiftMovementDirection || shiftMovementDirection === "x";
  421 + var setValue = !shiftMovementDirection || shiftMovementDirection === "y";
  422 +
  423 + if (setSaturation) {
  424 + currentSaturation = parseFloat(dragX / dragWidth);
  425 + }
  426 + if (setValue) {
  427 + currentValue = parseFloat((dragHeight - dragY) / dragHeight);
  428 + }
  429 +
  430 + isEmpty = false;
  431 + if (!opts.showAlpha) {
  432 + currentAlpha = 1;
  433 + }
  434 +
  435 + move();
  436 +
  437 + }, dragStart, dragStop);
  438 +
  439 + if (!!initialColor) {
  440 + set(initialColor);
  441 +
  442 + // In case color was black - update the preview UI and set the format
  443 + // since the set function will not run (default color is black).
  444 + updateUI();
  445 + currentPreferredFormat = opts.preferredFormat || tinycolor(initialColor).format;
  446 +
  447 + addColorToSelectionPalette(initialColor);
  448 + }
  449 + else {
  450 + updateUI();
  451 + }
  452 +
  453 + if (flat) {
  454 + show();
  455 + }
  456 +
  457 + function paletteElementClick(e) {
  458 + if (e.data && e.data.ignore) {
  459 + set($(e.target).closest(".sp-thumb-el").data("color"));
  460 + move();
  461 + }
  462 + else {
  463 + set($(e.target).closest(".sp-thumb-el").data("color"));
  464 + move();
  465 +
  466 + // If the picker is going to close immediately, a palette selection
  467 + // is a change. Otherwise, it's a move only.
  468 + if (opts.hideAfterPaletteSelect) {
  469 + updateOriginalInput(true);
  470 + hide();
  471 + } else {
  472 + updateOriginalInput();
  473 + }
  474 + }
  475 +
  476 + return false;
  477 + }
  478 +
  479 + var paletteEvent = IE ? "mousedown.spectrum" : "click.spectrum touchstart.spectrum";
  480 + paletteContainer.on(paletteEvent, ".sp-thumb-el", paletteElementClick);
  481 + initialColorContainer.on(paletteEvent, ".sp-thumb-el:nth-child(1)", { ignore: true }, paletteElementClick);
  482 + }
  483 +
  484 + function updateSelectionPaletteFromStorage() {
  485 +
  486 + if (localStorageKey && window.localStorage) {
  487 +
  488 + // Migrate old palettes over to new format. May want to remove this eventually.
  489 + try {
  490 + var oldPalette = window.localStorage[localStorageKey].split(",#");
  491 + if (oldPalette.length > 1) {
  492 + delete window.localStorage[localStorageKey];
  493 + $.each(oldPalette, function(i, c) {
  494 + addColorToSelectionPalette(c);
  495 + });
  496 + }
  497 + }
  498 + catch(e) { }
  499 +
  500 + try {
  501 + selectionPalette = window.localStorage[localStorageKey].split(";");
  502 + }
  503 + catch (e) { }
  504 + }
  505 + }
  506 +
  507 + function addColorToSelectionPalette(color) {
  508 + if (showSelectionPalette) {
  509 + var rgb = tinycolor(color).toRgbString();
  510 + if (!paletteLookup[rgb] && $.inArray(rgb, selectionPalette) === -1) {
  511 + selectionPalette.push(rgb);
  512 + while(selectionPalette.length > maxSelectionSize) {
  513 + selectionPalette.shift();
  514 + }
  515 + }
  516 +
  517 + if (localStorageKey && window.localStorage) {
  518 + try {
  519 + window.localStorage[localStorageKey] = selectionPalette.join(";");
  520 + }
  521 + catch(e) { }
  522 + }
  523 + }
  524 + }
  525 +
  526 + function getUniqueSelectionPalette() {
  527 + var unique = [];
  528 + if (opts.showPalette) {
  529 + for (var i = 0; i < selectionPalette.length; i++) {
  530 + var rgb = tinycolor(selectionPalette[i]).toRgbString();
  531 +
  532 + if (!paletteLookup[rgb]) {
  533 + unique.push(selectionPalette[i]);
  534 + }
  535 + }
  536 + }
  537 +
  538 + return unique.reverse().slice(0, opts.maxSelectionSize);
  539 + }
  540 +
  541 + function drawPalette() {
  542 +
  543 + var currentColor = get();
  544 +
  545 + var html = $.map(paletteArray, function (palette, i) {
  546 + return paletteTemplate(palette, currentColor, "sp-palette-row sp-palette-row-" + i, opts);
  547 + });
  548 +
  549 + updateSelectionPaletteFromStorage();
  550 +
  551 + if (selectionPalette) {
  552 + html.push(paletteTemplate(getUniqueSelectionPalette(), currentColor, "sp-palette-row sp-palette-row-selection", opts));
  553 + }
  554 +
  555 + paletteContainer.html(html.join(""));
  556 + }
  557 +
  558 + function drawInitial() {
  559 + if (opts.showInitial) {
  560 + var initial = colorOnShow;
  561 + var current = get();
  562 + initialColorContainer.html(paletteTemplate([initial, current], current, "sp-palette-row-initial", opts));
  563 + }
  564 + }
  565 +
  566 + function dragStart() {
  567 + if (dragHeight <= 0 || dragWidth <= 0 || slideHeight <= 0) {
  568 + reflow();
  569 + }
  570 + isDragging = true;
  571 + container.addClass(draggingClass);
  572 + shiftMovementDirection = null;
  573 + boundElement.trigger('dragstart.spectrum', [ get() ]);
  574 + }
  575 +
  576 + function dragStop() {
  577 + isDragging = false;
  578 + container.removeClass(draggingClass);
  579 + boundElement.trigger('dragstop.spectrum', [ get() ]);
  580 + }
  581 +
  582 + function setFromTextInput() {
  583 +
  584 + var value = textInput.val();
  585 +
  586 + if ((value === null || value === "") && allowEmpty) {
  587 + set(null);
  588 + move();
  589 + updateOriginalInput();
  590 + }
  591 + else {
  592 + var tiny = tinycolor(value);
  593 + if (tiny.isValid()) {
  594 + set(tiny);
  595 + move();
  596 + updateOriginalInput();
  597 + }
  598 + else {
  599 + textInput.addClass("sp-validation-error");
  600 + }
  601 + }
  602 + }
  603 +
  604 + function toggle() {
  605 + if (visible) {
  606 + hide();
  607 + }
  608 + else {
  609 + show();
  610 + }
  611 + }
  612 +
  613 + function show() {
  614 + var event = $.Event('beforeShow.spectrum');
  615 +
  616 + if (visible) {
  617 + reflow();
  618 + return;
  619 + }
  620 +
  621 + boundElement.trigger(event, [ get() ]);
  622 +
  623 + if (callbacks.beforeShow(get()) === false || event.isDefaultPrevented()) {
  624 + return;
  625 + }
  626 +
  627 + hideAll();
  628 + visible = true;
  629 +
  630 + $(doc).on("keydown.spectrum", onkeydown);
  631 + $(doc).on("click.spectrum", clickout);
  632 + $(window).on("resize.spectrum", resize);
  633 + replacer.addClass("sp-active");
  634 + container.removeClass("sp-hidden");
  635 +
  636 + reflow();
  637 + updateUI();
  638 +
  639 + colorOnShow = get();
  640 +
  641 + drawInitial();
  642 + callbacks.show(colorOnShow);
  643 + boundElement.trigger('show.spectrum', [ colorOnShow ]);
  644 + }
  645 +
  646 + function onkeydown(e) {
  647 + // Close on ESC
  648 + if (e.keyCode === 27) {
  649 + hide();
  650 + }
  651 + }
  652 +
  653 + function clickout(e) {
  654 + // Return on right click.
  655 + if (e.button == 2) { return; }
  656 +
  657 + // If a drag event was happening during the mouseup, don't hide
  658 + // on click.
  659 + if (isDragging) { return; }
  660 +
  661 + if (clickoutFiresChange) {
  662 + updateOriginalInput(true);
  663 + }
  664 + else {
  665 + revert();
  666 + }
  667 + hide();
  668 + }
  669 +
  670 + function hide() {
  671 + // Return if hiding is unnecessary
  672 + if (!visible || flat) { return; }
  673 + visible = false;
  674 +
  675 + $(doc).off("keydown.spectrum", onkeydown);
  676 + $(doc).off("click.spectrum", clickout);
  677 + $(window).off("resize.spectrum", resize);
  678 +
  679 + replacer.removeClass("sp-active");
  680 + container.addClass("sp-hidden");
  681 +
  682 + callbacks.hide(get());
  683 + boundElement.trigger('hide.spectrum', [ get() ]);
  684 + }
  685 +
  686 + function revert() {
  687 + set(colorOnShow, true);
  688 + updateOriginalInput(true);
  689 + }
  690 +
  691 + function set(color, ignoreFormatChange) {
  692 + if (tinycolor.equals(color, get())) {
  693 + // Update UI just in case a validation error needs
  694 + // to be cleared.
  695 + updateUI();
  696 + return;
  697 + }
  698 +
  699 + var newColor, newHsv;
  700 + if (!color && allowEmpty) {
  701 + isEmpty = true;
  702 + } else {
  703 + isEmpty = false;
  704 + newColor = tinycolor(color);
  705 + newHsv = newColor.toHsv();
  706 +
  707 + currentHue = (newHsv.h % 360) / 360;
  708 + currentSaturation = newHsv.s;
  709 + currentValue = newHsv.v;
  710 + currentAlpha = newHsv.a;
  711 + }
  712 + updateUI();
  713 +
  714 + if (newColor && newColor.isValid() && !ignoreFormatChange) {
  715 + currentPreferredFormat = opts.preferredFormat || newColor.getFormat();
  716 + }
  717 + }
  718 +
  719 + function get(opts) {
  720 + opts = opts || { };
  721 +
  722 + if (allowEmpty && isEmpty) {
  723 + return null;
  724 + }
  725 +
  726 + return tinycolor.fromRatio({
  727 + h: currentHue,
  728 + s: currentSaturation,
  729 + v: currentValue,
  730 + a: Math.round(currentAlpha * 1000) / 1000
  731 + }, { format: opts.format || currentPreferredFormat });
  732 + }
  733 +
  734 + function isValid() {
  735 + return !textInput.hasClass("sp-validation-error");
  736 + }
  737 +
  738 + function move() {
  739 + updateUI();
  740 +
  741 + callbacks.move(get());
  742 + boundElement.trigger('move.spectrum', [ get() ]);
  743 + }
  744 +
  745 + function updateUI() {
  746 +
  747 + textInput.removeClass("sp-validation-error");
  748 +
  749 + updateHelperLocations();
  750 +
  751 + // Update dragger background color (gradients take care of saturation and value).
  752 + var flatColor = tinycolor.fromRatio({ h: currentHue, s: 1, v: 1 });
  753 + dragger.css("background-color", flatColor.toHexString());
  754 +
  755 + // Get a format that alpha will be included in (hex and names ignore alpha)
  756 + var format = currentPreferredFormat;
  757 + if (currentAlpha < 1 && !(currentAlpha === 0 && format === "name")) {
  758 + if (format === "hex" || format === "hex3" || format === "hex6" || format === "name") {
  759 + format = "rgb";
  760 + }
  761 + }
  762 +
  763 + var realColor = get({ format: format }),
  764 + displayColor = '';
  765 +
  766 + //reset background info for preview element
  767 + previewElement.removeClass("sp-clear-display");
  768 + previewElement.css('background-color', 'transparent');
  769 +
  770 + if (!realColor && allowEmpty) {
  771 + // Update the replaced elements background with icon indicating no color selection
  772 + previewElement.addClass("sp-clear-display");
  773 + }
  774 + else {
  775 + var realHex = realColor.toHexString(),
  776 + realRgb = realColor.toRgbString();
  777 +
  778 + // Update the replaced elements background color (with actual selected color)
  779 + if (rgbaSupport || realColor.alpha === 1) {
  780 + previewElement.css("background-color", realRgb);
  781 + }
  782 + else {
  783 + previewElement.css("background-color", "transparent");
  784 + previewElement.css("filter", realColor.toFilter());
  785 + }
  786 +
  787 + if (opts.showAlpha) {
  788 + var rgb = realColor.toRgb();
  789 + rgb.a = 0;
  790 + var realAlpha = tinycolor(rgb).toRgbString();
  791 + var gradient = "linear-gradient(left, " + realAlpha + ", " + realHex + ")";
  792 +
  793 + if (IE) {
  794 + alphaSliderInner.css("filter", tinycolor(realAlpha).toFilter({ gradientType: 1 }, realHex));
  795 + }
  796 + else {
  797 + alphaSliderInner.css("background", "-webkit-" + gradient);
  798 + alphaSliderInner.css("background", "-moz-" + gradient);
  799 + alphaSliderInner.css("background", "-ms-" + gradient);
  800 + // Use current syntax gradient on unprefixed property.
  801 + alphaSliderInner.css("background",
  802 + "linear-gradient(to right, " + realAlpha + ", " + realHex + ")");
  803 + }
  804 + }
  805 +
  806 + displayColor = realColor.toString(format);
  807 + }
  808 +
  809 + // Update the text entry input as it changes happen
  810 + if (opts.showInput) {
  811 + textInput.val(displayColor);
  812 + }
  813 +
  814 + if (opts.showPalette) {
  815 + drawPalette();
  816 + }
  817 +
  818 + drawInitial();
  819 + }
  820 +
  821 + function updateHelperLocations() {
  822 + var s = currentSaturation;
  823 + var v = currentValue;
  824 +
  825 + if(allowEmpty && isEmpty) {
  826 + //if selected color is empty, hide the helpers
  827 + alphaSlideHelper.hide();
  828 + slideHelper.hide();
  829 + dragHelper.hide();
  830 + }
  831 + else {
  832 + //make sure helpers are visible
  833 + alphaSlideHelper.show();
  834 + slideHelper.show();
  835 + dragHelper.show();
  836 +
  837 + // Where to show the little circle in that displays your current selected color
  838 + var dragX = s * dragWidth;
  839 + var dragY = dragHeight - (v * dragHeight);
  840 + dragX = Math.max(
  841 + -dragHelperHeight,
  842 + Math.min(dragWidth - dragHelperHeight, dragX - dragHelperHeight)
  843 + );
  844 + dragY = Math.max(
  845 + -dragHelperHeight,
  846 + Math.min(dragHeight - dragHelperHeight, dragY - dragHelperHeight)
  847 + );
  848 + dragHelper.css({
  849 + "top": dragY + "px",
  850 + "left": dragX + "px"
  851 + });
  852 +
  853 + var alphaX = currentAlpha * alphaWidth;
  854 + alphaSlideHelper.css({
  855 + "left": (alphaX - (alphaSlideHelperWidth / 2)) + "px"
  856 + });
  857 +
  858 + // Where to show the bar that displays your current selected hue
  859 + var slideY = (currentHue) * slideHeight;
  860 + slideHelper.css({
  861 + "top": (slideY - slideHelperHeight) + "px"
  862 + });
  863 + }
  864 + }
  865 +
  866 + function updateOriginalInput(fireCallback) {
  867 + var color = get(),
  868 + displayColor = '',
  869 + hasChanged = !tinycolor.equals(color, colorOnShow);
  870 +
  871 + if (color) {
  872 + displayColor = color.toString(currentPreferredFormat);
  873 + // Update the selection palette with the current color
  874 + addColorToSelectionPalette(color);
  875 + }
  876 +
  877 + if (isInput) {
  878 + boundElement.val(displayColor);
  879 + }
  880 +
  881 + if (fireCallback && hasChanged) {
  882 + callbacks.change(color);
  883 + boundElement.trigger('change', [ color ]);
  884 + }
  885 + }
  886 +
  887 + function reflow() {
  888 + if (!visible) {
  889 + return; // Calculations would be useless and wouldn't be reliable anyways
  890 + }
  891 + dragWidth = dragger.width();
  892 + dragHeight = dragger.height();
  893 + dragHelperHeight = dragHelper.height();
  894 + slideWidth = slider.width();
  895 + slideHeight = slider.height();
  896 + slideHelperHeight = slideHelper.height();
  897 + alphaWidth = alphaSlider.width();
  898 + alphaSlideHelperWidth = alphaSlideHelper.width();
  899 +
  900 + if (!flat) {
  901 + container.css("position", "absolute");
  902 + if (opts.offset) {
  903 + container.offset(opts.offset);
  904 + } else {
  905 + container.offset(getOffset(container, offsetElement));
  906 + }
  907 + }
  908 +
  909 + updateHelperLocations();
  910 +
  911 + if (opts.showPalette) {
  912 + drawPalette();
  913 + }
  914 +
  915 + boundElement.trigger('reflow.spectrum');
  916 + }
  917 +
  918 + function destroy() {
  919 + boundElement.show();
  920 + offsetElement.off("click.spectrum touchstart.spectrum");
  921 + container.remove();
  922 + replacer.remove();
  923 + spectrums[spect.id] = null;
  924 + }
  925 +
  926 + function option(optionName, optionValue) {
  927 + if (optionName === undefined) {
  928 + return $.extend({}, opts);
  929 + }
  930 + if (optionValue === undefined) {
  931 + return opts[optionName];
  932 + }
  933 +
  934 + opts[optionName] = optionValue;
  935 +
  936 + if (optionName === "preferredFormat") {
  937 + currentPreferredFormat = opts.preferredFormat;
  938 + }
  939 + applyOptions();
  940 + }
  941 +
  942 + function enable() {
  943 + disabled = false;
  944 + boundElement.attr("disabled", false);
  945 + offsetElement.removeClass("sp-disabled");
  946 + }
  947 +
  948 + function disable() {
  949 + hide();
  950 + disabled = true;
  951 + boundElement.attr("disabled", true);
  952 + offsetElement.addClass("sp-disabled");
  953 + }
  954 +
  955 + function setOffset(coord) {
  956 + opts.offset = coord;
  957 + reflow();
  958 + }
  959 +
  960 + initialize();
  961 +
  962 + var spect = {
  963 + show: show,
  964 + hide: hide,
  965 + toggle: toggle,
  966 + reflow: reflow,
  967 + option: option,
  968 + enable: enable,
  969 + disable: disable,
  970 + offset: setOffset,
  971 + set: function (c) {
  972 + set(c);
  973 + updateOriginalInput();
  974 + },
  975 + get: get,
  976 + destroy: destroy,
  977 + container: container
  978 + };
  979 +
  980 + spect.id = spectrums.push(spect) - 1;
  981 +
  982 + return spect;
  983 + }
  984 +
  985 + /**
  986 + * checkOffset - get the offset below/above and left/right element depending on screen position
  987 + * Thanks https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js
  988 + */
  989 + function getOffset(picker, input) {
  990 + var extraY = 0;
  991 + var dpWidth = picker.outerWidth();
  992 + var dpHeight = picker.outerHeight();
  993 + var inputHeight = input.outerHeight();
  994 + var doc = picker[0].ownerDocument;
  995 + var docElem = doc.documentElement;
  996 + var viewWidth = docElem.clientWidth + $(doc).scrollLeft();
  997 + var viewHeight = docElem.clientHeight + $(doc).scrollTop();
  998 + var offset = input.offset();
  999 + var offsetLeft = offset.left;
  1000 + var offsetTop = offset.top;
  1001 +
  1002 + offsetTop += inputHeight;
  1003 +
  1004 + offsetLeft -=
  1005 + Math.min(offsetLeft, (offsetLeft + dpWidth > viewWidth && viewWidth > dpWidth) ?
  1006 + Math.abs(offsetLeft + dpWidth - viewWidth) : 0);
  1007 +
  1008 + offsetTop -=
  1009 + Math.min(offsetTop, ((offsetTop + dpHeight > viewHeight && viewHeight > dpHeight) ?
  1010 + Math.abs(dpHeight + inputHeight - extraY) : extraY));
  1011 +
  1012 + return {
  1013 + top: offsetTop,
  1014 + bottom: offset.bottom,
  1015 + left: offsetLeft,
  1016 + right: offset.right,
  1017 + width: offset.width,
  1018 + height: offset.height
  1019 + };
  1020 + }
  1021 +
  1022 + /**
  1023 + * noop - do nothing
  1024 + */
  1025 + function noop() {
  1026 +
  1027 + }
  1028 +
  1029 + /**
  1030 + * stopPropagation - makes the code only doing this a little easier to read in line
  1031 + */
  1032 + function stopPropagation(e) {
  1033 + e.stopPropagation();
  1034 + }
  1035 +
  1036 + /**
  1037 + * Create a function bound to a given object
  1038 + * Thanks to underscore.js
  1039 + */
  1040 + function bind(func, obj) {
  1041 + var slice = Array.prototype.slice;
  1042 + var args = slice.call(arguments, 2);
  1043 + return function () {
  1044 + return func.apply(obj, args.concat(slice.call(arguments)));
  1045 + };
  1046 + }
  1047 +
  1048 + /**
  1049 + * Lightweight drag helper. Handles containment within the element, so that
  1050 + * when dragging, the x is within [0,element.width] and y is within [0,element.height]
  1051 + */
  1052 + function draggable(element, onmove, onstart, onstop) {
  1053 + onmove = onmove || function () { };
  1054 + onstart = onstart || function () { };
  1055 + onstop = onstop || function () { };
  1056 + var doc = document;
  1057 + var dragging = false;
  1058 + var offset = {};
  1059 + var maxHeight = 0;
  1060 + var maxWidth = 0;
  1061 + var hasTouch = ('ontouchstart' in window);
  1062 +
  1063 + var duringDragEvents = {};
  1064 + duringDragEvents["selectstart"] = prevent;
  1065 + duringDragEvents["dragstart"] = prevent;
  1066 + duringDragEvents["touchmove mousemove"] = move;
  1067 + duringDragEvents["touchend mouseup"] = stop;
  1068 +
  1069 + function prevent(e) {
  1070 + if (e.stopPropagation) {
  1071 + e.stopPropagation();
  1072 + }
  1073 + if (e.preventDefault) {
  1074 + e.preventDefault();
  1075 + }
  1076 + e.returnValue = false;
  1077 + }
  1078 +
  1079 + function move(e) {
  1080 + if (dragging) {
  1081 + // Mouseup happened outside of window
  1082 + if (IE && doc.documentMode < 9 && !e.button) {
  1083 + return stop();
  1084 + }
  1085 +
  1086 + var t0 = e.originalEvent && e.originalEvent.touches && e.originalEvent.touches[0];
  1087 + var pageX = t0 && t0.pageX || e.pageX;
  1088 + var pageY = t0 && t0.pageY || e.pageY;
  1089 +
  1090 + var dragX = Math.max(0, Math.min(pageX - offset.left, maxWidth));
  1091 + var dragY = Math.max(0, Math.min(pageY - offset.top, maxHeight));
  1092 +
  1093 + if (hasTouch) {
  1094 + // Stop scrolling in iOS
  1095 + prevent(e);
  1096 + }
  1097 +
  1098 + onmove.apply(element, [dragX, dragY, e]);
  1099 + }
  1100 + }
  1101 +
  1102 + function start(e) {
  1103 + var rightclick = (e.which) ? (e.which == 3) : (e.button == 2);
  1104 +
  1105 + if (!rightclick && !dragging) {
  1106 + if (onstart.apply(element, arguments) !== false) {
  1107 + dragging = true;
  1108 + maxHeight = $(element).height();
  1109 + maxWidth = $(element).width();
  1110 + offset = $(element).offset();
  1111 +
  1112 + $(doc).on(duringDragEvents);
  1113 + $(doc.body).addClass("sp-dragging");
  1114 +
  1115 + move(e);
  1116 +
  1117 + prevent(e);
  1118 + }
  1119 + }
  1120 + }
  1121 +
  1122 + function stop() {
  1123 + if (dragging) {
  1124 + $(doc).off(duringDragEvents);
  1125 + $(doc.body).removeClass("sp-dragging");
  1126 +
  1127 + // Wait a tick before notifying observers to allow the click event
  1128 + // to fire in Chrome.
  1129 + setTimeout(function() {
  1130 + onstop.apply(element, arguments);
  1131 + }, 0);
  1132 + }
  1133 + dragging = false;
  1134 + }
  1135 +
  1136 + $(element).on("touchstart mousedown", start);
  1137 + }
  1138 +
  1139 + function throttle(func, wait, debounce) {
  1140 + var timeout;
  1141 + return function () {
  1142 + var context = this, args = arguments;
  1143 + var throttler = function () {
  1144 + timeout = null;
  1145 + func.apply(context, args);
  1146 + };
  1147 + if (debounce) clearTimeout(timeout);
  1148 + if (debounce || !timeout) timeout = setTimeout(throttler, wait);
  1149 + };
  1150 + }
  1151 +
  1152 + function inputTypeColorSupport() {
  1153 + return $.fn.spectrum.inputTypeColorSupport();
  1154 + }
  1155 +
  1156 + /**
  1157 + * Define a jQuery plugin
  1158 + */
  1159 + var dataID = "spectrum.id";
  1160 + $.fn.spectrum = function (opts, extra) {
  1161 +
  1162 + if (typeof opts == "string") {
  1163 +
  1164 + var returnValue = this;
  1165 + var args = Array.prototype.slice.call( arguments, 1 );
  1166 +
  1167 + this.each(function () {
  1168 + var spect = spectrums[$(this).data(dataID)];
  1169 + if (spect) {
  1170 + var method = spect[opts];
  1171 + if (!method) {
  1172 + throw new Error( "Spectrum: no such method: '" + opts + "'" );
  1173 + }
  1174 +
  1175 + if (opts == "get") {
  1176 + returnValue = spect.get();
  1177 + }
  1178 + else if (opts == "container") {
  1179 + returnValue = spect.container;
  1180 + }
  1181 + else if (opts == "option") {
  1182 + returnValue = spect.option.apply(spect, args);
  1183 + }
  1184 + else if (opts == "destroy") {
  1185 + spect.destroy();
  1186 + $(this).removeData(dataID);
  1187 + }
  1188 + else {
  1189 + method.apply(spect, args);
  1190 + }
  1191 + }
  1192 + });
  1193 +
  1194 + return returnValue;
  1195 + }
  1196 +
  1197 + // Initializing a new instance of spectrum
  1198 + return this.spectrum("destroy").each(function () {
  1199 + var options = $.extend({}, $(this).data(), opts);
  1200 + var spect = spectrum(this, options);
  1201 + $(this).data(dataID, spect.id);
  1202 + });
  1203 + };
  1204 +
  1205 + $.fn.spectrum.load = true;
  1206 + $.fn.spectrum.loadOpts = {};
  1207 + $.fn.spectrum.draggable = draggable;
  1208 + $.fn.spectrum.defaults = defaultOpts;
  1209 + $.fn.spectrum.inputTypeColorSupport = function inputTypeColorSupport() {
  1210 + if (typeof inputTypeColorSupport._cachedResult === "undefined") {
  1211 + var colorInput = $("<input type='color'/>")[0]; // if color element is supported, value will default to not null
  1212 + inputTypeColorSupport._cachedResult = colorInput.type === "color" && colorInput.value !== "";
  1213 + }
  1214 + return inputTypeColorSupport._cachedResult;
  1215 + };
  1216 +
  1217 + $.spectrum = { };
  1218 + $.spectrum.localization = { };
  1219 + $.spectrum.palettes = { };
  1220 +
  1221 + $.fn.spectrum.processNativeColorInputs = function () {
  1222 + var colorInputs = $("input[type=color]");
  1223 + if (colorInputs.length && !inputTypeColorSupport()) {
  1224 + colorInputs.spectrum({
  1225 + preferredFormat: "hex6"
  1226 + });
  1227 + }
  1228 + };
  1229 +
  1230 + // TinyColor v1.1.2
  1231 + // https://github.com/bgrins/TinyColor
  1232 + // Brian Grinstead, MIT License
  1233 +
  1234 + (function() {
  1235 +
  1236 + var trimLeft = /^[\s,#]+/,
  1237 + trimRight = /\s+$/,
  1238 + tinyCounter = 0,
  1239 + math = Math,
  1240 + mathRound = math.round,
  1241 + mathMin = math.min,
  1242 + mathMax = math.max,
  1243 + mathRandom = math.random;
  1244 +
  1245 + var tinycolor = function(color, opts) {
  1246 +
  1247 + color = (color) ? color : '';
  1248 + opts = opts || { };
  1249 +
  1250 + // If input is already a tinycolor, return itself
  1251 + if (color instanceof tinycolor) {
  1252 + return color;
  1253 + }
  1254 + // If we are called as a function, call using new instead
  1255 + if (!(this instanceof tinycolor)) {
  1256 + return new tinycolor(color, opts);
  1257 + }
  1258 +
  1259 + var rgb = inputToRGB(color);
  1260 + this._originalInput = color,
  1261 + this._r = rgb.r,
  1262 + this._g = rgb.g,
  1263 + this._b = rgb.b,
  1264 + this._a = rgb.a,
  1265 + this._roundA = mathRound(1000 * this._a) / 1000,
  1266 + this._format = opts.format || rgb.format;
  1267 + this._gradientType = opts.gradientType;
  1268 +
  1269 + // Don't let the range of [0,255] come back in [0,1].
  1270 + // Potentially lose a little bit of precision here, but will fix issues where
  1271 + // .5 gets interpreted as half of the total, instead of half of 1
  1272 + // If it was supposed to be 128, this was already taken care of by `inputToRgb`
  1273 + if (this._r < 1) { this._r = mathRound(this._r); }
  1274 + if (this._g < 1) { this._g = mathRound(this._g); }
  1275 + if (this._b < 1) { this._b = mathRound(this._b); }
  1276 +
  1277 + this._ok = rgb.ok;
  1278 + this._tc_id = tinyCounter++;
  1279 + };
  1280 +
  1281 + tinycolor.prototype = {
  1282 + isDark: function() {
  1283 + return this.getBrightness() < 128;
  1284 + },
  1285 + isLight: function() {
  1286 + return !this.isDark();
  1287 + },
  1288 + isValid: function() {
  1289 + return this._ok;
  1290 + },
  1291 + getOriginalInput: function() {
  1292 + return this._originalInput;
  1293 + },
  1294 + getFormat: function() {
  1295 + return this._format;
  1296 + },
  1297 + getAlpha: function() {
  1298 + return this._a;
  1299 + },
  1300 + getBrightness: function() {
  1301 + var rgb = this.toRgb();
  1302 + return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
  1303 + },
  1304 + setAlpha: function(value) {
  1305 + this._a = boundAlpha(value);
  1306 + this._roundA = mathRound(1000 * this._a) / 1000;
  1307 + return this;
  1308 + },
  1309 + toHsv: function() {
  1310 + var hsv = rgbToHsv(this._r, this._g, this._b);
  1311 + return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
  1312 + },
  1313 + toHsvString: function() {
  1314 + var hsv = rgbToHsv(this._r, this._g, this._b);
  1315 + var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
  1316 + return (this._a == 1) ?
  1317 + "hsv(" + h + ", " + s + "%, " + v + "%)" :
  1318 + "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";
  1319 + },
  1320 + toHsl: function() {
  1321 + var hsl = rgbToHsl(this._r, this._g, this._b);
  1322 + return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
  1323 + },
  1324 + toHslString: function() {
  1325 + var hsl = rgbToHsl(this._r, this._g, this._b);
  1326 + var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
  1327 + return (this._a == 1) ?
  1328 + "hsl(" + h + ", " + s + "%, " + l + "%)" :
  1329 + "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";
  1330 + },
  1331 + toHex: function(allow3Char) {
  1332 + return rgbToHex(this._r, this._g, this._b, allow3Char);
  1333 + },
  1334 + toHexString: function(allow3Char) {
  1335 + return '#' + this.toHex(allow3Char);
  1336 + },
  1337 + toHex8: function() {
  1338 + return rgbaToHex(this._r, this._g, this._b, this._a);
  1339 + },
  1340 + toHex8String: function() {
  1341 + return '#' + this.toHex8();
  1342 + },
  1343 + toRgb: function() {
  1344 + return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
  1345 + },
  1346 + toRgbString: function() {
  1347 + return (this._a == 1) ?
  1348 + "rgb(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
  1349 + "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
  1350 + },
  1351 + toPercentageRgb: function() {
  1352 + return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
  1353 + },
  1354 + toPercentageRgbString: function() {
  1355 + return (this._a == 1) ?
  1356 + "rgb(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
  1357 + "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
  1358 + },
  1359 + toName: function() {
  1360 + if (this._a === 0) {
  1361 + return "transparent";
  1362 + }
  1363 +
  1364 + if (this._a < 1) {
  1365 + return false;
  1366 + }
  1367 +
  1368 + return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
  1369 + },
  1370 + toFilter: function(secondColor) {
  1371 + var hex8String = '#' + rgbaToHex(this._r, this._g, this._b, this._a);
  1372 + var secondHex8String = hex8String;
  1373 + var gradientType = this._gradientType ? "GradientType = 1, " : "";
  1374 +
  1375 + if (secondColor) {
  1376 + var s = tinycolor(secondColor);
  1377 + secondHex8String = s.toHex8String();
  1378 + }
  1379 +
  1380 + return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";
  1381 + },
  1382 + toString: function(format) {
  1383 + var formatSet = !!format;
  1384 + format = format || this._format;
  1385 +
  1386 + var formattedString = false;
  1387 + var hasAlpha = this._a < 1 && this._a >= 0;
  1388 + var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "name");
  1389 +
  1390 + if (needsAlphaFormat) {
  1391 + // Special case for "transparent", all other non-alpha formats
  1392 + // will return rgba when there is transparency.
  1393 + if (format === "name" && this._a === 0) {
  1394 + return this.toName();
  1395 + }
  1396 + return this.toRgbString();
  1397 + }
  1398 + if (format === "rgb") {
  1399 + formattedString = this.toRgbString();
  1400 + }
  1401 + if (format === "prgb") {
  1402 + formattedString = this.toPercentageRgbString();
  1403 + }
  1404 + if (format === "hex" || format === "hex6") {
  1405 + formattedString = this.toHexString();
  1406 + }
  1407 + if (format === "hex3") {
  1408 + formattedString = this.toHexString(true);
  1409 + }
  1410 + if (format === "hex8") {
  1411 + formattedString = this.toHex8String();
  1412 + }
  1413 + if (format === "name") {
  1414 + formattedString = this.toName();
  1415 + }
  1416 + if (format === "hsl") {
  1417 + formattedString = this.toHslString();
  1418 + }
  1419 + if (format === "hsv") {
  1420 + formattedString = this.toHsvString();
  1421 + }
  1422 +
  1423 + return formattedString || this.toHexString();
  1424 + },
  1425 +
  1426 + _applyModification: function(fn, args) {
  1427 + var color = fn.apply(null, [this].concat([].slice.call(args)));
  1428 + this._r = color._r;
  1429 + this._g = color._g;
  1430 + this._b = color._b;
  1431 + this.setAlpha(color._a);
  1432 + return this;
  1433 + },
  1434 + lighten: function() {
  1435 + return this._applyModification(lighten, arguments);
  1436 + },
  1437 + brighten: function() {
  1438 + return this._applyModification(brighten, arguments);
  1439 + },
  1440 + darken: function() {
  1441 + return this._applyModification(darken, arguments);
  1442 + },
  1443 + desaturate: function() {
  1444 + return this._applyModification(desaturate, arguments);
  1445 + },
  1446 + saturate: function() {
  1447 + return this._applyModification(saturate, arguments);
  1448 + },
  1449 + greyscale: function() {
  1450 + return this._applyModification(greyscale, arguments);
  1451 + },
  1452 + spin: function() {
  1453 + return this._applyModification(spin, arguments);
  1454 + },
  1455 +
  1456 + _applyCombination: function(fn, args) {
  1457 + return fn.apply(null, [this].concat([].slice.call(args)));
  1458 + },
  1459 + analogous: function() {
  1460 + return this._applyCombination(analogous, arguments);
  1461 + },
  1462 + complement: function() {
  1463 + return this._applyCombination(complement, arguments);
  1464 + },
  1465 + monochromatic: function() {
  1466 + return this._applyCombination(monochromatic, arguments);
  1467 + },
  1468 + splitcomplement: function() {
  1469 + return this._applyCombination(splitcomplement, arguments);
  1470 + },
  1471 + triad: function() {
  1472 + return this._applyCombination(triad, arguments);
  1473 + },
  1474 + tetrad: function() {
  1475 + return this._applyCombination(tetrad, arguments);
  1476 + }
  1477 + };
  1478 +
  1479 + // If input is an object, force 1 into "1.0" to handle ratios properly
  1480 + // String input requires "1.0" as input, so 1 will be treated as 1
  1481 + tinycolor.fromRatio = function(color, opts) {
  1482 + if (typeof color == "object") {
  1483 + var newColor = {};
  1484 + for (var i in color) {
  1485 + if (color.hasOwnProperty(i)) {
  1486 + if (i === "a") {
  1487 + newColor[i] = color[i];
  1488 + }
  1489 + else {
  1490 + newColor[i] = convertToPercentage(color[i]);
  1491 + }
  1492 + }
  1493 + }
  1494 + color = newColor;
  1495 + }
  1496 +
  1497 + return tinycolor(color, opts);
  1498 + };
  1499 +
  1500 + // Given a string or object, convert that input to RGB
  1501 + // Possible string inputs:
  1502 + //
  1503 + // "red"
  1504 + // "#f00" or "f00"
  1505 + // "#ff0000" or "ff0000"
  1506 + // "#ff000000" or "ff000000"
  1507 + // "rgb 255 0 0" or "rgb (255, 0, 0)"
  1508 + // "rgb 1.0 0 0" or "rgb (1, 0, 0)"
  1509 + // "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
  1510 + // "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
  1511 + // "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
  1512 + // "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
  1513 + // "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
  1514 + //
  1515 + function inputToRGB(color) {
  1516 +
  1517 + var rgb = { r: 0, g: 0, b: 0 };
  1518 + var a = 1;
  1519 + var ok = false;
  1520 + var format = false;
  1521 +
  1522 + if (typeof color == "string") {
  1523 + color = stringInputToObject(color);
  1524 + }
  1525 +
  1526 + if (typeof color == "object") {
  1527 + if (color.hasOwnProperty("r") && color.hasOwnProperty("g") && color.hasOwnProperty("b")) {
  1528 + rgb = rgbToRgb(color.r, color.g, color.b);
  1529 + ok = true;
  1530 + format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
  1531 + }
  1532 + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("v")) {
  1533 + color.s = convertToPercentage(color.s);
  1534 + color.v = convertToPercentage(color.v);
  1535 + rgb = hsvToRgb(color.h, color.s, color.v);
  1536 + ok = true;
  1537 + format = "hsv";
  1538 + }
  1539 + else if (color.hasOwnProperty("h") && color.hasOwnProperty("s") && color.hasOwnProperty("l")) {
  1540 + color.s = convertToPercentage(color.s);
  1541 + color.l = convertToPercentage(color.l);
  1542 + rgb = hslToRgb(color.h, color.s, color.l);
  1543 + ok = true;
  1544 + format = "hsl";
  1545 + }
  1546 +
  1547 + if (color.hasOwnProperty("a")) {
  1548 + a = color.a;
  1549 + }
  1550 + }
  1551 +
  1552 + a = boundAlpha(a);
  1553 +
  1554 + return {
  1555 + ok: ok,
  1556 + format: color.format || format,
  1557 + r: mathMin(255, mathMax(rgb.r, 0)),
  1558 + g: mathMin(255, mathMax(rgb.g, 0)),
  1559 + b: mathMin(255, mathMax(rgb.b, 0)),
  1560 + a: a
  1561 + };
  1562 + }
  1563 +
  1564 +
  1565 + // Conversion Functions
  1566 + // --------------------
  1567 +
  1568 + // `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:
  1569 + // <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
  1570 +
  1571 + // `rgbToRgb`
  1572 + // Handle bounds / percentage checking to conform to CSS color spec
  1573 + // <http://www.w3.org/TR/css3-color/>
  1574 + // *Assumes:* r, g, b in [0, 255] or [0, 1]
  1575 + // *Returns:* { r, g, b } in [0, 255]
  1576 + function rgbToRgb(r, g, b){
  1577 + return {
  1578 + r: bound01(r, 255) * 255,
  1579 + g: bound01(g, 255) * 255,
  1580 + b: bound01(b, 255) * 255
  1581 + };
  1582 + }
  1583 +
  1584 + // `rgbToHsl`
  1585 + // Converts an RGB color value to HSL.
  1586 + // *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
  1587 + // *Returns:* { h, s, l } in [0,1]
  1588 + function rgbToHsl(r, g, b) {
  1589 +
  1590 + r = bound01(r, 255);
  1591 + g = bound01(g, 255);
  1592 + b = bound01(b, 255);
  1593 +
  1594 + var max = mathMax(r, g, b), min = mathMin(r, g, b);
  1595 + var h, s, l = (max + min) / 2;
  1596 +
  1597 + if(max == min) {
  1598 + h = s = 0; // achromatic
  1599 + }
  1600 + else {
  1601 + var d = max - min;
  1602 + s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
  1603 + switch(max) {
  1604 + case r: h = (g - b) / d + (g < b ? 6 : 0); break;
  1605 + case g: h = (b - r) / d + 2; break;
  1606 + case b: h = (r - g) / d + 4; break;
  1607 + }
  1608 +
  1609 + h /= 6;
  1610 + }
  1611 +
  1612 + return { h: h, s: s, l: l };
  1613 + }
  1614 +
  1615 + // `hslToRgb`
  1616 + // Converts an HSL color value to RGB.
  1617 + // *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
  1618 + // *Returns:* { r, g, b } in the set [0, 255]
  1619 + function hslToRgb(h, s, l) {
  1620 + var r, g, b;
  1621 +
  1622 + h = bound01(h, 360);
  1623 + s = bound01(s, 100);
  1624 + l = bound01(l, 100);
  1625 +
  1626 + function hue2rgb(p, q, t) {
  1627 + if(t < 0) t += 1;
  1628 + if(t > 1) t -= 1;
  1629 + if(t < 1/6) return p + (q - p) * 6 * t;
  1630 + if(t < 1/2) return q;
  1631 + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
  1632 + return p;
  1633 + }
  1634 +
  1635 + if(s === 0) {
  1636 + r = g = b = l; // achromatic
  1637 + }
  1638 + else {
  1639 + var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
  1640 + var p = 2 * l - q;
  1641 + r = hue2rgb(p, q, h + 1/3);
  1642 + g = hue2rgb(p, q, h);
  1643 + b = hue2rgb(p, q, h - 1/3);
  1644 + }
  1645 +
  1646 + return { r: r * 255, g: g * 255, b: b * 255 };
  1647 + }
  1648 +
  1649 + // `rgbToHsv`
  1650 + // Converts an RGB color value to HSV
  1651 + // *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
  1652 + // *Returns:* { h, s, v } in [0,1]
  1653 + function rgbToHsv(r, g, b) {
  1654 +
  1655 + r = bound01(r, 255);
  1656 + g = bound01(g, 255);
  1657 + b = bound01(b, 255);
  1658 +
  1659 + var max = mathMax(r, g, b), min = mathMin(r, g, b);
  1660 + var h, s, v = max;
  1661 +
  1662 + var d = max - min;
  1663 + s = max === 0 ? 0 : d / max;
  1664 +
  1665 + if(max == min) {
  1666 + h = 0; // achromatic
  1667 + }
  1668 + else {
  1669 + switch(max) {
  1670 + case r: h = (g - b) / d + (g < b ? 6 : 0); break;
  1671 + case g: h = (b - r) / d + 2; break;
  1672 + case b: h = (r - g) / d + 4; break;
  1673 + }
  1674 + h /= 6;
  1675 + }
  1676 + return { h: h, s: s, v: v };
  1677 + }
  1678 +
  1679 + // `hsvToRgb`
  1680 + // Converts an HSV color value to RGB.
  1681 + // *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
  1682 + // *Returns:* { r, g, b } in the set [0, 255]
  1683 + function hsvToRgb(h, s, v) {
  1684 +
  1685 + h = bound01(h, 360) * 6;
  1686 + s = bound01(s, 100);
  1687 + v = bound01(v, 100);
  1688 +
  1689 + var i = math.floor(h),
  1690 + f = h - i,
  1691 + p = v * (1 - s),
  1692 + q = v * (1 - f * s),
  1693 + t = v * (1 - (1 - f) * s),
  1694 + mod = i % 6,
  1695 + r = [v, q, p, p, t, v][mod],
  1696 + g = [t, v, v, q, p, p][mod],
  1697 + b = [p, p, t, v, v, q][mod];
  1698 +
  1699 + return { r: r * 255, g: g * 255, b: b * 255 };
  1700 + }
  1701 +
  1702 + // `rgbToHex`
  1703 + // Converts an RGB color to hex
  1704 + // Assumes r, g, and b are contained in the set [0, 255]
  1705 + // Returns a 3 or 6 character hex
  1706 + function rgbToHex(r, g, b, allow3Char) {
  1707 +
  1708 + var hex = [
  1709 + pad2(mathRound(r).toString(16)),
  1710 + pad2(mathRound(g).toString(16)),
  1711 + pad2(mathRound(b).toString(16))
  1712 + ];
  1713 +
  1714 + // Return a 3 character hex if possible
  1715 + if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
  1716 + return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
  1717 + }
  1718 +
  1719 + return hex.join("");
  1720 + }
  1721 + // `rgbaToHex`
  1722 + // Converts an RGBA color plus alpha transparency to hex
  1723 + // Assumes r, g, b and a are contained in the set [0, 255]
  1724 + // Returns an 8 character hex
  1725 + function rgbaToHex(r, g, b, a) {
  1726 +
  1727 + var hex = [
  1728 + pad2(convertDecimalToHex(a)),
  1729 + pad2(mathRound(r).toString(16)),
  1730 + pad2(mathRound(g).toString(16)),
  1731 + pad2(mathRound(b).toString(16))
  1732 + ];
  1733 +
  1734 + return hex.join("");
  1735 + }
  1736 +
  1737 + // `equals`
  1738 + // Can be called with any tinycolor input
  1739 + tinycolor.equals = function (color1, color2) {
  1740 + if (!color1 || !color2) { return false; }
  1741 + return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
  1742 + };
  1743 + tinycolor.random = function() {
  1744 + return tinycolor.fromRatio({
  1745 + r: mathRandom(),
  1746 + g: mathRandom(),
  1747 + b: mathRandom()
  1748 + });
  1749 + };
  1750 +
  1751 +
  1752 + // Modification Functions
  1753 + // ----------------------
  1754 + // Thanks to less.js for some of the basics here
  1755 + // <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
  1756 +
  1757 + function desaturate(color, amount) {
  1758 + amount = (amount === 0) ? 0 : (amount || 10);
  1759 + var hsl = tinycolor(color).toHsl();
  1760 + hsl.s -= amount / 100;
  1761 + hsl.s = clamp01(hsl.s);
  1762 + return tinycolor(hsl);
  1763 + }
  1764 +
  1765 + function saturate(color, amount) {
  1766 + amount = (amount === 0) ? 0 : (amount || 10);
  1767 + var hsl = tinycolor(color).toHsl();
  1768 + hsl.s += amount / 100;
  1769 + hsl.s = clamp01(hsl.s);
  1770 + return tinycolor(hsl);
  1771 + }
  1772 +
  1773 + function greyscale(color) {
  1774 + return tinycolor(color).desaturate(100);
  1775 + }
  1776 +
  1777 + function lighten (color, amount) {
  1778 + amount = (amount === 0) ? 0 : (amount || 10);
  1779 + var hsl = tinycolor(color).toHsl();
  1780 + hsl.l += amount / 100;
  1781 + hsl.l = clamp01(hsl.l);
  1782 + return tinycolor(hsl);
  1783 + }
  1784 +
  1785 + function brighten(color, amount) {
  1786 + amount = (amount === 0) ? 0 : (amount || 10);
  1787 + var rgb = tinycolor(color).toRgb();
  1788 + rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));
  1789 + rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));
  1790 + rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));
  1791 + return tinycolor(rgb);
  1792 + }
  1793 +
  1794 + function darken (color, amount) {
  1795 + amount = (amount === 0) ? 0 : (amount || 10);
  1796 + var hsl = tinycolor(color).toHsl();
  1797 + hsl.l -= amount / 100;
  1798 + hsl.l = clamp01(hsl.l);
  1799 + return tinycolor(hsl);
  1800 + }
  1801 +
  1802 + // Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
  1803 + // Values outside of this range will be wrapped into this range.
  1804 + function spin(color, amount) {
  1805 + var hsl = tinycolor(color).toHsl();
  1806 + var hue = (mathRound(hsl.h) + amount) % 360;
  1807 + hsl.h = hue < 0 ? 360 + hue : hue;
  1808 + return tinycolor(hsl);
  1809 + }
  1810 +
  1811 + // Combination Functions
  1812 + // ---------------------
  1813 + // Thanks to jQuery xColor for some of the ideas behind these
  1814 + // <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
  1815 +
  1816 + function complement(color) {
  1817 + var hsl = tinycolor(color).toHsl();
  1818 + hsl.h = (hsl.h + 180) % 360;
  1819 + return tinycolor(hsl);
  1820 + }
  1821 +
  1822 + function triad(color) {
  1823 + var hsl = tinycolor(color).toHsl();
  1824 + var h = hsl.h;
  1825 + return [
  1826 + tinycolor(color),
  1827 + tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
  1828 + tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
  1829 + ];
  1830 + }
  1831 +
  1832 + function tetrad(color) {
  1833 + var hsl = tinycolor(color).toHsl();
  1834 + var h = hsl.h;
  1835 + return [
  1836 + tinycolor(color),
  1837 + tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
  1838 + tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
  1839 + tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
  1840 + ];
  1841 + }
  1842 +
  1843 + function splitcomplement(color) {
  1844 + var hsl = tinycolor(color).toHsl();
  1845 + var h = hsl.h;
  1846 + return [
  1847 + tinycolor(color),
  1848 + tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
  1849 + tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
  1850 + ];
  1851 + }
  1852 +
  1853 + function analogous(color, results, slices) {
  1854 + results = results || 6;
  1855 + slices = slices || 30;
  1856 +
  1857 + var hsl = tinycolor(color).toHsl();
  1858 + var part = 360 / slices;
  1859 + var ret = [tinycolor(color)];
  1860 +
  1861 + for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
  1862 + hsl.h = (hsl.h + part) % 360;
  1863 + ret.push(tinycolor(hsl));
  1864 + }
  1865 + return ret;
  1866 + }
  1867 +
  1868 + function monochromatic(color, results) {
  1869 + results = results || 6;
  1870 + var hsv = tinycolor(color).toHsv();
  1871 + var h = hsv.h, s = hsv.s, v = hsv.v;
  1872 + var ret = [];
  1873 + var modification = 1 / results;
  1874 +
  1875 + while (results--) {
  1876 + ret.push(tinycolor({ h: h, s: s, v: v}));
  1877 + v = (v + modification) % 1;
  1878 + }
  1879 +
  1880 + return ret;
  1881 + }
  1882 +
  1883 + // Utility Functions
  1884 + // ---------------------
  1885 +
  1886 + tinycolor.mix = function(color1, color2, amount) {
  1887 + amount = (amount === 0) ? 0 : (amount || 50);
  1888 +
  1889 + var rgb1 = tinycolor(color1).toRgb();
  1890 + var rgb2 = tinycolor(color2).toRgb();
  1891 +
  1892 + var p = amount / 100;
  1893 + var w = p * 2 - 1;
  1894 + var a = rgb2.a - rgb1.a;
  1895 +
  1896 + var w1;
  1897 +
  1898 + if (w * a == -1) {
  1899 + w1 = w;
  1900 + } else {
  1901 + w1 = (w + a) / (1 + w * a);
  1902 + }
  1903 +
  1904 + w1 = (w1 + 1) / 2;
  1905 +
  1906 + var w2 = 1 - w1;
  1907 +
  1908 + var rgba = {
  1909 + r: rgb2.r * w1 + rgb1.r * w2,
  1910 + g: rgb2.g * w1 + rgb1.g * w2,
  1911 + b: rgb2.b * w1 + rgb1.b * w2,
  1912 + a: rgb2.a * p + rgb1.a * (1 - p)
  1913 + };
  1914 +
  1915 + return tinycolor(rgba);
  1916 + };
  1917 +
  1918 +
  1919 + // Readability Functions
  1920 + // ---------------------
  1921 + // <http://www.w3.org/TR/AERT#color-contrast>
  1922 +
  1923 + // `readability`
  1924 + // Analyze the 2 colors and returns an object with the following properties:
  1925 + // `brightness`: difference in brightness between the two colors
  1926 + // `color`: difference in color/hue between the two colors
  1927 + tinycolor.readability = function(color1, color2) {
  1928 + var c1 = tinycolor(color1);
  1929 + var c2 = tinycolor(color2);
  1930 + var rgb1 = c1.toRgb();
  1931 + var rgb2 = c2.toRgb();
  1932 + var brightnessA = c1.getBrightness();
  1933 + var brightnessB = c2.getBrightness();
  1934 + var colorDiff = (
  1935 + Math.max(rgb1.r, rgb2.r) - Math.min(rgb1.r, rgb2.r) +
  1936 + Math.max(rgb1.g, rgb2.g) - Math.min(rgb1.g, rgb2.g) +
  1937 + Math.max(rgb1.b, rgb2.b) - Math.min(rgb1.b, rgb2.b)
  1938 + );
  1939 +
  1940 + return {
  1941 + brightness: Math.abs(brightnessA - brightnessB),
  1942 + color: colorDiff
  1943 + };
  1944 + };
  1945 +
  1946 + // `readable`
  1947 + // http://www.w3.org/TR/AERT#color-contrast
  1948 + // Ensure that foreground and background color combinations provide sufficient contrast.
  1949 + // *Example*
  1950 + // tinycolor.isReadable("#000", "#111") => false
  1951 + tinycolor.isReadable = function(color1, color2) {
  1952 + var readability = tinycolor.readability(color1, color2);
  1953 + return readability.brightness > 125 && readability.color > 500;
  1954 + };
  1955 +
  1956 + // `mostReadable`
  1957 + // Given a base color and a list of possible foreground or background
  1958 + // colors for that base, returns the most readable color.
  1959 + // *Example*
  1960 + // tinycolor.mostReadable("#123", ["#fff", "#000"]) => "#000"
  1961 + tinycolor.mostReadable = function(baseColor, colorList) {
  1962 + var bestColor = null;
  1963 + var bestScore = 0;
  1964 + var bestIsReadable = false;
  1965 + for (var i=0; i < colorList.length; i++) {
  1966 +
  1967 + // We normalize both around the "acceptable" breaking point,
  1968 + // but rank brightness constrast higher than hue.
  1969 +
  1970 + var readability = tinycolor.readability(baseColor, colorList[i]);
  1971 + var readable = readability.brightness > 125 && readability.color > 500;
  1972 + var score = 3 * (readability.brightness / 125) + (readability.color / 500);
  1973 +
  1974 + if ((readable && ! bestIsReadable) ||
  1975 + (readable && bestIsReadable && score > bestScore) ||
  1976 + ((! readable) && (! bestIsReadable) && score > bestScore)) {
  1977 + bestIsReadable = readable;
  1978 + bestScore = score;
  1979 + bestColor = tinycolor(colorList[i]);
  1980 + }
  1981 + }
  1982 + return bestColor;
  1983 + };
  1984 +
  1985 +
  1986 + // Big List of Colors
  1987 + // ------------------
  1988 + // <http://www.w3.org/TR/css3-color/#svg-color>
  1989 + var names = tinycolor.names = {
  1990 + aliceblue: "f0f8ff",
  1991 + antiquewhite: "faebd7",
  1992 + aqua: "0ff",
  1993 + aquamarine: "7fffd4",
  1994 + azure: "f0ffff",
  1995 + beige: "f5f5dc",
  1996 + bisque: "ffe4c4",
  1997 + black: "000",
  1998 + blanchedalmond: "ffebcd",
  1999 + blue: "00f",
  2000 + blueviolet: "8a2be2",
  2001 + brown: "a52a2a",
  2002 + burlywood: "deb887",
  2003 + burntsienna: "ea7e5d",
  2004 + cadetblue: "5f9ea0",
  2005 + chartreuse: "7fff00",
  2006 + chocolate: "d2691e",
  2007 + coral: "ff7f50",
  2008 + cornflowerblue: "6495ed",
  2009 + cornsilk: "fff8dc",
  2010 + crimson: "dc143c",
  2011 + cyan: "0ff",
  2012 + darkblue: "00008b",
  2013 + darkcyan: "008b8b",
  2014 + darkgoldenrod: "b8860b",
  2015 + darkgray: "a9a9a9",
  2016 + darkgreen: "006400",
  2017 + darkgrey: "a9a9a9",
  2018 + darkkhaki: "bdb76b",
  2019 + darkmagenta: "8b008b",
  2020 + darkolivegreen: "556b2f",
  2021 + darkorange: "ff8c00",
  2022 + darkorchid: "9932cc",
  2023 + darkred: "8b0000",
  2024 + darksalmon: "e9967a",
  2025 + darkseagreen: "8fbc8f",
  2026 + darkslateblue: "483d8b",
  2027 + darkslategray: "2f4f4f",
  2028 + darkslategrey: "2f4f4f",
  2029 + darkturquoise: "00ced1",
  2030 + darkviolet: "9400d3",
  2031 + deeppink: "ff1493",
  2032 + deepskyblue: "00bfff",
  2033 + dimgray: "696969",
  2034 + dimgrey: "696969",
  2035 + dodgerblue: "1e90ff",
  2036 + firebrick: "b22222",
  2037 + floralwhite: "fffaf0",
  2038 + forestgreen: "228b22",
  2039 + fuchsia: "f0f",
  2040 + gainsboro: "dcdcdc",
  2041 + ghostwhite: "f8f8ff",
  2042 + gold: "ffd700",
  2043 + goldenrod: "daa520",
  2044 + gray: "808080",
  2045 + green: "008000",
  2046 + greenyellow: "adff2f",
  2047 + grey: "808080",
  2048 + honeydew: "f0fff0",
  2049 + hotpink: "ff69b4",
  2050 + indianred: "cd5c5c",
  2051 + indigo: "4b0082",
  2052 + ivory: "fffff0",
  2053 + khaki: "f0e68c",
  2054 + lavender: "e6e6fa",
  2055 + lavenderblush: "fff0f5",
  2056 + lawngreen: "7cfc00",
  2057 + lemonchiffon: "fffacd",
  2058 + lightblue: "add8e6",
  2059 + lightcoral: "f08080",
  2060 + lightcyan: "e0ffff",
  2061 + lightgoldenrodyellow: "fafad2",
  2062 + lightgray: "d3d3d3",
  2063 + lightgreen: "90ee90",
  2064 + lightgrey: "d3d3d3",
  2065 + lightpink: "ffb6c1",
  2066 + lightsalmon: "ffa07a",
  2067 + lightseagreen: "20b2aa",
  2068 + lightskyblue: "87cefa",
  2069 + lightslategray: "789",
  2070 + lightslategrey: "789",
  2071 + lightsteelblue: "b0c4de",
  2072 + lightyellow: "ffffe0",
  2073 + lime: "0f0",
  2074 + limegreen: "32cd32",
  2075 + linen: "faf0e6",
  2076 + magenta: "f0f",
  2077 + maroon: "800000",
  2078 + mediumaquamarine: "66cdaa",
  2079 + mediumblue: "0000cd",
  2080 + mediumorchid: "ba55d3",
  2081 + mediumpurple: "9370db",
  2082 + mediumseagreen: "3cb371",
  2083 + mediumslateblue: "7b68ee",
  2084 + mediumspringgreen: "00fa9a",
  2085 + mediumturquoise: "48d1cc",
  2086 + mediumvioletred: "c71585",
  2087 + midnightblue: "191970",
  2088 + mintcream: "f5fffa",
  2089 + mistyrose: "ffe4e1",
  2090 + moccasin: "ffe4b5",
  2091 + navajowhite: "ffdead",
  2092 + navy: "000080",
  2093 + oldlace: "fdf5e6",
  2094 + olive: "808000",
  2095 + olivedrab: "6b8e23",
  2096 + orange: "ffa500",
  2097 + orangered: "ff4500",
  2098 + orchid: "da70d6",
  2099 + palegoldenrod: "eee8aa",
  2100 + palegreen: "98fb98",
  2101 + paleturquoise: "afeeee",
  2102 + palevioletred: "db7093",
  2103 + papayawhip: "ffefd5",
  2104 + peachpuff: "ffdab9",
  2105 + peru: "cd853f",
  2106 + pink: "ffc0cb",
  2107 + plum: "dda0dd",
  2108 + powderblue: "b0e0e6",
  2109 + purple: "800080",
  2110 + rebeccapurple: "663399",
  2111 + red: "f00",
  2112 + rosybrown: "bc8f8f",
  2113 + royalblue: "4169e1",
  2114 + saddlebrown: "8b4513",
  2115 + salmon: "fa8072",
  2116 + sandybrown: "f4a460",
  2117 + seagreen: "2e8b57",
  2118 + seashell: "fff5ee",
  2119 + sienna: "a0522d",
  2120 + silver: "c0c0c0",
  2121 + skyblue: "87ceeb",
  2122 + slateblue: "6a5acd",
  2123 + slategray: "708090",
  2124 + slategrey: "708090",
  2125 + snow: "fffafa",
  2126 + springgreen: "00ff7f",
  2127 + steelblue: "4682b4",
  2128 + tan: "d2b48c",
  2129 + teal: "008080",
  2130 + thistle: "d8bfd8",
  2131 + tomato: "ff6347",
  2132 + turquoise: "40e0d0",
  2133 + violet: "ee82ee",
  2134 + wheat: "f5deb3",
  2135 + white: "fff",
  2136 + whitesmoke: "f5f5f5",
  2137 + yellow: "ff0",
  2138 + yellowgreen: "9acd32"
  2139 + };
  2140 +
  2141 + // Make it easy to access colors via `hexNames[hex]`
  2142 + var hexNames = tinycolor.hexNames = flip(names);
  2143 +
  2144 +
  2145 + // Utilities
  2146 + // ---------
  2147 +
  2148 + // `{ 'name1': 'val1' }` becomes `{ 'val1': 'name1' }`
  2149 + function flip(o) {
  2150 + var flipped = { };
  2151 + for (var i in o) {
  2152 + if (o.hasOwnProperty(i)) {
  2153 + flipped[o[i]] = i;
  2154 + }
  2155 + }
  2156 + return flipped;
  2157 + }
  2158 +
  2159 + // Return a valid alpha value [0,1] with all invalid values being set to 1
  2160 + function boundAlpha(a) {
  2161 + a = parseFloat(a);
  2162 +
  2163 + if (isNaN(a) || a < 0 || a > 1) {
  2164 + a = 1;
  2165 + }
  2166 +
  2167 + return a;
  2168 + }
  2169 +
  2170 + // Take input from [0, n] and return it as [0, 1]
  2171 + function bound01(n, max) {
  2172 + if (isOnePointZero(n)) { n = "100%"; }
  2173 +
  2174 + var processPercent = isPercentage(n);
  2175 + n = mathMin(max, mathMax(0, parseFloat(n)));
  2176 +
  2177 + // Automatically convert percentage into number
  2178 + if (processPercent) {
  2179 + n = parseInt(n * max, 10) / 100;
  2180 + }
  2181 +
  2182 + // Handle floating point rounding errors
  2183 + if ((math.abs(n - max) < 0.000001)) {
  2184 + return 1;
  2185 + }
  2186 +
  2187 + // Convert into [0, 1] range if it isn't already
  2188 + return (n % max) / parseFloat(max);
  2189 + }
  2190 +
  2191 + // Force a number between 0 and 1
  2192 + function clamp01(val) {
  2193 + return mathMin(1, mathMax(0, val));
  2194 + }
  2195 +
  2196 + // Parse a base-16 hex value into a base-10 integer
  2197 + function parseIntFromHex(val) {
  2198 + return parseInt(val, 16);
  2199 + }
  2200 +
  2201 + // Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
  2202 + // <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
  2203 + function isOnePointZero(n) {
  2204 + return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
  2205 + }
  2206 +
  2207 + // Check to see if string passed in is a percentage
  2208 + function isPercentage(n) {
  2209 + return typeof n === "string" && n.indexOf('%') != -1;
  2210 + }
  2211 +
  2212 + // Force a hex value to have 2 characters
  2213 + function pad2(c) {
  2214 + return c.length == 1 ? '0' + c : '' + c;
  2215 + }
  2216 +
  2217 + // Replace a decimal with it's percentage value
  2218 + function convertToPercentage(n) {
  2219 + if (n <= 1) {
  2220 + n = (n * 100) + "%";
  2221 + }
  2222 +
  2223 + return n;
  2224 + }
  2225 +
  2226 + // Converts a decimal to a hex value
  2227 + function convertDecimalToHex(d) {
  2228 + return Math.round(parseFloat(d) * 255).toString(16);
  2229 + }
  2230 + // Converts a hex value to a decimal
  2231 + function convertHexToDecimal(h) {
  2232 + return (parseIntFromHex(h) / 255);
  2233 + }
  2234 +
  2235 + var matchers = (function() {
  2236 +
  2237 + // <http://www.w3.org/TR/css3-values/#integers>
  2238 + var CSS_INTEGER = "[-\\+]?\\d+%?";
  2239 +
  2240 + // <http://www.w3.org/TR/css3-values/#number-value>
  2241 + var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
  2242 +
  2243 + // Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.
  2244 + var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
  2245 +
  2246 + // Actual matching.
  2247 + // Parentheses and commas are optional, but not required.
  2248 + // Whitespace can take the place of commas or opening paren
  2249 + var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
  2250 + var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
  2251 +
  2252 + return {
  2253 + rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
  2254 + rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
  2255 + hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
  2256 + hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
  2257 + hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
  2258 + hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
  2259 + hex3: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
  2260 + hex6: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
  2261 + hex8: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
  2262 + };
  2263 + })();
  2264 +
  2265 + // `stringInputToObject`
  2266 + // Permissive string parsing. Take in a number of formats, and output an object
  2267 + // based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}`
  2268 + function stringInputToObject(color) {
  2269 +
  2270 + color = color.replace(trimLeft,'').replace(trimRight, '').toLowerCase();
  2271 + var named = false;
  2272 + if (names[color]) {
  2273 + color = names[color];
  2274 + named = true;
  2275 + }
  2276 + else if (color == 'transparent') {
  2277 + return { r: 0, g: 0, b: 0, a: 0, format: "name" };
  2278 + }
  2279 +
  2280 + // Try to match string input using regular expressions.
  2281 + // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
  2282 + // Just return an object and let the conversion functions handle that.
  2283 + // This way the result will be the same whether the tinycolor is initialized with string or object.
  2284 + var match;
  2285 + if ((match = matchers.rgb.exec(color))) {
  2286 + return { r: match[1], g: match[2], b: match[3] };
  2287 + }
  2288 + if ((match = matchers.rgba.exec(color))) {
  2289 + return { r: match[1], g: match[2], b: match[3], a: match[4] };
  2290 + }
  2291 + if ((match = matchers.hsl.exec(color))) {
  2292 + return { h: match[1], s: match[2], l: match[3] };
  2293 + }
  2294 + if ((match = matchers.hsla.exec(color))) {
  2295 + return { h: match[1], s: match[2], l: match[3], a: match[4] };
  2296 + }
  2297 + if ((match = matchers.hsv.exec(color))) {
  2298 + return { h: match[1], s: match[2], v: match[3] };
  2299 + }
  2300 + if ((match = matchers.hsva.exec(color))) {
  2301 + return { h: match[1], s: match[2], v: match[3], a: match[4] };
  2302 + }
  2303 + if ((match = matchers.hex8.exec(color))) {
  2304 + return {
  2305 + a: convertHexToDecimal(match[1]),
  2306 + r: parseIntFromHex(match[2]),
  2307 + g: parseIntFromHex(match[3]),
  2308 + b: parseIntFromHex(match[4]),
  2309 + format: named ? "name" : "hex8"
  2310 + };
  2311 + }
  2312 + if ((match = matchers.hex6.exec(color))) {
  2313 + return {
  2314 + r: parseIntFromHex(match[1]),
  2315 + g: parseIntFromHex(match[2]),
  2316 + b: parseIntFromHex(match[3]),
  2317 + format: named ? "name" : "hex"
  2318 + };
  2319 + }
  2320 + if ((match = matchers.hex3.exec(color))) {
  2321 + return {
  2322 + r: parseIntFromHex(match[1] + '' + match[1]),
  2323 + g: parseIntFromHex(match[2] + '' + match[2]),
  2324 + b: parseIntFromHex(match[3] + '' + match[3]),
  2325 + format: named ? "name" : "hex"
  2326 + };
  2327 + }
  2328 +
  2329 + return false;
  2330 + }
  2331 +
  2332 + window.tinycolor = tinycolor;
  2333 + })();
  2334 +
  2335 + $(function () {
  2336 + if ($.fn.spectrum.load) {
  2337 + $.fn.spectrum.processNativeColorInputs();
  2338 + }
  2339 + });
  2340 +
  2341 +});
src/main/resources/static/real_control_v2/assets/plugins/uikit-2.27.1/components/form-advanced.gradient.min.css 0 → 100644
  1 +/*! UIkit 2.27.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
  2 +.uk-form input[type=radio],.uk-form input[type=checkbox]{display:inline-block;height:14px;width:14px;border:1px solid #aaa;overflow:hidden;margin-top:-4px;vertical-align:middle;-webkit-appearance:none;outline:0;background:0 0}.uk-form input[type=radio]{border-radius:50%}.uk-form input[type=checkbox]:before,.uk-form input[type=radio]:before{display:block}.uk-form input[type=radio]:checked:before{content:'';width:8px;height:8px;margin:2px auto 0;border-radius:50%;background:#00a8e6}.uk-form input[type=checkbox]:checked:before,.uk-form input[type=checkbox]:indeterminate:before{content:"\f00c";font-family:FontAwesome;font-size:12px;-webkit-font-smoothing:antialiased;text-align:center;line-height:12px;color:#00a8e6}.uk-form input[type=checkbox]:indeterminate:before{content:"\f068"}.uk-form input[type=checkbox]:disabled,.uk-form input[type=radio]:disabled{border-color:#ddd}.uk-form input[type=radio]:disabled:checked:before{background-color:#aaa}.uk-form input[type=checkbox]:disabled:checked:before,.uk-form input[type=checkbox]:disabled:indeterminate:before{color:#aaa}
0 \ No newline at end of file 3 \ No newline at end of file
src/main/resources/static/real_control_v2/js/data/json/north_toolbar.json
@@ -77,6 +77,11 @@ @@ -77,6 +77,11 @@
77 "id": 2.2, 77 "id": 2.2,
78 "text": "设备上报记录", 78 "text": "设备上报记录",
79 "event": "device_report" 79 "event": "device_report"
  80 + },
  81 + {
  82 + "id": 2.3,
  83 + "text": "轨迹回放",
  84 + "event": "play_back"
80 } 85 }
81 ] 86 ]
82 }, 87 },
src/main/resources/static/real_control_v2/js/main.js
@@ -58,7 +58,7 @@ var gb_main_ep = new EventProxy(), @@ -58,7 +58,7 @@ var gb_main_ep = new EventProxy(),
58 }); 58 });
59 59
60 //嵌入地图页面 60 //嵌入地图页面
61 - $('li.map-panel','#main-tab-content').load('/real_control_v2/mapmonitor/real_monitor/real.html'); 61 + $('li.map-panel','#main-tab-content').load('/real_control_v2/mapmonitor/real.html');
62 }); 62 });
63 63
64 function g_emit(id) { 64 function g_emit(id) {
src/main/resources/static/real_control_v2/js/utils/svg_chart.js
@@ -148,9 +148,14 @@ var gb_svg_chart = (function() { @@ -148,9 +148,14 @@ var gb_svg_chart = (function() {
148 //gps 按线路站点分组后的下标映射 148 //gps 按线路站点分组后的下标映射
149 var line_gps_index = {}; 149 var line_gps_index = {};
150 var get_circle = function(dataId, svg) { 150 var get_circle = function(dataId, svg) {
151 - var circle = $('.station_circle[data-id=' + dataId + ']', svg);  
152 - if (circle.length == 0)  
153 - circle = null; 151 + try {
  152 + var circle = $('.station_circle[data-id=' + dataId + ']', svg);
  153 + if (circle.length == 0)
  154 + circle = null;
  155 + }catch (e){
  156 + console.log('get_circle error! station_circle data-id:' + dataId);
  157 + return null;
  158 + }
154 return circle; 159 return circle;
155 }, 160 },
156 gx = function(gps, svg) { 161 gx = function(gps, svg) {
src/main/resources/static/real_control_v2/js/utils/svg_chart_map.js
1 -var gb_svg_map_util = (function(){  
2 - var storage = window.localStorage;  
3 - var drawLine = function(map, gps) {  
4 - //从storage里获取路段路由数据  
5 - var routes = JSON.parse(storage.getItem(gps.lineId + '_route')),  
6 - updown = gps.upDown == 0 ? 'up' : 'down',  
7 - pots = [],  
8 - tempArr;  
9 -  
10 - $.each(routes[updown].split(','), function() {  
11 - tempArr = this.split(' ');  
12 - pots.push(new BMap.Point(tempArr[0], tempArr[1]));  
13 - });  
14 -  
15 - var polyline = new BMap.Polyline(pots, {  
16 - strokeWeight: 6,  
17 - strokeOpacity: 0.5,  
18 - strokeColor: gps.upDown == 0 ? 'blue' : 'red'  
19 - });  
20 -  
21 - map.addOverlay(polyline);  
22 -  
23 - $.each(gb_data_basic.stationRoutes(gps.lineId), function() {  
24 - if (this.directions == gps.upDown) {  
25 - var marker = drawStationMarker(this);  
26 - if (marker)  
27 - map.addOverlay(marker);  
28 - }  
29 - })  
30 - }  
31 -  
32 - var drawStationMarker = function(routeItem) {  
33 - var station = routeItem.station,  
34 - coord = TransGPS.wgsToBD(station.gLaty, station.gLonx);  
35 -  
36 - var marker = new BMap.Marker(new BMap.Point(coord.lng, coord.lat));  
37 -  
38 - //label  
39 - var offsetX = Math.abs(station.stationName.length / 2 * 12),  
40 - offsetY = -20,  
41 - label = new BMap.Label(station.stationName, {  
42 - offset: new BMap.Size(-offsetX, offsetY)  
43 - });  
44 -  
45 - label.setStyle({  
46 - borderColor: 'rgb(130, 119, 119)',  
47 - borderRadius: '3px',  
48 - padding: '3px 7px 3px 7px',  
49 - color: 'rgb(130, 119, 119)'  
50 - });  
51 - marker.setLabel(label);  
52 - return marker;  
53 - }  
54 -  
55 - return {drawLine: drawLine}; 1 +var gb_svg_map_util = (function () {
  2 + var storage = window.localStorage;
  3 + var drawLine = function (map, gps) {
  4 + //从storage里获取路段路由数据
  5 + var routes = JSON.parse(storage.getItem(gps.lineId + '_route')),
  6 + updown = gps.upDown == 0 ? 'up' : 'down',
  7 + pots = [],
  8 + tempArr;
  9 +
  10 + $.each(routes[updown].split(','), function () {
  11 + tempArr = this.split(' ');
  12 + pots.push(new BMap.Point(tempArr[0], tempArr[1]));
  13 + });
  14 +
  15 + var polyline = new BMap.Polyline(pots, {
  16 + strokeWeight: 6,
  17 + strokeOpacity: 0.5,
  18 + strokeColor: gps.upDown == 0 ? 'blue' : 'red'
  19 + });
  20 +
  21 + map.addOverlay(polyline);
  22 +
  23 + $.each(gb_data_basic.stationRoutes(gps.lineId), function () {
  24 + if (this.directions == gps.upDown) {
  25 + try {
  26 + var marker = drawStationMarker(this);
  27 + if (marker)
  28 + map.addOverlay(marker);
  29 + }catch(e){
  30 + console.log(e);}
  31 + }
  32 + })
  33 + }
  34 +
  35 + var drawStationMarker = function (routeItem) {
  36 + var station = routeItem.station,
  37 + coord = TransGPS.wgsToBD(station.gLaty, station.gLonx);
  38 +
  39 + var marker = new BMap.Marker(new BMap.Point(coord.lng, coord.lat));
  40 +
  41 + //label
  42 + var offsetX = Math.abs(station.stationName.length / 2 * 12),
  43 + offsetY = -20,
  44 + label = new BMap.Label(station.stationName, {
  45 + offset: new BMap.Size(-offsetX, offsetY)
  46 + });
  47 +
  48 + label.setStyle({
  49 + borderColor: 'rgb(130, 119, 119)',
  50 + borderRadius: '3px',
  51 + padding: '3px 7px 3px 7px',
  52 + color: 'rgb(130, 119, 119)'
  53 + });
  54 + marker.setLabel(label);
  55 + return marker;
  56 + }
  57 +
  58 + return {drawLine: drawLine};
56 })(); 59 })();
src/main/resources/static/real_control_v2/mapmonitor/css/real.css 0 → 100644
  1 +#real_map_container{
  2 + width: 100%;
  3 + height: 100%;
  4 +
  5 + moz-user-select: -moz-none;
  6 + -moz-user-select: none;
  7 + -o-user-select:none;
  8 + -khtml-user-select:none;
  9 + -webkit-user-select:none;
  10 + -ms-user-select:none;
  11 + user-select:none;
  12 +}
  13 +
  14 +.real_right_gps_panel{
  15 + position: absolute;
  16 + right: 4px;
  17 + width: 320px;
  18 + height: 100%;
  19 + height: calc(100% - 6px);
  20 + background: #ffffff;
  21 + top: 3px;
  22 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  23 +}
  24 +
  25 +/**/
  26 +.real_bottom_panel{
  27 + position: absolute !important;
  28 + height: 180px;
  29 + width: 100%;
  30 + width: calc(100% - 342px);
  31 + bottom: 2px !important;
  32 + left: 0px !important;
  33 + background: #fff;
  34 + box-shadow: 0 8px 17px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
  35 + /* border-radius: 0 60px 0 0;*/
  36 + border: 1px solid #bfbcbc;
  37 +}
  38 +
  39 +
  40 +.real_right_gps_panel>form{
  41 + text-align: center;
  42 + margin-top: 20px;
  43 +}
  44 +
  45 +.real_right_gps_panel>form>div.uk-form-icon{
  46 + width: 88%;
  47 +}
  48 +
  49 +.real_right_gps_panel>form>div.uk-form-icon input{
  50 + width: 100%;
  51 +}
  52 +
  53 +.real_right_gps_panel>form>div.uk-form-icon input::-webkit-input-placeholder{
  54 + font-size: 12px;
  55 +}
  56 +
  57 +.real_right_gps_panel .gps_tree_list{
  58 + height: calc(100% - 80px);
  59 + overflow: auto;
  60 + padding: 20px 0 0 32px;
  61 +}
  62 +
  63 +/*.real_bottom_panel{
  64 + width: 100%;
  65 + background: red;
  66 + height: 100px;
  67 + position: fixed !important;
  68 + top: auto !important;
  69 + bottom: 0 !important;
  70 + left: 0;
  71 + right: 0;
  72 +}
  73 +*/
  74 +.real_bottom_panel #handle{
  75 + width: 100%;
  76 + height: 4px;
  77 + top: -4px;
  78 + background-color: rgba(136, 137, 138, 0.49);
  79 + cursor: row-resize;
  80 +}
  81 +
  82 +
  83 +.real_bottom_panel .real_bl_cont{
  84 + display: inline-block;
  85 + width: calc(100% - 240px);
  86 + height: 100%;
  87 + overflow: auto;
  88 +}
  89 +
  90 +.real_bottom_panel .real_br_cont{
  91 + display: inline-block;
  92 + width: 232px;
  93 + height: 100%;
  94 + height: calc(100% - 7px);
  95 + overflow: auto;
  96 + padding-top: 7px;
  97 + font-size: 13px
  98 +}
  99 +
  100 +.real_br_cont .uk-form .uk-form-row{
  101 + border-bottom: 1px solid #e9e9e9;
  102 + padding-bottom: 4px;
  103 +}
  104 +
  105 +.real_br_cont .uk-form input{
  106 + vertical-align: middle;
  107 + margin-top: -2px;
  108 +}
  109 +
  110 +.real_br_cont .uk-form .uk-form-controls label{
  111 + margin-right: 15px;
  112 + display: inline-block;
  113 +}
  114 +
  115 +.real_br_cont .uk-form .uk-form-controls label:last-child{
  116 + margin-right: 0;
  117 +}
  118 +
  119 +.real_br_cont .sp-placeholder{
  120 + width: 15px;
  121 + height: 15px;
  122 + margin: 2px 0 0 7px;
  123 + border-radius: 2px;
  124 + float: right;
  125 + cursor: pointer;
  126 +}
  127 +
  128 +.real_br_cont .color_block{
  129 + display: inline-block;
  130 + margin-right: 9px;
  131 +}
  132 +
  133 +.real_br_cont .color_block:last-child{
  134 + margin-right: 0;
  135 +}
  136 +
  137 +.real_br_cont .sp-placeholder .sp-placeholder-color {
  138 + width: 15px;
  139 + height: 15px;
  140 + border-radius: 2px;
  141 + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1) inset;
  142 +}
  143 +
  144 +.sp-container {
  145 + border: 1px solid #d3d3d3;
  146 + background-color: #fff;
  147 + border-radius: 4px;
  148 + box-shadow: 0 2px 5px rgba(0,0,0,0.1);
  149 +}
0 \ No newline at end of file 150 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/map/iMap.js 0 → 100644
  1 +/** 各地图平台通用接口定义 */
  2 +var gb_map_imap = (function(){
  3 +
  4 + var storage = window.localStorage;
  5 + // 地图DOM容器
  6 + var mapContainer = $('#mapContainer');
  7 + var maps = {};
  8 + //尝试从 localStorage 里获取默认的地图类型
  9 + var currentMap = storage.getItem('real_map');
  10 + var mapProxy = {
  11 + //添加一个地图实例
  12 + addMap: function(name, text, instance){
  13 + maps[name] = {name: name, text: text, instance: instance};
  14 +
  15 + if(!currentMap)
  16 + currentMap = name;
  17 + return mapProxy;
  18 + },
  19 + changeDefault: function(mapName){
  20 + if(mapName == currentMap)
  21 + return;
  22 + if(maps[mapName]){
  23 + //原地图 destroy
  24 + var oldMap = maps[currentMap].instance;
  25 + oldMap.destroy && oldMap.destroy();
  26 + $(gb_map_consts.mapContainer).html('');
  27 + //解除实时路况按钮点击事件
  28 + $(gb_map_consts.trafficBtn).unbind('click');
  29 +
  30 + //新地图 INIT
  31 + var text = maps[mapName].text;
  32 + //layer.msg('正在切换到' + text + '...', {icon : 16,shade : [ 0.6, '#393D49' ],time : 0});
  33 + var newMap = maps[mapName].instance;
  34 + newMap.init();
  35 + setText(text);
  36 +
  37 + currentMap = mapName;
  38 + //收拢线路
  39 + $('.mapRightWrap .collapse.in').collapse('hide');
  40 + }else
  41 + alertErr('不存在的地图实例' + mapName);
  42 + },
  43 + createCarIcon: createCarIcon,
  44 + call: function(f, opts){
  45 + if(f == 'init')
  46 + setText(maps[currentMap].text);
  47 +
  48 + var instance = maps[currentMap].instance;
  49 + if(instance[f])
  50 + instance[f](opts);
  51 + else
  52 + alertErr('当前地图实例不支持操作:' + f);
  53 + return mapProxy;
  54 + }
  55 + }
  56 +
  57 + //绘制车辆icon
  58 + function createCarIcon(gps, w){
  59 + var canvas = $('<canvas></canvas>')[0];
  60 + var ctx = canvas.getContext('2d');
  61 +
  62 + var colours = color(gps);
  63 +
  64 + ctx.shadowOffsetX = 5; // 阴影Y轴偏移
  65 + ctx.shadowOffsetY = 5; // 阴影X轴偏移
  66 + ctx.shadowBlur = 1; // 模糊尺寸
  67 + ctx.shadowColor = colours.shadow; // 颜色
  68 +
  69 + //绘制背景
  70 + if(!w)
  71 + w = 70;
  72 +
  73 + ctx.roundRect(0, 0, w, 25, 5).stroke();
  74 + ctx.fillStyle=colours.bgColor;
  75 + ctx.fill();
  76 + //文字
  77 + ctx.font="14px arial";
  78 + ctx.fillStyle = "#fff";
  79 + ctx.fillText(gps.nbbm, 8, 18);
  80 +
  81 + return canvas.toDataURL();
  82 + }
  83 +
  84 + function color(g){
  85 + var colours = {};
  86 + switch (g.state) {
  87 + case 0:
  88 + if(g.upDown == 0){
  89 + //营运上行
  90 + colours['bgColor'] = 'rgba(94, 150, 210, 1)';
  91 + colours['shadow'] = 'rgba(94, 150, 210, 0.3)';
  92 + }
  93 + else if(g.upDown == 1){
  94 + //营运下行
  95 + colours['bgColor'] = 'rgba(201, 33, 33, 1)';
  96 + colours['shadow'] = 'rgba(201, 33, 33, 0.3)';
  97 + }
  98 + else{
  99 + //未知走向
  100 + colours['bgColor'] = 'rgba(0, 0, 0, 1)';
  101 + colours['shadow'] = 'rgba(0, 0, 0, 0.3)';
  102 + }
  103 + break;
  104 +
  105 + default:
  106 + //非营运
  107 + colours['bgColor'] = 'rgba(136, 133, 133, 1)';
  108 + colours['shadow'] = 'rgba(136, 133, 133, 0.3)';
  109 + break;
  110 + }
  111 +
  112 + return colours;
  113 + }
  114 +
  115 + function alertErr(text){
  116 + notify_err('map -'+text);
  117 + }
  118 +
  119 + function setText(text) {
  120 + $('#curr_map_name').text(text);
  121 + }
  122 +
  123 + //文件载入完毕
  124 + mapmonitor_load_ep.emitLater('load_iMap');
  125 + return mapProxy;
  126 +})();
src/main/resources/static/real_control_v2/mapmonitor/js/map/platform/baidu.js 0 → 100644
  1 +/** 百度地图相关接口封装 */
  2 +var gb_map_baidu = (function(){
  3 +
  4 + var map;
  5 + var realMarkers = {};
  6 + var topMarker;
  7 + //实时路况是否打开
  8 + var traffVisible;
  9 + //线路 Polyline
  10 + var linePolyline;
  11 +
  12 + var polylines={};
  13 + var buffAreas = {};
  14 + var baiduInstance = {
  15 + //初始化
  16 + init: function(){
  17 + if(!window.BMap){
  18 + alert('地图没有加载成功,请确认是否能正常连接外网!!');
  19 + return;
  20 + }
  21 + map = new BMap.Map($(gb_map_consts.mapContainer)[0]);
  22 + //中心点和缩放级别
  23 + map.centerAndZoom(new BMap.Point(gb_map_consts.center_point.lng, gb_map_consts.center_point.lat), 12);
  24 + map.enableScrollWheelZoom();
  25 +
  26 + window.localStorage.setItem('real_map', 'baidu');
  27 +
  28 + // 路况控件
  29 +/* var ctrl = new BMapLib.TrafficControl();
  30 + map.addControl(ctrl);
  31 +
  32 + $(gb_map_consts.trafficBtn).on('click', function() {
  33 + if (traffVisible) {
  34 + ctrl.hide();
  35 + traffVisible = false;
  36 + showLinePolyline();
  37 + } else {
  38 + ctrl.show();
  39 + traffVisible = true;
  40 + hideLinePolyline();
  41 + }
  42 + });
  43 + //百度路况控件自身关闭按钮
  44 + $('.portlet-fullscreen').on('click', '.maplibTc .maplibTcClose', function(){
  45 + traffVisible = false;
  46 + showLinePolyline();
  47 + });*/
  48 +
  49 + //$('#tcWrap.maplibTc').addClass('animated bounceInLeft');
  50 + //$('.maplibTcBtn_deskTop.anchorTR').remove();
  51 + },
  52 + destroy: function(){
  53 + realMarkers = {};
  54 + linePolyline = [];
  55 + },
  56 + clear: function(){
  57 + realMarkers = {};
  58 + map.clearOverlays();
  59 + },
  60 + //画线路图层
  61 + drawLine: function(opts){
  62 + if(polylines[opts.key]){
  63 + //centerToPolyline(polylines[opts.key]);
  64 + return;
  65 + }
  66 + var plconfg={strokeWeight:6, strokeOpacity:0.5};
  67 + var pos = [], tempArray;
  68 + var route;
  69 + var polyline;
  70 + //上行
  71 + if(opts.updown==0){
  72 + route=opts.route.up;
  73 + plconfg.strokeColor="blue";
  74 + }
  75 + else if(opts.updown==1){
  76 + route=opts.route.down;
  77 + plconfg.strokeColor="red";
  78 + }
  79 + $.each(route.split(','), function(){
  80 + tempArray = this.split(' ');
  81 + pos.push(new BMap.Point(tempArray[0], tempArray[1]));
  82 + });
  83 +
  84 + polyline = new BMap.Polyline(pos, plconfg);
  85 + polylines[opts.key]=polyline;
  86 + map.addOverlay(polyline);
  87 +
  88 + console.log('centerToPolyline...');
  89 + centerToPolyline(polyline);
  90 + },
  91 + removeLine: function(opts){
  92 + var polyline=polylines[opts.key];
  93 + if(polyline){
  94 + map.removeOverlay(polyline);
  95 + polylines[opts.key]=null;
  96 + delete polylines[opts.key];
  97 + }
  98 + },
  99 + //绘制GPS信号
  100 + drawRealGpsMarker: function(opts){
  101 + var gpsArray = opts.gpsList;
  102 + var marker, coord;
  103 + $.each(gpsArray, function(i, gps){
  104 + if(opts.coordTransform){
  105 + //坐标转换
  106 + coord = TransGPS.wgsToBD(gps.lat, gps.lon);
  107 + gps.bd_lat = coord.lat;
  108 + gps.bd_lon = coord.lng;
  109 + }
  110 +
  111 +
  112 + marker = realMarkers[gps.deviceId];
  113 + if(marker){
  114 + if(gps.timestamp == marker.gpsData.timestamp)
  115 + return;
  116 + else
  117 + moveMarker(marker, gps);//移动marker
  118 + }
  119 + else{
  120 + //创建marker
  121 + marker = createBDMarkerByGps(gps);
  122 + map.addOverlay(marker);
  123 + //设备号和marker映射
  124 + realMarkers[gps.deviceId] = marker;
  125 + }
  126 + });
  127 + },
  128 + removeGps: function(opts){
  129 + var deviceArr = opts.deviceArr;
  130 + $.each(deviceArr, function(){
  131 + if(realMarkers[this]){
  132 + map.removeOverlay(realMarkers[this]);
  133 + realMarkers[this]=null;
  134 + delete realMarkers[this];
  135 + }
  136 + });
  137 + },
  138 + //定位到marker
  139 + goToMarker: function(opts){
  140 + var deviceId = opts.deviceId
  141 + ,m = realMarkers[deviceId];
  142 + if(m){
  143 + map.panTo(m.point);
  144 + setTop(m);
  145 + }
  146 + },
  147 + //打开信息窗口
  148 + openWindow: function(opts){
  149 + var deviceId = opts.deviceId
  150 + ,m = realMarkers[deviceId];
  151 + bdOpenWindow(m);
  152 + },
  153 + //绘制圆形
  154 + drawCircle: function(opts){
  155 + var coord = TransGPS.wgsToBD(opts.lat, opts.lon);
  156 + var circle = new BMap.Circle(new BMap.Point(coord.lng, coord.lat), opts.radius);
  157 + if(opts.color)
  158 + circle.setStrokeColor(opts.color);
  159 + if(opts.weight)
  160 + circle.setStrokeWeight(opts.weight);
  161 +
  162 + map.addOverlay(circle);
  163 + buffAreas[opts.id] = circle;
  164 + },
  165 + //绘制多边形
  166 + drawPolygon: function(opts){
  167 + var wgs,coord, points = [];
  168 + $.each(opts.cds, function(){
  169 + wgs = this.split(' ');
  170 + coord = TransGPS.wgsToBD(parseFloat(wgs[1]), parseFloat(wgs[0]));
  171 + points.push(new BMap.Point(coord.lng, coord.lat));
  172 + });
  173 +
  174 + var polygon = new BMap.Polygon(points, {strokeColor: opts.color, strokeWeight: opts.weight, strokeOpacity: 0.7});
  175 + map.addOverlay(polygon);
  176 + buffAreas[opts.id] = polygon;
  177 + },
  178 + //删除缓冲区
  179 + clearBuffArea: function(code){
  180 + if(buffAreas[code]){
  181 + map.removeOverlay(buffAreas[code]);
  182 + delete buffAreas[code];
  183 + }
  184 + }
  185 + };
  186 +
  187 + var bd_gps_info_win_opts = {
  188 + width : 190,
  189 + height: 255,
  190 + enableMessage:true
  191 + };
  192 + function createBDMarkerByGps(gpsData){
  193 +
  194 + var point = new BMap.Point(gpsData.bd_lon, gpsData.bd_lat);
  195 + var marker = new BMap.Marker(point);
  196 +
  197 + //根据编码长度 计算marker 宽度
  198 + var w = gpsData.nbbm.length * 10;
  199 + marker.setIcon(new BMap.Icon(gb_map_imap.createCarIcon(gpsData, w), new BMap.Size(w,25)));
  200 +
  201 + marker.infoWindow = new BMap.InfoWindow(bd_gps_info_win_opts);
  202 + marker.gpsData = gpsData;
  203 + //click
  204 + /*marker.addEventListener('click', function(){
  205 + bdOpenWindow(this);
  206 + });*/
  207 + //mouseover
  208 + marker.addEventListener('mouseover', function(){
  209 + setTop(this);
  210 + });
  211 + return marker;
  212 + }
  213 +
  214 + //隐藏线路线条
  215 + function hideLinePolyline(){
  216 + if(!linePolyline || linePolyline.length == 0)
  217 + return;
  218 +
  219 + layer.msg('隐藏线路图层',{offset: 'ct', shift : 5});
  220 + $.each(linePolyline, function(){
  221 + this.setStrokeOpacity(0.1);
  222 + });
  223 + }
  224 +
  225 + //显示线路线条
  226 + function showLinePolyline(){
  227 + if(!linePolyline || linePolyline.length == 0)
  228 + return;
  229 +
  230 + layer.msg('显示线路图层',{offset: 'ct', shift : 5});
  231 + $.each(linePolyline, function(){
  232 + this.setStrokeOpacity(0.5);
  233 + });
  234 + }
  235 +
  236 + function moveMarker(m, gps){
  237 + m.setPosition(new BMap.Point(gps.bd_lon, gps.bd_lat));
  238 + m.gpsData = gps;
  239 + //重新设置icon
  240 + //根据编码长度 计算marker 宽度
  241 + var w = gps.nbbm.length * 10;
  242 + m.setIcon(new BMap.Icon(gb_map_imap.createCarIcon(gps, w), new BMap.Size(w,25)));
  243 +
  244 + //更新 infoWindow
  245 + if(m.infoWindow.isOpen()){
  246 + bdOpenWindow(m);
  247 + }
  248 + }
  249 +
  250 + function setTop(m){
  251 + if(topMarker)
  252 + topMarker.setTop(false);
  253 + m.setTop(true);
  254 + topMarker = m;
  255 + }
  256 +
  257 + function bdOpenWindow(marker){
  258 + marker.gpsData.fromNow = moment(marker.gpsData.timestamp).fromNow();
  259 +
  260 + marker.infoWindow.setContent(template('map_gps_info_win_temp', marker.gpsData));
  261 + map.openInfoWindow(marker.infoWindow, marker.point);
  262 + }
  263 +
  264 + function centerToPolyline(polyline){
  265 + var pos=polyline.getPath();
  266 + map.panTo(pos[parseInt(pos.length / 2)]);
  267 + }
  268 +
  269 + //文件载入完毕
  270 + mapmonitor_load_ep.emitLater('load_baidu');
  271 +
  272 + return baiduInstance;
  273 +})();
src/main/resources/static/real_control_v2/mapmonitor/js/map/platform/gaode.js 0 → 100644
  1 +/** 高德地图相关接口封装 */
  2 +var gb_map_gaode = (function() {
  3 +
  4 + var mapLoadAnim = '<div class="sk-cube-grid _center">'
  5 + + '<div class="sk-cube sk-cube1"></div>'
  6 + + '<div class="sk-cube sk-cube2"></div>'
  7 + + '<div class="sk-cube sk-cube3"></div>'
  8 + + '<div class="sk-cube sk-cube4"></div>'
  9 + + '<div class="sk-cube sk-cube5"></div>'
  10 + + '<div class="sk-cube sk-cube6"></div>'
  11 + + '<div class="sk-cube sk-cube7"></div>'
  12 + + '<div class="sk-cube sk-cube8"></div>'
  13 + + '<div class="sk-cube sk-cube9"></div>' + '</div>';
  14 +
  15 + var map;
  16 + var topMarkr;
  17 + var realMarkers = {};
  18 + //线路路由线条
  19 + var linePolyline;
  20 + //实时路况是否显示
  21 + var traffVisible;
  22 + var gaodeInstance = {
  23 + init : function() {
  24 + var $mapCon = $(gb_map_consts.mapContainer);
  25 + $mapCon.html(mapLoadAnim);
  26 + //设置样式
  27 + gaodeInstance.setStyle();
  28 +
  29 + map = new AMap.Map($mapCon[0]);
  30 + // 地图中心和缩放级别
  31 + map.setZoomAndCenter(14, [ gb_map_consts.center_point.lng, gb_map_consts.center_point.lat ]);
  32 + // 加载完成
  33 + AMap.event.addListener(map, 'complete', function() {
  34 + layer.closeAll();
  35 + window.localStorage.setItem('real_map', 'gaode');
  36 + /*storage.setItem('real_map', REAL_GAODE_TEXT);
  37 + $('.sk-cube-grid._center').remove();*/
  38 + });
  39 +
  40 + // 实时路况图层
  41 + var trafficLayer = new AMap.TileLayer.Traffic();
  42 + trafficLayer.setMap(map);
  43 + trafficLayer.hide();
  44 +
  45 + $(gb_map_consts.trafficBtn).on('click', function() {
  46 + if (traffVisible) {
  47 + trafficLayer.hide();
  48 + traffVisible = false;
  49 + $(this).removeClass('active');
  50 + showLinePolyline();
  51 + } else {
  52 + trafficLayer.show();
  53 + traffVisible = true;
  54 + $(this).addClass('active');
  55 + hideLinePolyline();
  56 + }
  57 + });
  58 + },
  59 + setStyle : function() {
  60 + $('.mapRightWrap').addClass('gaode');
  61 + $('.mapTools').addClass('gaode');
  62 + $('.leftUtils').addClass('gaode');
  63 + },
  64 + destroy:function(){
  65 + realMarkers = {};
  66 + $('.mapRightWrap').removeClass('gaode');
  67 + $('.mapTools').removeClass('gaode');
  68 + $('.leftUtils').removeClass('gaode');
  69 + },
  70 + clear: function(){
  71 + realMarkers = {};
  72 + map.clearMap();
  73 + linePolyline = [];
  74 + },
  75 + drawLine: function(opts){
  76 + linePolyline = [];
  77 +
  78 + map.clearMap();
  79 +
  80 + var upArr = [], downArr = [];
  81 + var upLineOps = {path: upArr, strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5}
  82 + ,downLineOps = {path: downArr, strokeColor:"red", strokeWeight:6, strokeOpacity:0.5};
  83 + var route = opts.route;
  84 + //上行
  85 + if(route.up){
  86 + $.each(route.up_gcj.split(','), function(){
  87 + tempArray = this.split(' ');
  88 + upArr.push([tempArray[0], tempArray[1]]);
  89 + });
  90 + var upLine = new AMap.Polyline(upLineOps);
  91 + //保存线条引用
  92 + linePolyline.push(upLine);
  93 + upLine.setMap(map);
  94 + map.setCenter(upArr[parseInt(upArr.length / 2)]);
  95 +
  96 + }
  97 + //下行
  98 + if(route.down){
  99 + $.each(route.down_gcj.split(','), function(){
  100 + tempArray = this.split(' ');
  101 + downArr.push([tempArray[0], tempArray[1]]);
  102 + });
  103 + var downLine = new AMap.Polyline(downLineOps);
  104 + //保存线条引用
  105 + linePolyline.push(downLine);
  106 + downLine.setMap(map);
  107 + }
  108 + //实时路况下不显示
  109 + if(traffVisible)
  110 + hideLinePolyline();
  111 + },
  112 + drawRealGpsMarker: function(opts){
  113 + var gpsArray = opts.gpsList;
  114 + var coord;
  115 + $.each(gpsArray, function(i, gps){
  116 + if(opts.coordTransform){
  117 + coord = TransGPS.transformFromWGSToGCJ(gps.lat, gps.lon);
  118 + gps.gcj_lat = coord.lat;
  119 + gps.gcj_lon = coord.lng;
  120 + }
  121 +
  122 + marker = realMarkers[gps.deviceId];
  123 + if(marker){
  124 + if(gps.timestamp == marker.gpsData.timestamp)
  125 + return;
  126 + else
  127 + moveMarker(marker, gps);//移动marker
  128 + }
  129 + else{
  130 + var marker = createGDMarkerByGps(gps);
  131 + realMarkers[gps.deviceId] = marker
  132 + }
  133 + });
  134 + },
  135 + goToMarker: function(opts){
  136 + var deviceId = opts.deviceId
  137 + ,m = realMarkers[deviceId];
  138 + if(m){
  139 + map.setCenter(m.getPosition());
  140 + setTop(m);
  141 + }
  142 + },
  143 + openWindow: function(opts){
  144 + var deviceId = opts.deviceId
  145 + ,m = realMarkers[deviceId];
  146 + openWindow(m);
  147 + }
  148 + };
  149 +
  150 + function createGDMarkerByGps(gps){
  151 + //根据编码长度 计算marker 宽度
  152 + var w = gps.nbbm.length * 10;
  153 +
  154 + var marker = new AMap.Marker({
  155 + map: map,
  156 + position: [gps.gcj_lon, gps.gcj_lat],
  157 + icon: new AMap.Icon({
  158 + size: new AMap.Size(w, 25), //图标大小
  159 + image: iMap.createCarIcon(gps, w)
  160 + }),
  161 + offset: new AMap.Pixel(-35, -12)
  162 + });
  163 +
  164 + //绑定数据
  165 + marker.gpsData = gps;
  166 + marker.infoWindow = new AMap.InfoWindow();
  167 +
  168 + marker.on('mouseover', function(){
  169 + setTop(this);
  170 + });
  171 + //点击事件
  172 + marker.on('click', function(){
  173 + openWindow(this);
  174 + });
  175 +
  176 + return marker;
  177 + }
  178 +
  179 + function moveMarker(m, gps){
  180 + m.setPosition(new AMap.LngLat(gps.gcj_lon, gps.gcj_lat));
  181 + m.gpsData = gps;
  182 + //重新设置icon
  183 + //根据编码长度 计算marker 宽度
  184 + var w = gps.nbbm.length * 10;
  185 + m.setIcon(new AMap.Icon({
  186 + size: new AMap.Size(w, 25),
  187 + image: iMap.createCarIcon(gps, w)
  188 + }));
  189 +
  190 + if(m.infoWindow.getIsOpen())
  191 + openWindow(m);
  192 + }
  193 +
  194 + //隐藏线路线条
  195 + function hideLinePolyline(){
  196 + if(!linePolyline || linePolyline.length == 0)
  197 + return;
  198 + layer.msg('隐藏线路图层',{offset: 'ct', shift : 5});
  199 + $.each(linePolyline, function(){
  200 + this.setOptions({strokeOpacity: 0});
  201 + });
  202 + }
  203 +
  204 + //显示线路线条
  205 + function showLinePolyline(){
  206 + if(!linePolyline || linePolyline.length == 0)
  207 + return;
  208 +
  209 + layer.msg('显示线路图层',{offset: 'ct', shift : 5});
  210 + $.each(linePolyline, function(){
  211 + this.setOptions({strokeOpacity: 0.5});
  212 + });
  213 + }
  214 +
  215 + function openWindow(marker){
  216 + marker.gpsData.fromNow = moment(marker.gpsData.timestamp).fromNow();
  217 + /*var infoWindow = new AMap.InfoWindow({
  218 + content: template('gps_info_win_temp', marker.gpsData)
  219 + });*/
  220 + marker.infoWindow.setContent(template('gps_info_win_temp', marker.gpsData));
  221 + marker.infoWindow.open(map, marker.getPosition());
  222 + }
  223 +
  224 + function setTop(marker){
  225 + if(topMarkr)
  226 + topMarkr.setzIndex(1);
  227 + marker.setzIndex(2);
  228 + topMarkr = marker;
  229 + }
  230 +
  231 + //文件载入完毕
  232 + mapmonitor_load_ep.emitLater('load_gaode');
  233 +
  234 + return gaodeInstance;
  235 +})();
src/main/resources/static/real_control_v2/mapmonitor/js/map_overlay_manager.js 0 → 100644
  1 +var gb_map_overlay_mge=(function () {
  2 +
  3 +
  4 + var gpsRefresh=function(addArr, upArr, upDownChange) {
  5 + //console.log('1111111', addArr, upArr, upDownChange);
  6 + var all = addArr.concat(upArr).concat(upDownChange);
  7 + gpsRefreshAll(all);
  8 +
  9 + };
  10 +
  11 + var gpsRefreshAll=function (all) {
  12 + gb_map_imap.call('drawRealGpsMarker', {gpsList: all, coordTransform: true});
  13 + };
  14 +
  15 + if(gb_data_gps){
  16 + //如果是嵌入线调,注册GPS刷新事件
  17 + gb_data_gps.registerCallback(gpsRefresh);
  18 + }
  19 +
  20 + return {};
  21 +})();
0 \ No newline at end of file 22 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/js/real.js 0 → 100644
  1 +var mapmonitor_load_ep = EventProxy.create('load_iMap', 'load_baidu', 'load_gaode', function () {
  2 + moment.locale('zh-cn');
  3 + //地图
  4 + gb_map_imap.addMap('baidu', '百度地图', gb_map_baidu)
  5 + .addMap('gaode', '高德地图', gb_map_gaode)
  6 + .call('init');
  7 +
  8 + //设备树
  9 + var treeData = gb_common.get_device_tree_data();
  10 + _tree = $('.real_right_gps_panel .gps_tree_list')
  11 + .on('loaded.jstree', function () {
  12 + _tree.jstree(true).open_all();
  13 + //删掉tree node a标签的 href值(不然鼠标悬停浏览器会出现状态条)
  14 + $('.gps_tree_list .jstree-container-ul a.jstree-anchor').removeAttr('href');
  15 + })
  16 + .jstree({
  17 + 'core': {
  18 + 'data': treeData
  19 + },
  20 + 'checkbox': {
  21 + 'keep_selected_style': false,
  22 + 'whole_node': false,
  23 + 'tie_selection': false
  24 + },
  25 + 'contextmenu':{
  26 + 'items': {
  27 + '轨迹回放':{
  28 + 'label': '轨迹回放',
  29 + 'action': function (data) {
  30 + console.log('action', data);
  31 + }
  32 + },
  33 + '发送指令':{
  34 + 'label': '发送指令',
  35 + 'action': function (data) {
  36 + console.log('action', data);
  37 + }
  38 + }
  39 + }
  40 + },
  41 + 'plugins': ['checkbox', 'contextmenu', 'state']
  42 + });
  43 +
  44 + $(".real_bottom_panel").resizable({
  45 + handles: {
  46 + 'n': '.real_bottom_panel #handle'
  47 + },
  48 + maxHeight: 650,
  49 + minHeight: 70
  50 + });
  51 +
  52 + $(".color_block").spectrum({
  53 + color: "#f00",
  54 + showInput: true
  55 + });
  56 +});
  57 +
  58 +var gb_map_consts = {
  59 + mapContainer: '#real_map_container',
  60 + center_point: {
  61 + lng: 121.544336,
  62 + lat: 31.221315
  63 + },
  64 + allGps: {},
  65 + trafficBtn: '' //实时路况按钮
  66 +};
  67 +
  68 +//Canvas 带圆角的矩形
  69 +CanvasRenderingContext2D.prototype.roundRect = function (x, y, w, h, r) {
  70 + if (w < 2 * r) r = w / 2;
  71 + if (h < 2 * r) r = h / 2;
  72 + this.strokeStyle ='rgba(0,102,0,.1)';
  73 + this.beginPath();
  74 + this.moveTo(x+r, y);
  75 + this.arcTo(x+w, y, x+w, y+h, r);
  76 + this.arcTo(x+w, y+h, x, y+h, r);
  77 + this.arcTo(x, y+h, x, y, r);
  78 + this.arcTo(x, y, x+w, y, r);
  79 + this.closePath();
  80 + return this;
  81 +}
0 \ No newline at end of file 82 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/real.html 0 → 100644
  1 +<link href="/assets/css/TrafficControl.css" rel="stylesheet"/>
  2 +<link rel="stylesheet" href="/real_control_v2/assets/plugins/jquery.ui/themes/base/all.css"/>
  3 +<link rel="stylesheet" href="/real_control_v2/assets/plugins/spectrum/spectrum.css"/>
  4 +
  5 +<link rel="stylesheet" href="/real_control_v2/assets/plugins/uikit-2.27.1/components/form-advanced.gradient.min.css"/>
  6 +<link rel="stylesheet" href="/real_control_v2/mapmonitor/css/real.css"/>
  7 +
  8 +<div id="real_map_container"></div>
  9 +<div class="real_right_gps_panel">
  10 + <form class="uk-form" data-uk-margin="">
  11 + <div class="uk-form-icon">
  12 + <i class="uk-icon-search"></i>
  13 + <input type="text" placeholder="搜索..." >
  14 + </div>
  15 + </form>
  16 +
  17 + <div class="gps_tree_list"></div>
  18 +</div>
  19 +
  20 +<div class="real_bottom_panel">
  21 + <div id="handle" class="ui-resizable-handle ui-resizable-n"></div>
  22 + <div class="real_bl_cont">
  23 +
  24 + </div>
  25 + <div class="real_br_cont">
  26 + <form class="uk-form uk-form-stacked">
  27 + <div class="uk-form-row">
  28 + <span class="uk-form-label">图层</span>
  29 + <div class="uk-form-controls">
  30 + <label><input type="radio" name="map_type" checked> 百度</label>
  31 + <label><input type="radio" name="map_type"> 高德</label>
  32 + <label><input type="checkbox" name="map_type"> 实时路况</label>
  33 + </div>
  34 + </div>
  35 +
  36 + <div class="uk-form-row">
  37 + <span class="uk-form-label">空间数据</span>
  38 + <div class="uk-form-controls">
  39 + <label><input type="checkbox" checked> 绘制站点</label>
  40 + <label><input type="checkbox" > 绘制电子围栏</label>
  41 + </div>
  42 + </div>
  43 +
  44 + <div class="uk-form-row">
  45 + <span class="uk-form-label">异常警报输出</span>
  46 + <div class="uk-form-controls">
  47 + <label><input type="checkbox" checked> 超速</label>
  48 + <label><input type="checkbox" checked> 越界</label>
  49 + <label><input type="checkbox" > 大间隔</label>
  50 + </div>
  51 + </div>
  52 +
  53 + <div class="uk-form-row">
  54 + <span class="uk-form-label">车辆图标</span>
  55 + <div class="uk-form-controls">
  56 + <label><input type="checkbox" > 标示角度</label>
  57 + <label><input type="checkbox" > 聚合</label>
  58 + </div>
  59 + </div>
  60 +
  61 + <div class="uk-form-row">
  62 + <span class="uk-form-label">车辆图标颜色</span>
  63 + <div class="uk-form-controls">
  64 + <div class="color_block">
  65 + 上行
  66 + <div class="sp-placeholder">
  67 + <div class="sp-placeholder-color" style="background-color: rgb(221, 221, 221);"></div>
  68 + </div>
  69 + </div>
  70 +
  71 + <div class="color_block">
  72 + 下行
  73 + <div class="sp-placeholder">
  74 + <div class="sp-placeholder-color" style="background-color: rgb(196, 91, 91);"></div>
  75 + </div>
  76 + </div>
  77 +
  78 + <div class="color_block">
  79 + 未知走向
  80 + <div class="sp-placeholder">
  81 + <div class="sp-placeholder-color" style="background-color: rgb(102, 96, 96);"></div>
  82 + </div>
  83 + </div>
  84 + </div>
  85 + </div>
  86 + </form>
  87 + </div>
  88 +</div>
  89 +
  90 +<script src="/real_control_v2/mapmonitor/js/map_overlay_manager.js"></script>
  91 +<script src="/real_control_v2/mapmonitor/js/real.js"></script>
  92 +<script src="/real_control_v2/mapmonitor/js/map/iMap.js"></script>
  93 +<script src="/real_control_v2/mapmonitor/js/map/platform/baidu.js"></script>
  94 +<script src="/real_control_v2/mapmonitor/js/map/platform/gaode.js"></script>
  95 +
  96 +<!-- jquery ui -->
  97 +<script src="/real_control_v2/assets/plugins/jquery.ui/core.js"></script>
  98 +<script src="/real_control_v2/assets/plugins/jquery.ui/widget.js"></script>
  99 +<script src="/real_control_v2/assets/plugins/jquery.ui/mouse.js"></script>
  100 +<script src="/real_control_v2/assets/plugins/jquery.ui/resizable.js"></script>
  101 +
  102 +
  103 +<script src="/real_control_v2/assets/plugins/spectrum/spectrum.js"></script>
0 \ No newline at end of file 104 \ No newline at end of file
src/main/resources/static/real_control_v2/mapmonitor/real_monitor/css/real.css
@@ -30,7 +30,7 @@ @@ -30,7 +30,7 @@
30 .map_rt_wrap .uk-tab { 30 .map_rt_wrap .uk-tab {
31 background: white; 31 background: white;
32 font-family: 华文细黑; 32 font-family: 华文细黑;
33 - border-radius: 5px 33 + border-radius: 5px;
34 width: 350px; 34 width: 350px;
35 float: right; 35 float: right;
36 } 36 }