diff --git a/.idea/deployment.xml b/.idea/deployment.xml index 6647537f..0e0154f0 100644 --- a/.idea/deployment.xml +++ b/.idea/deployment.xml @@ -14,6 +14,9 @@ + + + diff --git a/img/favicons/favicon-32x32.png b/img/favicons/favicon-32x32.png deleted file mode 100644 index dd8d295c..00000000 Binary files a/img/favicons/favicon-32x32.png and /dev/null differ diff --git a/img/favicons/mstile-70x70.png b/img/favicons/mstile-70x70.png deleted file mode 100644 index 8a5d4090..00000000 Binary files a/img/favicons/mstile-70x70.png and /dev/null differ diff --git a/img/grid_20x20.png b/img/grid_40x40.png similarity index 93% rename from img/grid_20x20.png rename to img/grid_40x40.png index d177b0d4..794ce32e 100644 Binary files a/img/grid_20x20.png and b/img/grid_40x40.png differ diff --git a/img/jqueryui/ui-bg_flat_0_999999_40x100.png b/img/jqueryui/ui-bg_flat_0_999999_40x100.png deleted file mode 100644 index 13c79e86..00000000 Binary files a/img/jqueryui/ui-bg_flat_0_999999_40x100.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png b/img/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png deleted file mode 100644 index e425e6e4..00000000 Binary files a/img/jqueryui/ui-bg_flat_0_aaaaaa_40x100.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png b/img/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png deleted file mode 100644 index 3b2914a2..00000000 Binary files a/img/jqueryui/ui-bg_glass_55_fbf9ee_1x400.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_glass_65_ffffff_1x400.png b/img/jqueryui/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index e81a6d06..00000000 Binary files a/img/jqueryui/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_glass_75_dadada_1x400.png b/img/jqueryui/ui-bg_glass_75_dadada_1x400.png deleted file mode 100644 index 5a46b47c..00000000 Binary files a/img/jqueryui/ui-bg_glass_75_dadada_1x400.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png b/img/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png deleted file mode 100644 index 86c2baa6..00000000 Binary files a/img/jqueryui/ui-bg_glass_75_e6e6e6_1x400.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_glass_75_ffffff_1x400.png b/img/jqueryui/ui-bg_glass_75_ffffff_1x400.png deleted file mode 100644 index 52ff2d68..00000000 Binary files a/img/jqueryui/ui-bg_glass_75_ffffff_1x400.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png b/img/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png deleted file mode 100644 index 3cd467e1..00000000 Binary files a/img/jqueryui/ui-bg_highlight-soft_75_cccccc_1x100.png and /dev/null differ diff --git a/img/jqueryui/ui-bg_inset-soft_95_fef1ec_1x100.png b/img/jqueryui/ui-bg_inset-soft_95_fef1ec_1x100.png deleted file mode 100644 index a50a17f9..00000000 Binary files a/img/jqueryui/ui-bg_inset-soft_95_fef1ec_1x100.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_222222_256x240.png b/img/jqueryui/ui-icons_222222_256x240.png deleted file mode 100644 index 0085d125..00000000 Binary files a/img/jqueryui/ui-icons_222222_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_2e83ff_256x240.png b/img/jqueryui/ui-icons_2e83ff_256x240.png deleted file mode 100644 index 3bb63f15..00000000 Binary files a/img/jqueryui/ui-icons_2e83ff_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_428bca_256x240.png b/img/jqueryui/ui-icons_428bca_256x240.png deleted file mode 100644 index 5beba3aa..00000000 Binary files a/img/jqueryui/ui-icons_428bca_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_454545_256x240.png b/img/jqueryui/ui-icons_454545_256x240.png deleted file mode 100644 index a813d3e3..00000000 Binary files a/img/jqueryui/ui-icons_454545_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_555555_256x240.png b/img/jqueryui/ui-icons_555555_256x240.png deleted file mode 100644 index 5dcdcb41..00000000 Binary files a/img/jqueryui/ui-icons_555555_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_888888_256x240.png b/img/jqueryui/ui-icons_888888_256x240.png deleted file mode 100644 index 0b5ccc85..00000000 Binary files a/img/jqueryui/ui-icons_888888_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_999999_256x240.png b/img/jqueryui/ui-icons_999999_256x240.png deleted file mode 100644 index da7e727b..00000000 Binary files a/img/jqueryui/ui-icons_999999_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_cd0a0a_256x240.png b/img/jqueryui/ui-icons_cd0a0a_256x240.png deleted file mode 100644 index 8c3af0c4..00000000 Binary files a/img/jqueryui/ui-icons_cd0a0a_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_f0ad4e_256x240.png b/img/jqueryui/ui-icons_f0ad4e_256x240.png deleted file mode 100644 index fabf7cf3..00000000 Binary files a/img/jqueryui/ui-icons_f0ad4e_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_f6cf3b_256x240.png b/img/jqueryui/ui-icons_f6cf3b_256x240.png deleted file mode 100644 index 3c357457..00000000 Binary files a/img/jqueryui/ui-icons_f6cf3b_256x240.png and /dev/null differ diff --git a/img/jqueryui/ui-icons_ffffff_256x240.png b/img/jqueryui/ui-icons_ffffff_256x240.png deleted file mode 100644 index 42f8f992..00000000 Binary files a/img/jqueryui/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/img/pf-bg.jpg b/img/pf-bg.jpg index a6778318..72c3aa0b 100644 Binary files a/img/pf-bg.jpg and b/img/pf-bg.jpg differ diff --git a/index.htm b/index.htm index 33f8372c..1bfeb06d 100644 --- a/index.htm +++ b/index.htm @@ -24,11 +24,9 @@ - - + @@ -41,7 +39,7 @@ - + diff --git a/js/app.js b/js/app.js index c9c7497d..8433b075 100644 --- a/js/app.js +++ b/js/app.js @@ -1,6 +1,6 @@ requirejs.config({ - baseUrl: 'js', // user build_js files, change to "js" for un-compressed source + baseUrl: 'build_js', // user build_js files, change to "js" for un-compressed source stubModules: ['text'], // Exclude these modules on build paths: { layout: 'layout', @@ -8,11 +8,11 @@ requirejs.config({ //jquery: "lib/jquery-2.1.1.min", // v2.1.1 jQuery bootstrap: 'lib/bootstrap.min', // v3.3.0 Bootstrap js code - http://getbootstrap.com/javascript/ text: 'lib/requirejs/text', // v2.0.12 A RequireJS/AMD loader plugin for loading text resources. + throttleDebounce: 'lib/jquery.ba-throttle-debounce.min', // v1.1 Handle/throttle jquery events - http://benalman.com/projects/jquery-throttle-debounce-plugin/ + velocity: 'lib/velocity.min', // v1.2.1 animation engine - http://julian.com/research/velocity/ templates: '../templates', // template dir slidebars: 'lib/slidebars', // v0.10 Slidebars - side menu plugin http://plugins.adchsm.me/slidebars/ - // jsPlumb: 'lib/jsPlumb-1.6.4-min', // v1.4.6 jsPlumb - main map draw plugin http://www.jsplumb.org/ jsPlumb: 'lib/dom.jsPlumb-1.7.2-min', // v1.7.2 jsPlumb (Vanilla)- main map draw plugin http://www.jsplumb.org/ - customScrollbar: 'lib/jquery.mCustomScrollbar.concat.min', // v3.1.11 Custom scroll bars - http://manos.malihu.gr/ datatables: 'lib/jquery.dataTables.min', // v1.10.3 DataTables - tables datatablesBootstrap: 'lib/dataTables.bootstrap', // DataTables - not used (bootstrap style) @@ -38,11 +38,13 @@ requirejs.config({ }, shim: { - jqueryUI: { - export: '$', + bootstrap: { deps: ['jquery'] }, - bootstrap: { + velocity: { + deps: ['jquery'] + }, + throttleDebounce: { deps: ['jquery'] }, slidebars: { diff --git a/js/app/ccp.js b/js/app/ccp.js index c6bb7429..220d6c64 100644 --- a/js/app/ccp.js +++ b/js/app/ccp.js @@ -2,7 +2,7 @@ * Global CCPEvE function wrapper */ -define(["jquery", "app/render", "app/init"], function($, Render, Config) { +define(['jquery'], function($) { "use strict"; @@ -10,48 +10,16 @@ define(["jquery", "app/render", "app/init"], function($, Render, Config) { * in-game or out-of-game browser * @returns {boolean} */ - var isInGame = function(){ + var isInGameBrowser = function(){ var inGame = false; if(typeof CCPEVE === 'object'){ inGame = true; } -return true; + return inGame; - } - - - var requestTrust = function(){ - if(isInGame()){ - - var config = { - name: 'modules/dialog', - position: $('body'), - link: 'after', - functions: { - after: function(){ - $( "#pf_trust_dialog" ).dialog({ - modal: true, - buttons: { - Ok: function(){ - $(this).dialog('close'); - } - } - }); - } - } - }; - - var data = { - id: 'pf_trust_dialog', - titel: 'Trust page', - content: 123 //CCPEVE.requestTrust(Config.baseUrl) - }; - // Render.showModule(config, data); - } }; - return { - requestTrust: requestTrust + isInGameBrowser: isInGameBrowser }; }); \ No newline at end of file diff --git a/js/app/init.js b/js/app/init.js index d9ab8cc4..3ac9422e 100644 --- a/js/app/init.js +++ b/js/app/init.js @@ -8,7 +8,8 @@ define(['jquery'], function($) { var Config = { timer: { - mainPing: 3000 // main server ping + mapUpdatePing: 3000, // ping for map update + userUpdatePing: 2000 // ping for map user update }, path: { img: 'img/' @@ -17,23 +18,31 @@ define(['jquery'], function($) { zKillboard: 'https://zkillboard.com/api/', // killboard api eveCentral: 'http://api.eve-central.com/api/' // jump rout api }, + animationSpeed: { + headerLink: 100 // links in head bar + }, classes: { // map types mapTypes: { - global: { - class: 'pf-map-type-global', - classTab: 'pf-map-type-tab-global', - label: 'Global' + standard: { + class: '', + classTab: 'pf-map-type-tab-default', + label: '' + }, + private: { + class: 'pf-map-type-private', + classTab: 'pf-map-type-tab-private', + label: 'Private' }, alliance: { class: 'pf-map-type-alliance', classTab: 'pf-map-type-tab-alliance', label: 'Alliance' }, - private: { - class: 'pf-map-type-private', - classTab: 'pf-map-type-tab-private', - label: 'Private' + global: { + class: 'pf-map-type-global', + classTab: 'pf-map-type-tab-global', + label: 'Global' } }, // system effects @@ -195,7 +204,8 @@ define(['jquery'], function($) { jumpbridge: { cssClass: 'pf-map-connection-jumpbridge', paintStyle: { - dashstyle: '2' + //dashstyle: '2', + 'stroke-dasharray': [15,15] } }, stargate: { diff --git a/js/app/main.js b/js/app/main.js index af54168f..34b2a7c8 100644 --- a/js/app/main.js +++ b/js/app/main.js @@ -6,10 +6,12 @@ define([ 'jquery', 'app/init', 'app/render', + 'velocity', 'app/ccp', 'app/page', - 'app/module_map' -], function($, Init, Render, CCP) { + 'app/module_map', + 'throttleDebounce' +], function($, Init, Render, Velocity, CCP) { 'use strict'; @@ -19,7 +21,8 @@ define([ $(function() { - CCP.requestTrust(); + //CCP.requestTrust(); + $('body').loadPageStructure(); @@ -381,8 +384,12 @@ define([ id: 4, // system id user: [ { + id: 3, name: 'Exodus 4D', - ship: 'Legion', + ship: { + id: 55, + name: 'legion' + }, status: 'corp' } ] @@ -391,16 +398,28 @@ define([ id: 5, // system id user: [ { + id: 4, name: 'Faye Fantastic', - ship: 'Armageddon', + ship: { + id: 56, + name: 'Armageddon' + }, status: 'ally' },{ + id: 5, name: 'Sibasomos', - ship: 'Proteus', + ship: { + id: 57, + name: 'Proteus' + }, status: 'corp' },{ + id: 6, name: 'Xtrah', - ship: 'Pod', + ship: { + id: 58, + name: 'Pod' + }, status: 'ally' } ] @@ -410,35 +429,64 @@ define([ } ]}; - - // update map module ======================================== - setTimeout( - function() { - console.time('updateUserData') - // $('#' + config.mapModuleId).updateMapModuleData(userData); - console.timeEnd('updateUserData') - }, 5000); + $('#' + config.mapModuleId).on('pf:initModule', function(){ + var mapModule = $(this); + var mapDataUpdateActive = true; // allow update "map data" + var userDataUpdateActive = true; // allow update "user data" + // ping for main map update + var triggerMapUpdatePing = function(tempMapData){ - // server ping - var triggerMainPing = function(tempMapData){ - console.time('updateMapData') - // load map module ========================================== - $('#' + config.mapModuleId).updateMapModule(tempMapData); - console.timeEnd('updateMapData') + // prevent multiple requests simultaneously + if(mapDataUpdateActive === true){ + $(document).setProgramStatus('online'); - console.time('getMapData') - var mapData = $('#' + config.mapModuleId).getMapModuleData(); - console.timeEnd('getMapData') - console.log(mapData); - }; + mapDataUpdateActive = false; + console.time('updateMapData') - //setInterval(triggerMainPing, 5000, mapData); + // load map module ========================================== + mapDataUpdateActive = mapModule.updateMapModule(tempMapData); + console.timeEnd('updateMapData') + }else{ + // not finished in time -> to slow or error + $(document).setProgramStatus('problem'); + } + + // get updated map data + if(mapDataUpdateActive === true){ + console.time('getMapData') + var mapData = mapModule.getMapModuleData(); + console.timeEnd('getMapData') + } + }; + + triggerMapUpdatePing(mapData); + setInterval(triggerMapUpdatePing, Init.timer.mapUpdatePing, mapData); + + // ping for user data update + var triggerUserUpdatePing = function(tempUserData){ + + // prevent multiple requests simultaneously + if(userDataUpdateActive === true){ + $(document).setProgramStatus('online'); + + userDataUpdateActive = false; + console.time('updateUserData'); + userDataUpdateActive = mapModule.updateMapModuleData(userData); + console.timeEnd('updateUserData'); + }else{ + // not finished in time -> to slow or error + $(document).setProgramStatus('problem'); + } + + }; + setInterval(triggerUserUpdatePing, Init.timer.userUpdatePing, mapData); + + }); - setInterval(triggerMainPing, Init.timer.mainPing, mapData); }); diff --git a/js/app/map/map.js b/js/app/map/map.js index 815d335b..ab0282ca 100644 --- a/js/app/map/map.js +++ b/js/app/map/map.js @@ -38,7 +38,8 @@ define([ systemHeadNameClass: 'pf-system-head-name', // class for system name systemHeadExpandClass: 'pf-system-head-expand', // class for system head expand arrow systemBodyClass: 'pf-system-body', // class for system body - systemBodyItemClass: 'pf-system-body-item', + systemBodyItemHeight: 16, // px of a system body entry + systemBodyItemClass: 'pf-system-body-item', // class for a system body entry systemBodyItemStatusClass: 'pf-user-status', systemBodyRightClass: 'pf-system-body-right', dynamicElementWrapperId: 'pf-dialog-wrapper', // wrapper div for dynamic content (dialogs, context-menus,...) @@ -98,6 +99,11 @@ define([ onMaxConnections:function(info, e) { console.log('max connections') console.log(info.maxConnections); + }, + beforeDetach:function(connection) { + var mapElement = connection._jsPlumb.instance.getContainer(); + $(mapElement).getMapOverlay().startMapUpdateCounter(); + return true; }/*, overlays:[ @@ -156,20 +162,13 @@ define([ $.fn.updateSystemUserData = function(map, data, currentUserData){ var system = $(this); + var systemId = system.attr('id'); // find system body - var systemBody = $( $(system).find('.' + config.systemBodyClass) ); + var systemBody = $( system.find('.' + config.systemBodyClass) ); // find expand arrow - var systemHeadExpand = $( $(system).find('.' + config.systemHeadExpandClass) ); - - system = $(system); - - // remove tooltip - system.removeAttr('title'); - - // remove all content - systemBody.empty(); + var systemHeadExpand = $( system.find('.' + config.systemHeadExpandClass) ); var userCounter = 0; @@ -177,78 +176,126 @@ define([ // if current user is in THIS system trigger event if(currentUserData){ - /* not used jet - var tabContentElement = getTabContentElementByMapElement(system); - - $(tabContentElement).trigger('pf:highlightTab', [{system: system}]); - */ - system.data('currentUser', true); } + var oldCacheKey = system.data('userCache'); + // add user information if( data && data.user ){ - console.log(data.user) - $.each(data.user, function(i, userData){ - userCounter++; + var cacheArray = []; + // loop all active pilots and build cache-key + for(var i = 0; i < data.user.length; i++){ + var tempUserData = data.user[i]; + cacheArray.push(tempUserData.id + '_' + tempUserData.ship.name); + } - var statusClass = getStatusClassForUser(userData.status); - var userName = userData.name; + var cacheKey = cacheArray.join('_'); - var item = $('
', { - class: config.systemBodyItemClass - }).append( - $('
  • ', { - class: ['fa', 'fa-circle', config.systemBodyItemStatusClass, statusClass].join(' ') - }) - ).append( - $('', { - text: ' ' + userName - }) - ).append( - $('', { - text: userData.ship, - class: config.systemBodyRightClass - }) - ); + // check for if cacheKey has changed + if(cacheKey !== oldCacheKey){ + // set new CacheKey + system.data('userCache', cacheKey); - systemBody.append(item); - }); + // remove all content + systemBody.empty(); - } -/* - var oldUserCount = system.attr('title'); + // loop "again" and build DOM object with user information + for(var j = 0; j < data.user.length; j++){ + var userData = data.user[j]; + userCounter++; - system.removeAttr('title'); + var statusClass = getStatusClassForUser(userData.status); + var userName = userData.name; - if(userCounter === 0){ - // hide expand arrow - systemBody.hide(100); - systemHeadExpand.hide(100, function(){ - if(oldUserCount !== userCounter){ - // revalidate element size and repaint - map.revalidate( system.attr('id') ); + var item = $('
    ', { + class: config.systemBodyItemClass + }).append( + $('', { + text: userData.ship.name, + class: config.systemBodyRightClass + }) + ).append( + $('
  • ', { + class: ['fa', 'fa-circle', config.systemBodyItemStatusClass, statusClass].join(' ') + }) + ).append( + $('', { + text: ' ' + userName + }) + ); + + systemBody.append(item); } - }); + + + // ================================================================= + + // user count changed -> adapt tooltip + system.tooltip('destroy'); + + system.attr('title', userCounter); + + // show system head + systemHeadExpand.velocity({ + width: '10px' + },{ + duration: 50, + display: 'inline-block', + progress: function(){ + // revalidate element size and repaint + map.revalidate( systemId ); + }, + complete: function(){ + + // show system body + systemBody.velocity({ + height: config.systemBodyItemHeight + 'px' + },{ + duration: 50, + display: 'auto', + progress: function(){ + // revalidate element size and repaint + map.revalidate( systemId ); + } + }); + + // show active user tooltip + toggleSystemTooltip([system], 'show', {placement: 'top', trigger: 'manual'}); + } + }); + } }else{ - systemBody.show(100); - systemHeadExpand.show(100, function(){ - if(oldUserCount !== userCounter){ - // revalidate element size and repaint - map.revalidate( system.attr('id') ); - } - }); + // no user data found for this system + system.data('userCache', false); - system.attr('title', userCounter); + if( + oldCacheKey && + oldCacheKey.length > 0 + ){ + // no user -> clear SystemBody + systemHeadExpand.velocity('reverse',{ + display: 'none', + complete: function(){ + systemBody.velocity('reverse',{ + display: 'none', + progress: function(){ + // revalidate element size and repaint + map.revalidate( systemId ); + systemBody.empty(); + } + }); + } + }); + } - // show active user tooltip - toggleSystemTooltip([system], 'show', {placement: 'top', trigger: 'manual'}); } -*/ + + }; @@ -264,8 +311,9 @@ define([ if(options){ $(systems[i]).tooltip(options); } - $(systems[i]).tooltip(show); } + + $(systems).tooltip(show); }; /** @@ -287,6 +335,7 @@ define([ // add new class system.data('status', statusLabel); system.addClass( statusClass ); + }; /** @@ -406,156 +455,163 @@ define([ var mapContainer = mapConfig.map.getContainer(); - if(mapContainer === undefined){ - // add new map - // create map wrapper - var mapWrapper = $('
    ', { - class: config.mapWrapperClass - }); + // prevent jsPlumb from re-painting during main-map update -> performance boost :) + mapConfig.map.doWhileSuspended(function() { - // create new map container - mapContainer = $('
    ', { - id: config.mapIdPrefix + mapConfig.config.id, - class: [config.mapClass].join(' ') - }); + if(mapContainer === undefined){ + // add new map + + // create map wrapper + var mapWrapper = $('
    ', { + class: config.mapWrapperClass + }); + + // create new map container + mapContainer = $('
    ', { + id: config.mapIdPrefix + mapConfig.config.id, + class: [config.mapClass].join(' ') + }); + + // add additional information + mapContainer.data('id', mapConfig.config.id); + + mapWrapper.append(mapContainer); + + // append mapWrapper to parent element (at the top) + $(parentElement).prepend(mapWrapper); + + + // set main Container for current map -> the container exists now in DOM !! very important + mapConfig.map.setContainer($('#' + config.mapIdPrefix + mapConfig.config.id)); + + // set map observer + setMapObserver(mapConfig.map); + } // add additional information - mapContainer.data('id', mapConfig.config.id); mapContainer.data('name', mapConfig.config.name); + mapContainer.data('scope', mapConfig.config.scope); + mapContainer.data('icon', mapConfig.config.icon); mapContainer.data('type', mapConfig.config.type); - mapWrapper.append(mapContainer); + mapContainer = $(mapContainer); - // append mapWrapper to parent element (at the top) - $(parentElement).prepend(mapWrapper); + // get map data + var mapData = mapContainer.getMapData(); + if(mapData !== false){ + // map data available -> map not locked by update counter :) + var currentSystemData = mapData.data.systems; + var currentConnectionData = mapData.data.connections; - // set main Container for current map -> the container exists now in DOM !! very important - mapConfig.map.setContainer($('#' + config.mapIdPrefix + mapConfig.config.id)); + // update systems =========================================================== - // set map observer - setMapObserver(mapConfig.map); - } + for(var i = 0; i < mapConfig.data.systems.length; i++){ + var systemData = mapConfig.data.systems[i]; - mapContainer = $(mapContainer); + // add system + var addNewSystem = true; - // get map data - var mapData = mapContainer.getMapData(); + for(var k = 0; k < currentSystemData.length; k++){ + if(currentSystemData[k].id === systemData.id){ - if(mapData !== false){ - // map data available -> map not locked by update counter :) - var currentSystemData = mapData.data.systems; - var currentConnectionData = mapData.data.connections; + if( currentSystemData[k].updated < systemData.updated ){ + // system changed -> update + mapContainer.getSystem(mapConfig.map, systemData); + } - // update systems =========================================================== - - for(var i = 0; i < mapConfig.data.systems.length; i++){ - var systemData = mapConfig.data.systems[i]; - - // add system - var addNewSystem = true; - - for(var k = 0; k < currentSystemData.length; k++){ - if(currentSystemData[k].id === systemData.id){ - - if( currentSystemData[k].updated < systemData.updated ){ - // system changed -> update - mapContainer.getSystem(mapConfig.map, systemData); + addNewSystem = false; + break; } + } - addNewSystem = false; - break; + if( addNewSystem === true){ + drawSystem(mapConfig.map, systemData); } } - if( addNewSystem === true){ - console.log('omg') - drawSystem(mapConfig.map, systemData); - } - } + // check for systems that are gone -> delete system + for(var a = 0; a < currentSystemData.length; a++){ - // check for systems that are gone -> delete system - for(var a = 0; a < currentSystemData.length; a++){ + var deleteThisSystem = true; - var deleteThisSystem = true; + for(var b = 0; b < mapConfig.data.systems.length; b++){ + var deleteSystemData = mapConfig.data.systems[b]; - for(var b = 0; b < mapConfig.data.systems.length; b++){ - var deleteSystemData = mapConfig.data.systems[b]; - - if(deleteSystemData.id === currentSystemData[a].id){ - deleteThisSystem = false; - break; - } - } - - if(deleteThisSystem === true){ - // system not found -> delete system - deleteSystem(mapConfig.map, $('#' + config.systemIdPrefix + currentSystemData[a].id)); - } - } - - // update connections ========================================================= - - // set up default connections - for(var j = 0; j < mapConfig.data.connections.length; j++){ - var connectionData = mapConfig.data.connections[j]; - - // add connection - var addNewConnection= true; - - for(var c = 0; c < currentConnectionData.length; c++){ - if(currentConnectionData[c].id === connectionData.id){ - // connection already exists -> check for updates - - if( - currentConnectionData[c].updated < connectionData.updated && // has changed - ativeConnections[mapData.config.id][connectionData.id] !== undefined - ){ - // connection changed -> update - var tempConnection = ativeConnections[mapData.config.id][connectionData.id]; - updateConnection(tempConnection, connectionData, currentConnectionData[c]); + if(deleteSystemData.id === currentSystemData[a].id){ + deleteThisSystem = false; + break; } + } - addNewConnection = false; - break; + if(deleteThisSystem === true){ + // system not found -> delete system + deleteSystem(mapConfig.map, $('#' + config.systemIdPrefix + currentSystemData[a].id)); } } - if(addNewConnection === true){ - drawConnection(mapConfig.map, connectionData); - } - } + // update connections ========================================================= - // check for connections that are gone -> delete connection - for(var d = 0; d < currentConnectionData.length; d++){ + // set up default connections + for(var j = 0; j < mapConfig.data.connections.length; j++){ + var connectionData = mapConfig.data.connections[j]; - var deleteThisConnection = true; + // add connection + var addNewConnection= true; - for(var e = 0; e < mapConfig.data.connections.length;e++){ - var deleteConnectionData = mapConfig.data.connections[e]; + for(var c = 0; c < currentConnectionData.length; c++){ + if(currentConnectionData[c].id === connectionData.id){ + // connection already exists -> check for updates - if(deleteConnectionData.id === currentConnectionData[d].id){ - deleteThisConnection = false; - break; + if( + currentConnectionData[c].updated < connectionData.updated && // has changed + ativeConnections[mapData.config.id][connectionData.id] !== undefined + ){ + // connection changed -> update + var tempConnection = ativeConnections[mapData.config.id][connectionData.id]; + updateConnection(tempConnection, connectionData, currentConnectionData[c]); + } + + addNewConnection = false; + break; + } + } + + if(addNewConnection === true){ + drawConnection(mapConfig.map, connectionData); } } - deleteThisConnection = true; - if( - deleteThisConnection === true && - ativeConnections[mapData.config.id][currentConnectionData.id] !== undefined - ){ - // connection not found -> delete connection - var deleteConnection = ativeConnections[mapData.config.id][currentConnectionData.id]; - mapConfig.map.detach(deleteConnection); + + // check for connections that are gone -> delete connection + for(var d = 0; d < currentConnectionData.length; d++){ + + var deleteThisConnection = true; + + for(var e = 0; e < mapConfig.data.connections.length;e++){ + var deleteConnectionData = mapConfig.data.connections[e]; + + if(deleteConnectionData.id === currentConnectionData[d].id){ + deleteThisConnection = false; + break; + } + } + deleteThisConnection = true; + if( + deleteThisConnection === true && + ativeConnections[mapData.config.id][currentConnectionData.id] !== undefined + ){ + // connection not found -> delete connection + var deleteConnection = ativeConnections[mapData.config.id][currentConnectionData.id]; + mapConfig.map.detach(deleteConnection); + } + } + // repaint all connections because of some strange visual bugs -_- + mapConfig.map.repaintEverything(); } - - // repaint all connections because of some strange visual bugs -_- - mapConfig.map.repaintEverything(); - - } + }); }; @@ -622,7 +678,7 @@ define([ // get System Element by data var newSystem = mapContainer.getSystem(map, systemData); -console.log('test') + // add new system to map mapContainer.append(newSystem); @@ -1152,8 +1208,6 @@ console.log('test') var systemHeadExpand = $( system.find('.' + config.systemHeadExpandClass) ); var systemBody = $( system.find('.' + config.systemBodyClass) ); - var bodyItemHeight = 16; - // make system draggable map.draggable(system, { containment: 'parent', @@ -1246,54 +1300,51 @@ console.log('test') // get ship counter and calculate expand height var shipCounter = parseInt( system.attr('data-original-title') ); - var expandheight = shipCounter * bodyItemHeight; + var expandheight = shipCounter * config.systemBodyItemHeight; - systemBody.animate( + systemBody.velocity( { height: expandheight + 'px', - width: '100%', + width: 100, 'min-width': '150px' - }, - { - // queue:false, + },{ duration: 100, - step: function(){ + progress: function(){ // repaint connections of current system map.revalidate( hoverSystemId ); }, complete: function(){ map.revalidate( hoverSystemId ); - $(this).find('.' + config.systemBodyRightClass).show(); + $(this).find('.' + config.systemBodyRightClass).velocity({ + opacity: 1 + },{ + duration: 50, + display: 'auto' + }); } } ); + }, function(e){ // hover out var hoverSystem = $(this).parents('.' + config.systemClass); var hoverSystemId = hoverSystem.attr('id'); - systemBody.animate( - { - height: '16px', - width: '100%', - 'min-width': '60px' - }, - { - // queue:false, - duration: 100, - step: function(){ - // repaint connections of current system - map.revalidate( hoverSystemId ); - $(this).find('.' + config.systemBodyRightClass).hide(); - }, - start: function(){ - $(this).find('.' + config.systemBodyRightClass).hide(); - }, - complete: function(){ - map.revalidate( hoverSystemId ); - } + systemBody.find('.' + config.systemBodyRightClass).velocity( { + opacity: 0 + },{ + duration: 100, + display: 'none', + complete: function(){ + systemBody.velocity('reverse', { + complete: function(){ + // overwrite "complete" function from first "hover"-open + map.revalidate( hoverSystemId ); + } + }); } - ); + }); + }); // context menu ================================================================== @@ -1415,7 +1466,6 @@ console.log('test') // load system data ================================================================================= system.on('click', function(e){ - var system = $(this); // left mouse button @@ -1426,29 +1476,31 @@ console.log('test') // select system system.toggleSelectSystem(map); }else{ - - // activate system - markSystemActive(map, system); - - // get parent Tab Content and fire update event - var tabContentElement = getTabContentElementByMapElement( system ); - - var data = { - system: system - }; - - $(tabContentElement).trigger('pf:updateSystemData', [data]); + system.showSystemInfo(map); } } - } }); + }; + $.fn.showSystemInfo = function(map){ + var system = $(this); + // activate system + markSystemActive(map, system); + + // get parent Tab Content and fire update event + var tabContentElement = getTabContentElementByMapElement( system ); + + var data = { + system: system + }; + + $(tabContentElement).trigger('pf:updateSystemData', [data]); }; /** - * toggle select status of a system + * toggle selectable status of a system */ $.fn.toggleSelectSystem = function(map){ var system = $(this); @@ -1791,6 +1843,23 @@ console.log('test') }); + $(mapContainer).on('pf:menuSelectSystem', function(e, data){ + var tempMapContainer = $(this); + var systemId = config.systemIdPrefix + tempMapContainer.data('id') + '-' + data.systemId; + var system = $(this).find('#' + systemId); + + if(system.length === 1){ + // scroll to system + var tempMapWrapper = tempMapContainer.parents('.' + config.mapWrapperClass); + tempMapWrapper.scrollTo(system); + + // select system + system.showSystemInfo(map); + } + + }); + + }; /** @@ -2166,22 +2235,24 @@ console.log('test') * update the Data of the user that is currently viewing the map (if available) -> In - game info * @param userData * @param currentUserData + * @returns {boolean} */ $.fn.updateUserData = function(userData, currentUserData){ - // get all systems var systems = $(this).find('.' + config.systemClass); // get new map instance or load existing var map = getMapInstance(userData.config.id); - // trigger reset event for all Tabs - var tabContentElements = getTabContentElements(); - $(tabContentElements).trigger('pf:highlightTab', [{}]); - // container must exist! otherwise systems cant be updated if(map.getContainer() !== undefined){ + // data for header update + var headerUpdateData = { + mapId: userData.config.id, + userCount: 0 // active user in a map + }; + for(var i = 0; i < systems.length; i++){ // get user Data for System @@ -2206,11 +2277,24 @@ console.log('test') currentUserData.system.id === systemId ){ tempCurrentUserData = currentUserData; + + // set current location data for header update + headerUpdateData.currentSystemId = systemId; + headerUpdateData.currentSystemName = system.getSystemInfo(['alias']); + } + + if(tempUserData){ + headerUpdateData.userCount += tempUserData.user.length; } system.updateSystemUserData(map, tempUserData, tempCurrentUserData); } + + // trigger document event -> update header + $(document).trigger('pf:updateHeaderData', headerUpdateData); } + + return true; }; /** @@ -2239,6 +2323,8 @@ console.log('test') var mapConfig = {}; mapConfig.id = mapElement.data('id'); mapConfig.name = mapElement.data('name'); + mapConfig.scope = mapElement.data('scope'); + mapConfig.icon = mapElement.data('icon'); mapConfig.type = mapElement.data('type'); mapData.config = mapConfig; @@ -2267,6 +2353,7 @@ console.log('test') systemData.rally = tempSystem.data('rally'); systemData.currentUser = tempSystem.data('currentUser'); systemData.updated = tempSystem.data('updated'); + systemData.userCount = (tempSystem.attr('data-original-title') ? parseInt( tempSystem.attr('data-original-title') ) : 0); // position ------------------------------- var positionData = {}; @@ -2356,16 +2443,23 @@ console.log('test') setConnectionObserver(newJsPlumbInstance, info.connection); }); + newJsPlumbInstance.bind('connectionDetached', function(info, e) { + }); + // event after DragStop a connection or new connection newJsPlumbInstance.bind('beforeDrop', function(info) { var connection = info.connection; var sourceSystem = $('#' + info.sourceId); var returnValue = true; + var connectionId = connection.getParameter('connectionId'); + sourceSystem.getMapOverlay().startMapUpdateCounter(); - // set "default" connection status - setConnectionWHStatus(connection, 'wh_fresh'); + // set "default" connection status only for NEW connections + if(!connection.suspendedElement){ + setConnectionWHStatus(connection, 'wh_fresh'); + } // prevent multiple connections between same systems var connections = checkForConnection(newJsPlumbInstance, info.sourceId, info.targetId ); @@ -2381,12 +2475,24 @@ console.log('test') // notification if(returnValue === true){ - Util.showNotify({title: 'New Connection established', text: 'fgdgdf', type: 'success'}); + + var text = 'New connection established'; + if(connectionId > 0){ + text = 'connection switched'; + } + + Util.showNotify({title: text, type: 'success'}); } return returnValue; }); + // event before Detach connection + newJsPlumbInstance.bind('beforeDetach', function(info) { + + return true; + }); + activeInstances[mapId] = newJsPlumbInstance; @@ -2513,8 +2619,7 @@ console.log('test') */ $.fn.scrollTo = function(position){ return this.each(function(){ - // todo re-comment not used jet - //$(this).mCustomScrollbar('scrollTo', position); + $(this).mCustomScrollbar('scrollTo', position); }); }; diff --git a/js/app/module_map.js b/js/app/module_map.js index 8f525c92..c8379871 100644 --- a/js/app/module_map.js +++ b/js/app/module_map.js @@ -68,15 +68,6 @@ define([ // map scopes mapScopes: [ {scope: 'wormhole', label: 'W-Space'} - ], - - mapIcons: [ - {class: 'fa-desktop', label: 'desktop'}, - {class: 'fa-bookmark', label: 'bookmark'}, - {class: 'fa-cube', label: 'cube'}, - {class: 'fa-warning', label: 'warning'}, - {class: 'fa-plane', label: 'plane'}, - {class: 'fa-rocket', label: 'rocket'} ] }; @@ -86,56 +77,7 @@ define([ systemKillsGraphData: {} // data for system kills info graph }; - /** - * shows the add new map dialog - */ - var showNewMapDialog = function(){ - // confirm dialog - var moduleConfig = { - name: 'modules/map_dialog', - position: $('#' + config.dynamicElementWrapperId), - link: 'after', - functions: { - after: function(){ - $( "#" + config.newMapDialogId).dialog({ - modal: true, - resizable: false, - buttons: { - 'Cancel': function(){ - $(this).dialog('close'); - }, - 'Add map': function(){ - - // get form Values - var form = $('#' + config.newMapDialogId).find('form'); - - var newMapData = {}; - - $.each(form.serializeArray(), function(i, field) { - newMapData[field.name] = field.value; - }); - - saveMapData(newMapData); - - $(this).dialog('close'); - } - } - }); - } - } - }; - - var moduleData = { - id: config.newMapDialogId, - title: 'Add new map', - scope: config.mapScopes, - type: Util.getMapTypes(), - icon: config.mapIcons - }; - - Render.showModule(moduleConfig, moduleData); - }; var saveMapData = function(mapData){ @@ -160,8 +102,13 @@ define([ * @returns {*} */ $.fn.getActiveMap = function(){ + var map = $(this).find('.active.' + config.mapTabContentClass + ' .' + config.mapClass); + if(map.length === 0){ + map = false; + } + return map; }; @@ -193,11 +140,6 @@ define([ drawSystemInfoElement($( e.target ), systemInfoData); }); - // highlight a mapTab - $(this).on('pf:highlightTab', function(e, data){ - // TODO - }); - }); }; @@ -1745,6 +1687,7 @@ define([ /** * updates complete map module (all maps) * @param userData + * @returns {boolean} */ $.fn.updateMapModuleData = function(userData){ @@ -1759,25 +1702,29 @@ define([ } // get map Data - $.each(mapElements, function(i, mapElement){ - - var mapId = parseInt( $(mapElement).data('id') ); + for(var i = 0; i < mapElements.length; i++){ + var mapElement = $(mapElements[i]); + var mapId = mapElement.data('id'); var mapUserData = null; // get user data for each active map - $.each(userData.mapUserData, function(j, tempMapData){ + for(var j = 0; j < userData.mapUserData.length; j++){ + var tempMapData = userData.mapUserData[j]; if(tempMapData.config.id === mapId){ // map userData found mapUserData = tempMapData; + break; } - }); + } // update map if(mapUserData){ - $(mapElement).updateUserData(mapUserData, currentUserData); + mapElement.updateUserData(mapUserData, currentUserData); } - }); + } + + return true; }; /** @@ -1950,6 +1897,7 @@ define([ /** * load/update map module into element (all maps) * @param mapData + * @returns {boolean} */ $.fn.updateMapModule = function(mapData){ @@ -2071,7 +2019,7 @@ define([ // add "add" button var tabAddOptions = { id: 0, - tabClasses: [config.mapTabClass, Util.getInfoForMap( 'default', 'classTab') ], + tabClasses: [config.mapTabClass, Util.getInfoForMap( 'standard', 'classTab') ], contentClasses: [config.mapTabContentClass], icon: 'fa-plus', name: 'add', @@ -2113,7 +2061,7 @@ define([ if(mapId === 0){ // add new Tab selected - showNewMapDialog(); + $(document).trigger('pf:menuEditMap', {newMap: true}); e.preventDefault(); } }); @@ -2138,19 +2086,23 @@ define([ } }); - allTabElements.on('hide.bs.tab', function (e) { + allTabElements.on('hide.bs.tab', function (e, a) { - var mapId = $(e.target).data('map-id'); + var newMapId = $(e.relatedTarget).data('map-id'); + var oldMapId = $(e.target).data('map-id'); - var currentTabContentElement = $('#' + config.mapTabIdPrefix + mapId); - - // disable scrollbar for map that will be hidden. "freeze" current state - var scrollableElement = currentTabContentElement.find('.' + config.mapWrapperClass); - $(scrollableElement).mCustomScrollbar( 'disable' ); + // disable map if new map is selected -> not "add button" + if(newMapId > 0){ + var currentTabContentElement = $('#' + config.mapTabIdPrefix + oldMapId); + // disable scrollbar for map that will be hidden. "freeze" current state + var scrollableElement = currentTabContentElement.find('.' + config.mapWrapperClass); + $(scrollableElement).mCustomScrollbar( 'disable' ); + } }); } + return true; }; /** diff --git a/js/app/page.js b/js/app/page.js index 2b27897c..25683367 100644 --- a/js/app/page.js +++ b/js/app/page.js @@ -7,10 +7,10 @@ define([ 'app/util', 'app/render', 'bootbox', + 'app/ccp', 'slidebars', - 'fullScreen', 'app/module_map' -], function($, Init, Util, Render, bootbox) { +], function($, Init, Util, Render, bootbox, CCP) { 'use strict'; @@ -33,6 +33,9 @@ define([ headClass: 'pf-head', // class for page head headMenuClass: 'pf-head-menu', // class for page head menu button (left) headMapClass: 'pf-head-map', // class for page head map button (right) + headActiveUserClass: 'pf-head-active-user', // class for "active user" link + headCurrentLocationClass: 'pf-head-current-location', // class for "show current location" link + headProgramStatusClass: 'pf-head-program-status', // class for "program status" notification // footer pageFooterId: 'pf-footer', // id for page footer @@ -206,12 +209,19 @@ define([ ) ); - // init menu - if($.fullscreen.isNativelySupported() === true){ - $('#' + config.menuButtonFullScreenId).removeClass('hide'); + // init full screen -> IGB does not support full screen + if(CCP.isInGameBrowser() === false){ + requirejs(['fullScreen'], function() { + if($.fullscreen.isNativelySupported() === true){ + $('#' + config.menuButtonFullScreenId).removeClass('hide'); + } + }); } + + + }; /** @@ -236,13 +246,24 @@ define([ $('', { class: 'list-group-item', href: '#' - }).html('  Grid snap').prepend( + }).html('   Grid snap').prepend( $('',{ class: 'glyphicon glyphicon-th' }) ).on('click', function(){ $('#' + config.mapModuleId).getActiveMap().triggerMenuEvent('Grid', {button: this}); }) + ).append( + $('', { + class: 'list-group-item', + href: '#' + }).html('  Edit').prepend( + $('',{ + class: 'fa fa-edit fa-fw' + }) + ).on('click', function(){ + $(document).triggerMenuEvent('EditMap', {newMap: false}); + }) ) ); }; @@ -274,6 +295,8 @@ define([ var slideMenu = new $.slidebars({ scrollLock: false }); + + // main menus $('.' + config.headMenuClass).on('click', function() { slideMenu.slidebars.toggle('left'); }); @@ -282,11 +305,28 @@ define([ slideMenu.slidebars.toggle('right'); }); + // active pilots + $('.' + config.headActiveUserClass).find('a').on('click', function(){ + $(document).triggerMenuEvent('ShowMapInfo'); + }); + + // current location + $('.' + config.headCurrentLocationClass).find('a').on('click', function(){ + $('#' + config.mapModuleId).getActiveMap().triggerMenuEvent('SelectSystem', {systemId: $(this).data('systemId') }); + }); + $(document).on('pf:closeMenu', function(e){ // close all menus slideMenu.slidebars.close(); }); + // init all tooltips + var tooltipElements = $('#' + config.pageHeaderId).find('[title]'); + tooltipElements.tooltip({placement: 'bottom'}); + + // trigger load main map module -> header is required for drag&drop position + $('#' + config.mapModuleId).trigger('pf:initModule'); + } } }; @@ -373,27 +413,182 @@ define([ return false; }); + $(document).on('pf:menuEditMap', function(e, data){ + // show map edit dialog or edit map + var mapData = false; + + if(data.newMap === false){ + var activeMap = $('#' + config.mapModuleId).getActiveMap(); + + if(activeMap){ + mapData = activeMap.getMapData(true); + } + } + + showNewMapDialog(mapData); + return false; + }); + $(document).on('pf:menuFullScreen', function(e, data){ - var fullScreenElement = $('body'); + if(CCP.isInGameBrowser() === false){ + var fullScreenElement = $('body'); - // close all menus - $(this).trigger('pf:closeMenu', [{}]); + // close all menus + $(this).trigger('pf:closeMenu', [{}]); + + // wait until menu is closed before switch mode (looks better) + setTimeout( + function() { + // fullscreen is not supported by IGB + requirejs(['jquery', 'fullScreen'], function($) { + + if($.fullscreen.isFullScreen()){ + $.fullscreen.exit(); + }else{ + fullScreenElement.fullscreen({overflow: 'overflow-y', toggleClass: config.fullScreenClass}); + } + }); + }, 400); + } - // wait until menu is closed before switch mode (looks better) - setTimeout( - function() { - if($.fullscreen.isFullScreen()){ - $.fullscreen.exit(); - }else{ - fullScreenElement.fullscreen({overflow: 'overflow-y', toggleClass: config.fullScreenClass}); - } - }, 400); return false; }); + // update header links with current map data + $(document).on('pf:updateHeaderData', function(e, data){ + var activeMap = $('#' + config.mapModuleId).getActiveMap(); + + var userCount = 0; + var currentLocationData = {}; + + // show active user just for the current active map + if( + activeMap && + activeMap.data('id') === data.mapId + ){ + userCount = data.userCount; + currentLocationData = data; + } + + updateHeaderActiveUserCount(userCount); + updateHeaderCurrentLocation(currentLocationData); + + }); + }; + + /** + * update the "active user" badge in header + * @param userCount + */ + var updateHeaderActiveUserCount = function(userCount){ + var activeUserElement = $('.' + config.headActiveUserClass); + var badge = activeUserElement.find('.badge'); + + if(badge.data('userCount') !== userCount){ + badge.data('userCount', userCount); + + if(userCount > 0){ + badge.text(userCount); + activeUserElement.velocity('fadeIn', {duration: Init.animationSpeed.headerLink}); + }else{ + activeUserElement.velocity('reverse'); + } + } + }; + + /** + * update the "current location" element in head + * @param locationData + */ + var updateHeaderCurrentLocation = function(locationData){ + var currentLocationElement = $('.' + config.headCurrentLocationClass); + var linkElement = currentLocationElement.find('a'); + var textElement = linkElement.find('span'); + + if( + linkElement.data('systemName') !== locationData.currentSystemName + ){ + var tempSystemName = locationData.currentSystemName; + var tempSystemId = locationData.currentSystemId; + if( + tempSystemName === undefined || + tempSystemId === undefined + ){ + tempSystemName = false; + tempSystemId = false; + } + + linkElement.data('systemName', tempSystemName); + linkElement.data('systemId', tempSystemId); + + if(locationData.currentSystemName){ + textElement.text(locationData.currentSystemName); + currentLocationElement.velocity('fadeIn', {duration: Init.animationSpeed.headerLink}); + }else{ + currentLocationElement.velocity('reverse'); + } + } + }; + + /** + * shows the add new map dialog + */ + var showNewMapDialog = function(mapData){ + + var formData = {}; + + requirejs(['text!templates/modules/map_dialog.html', 'lib/mustache'], function(template, Mustache) { + + var data = { + id: config.newMapDialogId, + scope: config.mapScopes, + type: Util.getMapTypes(), + icon: Util.getMapIcons(), + formData: formData + }; + + var content = Mustache.render(template, data); + + var dialogTitle = 'New map'; + + if(mapData !== false){ + dialogTitle = 'Edit map'; + content = $(content); + content.find('select[name="icon"]').val( mapData.config.icon ); + content.find('input[name="name"]').val( mapData.config.name ); + content.find('select[name="scope"]').val( mapData.config.scope ); + content.find('select[name="type"]').val( mapData.config.type ); + } + + + + var mapInfoDialog = bootbox.dialog({ + title: dialogTitle, + message: content, + buttons: { + close: { + label: 'cancel', + className: 'btn-default' + }, + success: { + label: 'add map', + className: 'btn-primary', + callback: function() { + + // get form Values + var form = $('#' + config.newMapDialogId).find('form'); + var newMapData = form.getFormValues(); + + saveMapData(newMapData); + } + } + } + }); + + }); }; /** @@ -475,6 +670,13 @@ define([ tempData.push( '' ); } + // active pilots + if(tempSystemData.userCount > 0){ + tempData.push(tempSystemData.userCount); + }else{ + tempData.push( '' ); + } + // type tempData.push(tempSystemData.type); @@ -548,6 +750,10 @@ define([ title: '', width: '15px', searchable: false + },{ + title: '', + width: '18px', + searchable: false },{ title: 'type', width: '50px' @@ -935,5 +1141,62 @@ define([ }; + /** + * trigger "program status" in head + * @param status + */ + $.fn.setProgramStatus = function(status){ + var statusElement = $('.' + config.headProgramStatusClass); + var icon = statusElement.find('i'); + var textElement = statusElement.find('span'); + + var iconClass = false; + var textClass = false; + var text = ''; + + switch(status){ + case 'online': + if( ! statusElement.hasClass('txt-color-green')){ + iconClass = 'fa-wifi'; + textClass = 'txt-color-green'; + text = 'online'; + } + break; + case 'problem': + if( ! statusElement.hasClass('txt-color-orange')){ + iconClass = 'fa-warning'; + textClass = 'txt-color-orange'; + text = 'problem'; + } + break; + case 'offline': + if( ! statusElement.hasClass('txt-color-red')){ + iconClass = 'fa-bolt'; + textClass = 'txt-color-red'; + text = 'offline'; + } + break; + } + + // change status, on status changed + if(iconClass !== false){ + + statusElement.velocity('fadeOut', { + duration: Init.animationSpeed.headerLink, + complete: function(){ + statusElement.removeClass('txt-color-green txt-color-orange txt-color-red'); + icon.removeClass('fa-wifi fa-warning fa-bolt'); + statusElement.addClass(textClass); + icon.addClass(iconClass); + textElement.text(text); + } + }).velocity('fadeIn', { + duration: Init.animationSpeed.headerLink + }); + + } + + }; + }); \ No newline at end of file diff --git a/js/app/util.js b/js/app/util.js index de6e0b22..562e51f4 100644 --- a/js/app/util.js +++ b/js/app/util.js @@ -14,10 +14,41 @@ define([ ajaxOverlayWrapperClass: 'pf-loading-overlay-wrapper', ajaxOverlayVisibleClass: 'pf-loading-overlay-visible', - formEditableFieldClass: 'pf-editable' // Class for all xEditable fields + formEditableFieldClass: 'pf-editable', // Class for all xEditable fields + + // available map ions + mapIcons: [ + { + class: 'fa-desktop', + label: 'desktop', + unicode: '' + },{ + class: 'fa-bookmark', + label: 'bookmark', + unicode: '' + },{ + class: 'fa-cube', + label: 'cube', + unicode: '' + },{ + class: 'fa-plane', + label: 'plane', + unicode: '' + },{ + class: 'fa-rocket', + label: 'rocket', + unicode: '' + },{ + class: 'fa-life-ring', + label: 'life ring', + unicode: '' + } + ] }; + + /** * displays a loading indicator on an element */ @@ -164,6 +195,15 @@ define([ }; + /** + * get all available map icons + * @returns {*} + */ + var getMapIcons = function(){ + + return config.mapIcons; + }; + /** * get all available map Types * @returns {Array} @@ -173,12 +213,16 @@ define([ var mapTypes = []; $.each(Init.classes.mapTypes, function(prop, data){ - var tempData = { - type: prop, - label: data.label - }; - mapTypes.push(tempData); + // skip "default" type -> just for 'add' icon + if(data.label.length > 0){ + var tempData = { + type: prop, + label: data.label + }; + + mapTypes.push(tempData); + } }); return mapTypes; @@ -499,6 +543,7 @@ define([ return { showNotify: showNotify, + getMapIcons: getMapIcons, getMapTypes: getMapTypes, getInfoForMap: getInfoForMap, getMapScopes: getMapScopes, diff --git a/js/lib/jquery.ba-throttle-debounce.min.js b/js/lib/jquery.ba-throttle-debounce.min.js new file mode 100644 index 00000000..07205508 --- /dev/null +++ b/js/lib/jquery.ba-throttle-debounce.min.js @@ -0,0 +1,9 @@ +/* + * jQuery throttle / debounce - v1.1 - 3/7/2010 + * http://benalman.com/projects/jquery-throttle-debounce-plugin/ + * + * Copyright (c) 2010 "Cowboy" Ben Alman + * Dual licensed under the MIT and GPL licenses. + * http://benalman.com/about/license/ + */ +(function(b,c){var $=b.jQuery||b.Cowboy||(b.Cowboy={}),a;$.throttle=a=function(e,f,j,i){var h,d=0;if(typeof f!=="boolean"){i=j;j=f;f=c}function g(){var o=this,m=+new Date()-d,n=arguments;function l(){d=+new Date();j.apply(o,n)}function k(){h=c}if(i&&!h){l()}h&&clearTimeout(h);if(i===c&&m>e){l()}else{if(f!==true){h=setTimeout(i?k:l,i===c?e-m:e)}}}if($.guid){g.guid=j.guid=j.guid||$.guid++}return g};$.debounce=function(d,e,f){return f===c?a(d,e,false):a(d,f,e!==false)}})(this); \ No newline at end of file diff --git a/js/lib/jquery.dragToSelect.js b/js/lib/jquery.dragToSelect.js index 3c6c8cbb..84bb92b7 100644 --- a/js/lib/jquery.dragToSelect.js +++ b/js/lib/jquery.dragToSelect.js @@ -332,8 +332,7 @@ jQuery.fn.dragToSelect = function (conf) { parent.disableTextSelect(); } - parent - .mousedown(function (e) { + parent.mousedown(function (e) { if( e.which === 1 && // left mouse down @@ -352,24 +351,27 @@ jQuery.fn.dragToSelect = function (conf) { } - }) - .mousemove(function (e) { + }); - refreshSelectBox(e); + var dragSelectMousemove = function (e) { - if (config.selectables && config.selectOnMove) { + refreshSelectBox(e); - selectElementsInRange(); - } + if (config.selectables && config.selectOnMove) { - if (config.autoScroll) { - scrollPerhaps(e); - } + selectElementsInRange(); + } - e.preventDefault(); - }) - .mouseup(function (e) { + if (config.autoScroll) { + scrollPerhaps(e); + } + e.preventDefault(); + }; + parent.mousemove($.throttle(30, dragSelectMousemove) ); + + + parent.mouseup(function (e) { if (config.selectables) { selectElementsInRange(); } diff --git a/js/lib/jsPlumb-1.6.4-min.js b/js/lib/jsPlumb-1.6.4-min.js deleted file mode 100644 index ea6e8818..00000000 --- a/js/lib/jsPlumb-1.6.4-min.js +++ /dev/null @@ -1,6 +0,0 @@ -!function(){"undefined"==typeof Math.sgn&&(Math.sgn=function(a){return 0==a?0:a>0?1:-1});var a={subtract:function(a,b){return{x:a.x-b.x,y:a.y-b.y}},dotProduct:function(a,b){return a.x*b.x+a.y*b.y},square:function(a){return Math.sqrt(a.x*a.x+a.y*a.y)},scale:function(a,b){return{x:a.x*b,y:a.y*b}}},b=64,c=Math.pow(2,-b-1),d=function(b,c){for(var d=[],e=f(b,c),h=c.length-1,i=2*h-1,j=g(e,i,d,0),k=a.subtract(b,c[0]),m=a.square(k),n=0,o=0;j>o;o++){k=a.subtract(b,l(c,h,d[o],null,null));var p=a.square(k);m>p&&(m=p,n=d[o])}return k=a.subtract(b,c[h]),p=a.square(k),m>p&&(m=p,n=1),{location:n,distance:m}},e=function(a,b){var c=d(a,b);return{point:l(b,b.length-1,c.location,null,null),location:c.location}},f=function(b,c){for(var d=c.length-1,e=2*d-1,f=[],g=[],h=[],i=[],k=[[1,.6,.3,.1],[.4,.6,.6,.4],[.1,.3,.6,1]],l=0;d>=l;l++)f[l]=a.subtract(c[l],b);for(var l=0;d-1>=l;l++)g[l]=a.subtract(c[l+1],c[l]),g[l]=a.scale(g[l],3);for(var m=0;d-1>=m;m++)for(var n=0;d>=n;n++)h[m]||(h[m]=[]),h[m][n]=a.dotProduct(g[m],f[n]);for(l=0;e>=l;l++)i[l]||(i[l]=[]),i[l].y=0,i[l].x=parseFloat(l)/e;for(var o=d,p=d-1,q=0;o+p>=q;q++){var r=Math.max(0,q-p),s=Math.min(q,o);for(l=r;s>=l;l++)j=q-l,i[l+j].y+=h[j][l]*k[j][l]}return i},g=function(a,c,d,e){var f,j,m=[],n=[],o=[],p=[];switch(h(a,c)){case 0:return 0;case 1:if(e>=b)return d[0]=(a[0].x+a[c].x)/2,1;if(i(a,c))return d[0]=k(a,c),1}l(a,c,.5,m,n),f=g(m,c,o,e+1),j=g(n,c,p,e+1);for(var q=0;f>q;q++)d[q]=o[q];for(var q=0;j>q;q++)d[q+f]=p[q];return f+j},h=function(a,b){var c,d,e=0;c=d=Math.sgn(a[0].y);for(var f=1;b>=f;f++)c=Math.sgn(a[f].y),c!=d&&e++,d=c;return e},i=function(a,b){var d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s;i=a[0].y-a[b].y,j=a[b].x-a[0].x,k=a[0].x*a[b].y-a[b].x*a[0].y;for(var t=max_distance_below=0,u=1;b>u;u++){var v=i*a[u].x+j*a[u].y+k;v>t?t=v:max_distance_below>v&&(max_distance_below=v)}return n=0,o=1,p=0,q=i,r=j,s=k-t,l=n*r-q*o,m=1/l,e=(o*s-r*p)*m,q=i,r=j,s=k-max_distance_below,l=n*r-q*o,m=1/l,f=(o*s-r*p)*m,g=Math.min(e,f),h=Math.max(e,f),d=h-g,c>d?1:0},k=function(a,b){var c=1,d=0,e=a[b].x-a[0].x,f=a[b].y-a[0].y,g=a[0].x-0,h=a[0].y-0,i=e*d-f*c,j=1/i,k=(e*h-f*g)*j;return 0+c*k},l=function(a,b,c,d,e){for(var f=[[]],g=0;b>=g;g++)f[0][g]=a[g];for(var h=1;b>=h;h++)for(var g=0;b-h>=g;g++)f[h]||(f[h]=[]),f[h][g]||(f[h][g]={}),f[h][g].x=(1-c)*f[h-1][g].x+c*f[h-1][g+1].x,f[h][g].y=(1-c)*f[h-1][g].y+c*f[h-1][g+1].y;if(null!=d)for(g=0;b>=g;g++)d[g]=f[g][0];if(null!=e)for(g=0;b>=g;g++)e[g]=f[b-g][g];return f[b][0]},m={},n=function(a){var b=m[a];if(!b){b=[];var c=function(){return function(b){return Math.pow(b,a)}},d=function(){return function(b){return Math.pow(1-b,a)}},e=function(a){return function(){return a}},f=function(){return function(a){return a}},g=function(){return function(a){return 1-a}},h=function(a){return function(b){for(var c=1,d=0;di;i++){for(var j=[new e(a)],k=0;a-i>k;k++)j.push(new f);for(var k=0;i>k;k++)j.push(new g);b.push(new h(j))}b.push(new d),m[a]=b}return b},o=function(a,b){for(var c=n(a.length-1),d=0,e=0,f=0;f0?1:-1,h=null;ed;)d+=.005*e,f=o(a,d),c+=p(f,b),b=f;return c},t=function(a,b,c){return r(a,b,c).point},u=function(a,b,c){return r(a,b,c).location},v=function(a,b){var c=o(a,b),d=o(a.slice(0,a.length-1),b),e=d.y-c.y,f=d.x-c.x;return 0==e?1/0:Math.atan(e/f)},w=function(a,b,c){var d=r(a,b,c);return d.location>1&&(d.location=1),d.location<0&&(d.location=0),v(a,d.location)},x=function(a,b,c,d){d=null==d?0:d;var e=r(a,b,d),f=v(a,e.location),g=Math.atan(-1/f),h=c/2*Math.sin(g),i=c/2*Math.cos(g);return[{x:e.point.x+i,y:e.point.y+h},{x:e.point.x-i,y:e.point.y-h}]};window.jsBezier={distanceFromCurve:d,gradientAtPoint:v,gradientAtPointAlongCurveFrom:w,nearestPointOnCurve:e,pointOnCurve:o,pointAlongCurveFrom:t,perpendicularToCurveAt:x,locationAlongCurveFrom:u,getLength:s}}(),function(){"use strict";var a=this.Biltong={},b=function(a){return"[object Array]"===Object.prototype.toString.call(a)},c=function(a,c,d){return a=b(a)?a:[a.x,a.y],c=b(c)?c:[c.x,c.y],d(a,c)},d=a.gradient=function(a,b){return c(a,b,function(a,b){return b[0]==a[0]?b[1]>a[1]?1/0:-1/0:b[1]==a[1]?b[0]>a[0]?0:-0:(b[1]-a[1])/(b[0]-a[0])})},e=(a.normal=function(a,b){return-1/d(a,b)},a.lineLength=function(a,b){return c(a,b,function(a,b){return Math.sqrt(Math.pow(b[1]-a[1],2)+Math.pow(b[0]-a[0],2))})},a.quadrant=function(a,b){return c(a,b,function(a,b){return b[0]>a[0]?b[1]>a[1]?2:1:b[0]==a[0]?b[1]>a[1]?2:1:b[1]>a[1]?3:4})}),f=(a.theta=function(a,b){return c(a,b,function(a,b){var c=d(a,b),f=Math.atan(c),g=e(a,b);return(4==g||3==g)&&(f+=Math.PI),0>f&&(f+=2*Math.PI),f})},a.intersects=function(a,b){var c=a.x,d=a.x+a.w,e=a.y,f=a.y+a.h,g=b.x,h=b.x+b.w,i=b.y,j=b.y+b.h;return g>=c&&d>=g&&i>=e&&f>=i||h>=c&&d>=h&&i>=e&&f>=i||g>=c&&d>=g&&j>=e&&f>=j||h>=c&&d>=g&&j>=e&&f>=j||c>=g&&h>=c&&e>=i&&j>=e||d>=g&&h>=d&&e>=i&&j>=e||c>=g&&h>=c&&f>=i&&j>=f||d>=g&&h>=c&&f>=i&&j>=f},a.encloses=function(a,b,c){var d=a.x,e=a.x+a.w,f=a.y,g=a.y+a.h,h=b.x,i=b.x+b.w,j=b.y,k=b.y+b.h,l=function(a,b,d,e){return c?b>=a&&d>=e:b>a&&d>e};return l(d,h,e,i)&&l(f,j,g,k)},[null,[1,-1],[1,1],[-1,1],[-1,-1]]),g=[null,[-1,-1],[-1,1],[1,1],[1,-1]];a.pointOnLine=function(a,b,c){var h=d(a,b),i=e(a,b),j=c>0?f[i]:g[i],k=Math.atan(h),l=Math.abs(c*Math.sin(k))*j[1],m=Math.abs(c*Math.cos(k))*j[0];return{x:a.x+m,y:a.y+l}},a.perpendicularLineTo=function(a,b,c){var e=d(a,b),f=Math.atan(-1/e),g=c/2*Math.sin(f),h=c/2*Math.cos(f);return[{x:b.x+h,y:b.y+g},{x:b.x-h,y:b.y-g}]}}.call(this),function(){var a=function(a){return"[object Array]"===Object.prototype.toString.call(a)},b=function(a){return"[object Number]"===Object.prototype.toString.call(a)},c=function(a){return"string"==typeof a},d=function(a){return"boolean"==typeof a},e=function(a){return null==a},f=function(a){return null==a?!1:"[object Object]"===Object.prototype.toString.call(a)},g=function(a){return"[object Date]"===Object.prototype.toString.call(a)},h=function(a){return"[object Function]"===Object.prototype.toString.call(a)},i=function(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0},j=this,k=j.jsPlumbUtil={isArray:a,isString:c,isBoolean:d,isNull:e,isObject:f,isDate:g,isFunction:h,isEmpty:i,isNumber:b,clone:function(b){if(c(b))return""+b;if(d(b))return!!b;if(g(b))return new Date(b.getTime());if(h(b))return b;if(a(b)){for(var e=[],i=0;i=f.length,i=function(){return e[g[1]]||function(){return e[g[1]]=[],e[g[1]]}()};if(h)g?i()[g[3]]=c:e[a]=c;else if(g){var j=i();e=j[g[3]]||function(){return j[g[3]]={},j[g[3]]}()}else e=e[a]||function(){return e[a]={},e[a]}()}),a},functionChain:function(a,b,c){for(var d=0;d-1&&a.splice(c,1),-1!=c},remove:function(a,b){var c=k.indexOf(a,b);return c>-1&&a.splice(c,1),-1!=c},addWithFunction:function(a,b,c){-1==k.findWithFunction(a,c)&&a.push(b)},addToList:function(a,b,c,d){var e=a[b];return null==e&&(e=[],a[b]=e),e[d?"unshift":"push"](c),e},extend:function(b,c){var d;for(c=a(c)?c:[c],d=0;d2)for(d=2;dh&&j!==!1;){if(c[d])a[d][h].apply(this,[e,f]);else try{j=a[d][h].apply(this,[e,f])}catch(l){k.log("jsPlumb: fire failed for event "+d+" : "+l)}h++,(null==a||null==a[d])&&(i=!0)}}return this},this.unbind=function(b){return b?delete a[b]:a={},this},this.getListener=function(b){return a[b]},this.setSuspendEvents=function(a){b=a},this.isSuspendEvents=function(){return b},this.cleanupListeners=function(){for(var b in a)a[b]=null}},k.EventGenerator.prototype={cleanup:function(){this.cleanupListeners()}},Function.prototype.bind||(Function.prototype.bind=function(a){if("function"!=typeof this)throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");var b=Array.prototype.slice.call(arguments,1),c=this,d=function(){},e=function(){return c.apply(this instanceof d&&a?this:a,b.concat(Array.prototype.slice.call(arguments)))};return d.prototype=this.prototype,e.prototype=new d,e})}.call(this),function(){"use strict";var a=this,b=a.jsPlumbUtil;b.ieVersion=/MSIE\s([\d.]+)/.test(navigator.userAgent)?new Number(RegExp.$1):-1,b.oldIE=b.ieVersion>-1&&b.ieVersion<9,b.matchesSelector=function(a,b,c){c=c||a.parentNode;for(var d=c.querySelectorAll(b),e=0;e';var b=a.firstChild;null!=b&&null!=b.style?(b.style.behavior="url(#default#VML)",c.vml=b?"object"==typeof b.adj:!0):c.vml=!1,a.parentNode.removeChild(a)}return c.vml},d=function(){var a=-1;if("Microsoft Internet Explorer"==navigator.appName){var b=navigator.userAgent,c=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");null!=c.exec(b)&&(a=parseFloat(RegExp.$1))}return a}(),e=d>-1&&9>d,f=function(a,b){if(null==a)return[0,0];var c=k(a),d=j(c,0);return[d[b+"X"],d[b+"Y"]]},g=function(a){return null==a?[0,0]:e?[a.clientX+document.documentElement.scrollLeft,a.clientY+document.documentElement.scrollTop]:f(a,"page")},h=function(a){return f(a,"screen")},i=function(a){return f(a,"client")},j=function(a,b){return a.item?a.item(b):a[b]},k=function(a){return a.touches&&a.touches.length>0?a.touches:a.changedTouches&&a.changedTouches.length>0?a.changedTouches:a.targetTouches&&a.targetTouches.length>0?a.targetTouches:[a]},l=function(a){var b={},c=[],d={},e={},f={};this.register=function(g){var h=a.getId(g),i=jsPlumbAdapter.getOffset(g,a);b[h]||(b[h]=g,c.push(g),d[h]={});var j=function(b){if(b)for(var c=0;c0){var l=jsPlumbAdapter.getOffset(g,a);d[h][k]={id:k,offset:{left:l.left-i.left,top:l.top-i.top}},f[k]=h}j(b.childNodes[c])}};j(g)},this.updateOffsets=function(b){if(null!=b){var c=jsPlumb.getDOMElement(b),e=a.getId(c),g=d[e],h=jsPlumbAdapter.getOffset(c,a);if(g)for(var i in g){var j=jsPlumb.getElementObject(i),k=jsPlumbAdapter.getOffset(j,a);d[e][i]={id:i,offset:{left:k.left-h.left,top:k.top-h.top}},f[i]=e}}},this.endpointAdded=function(c){var g=document.body,h=a.getId(c),i=jsPlumbAdapter.getOffset(c,a),j=c.parentNode;for(e[h]=e[h]?e[h]+1:1;null!=j&&j!=g;){var k=a.getId(j,null,!0);if(k&&b[k]){var l=jsPlumbAdapter.getOffset(j,a);null==d[k][h]&&(d[k][h]={id:h,offset:{left:i.left-l.left,top:i.top-l.top}},f[h]=k);break}j=j.parentNode}},this.endpointDeleted=function(a){if(e[a.elementId]&&(e[a.elementId]--,e[a.elementId]<=0))for(var b in d)d[b]&&(delete d[b][a.elementId],delete f[a.elementId])},this.changeId=function(a,b){d[b]=d[a],d[a]={},f[b]=f[a],f[a]=null},this.getElementsForDraggable=function(a){return d[a]},this.elementRemoved=function(a){var b=f[a];b&&(delete d[b][a],delete f[a])},this.reset=function(){b={},c=[],d={},e={}},this.dragEnded=function(b){var c=a.getId(b),d=f[c];d&&this.updateOffsets(d)},this.setParent=function(b,c,e,g){var h=f[c];if(h){d[g]||(d[g]={}),d[g][c]=d[h][c],delete d[h][c];var i=jsPlumbAdapter.getOffset(e,a),j=jsPlumbAdapter.getOffset(b,a);d[g][c].offset={left:j.left-i.left,top:j.top-i.top},f[c]=g}},this.getDragAncestor=function(b){var c=jsPlumb.getDOMElement(b),d=a.getId(c),e=f[d];return e?jsPlumb.getDOMElement(e):null}};window.console||(window.console={time:function(){},timeEnd:function(){},group:function(){},groupEnd:function(){},log:function(){}});var m=function(a){return null==a?null:a.replace(/^\s\s*/,"").replace(/\s\s*$/,"")},n=function(a,b){b=m(b),"undefined"!=typeof a.className.baseVal?a.className.baseVal=b:a.className=b},o=function(a){return"undefined"==typeof a.className.baseVal?a.className:a.className.baseVal},p=function(a,b,c){for(var d=jsPlumbUtil.isArray(c)?c:c.split(/\s+/),e=o(a),f=e.split(/\s+/),g=0;gf;f++)d&&d==e[f]||e[f].setHover(b,!0,c)},h=function(a){return null==a?null:a.split(" ")},i=function(b,c,d){if(b.getDefaultType){for(var e=b.getTypeDescriptor(),f=a.merge({},b.getDefaultType()),g=0,h=b._jsPlumb.types.length;h>g;g++)f=a.merge(f,b._jsPlumb.instance.getType(b._jsPlumb.types[g],e),["cssClass"]);c&&(f=a.populate(f,c)),b.applyType(f,d),d||b.repaint()}},j=window.jsPlumbUIComponent=function(b){jsPlumbUtil.EventGenerator.apply(this,arguments);var c=this,d=arguments,g=c.idPrefix,h=g+(new Date).getTime();if(this._jsPlumb={instance:b._jsPlumb,parameters:b.parameters||{},paintStyle:null,hoverPaintStyle:null,paintStyleInUse:null,hover:!1,beforeDetach:b.beforeDetach,beforeDrop:b.beforeDrop,overlayPlacements:[],hoverClass:b.hoverClass||b._jsPlumb.Defaults.HoverClass,types:[]},this.getId=function(){return h},b.events)for(var i in b.events)c.bind(i,b.events[i]);this.clone=function(){var a={};return this.constructor.apply(a,d),a}.bind(this),this.isDetachAllowed=function(b){var c=!0;if(this._jsPlumb.beforeDetach)try{c=this._jsPlumb.beforeDetach(b)}catch(d){a.log("jsPlumb: beforeDetach callback failed",d)}return c},this.isDropAllowed=function(b,c,d,e,f,g,h){var i=this._jsPlumb.instance.checkCondition("beforeDrop",{sourceId:b,targetId:c,scope:d,connection:e,dropEndpoint:f,source:g,target:h});if(this._jsPlumb.beforeDrop)try{i=this._jsPlumb.beforeDrop({sourceId:b,targetId:c,scope:d,connection:e,dropEndpoint:f,source:g,target:h})}catch(j){a.log("jsPlumb: beforeDrop callback failed",j)}return i};var j=[],k=function(a,b,c){j.push([a,b,c]),a.bind(b,c)},l=[],m=function(a,b,c,d){var e=f[c]||c,g=function(a){d&&d(a)===!1||b.fire(e,b,a)};l.push([a,c,g,b]),b._jsPlumb.instance.on(a,c,g)},n=function(a,b,c,d){f[b]||b,d._jsPlumb.instance.off(a,b,c)};this.setListenerComponent=function(a){for(var b=0;bd;d++)m(a,b,e[d],c[e[d]])},this.detachListeners=function(){for(var a=0;a1){for(var b=0,c=e.length;c>b;b++)n(a,e[b]);for(b=1,c=arguments.length;c>b;b++)this.attachListeners(a,arguments[b])}}},k=function(a,b){var c=a._jsPlumb.types[b],d=a._jsPlumb.instance.getType(c,a.getTypeDescriptor());null!=d&&d.cssClass&&a.canvas&&a._jsPlumb.instance.removeClass(a.canvas,d.cssClass)};jsPlumbUtil.extend(j,jsPlumbUtil.EventGenerator,{getParameter:function(a){return this._jsPlumb.parameters[a]},setParameter:function(a,b){this._jsPlumb.parameters[a]=b},getParameters:function(){return this._jsPlumb.parameters},setParameters:function(a){this._jsPlumb.parameters=a},addClass:function(a){jsPlumbAdapter.addClass(this.canvas,a)},removeClass:function(a){jsPlumbAdapter.removeClass(this.canvas,a)},setType:function(a,b,c){this.clearTypes(),this._jsPlumb.types=h(a)||[],i(this,b,c)},getType:function(){return this._jsPlumb.types},reapplyTypes:function(a,b){i(this,a,b)},hasType:function(a){return-1!=jsPlumbUtil.indexOf(this._jsPlumb.types,a)},addType:function(a,b,c){var d=h(a),e=!1;if(null!=d){for(var f=0,g=d.length;g>f;f++)this.hasType(d[f])||(this._jsPlumb.types.push(d[f]),e=!0);e&&i(this,b,c)}},removeType:function(b,c){var d=h(b),e=!1,f=function(b){var c=a.indexOf(this._jsPlumb.types,b);return-1!=c?(k(this,c),this._jsPlumb.types.splice(c,1),!0):!1}.bind(this);if(null!=d){for(var g=0,j=d.length;j>g;g++)e=f(d[g])||e;e&&i(this,null,c)}},clearTypes:function(a){for(var b=this._jsPlumb.types.length,c=0;b>c;c++)k(this,0),this._jsPlumb.types.splice(0,1);i(this,{},a)},toggleType:function(a,b,c){var d=h(a);if(null!=d){for(var e=0,f=d.length;f>e;e++){var g=jsPlumbUtil.indexOf(this._jsPlumb.types,d[e]);-1!=g?(k(this,g),this._jsPlumb.types.splice(g,1)):this._jsPlumb.types.push(d[e])}i(this,b,c)}},applyType:function(a,b){if(this.setPaintStyle(a.paintStyle,b),this.setHoverPaintStyle(a.hoverPaintStyle,b),a.parameters)for(var c in a.parameters)this.setParameter(c,a.parameters[c])},setPaintStyle:function(a,b){this._jsPlumb.paintStyle=a,this._jsPlumb.paintStyleInUse=this._jsPlumb.paintStyle,d(this),b||this.repaint()},getPaintStyle:function(){return this._jsPlumb.paintStyle},setHoverPaintStyle:function(a,b){this._jsPlumb.hoverPaintStyle=a,d(this),b||this.repaint()},getHoverPaintStyle:function(){return this._jsPlumb.hoverPaintStyle},cleanup:function(){this.unbindListeners(),this.detachListeners()},destroy:function(){this.cleanupListeners(),this.clone=null,this._jsPlumb=null},isHover:function(){return this._jsPlumb.hover},setHover:function(a,b,d){if(this._jsPlumb&&!this._jsPlumb.instance.currentlyDragging&&!this._jsPlumb.instance.isHoverSuspended()){if(this._jsPlumb.hover=a,null!=this.canvas){if(null!=this._jsPlumb.instance.hoverClass){var e=a?"addClass":"removeClass";this._jsPlumb.instance[e](this.canvas,this._jsPlumb.instance.hoverClass)}null!=this._jsPlumb.hoverClass&&this._jsPlumb.instance[e](this.canvas,this._jsPlumb.hoverClass)}null!=this._jsPlumb.hoverPaintStyle&&(this._jsPlumb.paintStyleInUse=a?this._jsPlumb.hoverPaintStyle:this._jsPlumb.paintStyle,this._jsPlumb.instance.isSuspendDrawing()||(d=d||c(),this.repaint({timestamp:d,recalc:!1}))),this.getAttachedElements&&!b&&g(this,a,c(),this)}}});var l="__label",m=function(a,b){for(var c=-1,d=0,e=a._jsPlumb.overlays.length;e>d;d++)if(b===a._jsPlumb.overlays[d].id){c=d;break}return c},n=function(a,b){var c={cssClass:b.cssClass,labelStyle:a.labelStyle,id:l,component:a,_jsPlumb:a._jsPlumb.instance},d=u.extend(c,b);return new(u.Overlays[a._jsPlumb.instance.getRenderMode()].Label)(d)},o=function(b,c){var d=null;if(a.isArray(c)){var e=c[0],f=u.extend({component:b,_jsPlumb:b._jsPlumb.instance},c[1]);3==c.length&&u.extend(f,c[2]),d=new(u.Overlays[b._jsPlumb.instance.getRenderMode()][e])(f)}else d=c.constructor==String?new(u.Overlays[b._jsPlumb.instance.getRenderMode()][c])({component:b,_jsPlumb:b._jsPlumb.instance}):c;b._jsPlumb.overlays.push(d)},p=function(a,b){var c=a.defaultOverlayKeys||[],d=b.overlays,e=function(b){return a._jsPlumb.instance.Defaults[b]||u.Defaults[b]||[]};d||(d=[]);for(var f=0,g=c.length;g>f;f++)d.unshift.apply(d,e(c[f]));return d},q=window.OverlayCapableJsPlumbUIComponent=function(a){j.apply(this,arguments),this._jsPlumb.overlays=[];var b=p(this,a);if(b)for(var c=0,d=b.length;d>c;c++)o(this,b[c]);if(a.label){var e=a.labelLocation||this.defaultLabelLocation||.5,f=a.labelStyle||this._jsPlumb.instance.Defaults.LabelStyle;this._jsPlumb.overlays.push(n(this,{label:a.label,location:e,labelStyle:f}))}this.setListenerComponent=function(a){if(this._jsPlumb)for(var b=0;bc;c++)this.addOverlay(a.overlays[c],!0)},setHover:function(a){if(this._jsPlumb&&!this._jsPlumb.instance.isConnectionBeingDragged())for(var b=0,c=this._jsPlumb.overlays.length;c>b;b++)this._jsPlumb.overlays[b][a?"addClass":"removeClass"](this._jsPlumb.instance.hoverClass)},addOverlay:function(a,b){o(this,a),b||this.repaint()},getOverlay:function(a){var b=m(this,a);return b>=0?this._jsPlumb.overlays[b]:null},getOverlays:function(){return this._jsPlumb.overlays},hideOverlay:function(a){var b=this.getOverlay(a);b&&b.hide()},hideOverlays:function(){for(var a=0,b=this._jsPlumb.overlays.length;b>a;a++)this._jsPlumb.overlays[a].hide()},showOverlay:function(a){var b=this.getOverlay(a);b&&b.show()},showOverlays:function(){for(var a=0,b=this._jsPlumb.overlays.length;b>a;a++)this._jsPlumb.overlays[a].show()},removeAllOverlays:function(a){for(var b=0,c=this._jsPlumb.overlays.length;c>b;b++)this._jsPlumb.overlays[b].cleanup&&this._jsPlumb.overlays[b].cleanup();this._jsPlumb.overlays.splice(0,this._jsPlumb.overlays.length),this._jsPlumb.overlayPositions=null,a||this.repaint()},removeOverlay:function(a){var b=m(this,a);if(-1!=b){var c=this._jsPlumb.overlays[b];c.cleanup&&c.cleanup(),this._jsPlumb.overlays.splice(b,1),this._jsPlumb.overlayPositions&&delete this._jsPlumb.overlayPositions[a]}},removeOverlays:function(){for(var a=0,b=arguments.length;b>a;a++)this.removeOverlay(arguments[a])},moveParent:function(a){this.bgCanvas&&(this.bgCanvas.parentNode.removeChild(this.bgCanvas),a.appendChild(this.bgCanvas)),this.canvas.parentNode.removeChild(this.canvas),a.appendChild(this.canvas);for(var b=0;bi;i++)d=e.getElementObject(b[i]),g=e.getDOMElement(d),f=e.getAttribute(g,"id"),h.push(c.apply(e,[g,f]))}else d=e.getDOMElement(b),f=e.getId(d),h=c.apply(e,[d,f]);return h},K=function(a){return r[a]},L=function(b,c,d){if(!jsPlumbAdapter.headless){var f=null==c?!1:c;if(f&&u.isDragSupported(b,e)&&!u.isAlreadyDraggable(b,e)){var g=d||e.Defaults.DragOptions;g=u.extend({},g);var h=u.dragEvents.drag,i=u.dragEvents.stop,j=u.dragEvents.start,k=e.getDOMElement(b),l=e.dragManager.getDragAncestor(k),m={left:0,top:0},n=m,o=!1;g[j]=a.wrap(g[j],function(){return n=null!=l?jsPlumbAdapter.getOffset(l,e):m,e.setHoverSuspended(!0),e.select({source:b}).addClass(e.elementDraggingClass+" "+e.sourceElementDraggingClass,!0),e.select({target:b}).addClass(e.elementDraggingClass+" "+e.targetElementDraggingClass,!0),e.setConnectionBeingDragged(!0),g.canDrag?d.canDrag():void 0 -},!1),g[h]=a.wrap(g[h],function(){var a=e.getUIPosition(arguments,e.getZoom());a.left+=n.left,a.top+=n.top,I(b,a,null,!0),o&&e.addClass(b,"jsPlumb_dragged"),o=!0}),g[i]=a.wrap(g[i],function(){var a=e.getUIPosition(arguments,e.getZoom(),!0);I(b,a),o=!1,e.removeClass(b,"jsPlumb_dragged"),e.setHoverSuspended(!1),e.select({source:b}).removeClass(e.elementDraggingClass+" "+e.sourceElementDraggingClass,!0),e.select({target:b}).removeClass(e.elementDraggingClass+" "+e.targetElementDraggingClass,!0),e.setConnectionBeingDragged(!1),e.dragManager.dragEnded(b)});var p=Y(b);x[p]=!0;var q=x[p];g.disabled=null==q?!1:!q,e.initDraggable(b,g,!1),e.dragManager.register(b)}}},M=function(b,c){var d=u.extend({},b);if(c&&u.extend(d,c),d.source&&(d.source.endpoint?d.sourceEndpoint=d.source:d.source=e.getDOMElement(d.source)),d.target&&(d.target.endpoint?d.targetEndpoint=d.target:d.target=e.getDOMElement(d.target)),b.uuids&&(d.sourceEndpoint=K(b.uuids[0]),d.targetEndpoint=K(b.uuids[1])),d.sourceEndpoint&&d.sourceEndpoint.isFull())return a.log(e,"could not add connection; source endpoint is full"),void 0;if(d.targetEndpoint&&d.targetEndpoint.isFull())return a.log(e,"could not add connection; target endpoint is full"),void 0;if(!d.type&&d.sourceEndpoint&&(d.type=d.sourceEndpoint.connectionType),d.sourceEndpoint&&d.sourceEndpoint.connectorOverlays){d.overlays=d.overlays||[];for(var f=0,g=d.sourceEndpoint.connectorOverlays.length;g>f;f++)d.overlays.push(d.sourceEndpoint.connectorOverlays[f])}!d["pointer-events"]&&d.sourceEndpoint&&d.sourceEndpoint.connectorPointerEvents&&(d["pointer-events"]=d.sourceEndpoint.connectorPointerEvents);var h,i,j,k=function(a,b){var c=u.extend({},a);for(var d in b)b[d]&&(c[d]=b[d]);return c},l=function(a,b,c){return e.addEndpoint(a,k(i.def,{anchor:d.anchors?d.anchors[c]:d.anchor,endpoint:d.endpoints?d.endpoints[c]:d.endpoint,paintStyle:d.endpointStyles?d.endpointStyles[c]:d.endpointStyle,hoverPaintStyle:d.endpointHoverStyles?d.endpointHoverStyles[c]:d.endpointHoverStyle}))};if(d.target&&!d.target.endpoint&&!d.targetEndpoint&&!d.newConnection&&(h=Y(d.target),i=this.targetEndpointDefinitions[h])){if(!i.enabled)return;i.isTarget=!0,j=null!=i.endpoint&&i.endpoint._jsPlumb?i.endpoint:l(d.target,i.def,1),i.uniqueEndpoint&&(i.endpoint=j),d.targetEndpoint=j,j._doNotDeleteOnDetach=!1,j._deleteOnDetach=!0}if(d.source&&!d.source.endpoint&&!d.sourceEndpoint&&!d.newConnection&&(h=Y(d.source),i=this.sourceEndpointDefinitions[h])){if(!i.enabled)return;j=null!=i.endpoint&&i.endpoint._jsPlumb?i.endpoint:l(d.source,i.def,0),i.uniqueEndpoint&&(i.endpoint=j),d.sourceEndpoint=j,j._doNotDeleteOnDetach=!1,j._deleteOnDetach=!0}return d}.bind(e),N=function(a){var b=e.Defaults.ConnectionType||e.getDefaultConnectionType();e.Defaults.EndpointType||u.Endpoint,a._jsPlumb=e,a.newConnection=N,a.newEndpoint=Q,a.endpointsByUUID=r,a.endpointsByElement=q,a.finaliseConnection=O;var c=new b(a);return c.id="con_"+F(),P("click","click",c),P("dblclick","dblclick",c),P("contextmenu","contextmenu",c),c.isDetachable()&&(c.endpoints[0].initDraggable(),c.endpoints[1].initDraggable()),c},O=function(a,b,c,d){if(b=b||{},a.suspendedEndpoint||p.push(a),a.endpoints[0].isTemporarySource=!1,(null==a.suspendedEndpoint||d)&&e.anchorManager.newConnection(a),I(a.source),!b.doNotFireConnectionEvent&&b.fireEvent!==!1){var f={connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]};e.fire("connection",f,c)}},P=function(a,b,c){c.bind(a,function(a,d){e.fire(b,c,d)})},Q=function(a){var b=e.Defaults.EndpointType||u.Endpoint,c=u.extend({},a);c._jsPlumb=e,c.newConnection=N,c.newEndpoint=Q,c.endpointsByUUID=r,c.endpointsByElement=q,c.finaliseConnection=O,c.fireDetachEvent=_,c.fireMoveEvent=ab,c.floatingConnections=w,c.elementId=Y(c.source);var d=new b(c);return d.id="ep_"+F(),P("click","endpointClick",d),P("dblclick","endpointDblClick",d),P("contextmenu","contextmenu",d),jsPlumbAdapter.headless||e.dragManager.endpointAdded(c.source),d},R=function(a,b,c){var d=q[a];if(d&&d.length)for(var e=0,f=d.length;f>e;e++){for(var g=0,h=d[e].connections.length;h>g;g++){var i=b(d[e].connections[g]);if(i)return}c&&c(d[e])}},S=function(a,b){return J(a,function(a,c){x[c]=b,this.isDragSupported(a)&&this.setElementDraggable(a,b)})},T=function(a,b,c){b="block"===b;var d=null;c&&(d=b?function(a){a.setVisible(!0,!0,!0)}:function(a){a.setVisible(!1,!0,!0)});var e=k(a);R(e.id,function(a){if(b&&c){var d=a.sourceId===e.id?1:0;a.endpoints[d].isVisible()&&a.setVisible(!0)}else a.setVisible(b)},d)},U=function(a){return J(a,function(a,b){var c=null==x[b]?!1:x[b];return c=!c,x[b]=c,this.setDraggable(a,c),c})},V=function(a,b){var c=null;b&&(c=function(a){var b=a.isVisible();a.setVisible(!b)}),R(a,function(a){var b=a.isVisible();a.setVisible(!b)},c)},W=this.updateOffset=function(a){var c,d=a.timestamp,f=a.recalc,g=a.offset,h=a.elId;return A&&!d&&(d=B),!f&&d&&d===v[h]?{o:a.offset||t[h],s:z[h]}:(f||!g?(c=document.getElementById(h),null!=c&&(z[h]=e.getSize(c),t[h]=b(c,e),v[h]=d)):(t[h]=g,null==z[h]&&(c=document.getElementById(h),null!=c&&(z[h]=e.getSize(c))),v[h]=d),t[h]&&!t[h].right&&(t[h].right=t[h].left+z[h][0],t[h].bottom=t[h].top+z[h][1],t[h].width=z[h][0],t[h].height=z[h][1],t[h].centerx=t[h].left+t[h].width/2,t[h].centery=t[h].top+t[h].height/2),{o:t[h],s:z[h]})},X=function(a){var b=t[a];return b?{o:b,s:z[a]}:W({elId:a})},Y=function(a,b,c){if(jsPlumbUtil.isString(a))return a;if(null==a)return null;var d=e.getAttribute(a,"id");return d&&"undefined"!==d||(2==arguments.length&&void 0!==arguments[1]?d=b:(1==arguments.length||3==arguments.length&&!arguments[2])&&(d="jsPlumb_"+f+"_"+F()),c||e.setAttribute(a,"id",d)),d};this.setConnectionBeingDragged=function(a){y=a},this.isConnectionBeingDragged=function(){return y},this.connectorClass="_jsPlumb_connector",this.hoverClass="_jsPlumb_hover",this.endpointClass="_jsPlumb_endpoint",this.endpointConnectedClass="_jsPlumb_endpoint_connected",this.endpointFullClass="_jsPlumb_endpoint_full",this.endpointDropAllowedClass="_jsPlumb_endpoint_drop_allowed",this.endpointDropForbiddenClass="_jsPlumb_endpoint_drop_forbidden",this.overlayClass="_jsPlumb_overlay",this.draggingClass="_jsPlumb_dragging",this.elementDraggingClass="_jsPlumb_element_dragging",this.sourceElementDraggingClass="_jsPlumb_source_element_dragging",this.targetElementDraggingClass="_jsPlumb_target_element_dragging",this.endpointAnchorClassPrefix="_jsPlumb_endpoint_anchor",this.hoverSourceClass="_jsPlumb_source_hover",this.hoverTargetClass="_jsPlumb_target_hover",this.dragSelectClass="_jsPlumb_drag_select",this.Anchors={},this.Connectors={svg:{},vml:{}},this.Endpoints={svg:{},vml:{}},this.Overlays={svg:{},vml:{}},this.ConnectorRenderers={},this.SVG="svg",this.VML="vml",this.addEndpoint=function(b,c,d){d=d||{};var f=u.extend({},d);u.extend(f,c),f.endpoint=f.endpoint||e.Defaults.Endpoint,f.paintStyle=f.paintStyle||e.Defaults.EndpointStyle,b=H(b);for(var g=[],h=a.isArray(b)||null!=b.length&&!a.isString(b)?b:[b],i=0,j=h.length;j>i;i++){var k=e.getDOMElement(h[i]),l=Y(k);f.source=k,qb(f.source),W({elId:l,timestamp:B});var m=Q(f);f.parentAnchor&&(m.parentAnchor=f.parentAnchor),a.addToList(q,l,m);var n=t[l],o=z[l],p=m.anchor.compute({xy:[n.left,n.top],wh:o,element:m,timestamp:B}),r={anchorLoc:p,timestamp:B};A&&(r.recalc=!1),A||m.paint(r),g.push(m),m._doNotDeleteOnDetach=!0}return 1==g.length?g[0]:g},this.addEndpoints=function(b,c,d){for(var f=[],g=0,h=c.length;h>g;g++){var i=e.addEndpoint(b,c[g],d);a.isArray(i)?Array.prototype.push.apply(f,i):f.push(i)}return f},this.animate=function(b,c,d){d=d||{};var f=this.getElementObject(b),g=this.getDOMElement(b),h=Y(g),i=u.animEvents.step,j=u.animEvents.complete;d[i]=a.wrap(d[i],function(){e.repaint(h)}),d[j]=a.wrap(d[j],function(){e.repaint(h)}),e.doAnimate(f,c,d)},this.checkCondition=function(b,c){var d=e.getListener(b),f=!0;if(d&&d.length>0)try{for(var g=0,h=d.length;h>g;g++)f=f&&d[g](c)}catch(i){a.log(e,"cannot check condition ["+b+"]"+i)}return f},this.checkASyncCondition=function(b,c,d,f){var g=e.getListener(b);if(g&&g.length>0)try{g[0](c,d,f)}catch(h){a.log(e,"cannot asynchronously check condition ["+b+"]"+h)}},this.connect=function(a,b){var c,d=M(a,b);return d&&(qb(d.source),c=N(d),O(c,d)),c};var Z=[{el:"source",elId:"sourceId",epDefs:"sourceEndpointDefinitions"},{el:"target",elId:"targetId",epDefs:"targetEndpointDefinitions"}],$=function(a,b,c,d){var e,f,g,h=Z[c],i=a[h.elId],j=(a[h.el],a.endpoints[c]),k={index:c,originalSourceId:0===c?i:a.sourceId,newSourceId:a.sourceId,originalTargetId:1==c?i:a.targetId,newTargetId:a.targetId,connection:a};if(b.constructor==u.Endpoint)e=b,e.addConnection(a);else if(f=Y(b),g=this[h.epDefs][f],f===a[h.elId])e=null;else if(g){if(!g.enabled)return;e=null!=g.endpoint&&g.endpoint._jsPlumb?g.endpoint:this.addEndpoint(b,g.def),g.uniqueEndpoint&&(g.endpoint=e),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0,e.addConnection(a)}else e=a.makeEndpoint(0===c,b,f),e._doNotDeleteOnDetach=!1,e._deleteOnDetach=!0;return null!=e&&(j.detachFromConnection(a),a.endpoints[c]=e,a[h.el]=e.element,a[h.elId]=e.elementId,k[0===c?"newSourceId":"newTargetId"]=e.elementId,ab(k),d||a.repaint()),k}.bind(this);this.setSource=function(a,b,c){var d=$(a,b,0,c);this.anchorManager.sourceChanged(d.originalSourceId,d.newSourceId,a)},this.setTarget=function(a,b,c){var d=$(a,b,1,c);this.anchorManager.updateOtherEndpoint(d.originalSourceId,d.originalTargetId,d.newTargetId,a)},this.deleteEndpoint=function(a,b){var c=e.setSuspendDrawing(!0),d="string"==typeof a?r[a]:a;return d&&e.deleteObject({endpoint:d}),c||e.setSuspendDrawing(!1,b),e},this.deleteEveryEndpoint=function(){var a=e.setSuspendDrawing(!0);for(var b in q){var c=q[b];if(c&&c.length)for(var d=0,f=c.length;f>d;d++)e.deleteEndpoint(c[d],!0)}return q={},r={},e.anchorManager.reset(),e.dragManager.reset(),a||e.setSuspendDrawing(!1),e};var _=function(a,b,c){var d=e.Defaults.ConnectionType||e.getDefaultConnectionType(),f=a.constructor==d,g=f?{connection:a,source:a.source,target:a.target,sourceId:a.sourceId,targetId:a.targetId,sourceEndpoint:a.endpoints[0],targetEndpoint:a.endpoints[1]}:a;b&&e.fire("connectionDetached",g,c),e.anchorManager.connectionDetached(g)},ab=function(a,b){e.fire("connectionMoved",a,b)};this.unregisterEndpoint=function(a){a._jsPlumb.uuid&&(r[a._jsPlumb.uuid]=null),e.anchorManager.deleteEndpoint(a);for(var b in q){var c=q[b];if(c){for(var d=[],f=0,g=c.length;g>f;f++)c[f]!=a&&d.push(c[f]);q[b]=d}q[b].length<1&&delete q[b]}},this.detach=function(){if(0!==arguments.length){var a=e.Defaults.ConnectionType||e.getDefaultConnectionType(),b=arguments[0].constructor==a,c=2==arguments.length?b?arguments[1]||{}:arguments[0]:arguments[0],d=c.fireEvent!==!1,f=c.forceDetach,g=b?arguments[0]:c.connection;if(g)(f||jsPlumbUtil.functionChain(!0,!1,[[g.endpoints[0],"isDetachAllowed",[g]],[g.endpoints[1],"isDetachAllowed",[g]],[g,"isDetachAllowed",[g]],[e,"checkCondition",["beforeDetach",g]]]))&&g.endpoints[0].detach(g,!1,!0,d);else{var h=u.extend({},c);if(h.uuids)K(h.uuids[0]).detachFrom(K(h.uuids[1]),d);else if(h.sourceEndpoint&&h.targetEndpoint)h.sourceEndpoint.detachFrom(h.targetEndpoint);else{var i=Y(e.getDOMElement(h.source)),j=Y(e.getDOMElement(h.target));R(i,function(a){(a.sourceId==i&&a.targetId==j||a.targetId==i&&a.sourceId==j)&&e.checkCondition("beforeDetach",a)&&a.endpoints[0].detach(a,!1,!0,d)})}}}},this.detachAllConnections=function(a,b){b=b||{},a=e.getDOMElement(a);var c=Y(a),d=q[c];if(d&&d.length)for(var f=0,g=d.length;g>f;f++)d[f].detachAll(b.fireEvent!==!1);return e},this.detachEveryConnection=function(a){return a=a||{},e.doWhileSuspended(function(){for(var b in q){var c=q[b];if(c&&c.length)for(var d=0,e=c.length;e>d;d++)c[d].detachAll(a.fireEvent!==!1)}p.splice(0)}),e},this.deleteObject=function(a){var b={endpoints:{},connections:{},endpointCount:0,connectionCount:0},c=a.fireEvent!==!1,d=a.deleteAttachedObjects!==!1,f=function(a){if(null!=a&&null==b.connections[a.id]&&(null!=a._jsPlumb&&a.setHover(!1),b.connections[a.id]=a,b.connectionCount++,d))for(var c=0;cc;c++)f=e.getDOMElement(a[c]),f&&L(f,!0,b);else if(a._nodes)for(c=0,d=a._nodes.length;d>c;c++)f=e.getDOMElement(a._nodes[c]),f&&L(f,!0,b);else f=e.getDOMElement(a),f&&L(f,!0,b);return e};var bb=function(a,b,c,d){for(var e=0,f=a.length;f>e;e++)a[e][b].apply(a[e],c);return d(a)},cb=function(a,b,c){for(var d=[],e=0,f=a.length;f>e;e++)d.push([a[e][b].apply(a[e],c),a[e]]);return d},db=function(a,b,c){return function(){return bb(a,b,arguments,c)}},eb=function(a,b){return function(){return cb(a,b,arguments)}},fb=function(a,b){var c=[];if(a)if("string"==typeof a){if("*"===a)return a;c.push(a)}else if(b)c=a;else if(a.length)for(var d=0,e=a.length;e>d;d++)c.push(k(a[d]).id);else c.push(k(a).id);return c},gb=function(a,b,c){return"*"===a?!0:a.length>0?-1!=jsPlumbUtil.indexOf(a,b):!c};this.getConnections=function(a,b){a?a.constructor==String&&(a={scope:a}):a={};for(var c=a.scope||e.getDefaultScope(),d=fb(c,!0),f=fb(a.source),g=fb(a.target),h=!b&&d.length>1?{}:[],i=function(a,c){if(!b&&d.length>1){var e=h[a];null==e&&(e=h[a]=[]),e.push(c)}else h.push(c)},j=0,k=p.length;k>j;j++){var l=p[j];gb(d,l.scope)&&gb(f,l.sourceId)&&gb(g,l.targetId)&&i(l.scope,l)}return h};var hb=function(a,b){return function(c){for(var d=0,e=a.length;e>d;d++)c(a[d]);return b(a)}},ib=function(a){return function(b){return a[b]}},jb=function(a,b){var c,d,e={length:a.length,each:hb(a,b),get:ib(a)},f=["setHover","removeAllOverlays","setLabel","addClass","addOverlay","removeOverlay","removeOverlays","showOverlay","hideOverlay","showOverlays","hideOverlays","setPaintStyle","setHoverPaintStyle","setSuspendEvents","setParameter","setParameters","setVisible","repaint","addType","toggleType","removeType","removeClass","setType","bind","unbind"],g=["getLabel","getOverlay","isHover","getParameter","getParameters","getPaintStyle","getHoverPaintStyle","isVisible","hasType","getType","isSuspendEvents"];for(c=0,d=f.length;d>c;c++)e[f[c]]=db(a,f[c],b);for(c=0,d=g.length;d>c;c++)e[g[c]]=eb(a,g[c]);return e},kb=function(a){var b=jb(a,kb);return u.extend(b,{setDetachable:db(a,"setDetachable",kb),setReattach:db(a,"setReattach",kb),setConnector:db(a,"setConnector",kb),detach:function(){for(var b=0,c=a.length;c>b;b++)e.detach(a[b])},isDetachable:eb(a,"isDetachable"),isReattach:eb(a,"isReattach")})},lb=function(a){var b=jb(a,lb);return u.extend(b,{setEnabled:db(a,"setEnabled",lb),setAnchor:db(a,"setAnchor",lb),isEnabled:eb(a,"isEnabled"),detachAll:function(){for(var b=0,c=a.length;c>b;b++)a[b].detachAll()},remove:function(){for(var b=0,c=a.length;c>b;b++)e.deleteObject({endpoint:a[b]})}})};this.select=function(a){return a=a||{},a.scope=a.scope||"*",kb(a.connections||e.getConnections(a,!0))},this.selectEndpoints=function(a){a=a||{},a.scope=a.scope||"*";var b=!a.element&&!a.source&&!a.target,c=b?"*":fb(a.element),d=b?"*":fb(a.source),e=b?"*":fb(a.target),f=fb(a.scope,!0),g=[];for(var h in q){var i=gb(c,h,!0),j=gb(d,h,!0),k="*"!=d,l=gb(e,h,!0),m="*"!=e;if(i||j||l)a:for(var n=0,o=q[h].length;o>n;n++){var p=q[h][n];if(gb(f,p.scope,!0)){var r=k&&d.length>0&&!p.isSource,s=m&&e.length>0&&!p.isTarget;if(r||s)continue a;g.push(p)}}}return lb(g)},this.getAllConnections=function(){return p},this.getDefaultScope=function(){return C},this.getEndpoint=K,this.getEndpoints=function(a){return q[k(a).id]},this.getDefaultEndpointType=function(){return u.Endpoint},this.getDefaultConnectionType=function(){return u.Connection},this.getId=Y,this.getOffset=function(a){return t[a],W({elId:a})},this.appendElement=G;var mb=!1;this.isHoverSuspended=function(){return mb},this.setHoverSuspended=function(a){mb=a};var nb=function(a){return function(){return jsPlumbAdapter.isRenderModeAvailable(a)}};this.isSVGAvailable=nb("svg"),this.isVMLAvailable=nb("vml"),this.hide=function(a,b){return T(a,"none",b),e},this.idstamp=F,this.connectorsInitialized=!1;var ob=[],pb=["svg","vml"];this.registerConnectorType=function(a,b){ob.push([a,b])};var qb=function(a){if(!m&&a){var b=e.getDOMElement(a);b.offsetParent&&(m=b.offsetParent)}},rb=function(){e.Defaults.Container&&(m=e.getDOMElement(e.Defaults.Container))};this.init=function(){var a=function(a,b,c){u.Connectors[a][b]=function(){c.apply(this,arguments),u.ConnectorRenderers[a].apply(this,arguments)},jsPlumbUtil.extend(u.Connectors[a][b],[c,u.ConnectorRenderers[a]])};if(!u.connectorsInitialized){for(var b=0;b=4?[d[2],d[3]]:[0,0],offsets:d.length>=6?[d[4],d[5]]:[0,0],elementId:f,jsPlumbInstance:g,cssClass:7==d.length?d[6]:null};h=new u.Anchor(i),h.clone=function(){return new u.Anchor(i)}}return h.id||(h.id="anchor_"+F()),h},this.makeAnchors=function(b,c,d){for(var f=[],g=0,h=b.length;h>g;g++)"string"==typeof b[g]?f.push(u.Anchors[b[g]]({elementId:c,jsPlumbInstance:d})):a.isArray(b[g])&&f.push(e.makeAnchor(b[g],c,d));return f},this.makeDynamicAnchor=function(a,b){return new u.DynamicAnchor({anchors:a,selector:b,elementId:null,jsPlumbInstance:e})},this.targetEndpointDefinitions={};var sb=function(a,b,c){a.paintStyle=a.paintStyle||c.Defaults.EndpointStyles[b]||c.Defaults.EndpointStyle,a.hoverPaintStyle=a.hoverPaintStyle||c.Defaults.EndpointHoverStyles[b]||c.Defaults.EndpointHoverStyle,a.anchor=a.anchor||c.Defaults.Anchors[b]||c.Defaults.Anchor,a.endpoint=a.endpoint||c.Defaults.Endpoints[b]||c.Defaults.Endpoint};this.sourceEndpointDefinitions={};var tb=function(a,b,c,d,e){for(var f=a.target||a.srcElement,g=!1,h=d.getSelector(b,c),i=0;i0&&c>=p.maxConnections)return m&&m({element:d.el,connection:l},a),!1;if(o.anchor.locked=!1,k&&this.setDragScope(h,k),null==l.suspendedEndpoint&&!l.pending)return!1;var q=f.isDropAllowed(0===n?e:l.sourceId,0===n?l.targetId:e,l.scope,l,null,0===n?d.el:l.source,0===n?l.target:d.el);if(l.suspendedEndpoint){l[n?"targetId":"sourceId"]=l.suspendedEndpoint.elementId,l[n?"target":"source"]=l.suspendedEndpoint.element,l.endpoints[n]=l.suspendedEndpoint;var r=(l.suspendedEndpoint.getElement(),l.suspendedEndpoint.elementId);ab({index:n,originalSourceId:0===n?r:l.sourceId,newSourceId:0===n?e:l.sourceId,originalTargetId:1==n?r:l.targetId,newTargetId:1==n?e:l.targetId,connection:l},a)}if(q){var s=this.getElementObject(d.el),t=p.endpoint;if((null==t||null==t._jsPlumb)&&(t=this.addEndpoint(s,g)),g.uniqueEndpoint&&(p.endpoint=t),t._doNotDeleteOnDetach=!1,t._deleteOnDetach=!0,l.isDetachable()&&t.initDraggable(),null!=t.anchor.positionFinder){var v=this.getUIPosition(arguments,this.getZoom()),x=b(s,this),y=this.getSize(s),z=t.anchor.positionFinder(v,x,y,t.anchor.constructorParams);t.anchor.x=z[0],t.anchor.y=z[1]}l[n?"target":"source"]=t.element,l[n?"targetId":"sourceId"]=t.elementId,l.endpoints[n].detachFromConnection(l),l.endpoints[n]._deleteOnDetach&&(l.endpoints[n].deleteAfterDragStop=!0),t.addConnection(l),l.endpoints[n]=t,l.deleteEndpointsOnDetach=i,1==n?this.anchorManager.updateOtherEndpoint(l.sourceId,l.suspendedElementId,l.targetId,l):this.anchorManager.sourceChanged(l.suspendedEndpoint.elementId,l.sourceId,l),O(l,null,a),l.pending=!1}else l.suspendedEndpoint&&(l.isReattach()?(l.setHover(!1),l.floatingAnchorIndex=null,l.suspendedEndpoint.addConnection(l),this.repaint(o.elementId)):l.deleteConnectionNow=!0)}}.bind(this),p=u.dragEvents.drop;n.scope=n.scope||h,n[p]=a.wrap(n[p],o),g.allowLoopback===!1&&(n.canDrop=function(a){var b=a.getDragElement()._jsPlumbRelatedElement;return b!=d.el}),this.initDroppable(this.getElementObject(d.el),n,!0)}.bind(this);c=H(c);for(var o=c.length&&c.constructor!=String?c:[c],p=0,q=o.length;q>p;p++)n(o[p]);return this},this.unmakeTarget=function(a,b){var c=k(a);return u.destroyDroppable(c.el),b||delete this.targetEndpointDefinitions[c.id],this},this.makeSource=function(c,d,f){var g=u.extend({},f);u.extend(g,d),sb(g,0,this);var h=g.maxConnections||1,j=g.onMaxConnections,l=function(c){var d=c.id,f=this.getElementObject(c.el),k=this.getDOMElement(f),l=function(){return null==g.parent?null:"parent"===g.parent?c.el.parentNode:e.getDOMElement(g.parent)},n=null!=g.parent?this.getId(l()):d;qb(n),this.sourceEndpointDefinitions[n]={def:g,uniqueEndpoint:g.uniqueEndpoint,maxConnections:h,enabled:!0};var o=u.dragEvents.stop,p=u.dragEvents.drag,q=u.extend({},g.dragOptions||{}),r=q.drag,s=q.stop,t=null,v=!1;q.scope=q.scope||g.scope,q[p]=a.wrap(q[p],function(){r&&r.apply(this,arguments),v=!1}),q[o]=a.wrap(q[o],function(){if(s&&s.apply(this,arguments),this.currentlyDragging=!1,null!=t._jsPlumb){var a=g.anchor||this.Defaults.Anchor,c=t.anchor,e=t.connections[0],f=this.makeAnchor(a,d,this),h=t.element;if(null!=f.positionFinder){var i=b(h,this),j=this.getSize(h),k={left:i.left+c.x*j[0],top:i.top+c.y*j[1]},n=f.positionFinder(k,i,j,f.constructorParams);f.x=n[0],f.y=n[1]}if(t.setAnchor(f,!0),g.parent){var o=l();if(o){var p=g.container||m;t.setElement(o,p)}}t.repaint(),this.repaint(t.elementId),this.repaint(e.targetId)}}.bind(this));var w=function(a){var b=this.getOriginalEvent(a),c=this.sourceEndpointDefinitions[n];if(d=this.getId(this.getDOMElement(f)),c.enabled){if(g.filter){var m=jsPlumbUtil.isString(g.filter)?tb(b,f,g.filter,this,g.filterExclude):g.filter(b,f);if(m===!1)return}var o=this.select({source:n}).length;if(c.maxConnections>=0&&c.uniqueEndpoint&&o>=c.maxConnections)return j&&j({element:f,maxConnections:h},a),!1;var p=jsPlumbAdapter.getPositionOnElement(b,k,i),r=p;g.parent&&(r=jsPlumbAdapter.getPositionOnElement(b,l(),i));var s={};u.extend(s,g),s.isTemporarySource=!0,s.anchor=[p[0],p[1],0,0],s.parentAnchor=[r[0],r[1],0,0],s.dragOptions=q,t=this.addEndpoint(d,s),v=!0,t.endpointWillMoveTo=g.parent?l():null,t._doNotDeleteOnDetach=!1,t._deleteOnDetach=!0;var w=function(){v&&(v=!1,e.deleteEndpoint(t))};e.registerListener(t.canvas,"mouseup",w),e.registerListener(f,"mouseup",w),e.trigger(t.canvas,"mousedown",a),jsPlumbUtil.consume(a)}}.bind(this);this.registerListener(f,"mousedown",w),this.sourceEndpointDefinitions[n].trigger=w,g.filter&&jsPlumbUtil.isString(g.filter)&&e.setDragFilter(f,g.filter)}.bind(this);c=H(c);for(var n=c.length&&c.constructor!=String?c:[c],o=0,p=n.length;p>o;o++)l(k(n[o]));return this},this.unmakeSource=function(a,b){var c=k(a),d=this.sourceEndpointDefinitions[c.id].trigger;return d&&e.unregisterListener(c.el,"mousedown",d),b||delete this.sourceEndpointDefinitions[c.id],this},this.unmakeEverySource=function(){for(var a in this.sourceEndpointDefinitions)e.unmakeSource(a,!0);return this.sourceEndpointDefinitions={},this},this.unmakeEveryTarget=function(){for(var a in this.targetEndpointDefinitions)e.unmakeTarget(a,!0);return this.targetEndpointDefinitions={},this};var ub=function(b,c,d,e){var f="source"==b?this.sourceEndpointDefinitions:this.targetEndpointDefinitions;if(c=H(c),a.isString(c))f[c].enabled=e?!f[c].enabled:d;else if(c.length)for(var g=0,h=c.length;h>g;g++){var i=k(c[g]);f[i.id]&&(f[i.id].enabled=e?!f[i.id].enabled:d)}else{var j=k(c).id;f[j].enabled=e?!f[j].enabled:d}return this}.bind(this),vb=function(b,c){return b=H(b),a.isString(b)||!b.length?c.apply(this,[b]):b.length?c.apply(this,[b[0]]):void 0}.bind(this);this.toggleSourceEnabled=function(a){return ub("source",a,null,!0),this.isSourceEnabled(a)},this.setSourceEnabled=function(a,b){return ub("source",a,b)},this.isSource=function(a){return vb(a,function(a){return null!=this.sourceEndpointDefinitions[k(a).id]})},this.isSourceEnabled=function(a){return vb(a,function(a){var b=this.sourceEndpointDefinitions[k(a).id];return b&&b.enabled===!0})},this.toggleTargetEnabled=function(a){return ub("target",a,null,!0),this.isTargetEnabled(a)},this.isTarget=function(a){return vb(a,function(a){return null!=this.targetEndpointDefinitions[k(a).id]})},this.isTargetEnabled=function(a){return vb(a,function(a){var b=this.targetEndpointDefinitions[k(a).id];return b&&b.enabled===!0})},this.setTargetEnabled=function(a,b){return ub("target",a,b)},this.ready=function(a){e.bind("ready",a)},this.repaint=function(a,b,c){if("object"==typeof a&&a.length)for(var d=0,f=a.length;f>d;d++)I(a[d],b,c);else I(a,b,c);return e},this.repaintEverything=function(a){var b=c();for(var d in q)I(d,null,b,a);return this},this.removeAllEndpoints=function(a,b){var c=function(a){var d,f,g=k(a),h=q[g.id];if(h)for(d=0,f=h.length;f>d;d++)e.deleteEndpoint(h[d]);if(delete q[g.id],b&&g.el&&3!=g.el.nodeType&&8!=g.el.nodeType)for(d=0,f=g.el.childNodes.length;f>d;d++)c(g.el.childNodes[d])};return c(a),this},this.remove=function(a,b){var c=k(a);return e.doWhileSuspended(function(){e.removeAllEndpoints(c.id,!0),e.dragManager.elementRemoved(c.id),delete w[c.id],e.anchorManager.clearFor(c.id),e.anchorManager.removeFloatingConnection(c.id)},b===!1),c.el&&e.removeElement(c.el),e};var wb={},xb=function(){for(var a in wb)for(var b=0,c=wb[a].length;c>b;b++){var d=wb[a][b];e.off(d.el,d.event,d.listener)}wb={}};this.registerListener=function(a,b,c){e.on(a,b,c),jsPlumbUtil.addToList(wb,b,{el:a,event:b,listener:c})},this.unregisterListener=function(a,b,c){e.off(a,b,c),jsPlumbUtil.removeWithFunction(wb,function(a){return a.type==b&&a.listener==c})},this.reset=function(){e.deleteEveryEndpoint(),e.unbind(),this.targetEndpointDefinitions={},this.sourceEndpointDefinitions={},p.splice(0),xb(),e.anchorManager.reset(),jsPlumbAdapter.headless||e.dragManager.reset()},this.setDefaultScope=function(a){return C=a,e},this.setDraggable=S,this.setId=function(a,b,c){var d;jsPlumbUtil.isString(a)?d=a:(a=this.getDOMElement(a),d=this.getId(a));var e=this.getConnections({source:d,scope:"*"},!0),f=this.getConnections({target:d,scope:"*"},!0);b=""+b,c?a=this.getDOMElement(b):(a=this.getDOMElement(d),this.setAttribute(a,"id",b)),q[b]=q[d]||[];for(var g=0,h=q[b].length;h>g;g++)q[b][g].setElementId(b),q[b][g].setReferenceElement(a);delete q[d],this.anchorManager.changeId(d,b),this.dragManager&&this.dragManager.changeId(d,b);var i=function(c,d,e){for(var f=0,g=c.length;g>f;f++)c[f].endpoints[d].setElementId(b),c[f].endpoints[d].setReferenceElement(a),c[f][e+"Id"]=b,c[f][e]=a};i(e,0,"source"),i(f,1,"target"),this.repaint(b)},this.setDebugLog=function(a){n=a},this.setSuspendDrawing=function(a,b){var c=A;return A=a,B=a?(new Date).getTime():null,b&&this.repaintEverything(),c},this.isSuspendDrawing=function(){return A},this.getSuspendedAt=function(){return B},this.doWhileSuspended=function(b,c){var d=this.isSuspendDrawing();d||this.setSuspendDrawing(!0);try{b()}catch(e){a.log("Function run while suspended failed",e)}d||this.setSuspendDrawing(!1,!c)},this.getOffset=function(a){return t[a]},this.getCachedData=X,this.timestamp=c,this.setRenderMode=function(a){if(a!==u.SVG&&a!==u.VML)throw new TypeError("Render mode ["+a+"] not supported");return D=jsPlumbAdapter.setRenderMode(a)},this.getRenderMode=function(){return D},this.show=function(a,b){return T(a,"block",b),e},this.toggleVisible=V,this.toggleDraggable=U,this.addListener=this.bind,jsPlumbAdapter.headless||(e.dragManager=jsPlumbAdapter.getDragManager(e),e.recalculateOffsets=e.dragManager.updateOffsets)};jsPlumbUtil.extend(t,jsPlumbUtil.EventGenerator,{setAttribute:function(a,b,c){this.setAttribute(a,b,c)},getAttribute:function(a,b){return this.getAttribute(u.getDOMElement(a),b)},registerConnectionType:function(a,b){this._connectionTypes[a]=u.extend({},b)},registerConnectionTypes:function(a){for(var b in a)this._connectionTypes[b]=u.extend({},a[b])},registerEndpointType:function(a,b){this._endpointTypes[a]=u.extend({},b)},registerEndpointTypes:function(a){for(var b in a)this._endpointTypes[b]=u.extend({},a[b])},getType:function(a,b){return"connection"===b?this._connectionTypes[a]:this._endpointTypes[a]},setIdChanged:function(a,b){this.setId(a,b,!0)},setParent:function(a,b){var c=this.getElementObject(a),d=this.getDOMElement(c),e=this.getId(d),f=this.getElementObject(b),g=this.getDOMElement(f),h=this.getId(g);d.parentNode.removeChild(d),g.appendChild(d),this.dragManager.setParent(c,e,f,h)},getSize:function(a){return[a.offsetWidth,a.offsetHeight]},getWidth:function(a){return a.offsetWidth},getHeight:function(a){return a.offsetHeight},extend:function(a,b,c){var d;if(c)for(d=0;d0?this.connections[0].setHover(a,!1):this.setHover(a)}.bind(this);g._transient||this._jsPlumb.instance.anchorManager.add(this,this.elementId),this.setEndpoint=function(a){null!=this.endpoint&&(this.endpoint.cleanup(),this.endpoint.destroy());var b=function(a,b){var c=h.getRenderMode();if(jsPlumb.Endpoints[c][a])return new jsPlumb.Endpoints[c][a](b);if(!h.Defaults.DoNotThrowErrors)throw{msg:"jsPlumb: unknown endpoint type '"+a+"'"}},c={_jsPlumb:this._jsPlumb.instance,cssClass:g.cssClass,container:g.container,tooltip:g.tooltip,connectorTooltip:g.connectorTooltip,endpoint:this};j.isString(a)?this.endpoint=b(a,c):j.isArray(a)?(c=j.merge(a[1],c),this.endpoint=b(a[0],c)):this.endpoint=a.clone(),jsPlumb.extend({},c),this.endpoint.clone=function(){return j.isString(a)?b(a,c):j.isArray(a)?(c=j.merge(a[1],c),b(a[0],c)):void 0}.bind(this),this.type=this.endpoint.type,this.bindListeners(this.endpoint,this,s)},this.setEndpoint(g.endpoint||h.Defaults.Endpoint||jsPlumb.Defaults.Endpoint||"Dot"),this.setPaintStyle(g.paintStyle||g.style||h.Defaults.EndpointStyle||jsPlumb.Defaults.EndpointStyle,!0),this.setHoverPaintStyle(g.hoverPaintStyle||h.Defaults.EndpointHoverStyle||jsPlumb.Defaults.EndpointHoverStyle,!0),this._jsPlumb.paintStyleInUse=this.getPaintStyle(),jsPlumb.extend(this,g,d),this.isSource=g.isSource||!1,this.isTemporarySource=g.isTemporarySource||!1,this.isTarget=g.isTarget||!1,this._jsPlumb.maxConnections=g.maxConnections||h.Defaults.MaxConnections,this.canvas=this.endpoint.canvas,this.addClass(h.endpointAnchorClassPrefix+"_"+this._jsPlumb.currentAnchorClass),jsPlumbAdapter.addClass(this.element,h.endpointAnchorClassPrefix+"_"+this._jsPlumb.currentAnchorClass),this.connections=g.connections||[],this.connectorPointerEvents=g["connector-pointer-events"],this.scope=g.scope||h.getDefaultScope(),this.timestamp=null,this.reattachConnections=g.reattach||h.Defaults.ReattachConnections,this.connectionsDetachable=h.Defaults.ConnectionsDetachable,(g.connectionsDetachable===!1||g.detachable===!1)&&(this.connectionsDetachable=!1),this.dragAllowedWhenFull=g.dragAllowedWhenFull!==!1,g.onMaxConnections&&this.bind("maxConnections",g.onMaxConnections),this.addConnection=function(a){this.connections.push(a),this[(this.connections.length>0?"add":"remove")+"Class"](h.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](h.endpointFullClass)},this.detachFromConnection=function(a,b,c){b=null==b?f(a,this):b,b>=0&&(this.connections.splice(b,1),this[(this.connections.length>0?"add":"remove")+"Class"](h.endpointConnectedClass),this[(this.isFull()?"add":"remove")+"Class"](h.endpointFullClass)),!c&&this._deleteOnDetach&&0===this.connections.length&&h.deleteObject({endpoint:this,fireEvent:!1,deleteAttachedObjects:!1})},this.detach=function(a,b,c,d,e,g,i){var j=null==i?f(a,this):i,k=!1;return d=d!==!1,j>=0&&(c||a._forceDetach||a.isDetachable()&&a.isDetachAllowed(a)&&this.isDetachAllowed(a)&&h.checkCondition("beforeDetach",a))&&(h.deleteObject({connection:a,fireEvent:!b&&d,originalEvent:e,deleteAttachedObjects:!1}),k=!0),k},this.detachAll=function(a,b){for(;this.connections.length>0;)this.detach(this.connections[0],!1,!0,a!==!1,b,this,0);return this},this.detachFrom=function(a,b,c){for(var d=[],e=0;e0){var l=e(this,a.elementWithPrecedence),m=l.endpoints[0]==this?1:0,n=0===m?l.sourceId:l.targetId,o=h.getCachedData(n),p=o.o,q=o.s;k.txy=[p.left,p.top],k.twh=q,k.tElement=l.endpoints[m]}g=this.anchor.compute(k)}this.endpoint.compute(g,this.anchor.getOrientation(this),this._jsPlumb.paintStyleInUse,i||this.paintStyleInUse),this.endpoint.paint(this._jsPlumb.paintStyleInUse,this.anchor),this.timestamp=b;for(var r=0;rb.dist?1:0 -});for(var o=k[0].source,p=k[0].target,q=0;qc[0][0],d===!1?-1:1}},q=function(a,b){var c=a[0][0]<0?-Math.PI-a[0][0]:Math.PI-a[0][0],d=b[0][0]<0?-Math.PI-b[0][0]:Math.PI-b[0][0];return c>d?1:a[0][1]>b[0][1]?1:-1},r={top:function(a,b){return a[0]>b[0]?1:-1},right:p(!0),bottom:p(!0),left:q},s=function(a,b){return a.sort(b)},t=function(a,b){var c=l.getCachedData(a),e=c.s,g=c.o,h=function(b,c,e,g,h,i,j){if(g.length>0)for(var k=s(g,r[b]),l="right"===b||"top"===b,m=o(b,c,e,k,h,i,l),n=function(a,b){d[a.id]=[b[0],b[1],b[2],b[3]],f[a.id]=j},p=0;p-1&&(i[b].splice(f,1),jsPlumbUtil.addToList(i,c,[d,d.endpoints[0],d.endpoints[0].anchor.constructor==jsPlumb.DynamicAnchor]))},this.sourceChanged=function(a,b,c){if(a!==b){jsPlumbUtil.removeWithFunction(i[a],function(a){return a[0].id===c.id});var d=jsPlumbUtil.findWithFunction(i[c.targetId],function(a){return a[0].id===c.id});d>-1&&(i[c.targetId][d][0]=c,i[c.targetId][d][1]=c.endpoints[0],i[c.targetId][d][2]=c.endpoints[0].anchor.constructor==jsPlumb.DynamicAnchor),jsPlumbUtil.addToList(i,b,[c,c.endpoints[1],c.endpoints[1].anchor.constructor==jsPlumb.DynamicAnchor])}},this.rehomeEndpoint=function(a,c,d){var e=b[c]||[],f=l.getId(d);if(f!==c){var g=jsPlumbUtil.indexOf(e,a);if(g>-1){var h=e.splice(g,1)[0];j.add(h,f)}}for(var i=0;i0?this.anchors[0]:null,e=(this.anchors.length>0?0:-1,d),f=this,g=function(a,b,c,d,e){var f=d[0]+a.x*e[0],g=d[1]+a.y*e[1],h=d[0]+e[0]/2,i=d[1]+e[1]/2;return Math.sqrt(Math.pow(b-f,2)+Math.pow(c-g,2))+Math.sqrt(Math.pow(h-f,2)+Math.pow(i-g,2))},h=b.selector||function(a,b,c,d,e){for(var f=c[0]+d[0]/2,h=c[1]+d[1]/2,i=-1,j=1/0,k=0;kl&&(i=k+0,j=l)}return e[i]};this.compute=function(a){var b=a.xy,c=a.wh,g=a.timestamp,i=a.txy,j=a.twh;a.clearUserDefinedLocation&&(userDefinedLocation=null),this.timestamp=g;var k=f.getUserDefinedLocation();return null!=k?k:this.locked||null==i||null==j?d.compute(a):(a.timestamp=null,d=h(b,c,i,j,this.anchors),this.x=d.x,this.y=d.y,d!=e&&this.fire("anchorChanged",d),e=d,d.compute(a))},this.getCurrentLocation=function(a){return this.getUserDefinedLocation()||(null!=d?d.getCurrentLocation(a):null)},this.getOrientation=function(a){return null!=d?d.getOrientation(a):[0,0]},this.over=function(a,b){null!=d&&d.over(a,b)},this.out=function(){null!=d&&d.out()},this.getCssClass=function(){return d&&d.getCssClass()||""}},jsPlumbUtil.extend(jsPlumb.DynamicAnchor,jsPlumb.Anchor);var b=function(a,b,c,d,e,f){jsPlumb.Anchors[e]=function(g){var h=g.jsPlumbInstance.makeAnchor([a,b,c,d,0,0],g.elementId,g.jsPlumbInstance);return h.type=e,f&&f(h,g),h}};b(.5,0,0,-1,"TopCenter"),b(.5,1,0,1,"BottomCenter"),b(0,.5,-1,0,"LeftMiddle"),b(1,.5,1,0,"RightMiddle"),b(.5,0,0,-1,"Top"),b(.5,1,0,1,"Bottom"),b(0,.5,-1,0,"Left"),b(1,.5,1,0,"Right"),b(.5,.5,0,0,"Center"),b(1,0,0,-1,"TopRight"),b(1,1,0,1,"BottomRight"),b(0,0,0,-1,"TopLeft"),b(0,1,0,1,"BottomLeft"),jsPlumb.Defaults.DynamicAnchors=function(a){return a.jsPlumbInstance.makeAnchors(["TopCenter","RightMiddle","BottomCenter","LeftMiddle"],a.elementId,a.jsPlumbInstance)},jsPlumb.Anchors.AutoDefault=function(a){var b=a.jsPlumbInstance.makeDynamicAnchor(jsPlumb.Defaults.DynamicAnchors(a));return b.type="AutoDefault",b};var c=function(a,b){jsPlumb.Anchors[a]=function(c){var d=c.jsPlumbInstance.makeAnchor(["Continuous",{faces:b}],c.elementId,c.jsPlumbInstance);return d.type=a,d}};jsPlumb.Anchors.Continuous=function(a){return a.jsPlumbInstance.continuousAnchorFactory.get(a)},c("ContinuousLeft",["left"]),c("ContinuousTop",["top"]),c("ContinuousBottom",["bottom"]),c("ContinuousRight",["right"]),b(0,0,0,0,"Assign",function(a,b){var c=b.position||"Fixed";a.positionFinder=c.constructor==String?b.jsPlumbInstance.AnchorPositionFinders[c]:c,a.constructorParams=b}),jsPlumbInstance.prototype.AnchorPositionFinders={Fixed:function(a,b,c){return[(a.left-b.left)/c[0],(a.top-b.top)/c[1]]},Grid:function(a,b,c,d){var e=a.left-b.left,f=a.top-b.top,g=c[0]/d.grid[0],h=c[1]/d.grid[1],i=Math.floor(e/g),j=Math.floor(f/h);return[(i*g+g/2)/c[0],(j*h+h/2)/c[1]]}},jsPlumb.Anchors.Perimeter=function(a){a=a||{};var b=a.anchorCount||60,c=a.shape;if(!c)throw new Error("no shape supplied to Perimeter Anchor type");var d=function(){for(var a=.5,c=2*Math.PI/b,d=0,e=[],f=0;b>f;f++){var g=a+a*Math.sin(d),h=a+a*Math.cos(d);e.push([g,h,0,0]),d+=c}return e},e=function(a){for(var c=b/a.length,d=[],e=function(a,e,f,g,h){c=b*h;for(var i=(f-a)/c,j=(g-e)/c,k=0;c>k;k++)d.push([a+i*k,e+j*k,0,0])},f=0;f0?a:b+a:a*b;return Biltong.pointOnLine({x:e,y:g},{x:f,y:h},d)}return{x:f,y:h}}return{x:e,y:g}},this.gradientAtPoint=function(){return c},this.pointAlongPathFrom=function(a,b,c){var d=this.pointOnPath(a,c),i=0>=b?{x:e,y:g}:{x:f,y:h};return 0>=b&&Math.abs(b)>1&&(b*=-1),Biltong.pointOnLine(d,i,b)};var j=function(a,b,c){return c>=Math.min(a,b)&&c<=Math.max(a,b)},k=function(a,b,c){return Math.abs(c-a)a-b?b:i>c-a?c:a};this.pointOnPath=function(b,d){if(0===b)return{x:this.x1,y:this.y1,theta:this.startAngle};if(1==b)return{x:this.x2,y:this.y2,theta:this.endAngle};d&&(b/=h);var e=c(this,b),f=a.cx+a.r*Math.cos(e),g=a.cy+a.r*Math.sin(e);return{x:j(f),y:j(g),theta:e}},this.gradientAtPoint=function(b,c){var d=this.pointOnPath(b,c),e=Biltong.normal([a.cx,a.cy],[d.x,d.y]);return this.anticlockwise||1/0!=e&&e!=-1/0||(e*=-1),e},this.pointAlongPathFrom=function(b,c,d){var e=this.pointOnPath(b,d),g=2*(c/f)*Math.PI,h=this.anticlockwise?-1:1,i=e.theta+h*g,j=a.cx+this.radius*Math.cos(i),k=a.cy+this.radius*Math.sin(i);return{x:j,y:k}}},Bezier:function(a){var b=(jsPlumb.Segments.AbstractSegment.apply(this,arguments),[{x:a.x1,y:a.y1},{x:a.cp1x,y:a.cp1y},{x:a.cp2x,y:a.cp2y},{x:a.x2,y:a.y2}]),c={minX:Math.min(a.x1,a.x2,a.cp1x,a.cp2x),minY:Math.min(a.y1,a.y2,a.cp1y,a.cp2y),maxX:Math.max(a.x1,a.x2,a.cp1x,a.cp2x),maxY:Math.max(a.y1,a.y2,a.cp1y,a.cp2y)};this.type="Bezier";var d=function(a,b,c){return c&&(b=jsBezier.locationAlongCurveFrom(a,b>0?0:1,b)),b};this.pointOnPath=function(a,c){return a=d(b,a,c),jsBezier.pointOnCurve(b,a)},this.gradientAtPoint=function(a,c){return a=d(b,a,c),jsBezier.gradientAtPoint(b,a)},this.pointAlongPathFrom=function(a,c,e){return a=d(b,a,e),jsBezier.pointAlongCurveFrom(b,a,c)},this.getLength=function(){return jsBezier.getLength(b)},this.getBounds=function(){return c}}};var a=function(){this.resetBounds=function(){this.bounds={minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}},this.resetBounds()};jsPlumb.Connectors.AbstractConnector=function(b){a.apply(this,arguments);var c=[],d=0,e=[],f=[],g=b.stub||0,h=jsPlumbUtil.isArray(g)?g[0]:g,i=jsPlumbUtil.isArray(g)?g[1]:g,j=b.gap||0,k=jsPlumbUtil.isArray(j)?j[0]:j,l=jsPlumbUtil.isArray(j)?j[1]:j,m=null,n=!1,o=null;this.isEditable=function(){return!1},this.setEdited=function(a){n=a},this.getPath=function(){},this.setPath=function(){},this.findSegmentForPoint=function(a,b){for(var d={d:1/0,s:null,x:null,y:null,l:null},e=0;e0?a/d:(d+a)/d);for(var g=e.length-1,h=1,i=0;i=a){g=i,h=1==a?1:0===a?0:(a-e[i][0])/f[i];break}return{segment:c[g],proportion:h,index:g}},r=function(a,b,e){if(e.x1!=e.x2||e.y1!=e.y2){var f=new jsPlumb.Segments[b](e);c.push(f),d+=f.getLength(),a.updateBounds(f)}},s=function(){d=c.length=e.length=f.length=0};this.setSegments=function(a){m=[],d=0;for(var b=0;bo?0:1,q=[1,0][p];f=[],g=[],f[p]=a.sourcePos[p]>a.targetPos[p]?-1:1,g[p]=a.sourcePos[p]>a.targetPos[p]?1:-1,f[q]=0,g[q]=0}var r=c?n+k*f[0]:k*f[0],s=d?o+k*f[1]:k*f[1],t=c?l*g[0]:n+l*g[0],u=d?l*g[1]:o+l*g[1],v=f[0]*g[0]+f[1]*g[1],w={sx:r,sy:s,tx:t,ty:u,lw:e,xSpan:Math.abs(t-r),ySpan:Math.abs(u-s),mx:(r+t)/2,my:(s+u)/2,so:f,to:g,x:j,y:m,w:n,h:o,segment:b,startStubX:r+f[0]*h,startStubY:s+f[1]*h,endStubX:t+g[0]*i,endStubY:u+g[1]*i,isXGreaterThanStubTimes2:Math.abs(r-t)>h+i,isYGreaterThanStubTimes2:Math.abs(s-u)>h+i,opposite:-1==v,perpendicular:0===v,orthogonal:1==v,sourceAxis:0===f[0]?"y":"x",points:[j,m,n,o,r,s,t,u]};return w.anchorOrientation=w.opposite?"opposite":w.orthogonal?"orthogonal":"perpendicular",w};return this.getSegments=function(){return c},this.updateBounds=function(a){var b=a.getBounds();this.bounds.minX=Math.min(this.bounds.minX,b.minX),this.bounds.maxX=Math.max(this.bounds.maxX,b.maxX),this.bounds.minY=Math.min(this.bounds.minY,b.minY),this.bounds.maxY=Math.max(this.bounds.maxY,b.maxY)},this.pointOnPath=function(a,b){var c=q(a,b);return c.segment&&c.segment.pointOnPath(c.proportion,!1)||[0,0]},this.gradientAtPoint=function(a,b){var c=q(a,b);return c.segment&&c.segment.gradientAtPoint(c.proportion,!1)||0},this.pointAlongPathFrom=function(a,b,c){var d=q(a,c);return d.segment&&d.segment.pointAlongPathFrom(d.proportion,b,!1)||[0,0]},this.compute=function(a){n||(o=t.call(this,a)),s(),this._compute(o,a),this.x=o.points[0],this.y=o.points[1],this.w=o.points[2],this.h=o.points[3],this.segment=o.segment,p()},{addSegment:r,prepareCompute:t,sourceStub:h,targetStub:i,maxStub:Math.max(h,i),sourceGap:k,targetGap:l,maxGap:Math.max(k,l)}},jsPlumbUtil.extend(jsPlumb.Connectors.AbstractConnector,a);var b=jsPlumb.Connectors.Straight=function(){this.type="Straight";var a=jsPlumb.Connectors.AbstractConnector.apply(this,arguments);this._compute=function(b){a.addSegment(this,"Straight",{x1:b.sx,y1:b.sy,x2:b.startStubX,y2:b.startStubY}),a.addSegment(this,"Straight",{x1:b.startStubX,y1:b.startStubY,x2:b.endStubX,y2:b.endStubY}),a.addSegment(this,"Straight",{x1:b.endStubX,y1:b.endStubY,x2:b.tx,y2:b.ty})}};jsPlumbUtil.extend(jsPlumb.Connectors.Straight,jsPlumb.Connectors.AbstractConnector),jsPlumb.registerConnectorType(b,"Straight"),jsPlumb.Endpoints.AbstractEndpoint=function(b){a.apply(this,arguments);var c=this.compute=function(){var a=this._compute.apply(this,arguments);return this.x=a[0],this.y=a[1],this.w=a[2],this.h=a[3],this.bounds.minX=this.x,this.bounds.minY=this.y,this.bounds.maxX=this.x+this.w,this.bounds.maxY=this.y+this.h,a};return{compute:c,cssClass:b.cssClass}},jsPlumbUtil.extend(jsPlumb.Endpoints.AbstractEndpoint,a),jsPlumb.Endpoints.Dot=function(a){this.type="Dot",jsPlumb.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},this.radius=a.radius||10,this.defaultOffset=.5*this.radius,this.defaultInnerRadius=this.radius/3,this._compute=function(a,b,c){this.radius=c.radius||this.radius;var d=a[0]-this.radius,e=a[1]-this.radius,f=2*this.radius,g=2*this.radius;if(c.strokeStyle){var h=c.lineWidth||1;d-=h,e-=h,f+=2*h,g+=2*h}return[d,e,f,g,this.radius]}},jsPlumbUtil.extend(jsPlumb.Endpoints.Dot,jsPlumb.Endpoints.AbstractEndpoint),jsPlumb.Endpoints.Rectangle=function(a){this.type="Rectangle",jsPlumb.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},this.width=a.width||20,this.height=a.height||20,this._compute=function(a,b,c){var d=c.width||this.width,e=c.height||this.height,f=a[0]-d/2,g=a[1]-e/2;return[f,g,d,e]}},jsPlumbUtil.extend(jsPlumb.Endpoints.Rectangle,jsPlumb.Endpoints.AbstractEndpoint);var c=function(){jsPlumb.DOMElementComponent.apply(this,arguments),this._jsPlumb.displayElements=[]};jsPlumbUtil.extend(c,jsPlumb.DOMElementComponent,{getDisplayElements:function(){return this._jsPlumb.displayElements},appendDisplayElement:function(a){this._jsPlumb.displayElements.push(a)}}),jsPlumb.Endpoints.Image=function(a){this.type="Image",c.apply(this,arguments),jsPlumb.Endpoints.AbstractEndpoint.apply(this,arguments);var b=a.onload,d=a.src||a.url,e=a.cssClass?" "+a.cssClass:"";this._jsPlumb.img=new Image,this._jsPlumb.ready=!1,this._jsPlumb.initialized=!1,this._jsPlumb.deleted=!1,this._jsPlumb.widthToUse=a.width,this._jsPlumb.heightToUse=a.height,this._jsPlumb.endpoint=a.endpoint,this._jsPlumb.img.onload=function(){null!=this._jsPlumb&&(this._jsPlumb.ready=!0,this._jsPlumb.widthToUse=this._jsPlumb.widthToUse||this._jsPlumb.img.width,this._jsPlumb.heightToUse=this._jsPlumb.heightToUse||this._jsPlumb.img.height,b&&b(this))}.bind(this),this._jsPlumb.endpoint.setImage=function(a,c){var d=a.constructor==String?a:a.src;b=c,this._jsPlumb.img.src=d,null!=this.canvas&&this.canvas.setAttribute("src",this._jsPlumb.img.src)}.bind(this),this._jsPlumb.endpoint.setImage(d,b),this._compute=function(a){return this.anchorPoint=a,this._jsPlumb.ready?[a[0]-this._jsPlumb.widthToUse/2,a[1]-this._jsPlumb.heightToUse/2,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse]:[0,0,0,0]},this.canvas=document.createElement("img"),this.canvas.style.margin=0,this.canvas.style.padding=0,this.canvas.style.outline=0,this.canvas.style.position="absolute",this.canvas.className=this._jsPlumb.instance.endpointClass+e,this._jsPlumb.widthToUse&&this.canvas.setAttribute("width",this._jsPlumb.widthToUse),this._jsPlumb.heightToUse&&this.canvas.setAttribute("height",this._jsPlumb.heightToUse),this._jsPlumb.instance.appendElement(this.canvas),this.attachListeners(this.canvas,this),this.actuallyPaint=function(){if(!this._jsPlumb.deleted){this._jsPlumb.initialized||(this.canvas.setAttribute("src",this._jsPlumb.img.src),this.appendDisplayElement(this.canvas),this._jsPlumb.initialized=!0);var a=this.anchorPoint[0]-this._jsPlumb.widthToUse/2,b=this.anchorPoint[1]-this._jsPlumb.heightToUse/2;jsPlumbUtil.sizeElement(this.canvas,a,b,this._jsPlumb.widthToUse,this._jsPlumb.heightToUse)}},this.paint=function(a,b){null!=this._jsPlumb&&(this._jsPlumb.ready?this.actuallyPaint(a,b):window.setTimeout(function(){this.paint(a,b)}.bind(this),200))}},jsPlumbUtil.extend(jsPlumb.Endpoints.Image,[c,jsPlumb.Endpoints.AbstractEndpoint],{cleanup:function(){this._jsPlumb.deleted=!0,this.canvas&&this.canvas.parentNode.removeChild(this.canvas),this.canvas=null}}),jsPlumb.Endpoints.Blank=function(){jsPlumb.Endpoints.AbstractEndpoint.apply(this,arguments),this.type="Blank",c.apply(this,arguments),this._compute=function(a){return[a[0],a[1],10,0]},this.canvas=document.createElement("div"),this.canvas.style.display="block",this.canvas.style.width="1px",this.canvas.style.height="1px",this.canvas.style.background="transparent",this.canvas.style.position="absolute",this.canvas.className=this._jsPlumb.endpointClass,jsPlumb.appendElement(this.canvas),this.paint=function(){jsPlumbUtil.sizeElement(this.canvas,this.x,this.y,this.w,this.h)}},jsPlumbUtil.extend(jsPlumb.Endpoints.Blank,[jsPlumb.Endpoints.AbstractEndpoint,c],{cleanup:function(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas)}}),jsPlumb.Endpoints.Triangle=function(a){this.type="Triangle",jsPlumb.Endpoints.AbstractEndpoint.apply(this,arguments),a=a||{},a.width=a.width||55,a.height=a.height||55,this.width=a.width,this.height=a.height,this._compute=function(a,b,c){var d=c.width||self.width,e=c.height||self.height,f=a[0]-d/2,g=a[1]-e/2;return[f,g,d,e]}};var d=jsPlumb.Overlays.AbstractOverlay=function(a){this.visible=!0,this.isAppendedAtTopLevel=!0,this.component=a.component,this.loc=null==a.location?.5:a.location,this.endpointLoc=null==a.endpointLocation?[.5,.5]:a.endpointLocation};d.prototype={cleanup:function(){this.component=null,this.canvas=null,this.endpointLoc=null},setVisible:function(a){this.visible=a,this.component.repaint()},isVisible:function(){return this.visible},hide:function(){this.setVisible(!1)},show:function(){this.setVisible(!0)},incrementLocation:function(a){this.loc+=a,this.component.repaint()},setLocation:function(a){this.loc=a,this.component.repaint()},getLocation:function(){return this.loc}},jsPlumb.Overlays.Arrow=function(a){this.type="Arrow",d.apply(this,arguments),this.isAppendedAtTopLevel=!1,a=a||{};var b=jsPlumbUtil,c=Biltong;this.length=a.length||20,this.width=a.width||20,this.id=a.id;var e=(a.direction||1)<0?-1:1,f=a.paintStyle||{lineWidth:1},g=a.foldback||.623;this.computeMaxSize=function(){return 1.5*self.width},this.draw=function(a,d){var h,i,j,k,l;if(a.pointAlongPathFrom){if(b.isString(this.loc)||this.loc>1||this.loc<0){var m=parseInt(this.loc,10),n=this.loc<0?1:0;h=a.pointAlongPathFrom(n,m,!1),i=a.pointAlongPathFrom(n,m-e*this.length/2,!1),j=c.pointOnLine(h,i,this.length)}else if(1==this.loc){if(h=a.pointOnPath(this.loc),i=a.pointAlongPathFrom(this.loc,-this.length),j=c.pointOnLine(h,i,this.length),-1==e){var o=j;j=h,h=o}}else if(0===this.loc){if(j=a.pointOnPath(this.loc),i=a.pointAlongPathFrom(this.loc,this.length),h=c.pointOnLine(j,i,this.length),-1==e){var p=j;j=h,h=p}}else h=a.pointAlongPathFrom(this.loc,e*this.length/2),i=a.pointOnPath(this.loc),j=c.pointOnLine(h,i,this.length);k=c.perpendicularLineTo(h,j,this.width),l=c.pointOnLine(h,j,g*this.length);var q={hxy:h,tail:k,cxy:l},r=f.strokeStyle||d.strokeStyle,s=f.fillStyle||d.strokeStyle,t=f.lineWidth||d.lineWidth,u={component:a,d:q,lineWidth:t,strokeStyle:r,fillStyle:s,minX:Math.min(h.x,k[0].x,k[1].x),maxX:Math.max(h.x,k[0].x,k[1].x),minY:Math.min(h.y,k[0].y,k[1].y),maxY:Math.max(h.y,k[0].y,k[1].y)};return u}return{component:a,minX:0,maxX:0,minY:0,maxY:0}}},jsPlumbUtil.extend(jsPlumb.Overlays.Arrow,d),jsPlumb.Overlays.PlainArrow=function(a){a=a||{};var b=jsPlumb.extend(a,{foldback:1});jsPlumb.Overlays.Arrow.call(this,b),this.type="PlainArrow"},jsPlumbUtil.extend(jsPlumb.Overlays.PlainArrow,jsPlumb.Overlays.Arrow),jsPlumb.Overlays.Diamond=function(a){a=a||{};var b=a.length||40,c=jsPlumb.extend(a,{length:b/2,foldback:2});jsPlumb.Overlays.Arrow.call(this,c),this.type="Diamond"},jsPlumbUtil.extend(jsPlumb.Overlays.Diamond,jsPlumb.Overlays.Arrow);var e=function(a,b){return(null==a._jsPlumb.cachedDimensions||b)&&(a._jsPlumb.cachedDimensions=a.getDimensions()),a._jsPlumb.cachedDimensions -},f=function(a){jsPlumb.DOMElementComponent.apply(this,arguments),d.apply(this,arguments),this.id=a.id,this._jsPlumb.div=null,this._jsPlumb.initialised=!1,this._jsPlumb.component=a.component,this._jsPlumb.cachedDimensions=null,this._jsPlumb.create=a.create,this._jsPlumb.initiallyInvisible=a.visible===!1,this.getElement=function(){if(null==this._jsPlumb.div){var b=this._jsPlumb.div=jsPlumb.getDOMElement(this._jsPlumb.create(this._jsPlumb.component));b.style.position="absolute";var c=this._jsPlumb.instance.overlayClass+" "+(this.cssClass?this.cssClass:a.cssClass?a.cssClass:"");b.className=c,this._jsPlumb.instance.appendElement(b),this._jsPlumb.instance.getId(b),this.attachListeners(b,this),this.canvas=b,a.visible===!1&&(b.style.display="none")}return this._jsPlumb.div},this.draw=function(a,b,c){var d=e(this);if(null!=d&&2==d.length){var f={x:0,y:0};if(c)f={x:c[0],y:c[1]};else if(a.pointOnPath){var g=this.loc,h=!1;(jsPlumbUtil.isString(this.loc)||this.loc<0||this.loc>1)&&(g=parseInt(this.loc,10),h=!0),f=a.pointOnPath(g,h)}else{var i=this.loc.constructor==Array?this.loc:this.endpointLoc;f={x:i[0]*a.w,y:i[1]*a.h}}var j=f.x-d[0]/2,k=f.y-d[1]/2;return{component:a,d:{minx:j,miny:k,td:d,cxy:f},minX:j,maxX:j+d[0],minY:k,maxY:k+d[1]}}return{minX:0,maxX:0,minY:0,maxY:0}}};jsPlumbUtil.extend(f,[jsPlumb.DOMElementComponent,d],{getDimensions:function(){return jsPlumb.getSize(this.getElement())},setVisible:function(a){this._jsPlumb.div.style.display=a?"block":"none",a&&this._jsPlumb.initiallyInvisible&&(e(this,!0),this.component.repaint(),this._jsPlumb.initiallyInvisible=!1)},clearCachedDimensions:function(){this._jsPlumb.cachedDimensions=null},cleanup:function(){null!=this._jsPlumb.div&&this._jsPlumb.instance.removeElement(this._jsPlumb.div)},computeMaxSize:function(){var a=e(this);return Math.max(a[0],a[1])},reattachListeners:function(a){this._jsPlumb.div&&this.reattachListenersForElement(this._jsPlumb.div,this,a)},paint:function(a){this._jsPlumb.initialised||(this.getElement(),a.component.appendDisplayElement(this._jsPlumb.div),this.attachListeners(this._jsPlumb.div,a.component),this._jsPlumb.initialised=!0),this._jsPlumb.div.style.left=a.component.x+a.d.minx+"px",this._jsPlumb.div.style.top=a.component.y+a.d.miny+"px"}}),jsPlumb.Overlays.Custom=function(){this.type="Custom",f.apply(this,arguments)},jsPlumbUtil.extend(jsPlumb.Overlays.Custom,f),jsPlumb.Overlays.GuideLines=function(){var a=this;a.length=50,a.lineWidth=5,this.type="GuideLines",d.apply(this,arguments),jsPlumb.jsPlumbUIComponent.apply(this,arguments),this.draw=function(b){var c=b.pointAlongPathFrom(a.loc,a.length/2),d=b.pointOnPath(a.loc),e=Biltong.pointOnLine(c,d,a.length),f=Biltong.perpendicularLineTo(c,e,40),g=Biltong.perpendicularLineTo(e,c,20);return{connector:b,head:c,tail:e,headLine:g,tailLine:f,minX:Math.min(c.x,e.x,g[0].x,g[1].x),minY:Math.min(c.y,e.y,g[0].y,g[1].y),maxX:Math.max(c.x,e.x,g[0].x,g[1].x),maxY:Math.max(c.y,e.y,g[0].y,g[1].y)}}},jsPlumb.Overlays.Label=function(a){this.labelStyle=a.labelStyle,this.cssClass=null!=this.labelStyle?this.labelStyle.cssClass:null;var b=jsPlumb.extend({create:function(){return document.createElement("div")}},a);if(jsPlumb.Overlays.Custom.call(this,b),this.type="Label",this.label=a.label||"",this.labelText=null,this.labelStyle){var c=this.getElement();if(this.labelStyle.font=this.labelStyle.font||"12px sans-serif",c.style.font=this.labelStyle.font,c.style.color=this.labelStyle.color||"black",this.labelStyle.fillStyle&&(c.style.background=this.labelStyle.fillStyle),this.labelStyle.borderWidth>0){var d=this.labelStyle.borderStyle?this.labelStyle.borderStyle:"black";c.style.border=this.labelStyle.borderWidth+"px solid "+d}this.labelStyle.padding&&(c.style.padding=this.labelStyle.padding)}},jsPlumbUtil.extend(jsPlumb.Overlays.Label,jsPlumb.Overlays.Custom,{cleanup:function(){this.div=null,this.label=null,this.labelText=null,this.cssClass=null,this.labelStyle=null},getLabel:function(){return this.label},setLabel:function(a){this.label=a,this.labelText=null,this.clearCachedDimensions(),this.update(),this.component.repaint()},getDimensions:function(){return this.update(),f.prototype.getDimensions.apply(this,arguments)},update:function(){if("function"==typeof this.label){var a=this.label(this);this.getElement().innerHTML=a.replace(/\r\n/g,"
    ")}else null==this.labelText&&(this.labelText=this.label,this.getElement().innerHTML=this.labelText.replace(/\r\n/g,"
    "))}})}(),function(){"use strict";var a=function(a){this.type="Flowchart",a=a||{},a.stub=null==a.stub?30:a.stub;var b,c=jsPlumb.Connectors.AbstractConnector.apply(this,arguments),d=null==a.midpoint?.5:a.midpoint,e=[],f=(a.grid,a.alwaysRespectStubs),g=null,h=null,i=null,j=null!=a.cornerRadius?a.cornerRadius:0,k=function(a){return 0>a?-1:0===a?0:1},l=function(a,b,c,d){if(h!=b||i!=c){var e=null==h?d.sx:h,f=null==i?d.sy:i,g=e==b?"v":"h",j=k(b-e),l=k(c-f);h=b,i=c,a.push([e,f,b,c,g,j,l])}},m=function(a){return Math.sqrt(Math.pow(a[0]-a[2],2)+Math.pow(a[1]-a[3],2))},n=function(a){var b=[];return b.push.apply(b,a),b},o=function(a,b,d){for(var e,f,g=0;g0&&e[4]!=f[4]){var h=Math.min(j,m(e),m(f));e[2]-=e[5]*h,e[3]-=e[6]*h,f[0]+=f[5]*h,f[1]+=f[6]*h;var i=e[6]==f[5]&&1==f[5]||e[6]==f[5]&&0===f[5]&&e[5]!=f[6]||e[6]==f[5]&&-1==f[5],k=f[1]>e[3]?1:-1,l=f[0]>e[2]?1:-1,o=k==l,p=o&&i||!o&&!i?f[0]:e[2],q=o&&i||!o&&!i?e[3]:f[1];c.addSegment(a,"Straight",{x1:e[0],y1:e[1],x2:e[2],y2:e[3]}),c.addSegment(a,"Arc",{r:h,x1:e[2],y1:e[3],x2:f[0],y2:f[1],cx:p,cy:q,ac:i})}else{var r=e[2]==e[0]?0:e[2]>e[0]?d.lw/2:-(d.lw/2),s=e[3]==e[1]?0:e[3]>e[1]?d.lw/2:-(d.lw/2);c.addSegment(a,"Straight",{x1:e[0]-r,y1:e[1]-s,x2:e[2]+r,y2:e[3]+s})}e=f}null!=f&&c.addSegment(a,"Straight",{x1:f[0],y1:f[1],x2:f[2],y2:f[3]})};this.setSegments=function(a){g=a},this.isEditable=function(){return!0},this.getOriginalSegments=function(){return g||e},this._compute=function(a,j){if(j.clearEdits&&(g=null),null!=g)return o(this,g,a),void 0;e=[],h=null,i=null,b=null;var k=a.startStubX+(a.endStubX-a.startStubX)*d,m=a.startStubY+(a.endStubY-a.startStubY)*d,n={x:[0,1],y:[1,0]},p=function(){return[a.startStubX,a.startStubY,a.endStubX,a.endStubY]},q={perpendicular:p,orthogonal:p,opposite:function(b){var c=a,d="x"==b?0:1,e={x:function(){return 1==c.so[d]&&(c.startStubX>c.endStubX&&c.tx>c.startStubX||c.sx>c.endStubX&&c.tx>c.sx)||-1==c.so[d]&&(c.startStubXc.endStubY&&c.ty>c.startStubY||c.sy>c.endStubY&&c.ty>c.sy)||-1==c.so[d]&&(c.startStubYj[b][0],s=e[b][p][0],t=e[b][p][1],u=d[b][p][q];return c.segment==u[3]||c.segment==u[2]&&r?f[b]:c.segment==u[2]&&s>t?g[b]:c.segment==u[2]&&t>=s||c.segment==u[1]&&!r?i[b]:c.segment==u[0]||c.segment==u[1]&&r?h[b]:void 0},orthogonal:function(b,c,d,e,f){var g=a,h={x:-1==g.so[0]?Math.min(c,e):Math.max(c,e),y:-1==g.so[1]?Math.min(c,e):Math.max(c,e)}[b];return{x:[[h,d],[h,f],[e,f]],y:[[d,h],[f,h],[f,e]]}[b]},opposite:function(b,d,e,f){var g=a,h={x:"y",y:"x"}[b],i={x:"height",y:"width"}[b],l=g["is"+b.toUpperCase()+"GreaterThanStubTimes2"];if(j.sourceEndpoint.elementId==j.targetEndpoint.elementId){var n=e+(1-j.sourceEndpoint.anchor[h])*j.sourceInfo[i]+c.maxStub;return{x:[[d,n],[f,n]],y:[[n,d],[n,f]]}[b]}return!l||1==g.so[t]&&d>f||-1==g.so[t]&&f>d?{x:[[d,m],[f,m]],y:[[k,d],[k,f]]}[b]:1==g.so[t]&&f>d||-1==g.so[t]&&d>f?{x:[[k,g.sy],[k,g.ty]],y:[[g.sx,m],[g.tx,m]]}[b]:void 0}},s=q[a.anchorOrientation](a.sourceAxis),t="x"==a.sourceAxis?0:1,u="x"==a.sourceAxis?1:0,v=s[t],w=s[u],x=s[t+2],y=s[u+2];l(e,s[0],s[1],a);var z=r[a.anchorOrientation](a.sourceAxis,v,w,x,y);if(z)for(var A=0;A=a&&b>=d?1:c>=a&&d>=b?2:a>=c&&d>=b?3:4},b=function(a,b,c,d,e,f,g,h,i){return i>=h?[a,b]:1===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:2===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]>=1&&e[2]<=0?[a,b+(d[3]<.5?-1*g:g)]:[a+1*f,b+-1*g]:3===c?d[3]>=1&&e[3]<=0?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+-1*f,b+-1*g]:4===c?d[3]<=0&&e[3]>=1?[a+(d[2]<.5?-1*f:f),b]:d[2]<=0&&e[2]>=1?[a,b+(d[3]<.5?-1*g:g)]:[a+1*f,b+-1*g]:void 0},c=function(c){c=c||{},this.type="StateMachine";var d=jsPlumb.Connectors.AbstractConnector.apply(this,arguments),e=c.curviness||10,f=c.margin||5,g=c.proximityLimit||80,h=c.orientation&&"clockwise"===c.orientation,i=c.loopbackRadius||25,j=c.showLoopback!==!1;this._compute=function(c,k){var l=Math.abs(k.sourcePos[0]-k.targetPos[0]),m=Math.abs(k.sourcePos[1]-k.targetPos[1]);if(Math.min(k.sourcePos[0],k.targetPos[0]),Math.min(k.sourcePos[1],k.targetPos[1]),j&&k.sourceEndpoint.elementId===k.targetEndpoint.elementId){var n=k.sourcePos[0],o=(k.sourcePos[0],k.sourcePos[1]-f),p=(k.sourcePos[1]-f,n),q=o-i,r=2*i,s=2*i,t=p-i,u=q-i;c.points[0]=t,c.points[1]=u,c.points[2]=r,c.points[3]=s,d.addSegment(this,"Arc",{loopback:!0,x1:n-t+4,y1:o-u,startAngle:0,endAngle:2*Math.PI,r:i,ac:!h,x2:n-t-4,y2:o-u,cx:p-t,cy:q-u})}else{var v=k.sourcePos[0]c?a.insertBefore(b,a.childNodes[c]):a.appendChild(b)};jsPlumbUtil.svg={node:q,attr:p,pos:r};var w=function(a){var b=a.pointerEventsSpec||"all",c={};jsPlumb.jsPlumbUIComponent.apply(this,a.originalArgs),this.canvas=null,this.path=null,this.svg=null,this.bgCanvas=null;var d=a.cssClass+" "+(a.originalArgs[0].cssClass||""),e={style:"",width:0,height:0,"pointer-events":b,position:"absolute"};this.svg=q("svg",e),a.useDivWrapper?(this.canvas=document.createElement("div"),this.canvas.style.position="absolute",jsPlumbUtil.sizeElement(this.canvas,0,0,1,1),this.canvas.className=d):(p(this.svg,{"class":d}),this.canvas=this.svg),a._jsPlumb.appendElement(this.canvas,a.originalArgs[0].parent),a.useDivWrapper&&this.canvas.appendChild(this.svg);var f=[this.canvas];return this.getDisplayElements=function(){return f},this.appendDisplayElement=function(a){f.push(a)},this.paint=function(b,d,e){if(null!=b){var f,g=[this.x,this.y],h=[this.w,this.h];null!=e&&(e.xmin<0&&(g[0]+=e.xmin),e.ymin<0&&(g[1]+=e.ymin),h[0]=e.xmax+(e.xmin<0?-e.xmin:0),h[1]=e.ymax+(e.ymin<0?-e.ymin:0)),a.useDivWrapper?(jsPlumbUtil.sizeElement(this.canvas,g[0],g[1],h[0],h[1]),g[0]=0,g[1]=0,f=r([0,0])):f=r([g[0],g[1]]),c.paint.apply(this,arguments),p(this.svg,{style:f,width:h[0],height:h[1]})}},{renderer:c}};jsPlumbUtil.extend(w,jsPlumb.jsPlumbUIComponent,{cleanup:function(){this.canvas&&this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.svg=null,this.canvas=null,this.bgCanvas=null,this.path=null,this.group=null},setVisible:function(a){this.canvas&&(this.canvas.style.display=a?"block":"none"),this.bgCanvas&&(this.bgCanvas.style.display=a?"block":"none")}}),jsPlumb.ConnectorRenderers.svg=function(a){var b=this,c=w.apply(this,[{cssClass:a._jsPlumb.connectorClass,originalArgs:arguments,pointerEventsSpec:"none",_jsPlumb:a._jsPlumb}]);c.renderer.paint=function(c,d,e){var f=b.getSegments(),g="",h=[0,0];if(e.xmin<0&&(h[0]=-e.xmin),e.ymin<0&&(h[1]=-e.ymin),f.length>0){for(var i=0;iMath.PI?1:0,d=a.anticlockwise?0:1;return"M"+a.x1+" "+a.y1+" A "+a.radius+" "+b.r+" 0 "+c+","+d+" "+a.x2+" "+a.y2}}[a.type]()}}};var x=window.SvgEndpoint=function(a){var b=w.apply(this,[{cssClass:a._jsPlumb.endpointClass,originalArgs:arguments,pointerEventsSpec:"all",useDivWrapper:!0,_jsPlumb:a._jsPlumb}]);b.renderer.paint=function(a){var b=jsPlumb.extend({},a);b.outlineColor&&(b.strokeWidth=b.outlineWidth,b.strokeStyle=jsPlumbUtil.convertStyle(b.outlineColor,!0)),null==this.node?(this.node=this.makeNode(b),this.svg.appendChild(this.node),this.attachListeners(this.node,this)):null!=this.updateNode&&this.updateNode(this.node),u(this.svg,this.node,b,[this.x,this.y,this.w,this.h],this),r(this.node,[this.x,this.y])}.bind(this)};jsPlumbUtil.extend(x,w,{reattachListeners:function(){this.node&&this.reattachListenersForElement(this.node,this)}}),jsPlumb.Endpoints.svg.Dot=function(){jsPlumb.Endpoints.Dot.apply(this,arguments),x.apply(this,arguments),this.makeNode=function(){return q("circle",{cx:this.w/2,cy:this.h/2,r:this.radius})},this.updateNode=function(a){p(a,{cx:this.w/2,cy:this.h/2,r:this.radius})}},jsPlumbUtil.extend(jsPlumb.Endpoints.svg.Dot,[jsPlumb.Endpoints.Dot,x]),jsPlumb.Endpoints.svg.Rectangle=function(){jsPlumb.Endpoints.Rectangle.apply(this,arguments),x.apply(this,arguments),this.makeNode=function(){return q("rect",{width:this.w,height:this.h})},this.updateNode=function(a){p(a,{width:this.w,height:this.h})}},jsPlumbUtil.extend(jsPlumb.Endpoints.svg.Rectangle,[jsPlumb.Endpoints.Rectangle,x]),jsPlumb.Endpoints.svg.Image=jsPlumb.Endpoints.Image,jsPlumb.Endpoints.svg.Blank=jsPlumb.Endpoints.Blank,jsPlumb.Overlays.svg.Label=jsPlumb.Overlays.Label,jsPlumb.Overlays.svg.Custom=jsPlumb.Overlays.Custom;var y=function(a,b){a.apply(this,b),jsPlumb.jsPlumbUIComponent.apply(this,b),this.isAppendedAtTopLevel=!1,this.path=null,this.paint=function(a,d){if(a.component.svg&&d){null==this.path&&(this.path=q("path",{"pointer-events":"all"}),a.component.svg.appendChild(this.path),this.canvas=a.component.svg,this.attachListeners(this.path,a.component),this.attachListeners(this.path,this));var e=b&&1==b.length?b[0].cssClass||"":"",f=[0,0];d.xmin<0&&(f[0]=-d.xmin),d.ymin<0&&(f[1]=-d.ymin),p(this.path,{d:c(a.d),"class":e,stroke:a.strokeStyle?a.strokeStyle:null,fill:a.fillStyle?a.fillStyle:null,transform:"translate("+f[0]+","+f[1]+")"})}};var c=function(a){return"M"+a.hxy.x+","+a.hxy.y+" L"+a.tail[0].x+","+a.tail[0].y+" L"+a.cxy.x+","+a.cxy.y+" L"+a.tail[1].x+","+a.tail[1].y+" L"+a.hxy.x+","+a.hxy.y};this.reattachListeners=function(){this.path&&this.reattachListenersForElement(this.path,this)}};jsPlumbUtil.extend(y,[jsPlumb.jsPlumbUIComponent,jsPlumb.Overlays.AbstractOverlay],{cleanup:function(){null!=this.path&&this._jsPlumb.instance.removeElement(this.path)},setVisible:function(a){null!=this.path&&(this.path.style.display=a?"block":"none")}}),jsPlumb.Overlays.svg.Arrow=function(){y.apply(this,[jsPlumb.Overlays.Arrow,arguments])},jsPlumbUtil.extend(jsPlumb.Overlays.svg.Arrow,[jsPlumb.Overlays.Arrow,y]),jsPlumb.Overlays.svg.PlainArrow=function(){y.apply(this,[jsPlumb.Overlays.PlainArrow,arguments])},jsPlumbUtil.extend(jsPlumb.Overlays.svg.PlainArrow,[jsPlumb.Overlays.PlainArrow,y]),jsPlumb.Overlays.svg.Diamond=function(){y.apply(this,[jsPlumb.Overlays.Diamond,arguments])},jsPlumbUtil.extend(jsPlumb.Overlays.svg.Diamond,[jsPlumb.Overlays.Diamond,y]),jsPlumb.Overlays.svg.GuideLines=function(){var a,b,c=null,d=this;jsPlumb.Overlays.GuideLines.apply(this,arguments),this.paint=function(f,g){null==c&&(c=q("path"),f.connector.svg.appendChild(c),d.attachListeners(c,f.connector),d.attachListeners(c,d),a=q("path"),f.connector.svg.appendChild(a),d.attachListeners(a,f.connector),d.attachListeners(a,d),b=q("path"),f.connector.svg.appendChild(b),d.attachListeners(b,f.connector),d.attachListeners(b,d));var h=[0,0];g.xmin<0&&(h[0]=-g.xmin),g.ymin<0&&(h[1]=-g.ymin),p(c,{d:e(f.head,f.tail),stroke:"red",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),p(a,{d:e(f.tailLine[0],f.tailLine[1]),stroke:"blue",fill:null,transform:"translate("+h[0]+","+h[1]+")"}),p(b,{d:e(f.headLine[0],f.headLine[1]),stroke:"green",fill:null,transform:"translate("+h[0]+","+h[1]+")"})};var e=function(a,b){return"M "+a.x+","+a.y+" L"+b.x+","+b.y}},jsPlumbUtil.extend(jsPlumb.Overlays.svg.GuideLines,jsPlumb.Overlays.GuideLines)}(),function(){"use strict";var a={"stroke-linejoin":"joinstyle",joinstyle:"joinstyle",endcap:"endcap",miterlimit:"miterlimit"},b=null;if(document.createStyleSheet&&document.namespaces){var c=[".jsplumb_vml","jsplumb\\:textbox","jsplumb\\:oval","jsplumb\\:rect","jsplumb\\:stroke","jsplumb\\:shape","jsplumb\\:group"],d="behavior:url(#default#VML);position:absolute;";b=document.createStyleSheet();for(var e=0;e0&&t-1 in e}if(!e.jQuery){var $=function(e,t){return new $.fn.init(e,t)};$.isWindow=function(e){return null!=e&&e==e.window},$.type=function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?a[o.call(e)]||"object":typeof e},$.isArray=Array.isArray||function(e){return"array"===$.type(e)},$.isPlainObject=function(e){var t;if(!e||"object"!==$.type(e)||e.nodeType||$.isWindow(e))return!1;try{if(e.constructor&&!n.call(e,"constructor")&&!n.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}for(t in e);return void 0===t||n.call(e,t)},$.each=function(e,r,a){var n,o=0,i=e.length,s=t(e);if(a){if(s)for(;i>o&&(n=r.apply(e[o],a),n!==!1);o++);else for(o in e)if(n=r.apply(e[o],a),n===!1)break}else if(s)for(;i>o&&(n=r.call(e[o],o,e[o]),n!==!1);o++);else for(o in e)if(n=r.call(e[o],o,e[o]),n===!1)break;return e},$.data=function(e,t,a){if(void 0===a){var n=e[$.expando],o=n&&r[n];if(void 0===t)return o;if(o&&t in o)return o[t]}else if(void 0!==t){var n=e[$.expando]||(e[$.expando]=++$.uuid);return r[n]=r[n]||{},r[n][t]=a,a}},$.removeData=function(e,t){var a=e[$.expando],n=a&&r[a];n&&$.each(t,function(e,t){delete n[t]})},$.extend=function(){var e,t,r,a,n,o,i=arguments[0]||{},s=1,l=arguments.length,u=!1;for("boolean"==typeof i&&(u=i,i=arguments[s]||{},s++),"object"!=typeof i&&"function"!==$.type(i)&&(i={}),s===l&&(i=this,s--);l>s;s++)if(null!=(n=arguments[s]))for(a in n)e=i[a],r=n[a],i!==r&&(u&&r&&($.isPlainObject(r)||(t=$.isArray(r)))?(t?(t=!1,o=e&&$.isArray(e)?e:[]):o=e&&$.isPlainObject(e)?e:{},i[a]=$.extend(u,o,r)):void 0!==r&&(i[a]=r));return i},$.queue=function(e,r,a){function n(e,r){var a=r||[];return null!=e&&(t(Object(e))?!function(e,t){for(var r=+t.length,a=0,n=e.length;r>a;)e[n++]=t[a++];if(r!==r)for(;void 0!==t[a];)e[n++]=t[a++];return e.length=n,e}(a,"string"==typeof e?[e]:e):[].push.call(a,e)),a}if(e){r=(r||"fx")+"queue";var o=$.data(e,r);return a?(!o||$.isArray(a)?o=$.data(e,r,n(a)):o.push(a),o):o||[]}},$.dequeue=function(e,t){$.each(e.nodeType?[e]:e,function(e,r){t=t||"fx";var a=$.queue(r,t),n=a.shift();"inprogress"===n&&(n=a.shift()),n&&("fx"===t&&a.unshift("inprogress"),n.call(r,function(){$.dequeue(r,t)}))})},$.fn=$.prototype={init:function(e){if(e.nodeType)return this[0]=e,this;throw new Error("Not a DOM node.")},offset:function(){var t=this[0].getBoundingClientRect?this[0].getBoundingClientRect():{top:0,left:0};return{top:t.top+(e.pageYOffset||document.scrollTop||0)-(document.clientTop||0),left:t.left+(e.pageXOffset||document.scrollLeft||0)-(document.clientLeft||0)}},position:function(){function e(){for(var e=this.offsetParent||document;e&&"html"===!e.nodeType.toLowerCase&&"static"===e.style.position;)e=e.offsetParent;return e||document}var t=this[0],e=e.apply(t),r=this.offset(),a=/^(?:body|html)$/i.test(e.nodeName)?{top:0,left:0}:$(e).offset();return r.top-=parseFloat(t.style.marginTop)||0,r.left-=parseFloat(t.style.marginLeft)||0,e.style&&(a.top+=parseFloat(e.style.borderTopWidth)||0,a.left+=parseFloat(e.style.borderLeftWidth)||0),{top:r.top-a.top,left:r.left-a.left}}};var r={};$.expando="velocity"+(new Date).getTime(),$.uuid=0;for(var a={},n=a.hasOwnProperty,o=a.toString,i="Boolean Number String Function Array Date RegExp Object Error".split(" "),s=0;sn;++n){var o=u(r,e,a);if(0===o)return r;var i=l(r,e,a)-t;r-=i/o}return r}function p(){for(var t=0;b>t;++t)w[t]=l(t*x,e,a)}function f(t,r,n){var o,i,s=0;do i=r+(n-r)/2,o=l(i,e,a)-t,o>0?n=i:r=i;while(Math.abs(o)>h&&++s=y?c(t,s):0==l?s:f(t,r,r+x)}function g(){V=!0,(e!=r||a!=n)&&p()}var m=4,y=.001,h=1e-7,v=10,b=11,x=1/(b-1),S="Float32Array"in t;if(4!==arguments.length)return!1;for(var P=0;4>P;++P)if("number"!=typeof arguments[P]||isNaN(arguments[P])||!isFinite(arguments[P]))return!1;e=Math.min(e,1),a=Math.min(a,1),e=Math.max(e,0),a=Math.max(a,0);var w=S?new Float32Array(b):new Array(b),V=!1,C=function(t){return V||g(),e===r&&a===n?t:0===t?0:1===t?1:l(d(t),r,n)};C.getControlPoints=function(){return[{x:e,y:r},{x:a,y:n}]};var T="generateBezier("+[e,r,a,n]+")";return C.toString=function(){return T},C}function u(e,t){var r=e;return g.isString(e)?v.Easings[e]||(r=!1):r=g.isArray(e)&&1===e.length?s.apply(null,e):g.isArray(e)&&2===e.length?b.apply(null,e.concat([t])):g.isArray(e)&&4===e.length?l.apply(null,e):!1,r===!1&&(r=v.Easings[v.defaults.easing]?v.defaults.easing:h),r}function c(e){if(e){var t=(new Date).getTime(),r=v.State.calls.length;r>1e4&&(v.State.calls=n(v.State.calls));for(var o=0;r>o;o++)if(v.State.calls[o]){var s=v.State.calls[o],l=s[0],u=s[2],f=s[3],d=!!f,m=null;f||(f=v.State.calls[o][3]=t-16);for(var y=Math.min((t-f)/u.duration,1),h=0,b=l.length;b>h;h++){var S=l[h],w=S.element;if(i(w)){var V=!1;if(u.display!==a&&null!==u.display&&"none"!==u.display){if("flex"===u.display){var C=["-webkit-box","-moz-box","-ms-flexbox","-webkit-flex"];$.each(C,function(e,t){x.setPropertyValue(w,"display",t)})}x.setPropertyValue(w,"display",u.display)}u.visibility!==a&&"hidden"!==u.visibility&&x.setPropertyValue(w,"visibility",u.visibility);for(var T in S)if("element"!==T){var k=S[T],A,F=g.isString(k.easing)?v.Easings[k.easing]:k.easing;if(1===y)A=k.endValue;else{var E=k.endValue-k.startValue;if(A=k.startValue+E*F(y,u,E),!d&&A===k.currentValue)continue}if(k.currentValue=A,"tween"===T)m=A;else{if(x.Hooks.registered[T]){var j=x.Hooks.getRoot(T),H=i(w).rootPropertyValueCache[j];H&&(k.rootPropertyValue=H)}var N=x.setPropertyValue(w,T,k.currentValue+(0===parseFloat(A)?"":k.unitType),k.rootPropertyValue,k.scrollData);x.Hooks.registered[T]&&(i(w).rootPropertyValueCache[j]=x.Normalizations.registered[j]?x.Normalizations.registered[j]("extract",null,N[1]):N[1]),"transform"===N[0]&&(V=!0)}}u.mobileHA&&i(w).transformCache.translate3d===a&&(i(w).transformCache.translate3d="(0px, 0px, 0px)",V=!0),V&&x.flushTransformCache(w)}}u.display!==a&&"none"!==u.display&&(v.State.calls[o][2].display=!1),u.visibility!==a&&"hidden"!==u.visibility&&(v.State.calls[o][2].visibility=!1),u.progress&&u.progress.call(s[1],s[1],y,Math.max(0,f+u.duration-t),f,m),1===y&&p(o)}}v.State.isTicking&&P(c)}function p(e,t){if(!v.State.calls[e])return!1;for(var r=v.State.calls[e][0],n=v.State.calls[e][1],o=v.State.calls[e][2],s=v.State.calls[e][4],l=!1,u=0,c=r.length;c>u;u++){var p=r[u].element;if(t||o.loop||("none"===o.display&&x.setPropertyValue(p,"display",o.display),"hidden"===o.visibility&&x.setPropertyValue(p,"visibility",o.visibility)),o.loop!==!0&&($.queue(p)[1]===a||!/\.velocityQueueEntryFlag/i.test($.queue(p)[1]))&&i(p)){i(p).isAnimating=!1,i(p).rootPropertyValueCache={};var f=!1;$.each(x.Lists.transforms3D,function(e,t){var r=/^scale/.test(t)?1:0,n=i(p).transformCache[t];i(p).transformCache[t]!==a&&new RegExp("^\\("+r+"[^.]").test(n)&&(f=!0,delete i(p).transformCache[t])}),o.mobileHA&&(f=!0,delete i(p).transformCache.translate3d),f&&x.flushTransformCache(p),x.Values.removeClass(p,"velocity-animating")}if(!t&&o.complete&&!o.loop&&u===c-1)try{o.complete.call(n,n)}catch(d){setTimeout(function(){throw d},1)}s&&o.loop!==!0&&s(n),o.loop!==!0||t||($.each(i(p).tweensContainer,function(e,t){/^rotate/.test(e)&&360===parseFloat(t.endValue)&&(t.endValue=0,t.startValue=360),/^backgroundPosition/.test(e)&&100===parseFloat(t.endValue)&&"%"===t.unitType&&(t.endValue=0,t.startValue=100)}),v(p,"reverse",{loop:!0,delay:o.delay})),o.queue!==!1&&$.dequeue(p,o.queue)}v.State.calls[e]=!1;for(var g=0,m=v.State.calls.length;m>g;g++)if(v.State.calls[g]!==!1){l=!0;break}l===!1&&(v.State.isTicking=!1,delete v.State.calls,v.State.calls=[])}var f=function(){if(r.documentMode)return r.documentMode;for(var e=7;e>4;e--){var t=r.createElement("div");if(t.innerHTML="",t.getElementsByTagName("span").length)return t=null,e}return a}(),d=function(){var e=0;return t.webkitRequestAnimationFrame||t.mozRequestAnimationFrame||function(t){var r=(new Date).getTime(),a;return a=Math.max(0,16-(r-e)),e=r+a,setTimeout(function(){t(r+a)},a)}}(),g={isString:function(e){return"string"==typeof e},isArray:Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)},isFunction:function(e){return"[object Function]"===Object.prototype.toString.call(e)},isNode:function(e){return e&&e.nodeType},isNodeList:function(e){return"object"==typeof e&&/^\[object (HTMLCollection|NodeList|Object)\]$/.test(Object.prototype.toString.call(e))&&e.length!==a&&(0===e.length||"object"==typeof e[0]&&e[0].nodeType>0)},isWrapped:function(e){return e&&(e.jquery||t.Zepto&&t.Zepto.zepto.isZ(e))},isSVG:function(e){return t.SVGElement&&e instanceof t.SVGElement},isEmptyObject:function(e){for(var t in e)return!1;return!0}},$,m=!1;if(e.fn&&e.fn.jquery?($=e,m=!0):$=t.Velocity.Utilities,8>=f&&!m)throw new Error("Velocity: IE8 and below require jQuery to be loaded before Velocity.");if(7>=f)return void(jQuery.fn.velocity=jQuery.fn.animate);var y=400,h="swing",v={State:{isMobile:/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),isAndroid:/Android/i.test(navigator.userAgent),isGingerbread:/Android 2\.3\.[3-7]/i.test(navigator.userAgent),isChrome:t.chrome,isFirefox:/Firefox/i.test(navigator.userAgent),prefixElement:r.createElement("div"),prefixMatches:{},scrollAnchor:null,scrollPropertyLeft:null,scrollPropertyTop:null,isTicking:!1,calls:[]},CSS:{},Utilities:$,Redirects:{},Easings:{},Promise:t.Promise,defaults:{queue:"",duration:y,easing:h,begin:a,complete:a,progress:a,display:a,visibility:a,loop:!1,delay:!1,mobileHA:!0,_cacheValues:!0},init:function(e){$.data(e,"velocity",{isSVG:g.isSVG(e),isAnimating:!1,computedStyle:null,tweensContainer:null,rootPropertyValueCache:{},transformCache:{}})},hook:null,mock:!1,version:{major:1,minor:2,patch:1},debug:!1};t.pageYOffset!==a?(v.State.scrollAnchor=t,v.State.scrollPropertyLeft="pageXOffset",v.State.scrollPropertyTop="pageYOffset"):(v.State.scrollAnchor=r.documentElement||r.body.parentNode||r.body,v.State.scrollPropertyLeft="scrollLeft",v.State.scrollPropertyTop="scrollTop");var b=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,r,a){var n={x:t.x+a.dx*r,v:t.v+a.dv*r,tension:t.tension,friction:t.friction};return{dx:n.v,dv:e(n)}}function r(r,a){var n={dx:r.v,dv:e(r)},o=t(r,.5*a,n),i=t(r,.5*a,o),s=t(r,a,i),l=1/6*(n.dx+2*(o.dx+i.dx)+s.dx),u=1/6*(n.dv+2*(o.dv+i.dv)+s.dv);return r.x=r.x+l*a,r.v=r.v+u*a,r}return function a(e,t,n){var o={x:-1,v:0,tension:null,friction:null},i=[0],s=0,l=1e-4,u=.016,c,p,f;for(e=parseFloat(e)||500,t=parseFloat(t)||20,n=n||null,o.tension=e,o.friction=t,c=null!==n,c?(s=a(e,t),p=s/n*u):p=u;;)if(f=r(f||o,p),i.push(1+f.x),s+=16,!(Math.abs(f.x)>l&&Math.abs(f.v)>l))break;return c?function(e){return i[e*(i.length-1)|0]}:s}}();v.Easings={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},spring:function(e){return 1-Math.cos(4.5*e*Math.PI)*Math.exp(6*-e)}},$.each([["ease",[.25,.1,.25,1]],["ease-in",[.42,0,1,1]],["ease-out",[0,0,.58,1]],["ease-in-out",[.42,0,.58,1]],["easeInSine",[.47,0,.745,.715]],["easeOutSine",[.39,.575,.565,1]],["easeInOutSine",[.445,.05,.55,.95]],["easeInQuad",[.55,.085,.68,.53]],["easeOutQuad",[.25,.46,.45,.94]],["easeInOutQuad",[.455,.03,.515,.955]],["easeInCubic",[.55,.055,.675,.19]],["easeOutCubic",[.215,.61,.355,1]],["easeInOutCubic",[.645,.045,.355,1]],["easeInQuart",[.895,.03,.685,.22]],["easeOutQuart",[.165,.84,.44,1]],["easeInOutQuart",[.77,0,.175,1]],["easeInQuint",[.755,.05,.855,.06]],["easeOutQuint",[.23,1,.32,1]],["easeInOutQuint",[.86,0,.07,1]],["easeInExpo",[.95,.05,.795,.035]],["easeOutExpo",[.19,1,.22,1]],["easeInOutExpo",[1,0,0,1]],["easeInCirc",[.6,.04,.98,.335]],["easeOutCirc",[.075,.82,.165,1]],["easeInOutCirc",[.785,.135,.15,.86]]],function(e,t){v.Easings[t[0]]=l.apply(null,t[1])});var x=v.CSS={RegEx:{isHex:/^#([A-f\d]{3}){1,2}$/i,valueUnwrap:/^[A-z]+\((.*)\)$/i,wrappedValueAlreadyExtracted:/[0-9.]+ [0-9.]+ [0-9.]+( [0-9.]+)?/,valueSplit:/([A-z]+\(.+\))|(([A-z0-9#-.]+?)(?=\s|$))/gi},Lists:{colors:["fill","stroke","stopColor","color","backgroundColor","borderColor","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","outlineColor"],transformsBase:["translateX","translateY","scale","scaleX","scaleY","skewX","skewY","rotateZ"],transforms3D:["transformPerspective","translateZ","scaleZ","rotateX","rotateY"]},Hooks:{templates:{textShadow:["Color X Y Blur","black 0px 0px 0px"],boxShadow:["Color X Y Blur Spread","black 0px 0px 0px 0px"],clip:["Top Right Bottom Left","0px 0px 0px 0px"],backgroundPosition:["X Y","0% 0%"],transformOrigin:["X Y Z","50% 50% 0px"],perspectiveOrigin:["X Y","50% 50%"]},registered:{},register:function(){for(var e=0;e=f)switch(e){case"name":return"filter";case"extract":var a=r.toString().match(/alpha\(opacity=(.*)\)/i);return r=a?a[1]/100:1;case"inject":return t.style.zoom=1,parseFloat(r)>=1?"":"alpha(opacity="+parseInt(100*parseFloat(r),10)+")"}else switch(e){case"name":return"opacity";case"extract":return r;case"inject":return r}}},register:function(){9>=f||v.State.isGingerbread||(x.Lists.transformsBase=x.Lists.transformsBase.concat(x.Lists.transforms3D));for(var e=0;en&&(n=1),o=!/(\d)$/i.test(n);break;case"skew":o=!/(deg|\d)$/i.test(n);break;case"rotate":o=!/(deg|\d)$/i.test(n)}return o||(i(r).transformCache[t]="("+n+")"),i(r).transformCache[t]}}}();for(var e=0;e=f||3!==o.split(" ").length||(o+=" 1"),o;case"inject":return 8>=f?4===n.split(" ").length&&(n=n.split(/\s+/).slice(0,3).join(" ")):3===n.split(" ").length&&(n+=" 1"),(8>=f?"rgb":"rgba")+"("+n.replace(/\s+/g,",").replace(/\.(\d)+(?=,)/g,"")+")"}}}()}},Names:{camelCase:function(e){return e.replace(/-(\w)/g,function(e,t){return t.toUpperCase()})},SVGAttribute:function(e){var t="width|height|x|y|cx|cy|r|rx|ry|x1|x2|y1|y2";return(f||v.State.isAndroid&&!v.State.isChrome)&&(t+="|transform"),new RegExp("^("+t+")$","i").test(e)},prefixCheck:function(e){if(v.State.prefixMatches[e])return[v.State.prefixMatches[e],!0];for(var t=["","Webkit","Moz","ms","O"],r=0,a=t.length;a>r;r++){var n;if(n=0===r?e:t[r]+e.replace(/^\w/,function(e){return e.toUpperCase()}),g.isString(v.State.prefixElement.style[n]))return v.State.prefixMatches[e]=n,[n,!0]}return[e,!1]}},Values:{hexToRgb:function(e){var t=/^#?([a-f\d])([a-f\d])([a-f\d])$/i,r=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i,a;return e=e.replace(t,function(e,t,r,a){return t+t+r+r+a+a}),a=r.exec(e),a?[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]:[0,0,0]},isCSSNullValue:function(e){return 0==e||/^(none|auto|transparent|(rgba\(0, ?0, ?0, ?0\)))$/i.test(e)},getUnitType:function(e){return/^(rotate|skew)/i.test(e)?"deg":/(^(scale|scaleX|scaleY|scaleZ|alpha|flexGrow|flexHeight|zIndex|fontWeight)$)|((opacity|red|green|blue|alpha)$)/i.test(e)?"":"px"},getDisplayType:function(e){var t=e&&e.tagName.toString().toLowerCase();return/^(b|big|i|small|tt|abbr|acronym|cite|code|dfn|em|kbd|strong|samp|var|a|bdo|br|img|map|object|q|script|span|sub|sup|button|input|label|select|textarea)$/i.test(t)?"inline":/^(li)$/i.test(t)?"list-item":/^(tr)$/i.test(t)?"table-row":/^(table)$/i.test(t)?"table":/^(tbody)$/i.test(t)?"table-row-group":"block"},addClass:function(e,t){e.classList?e.classList.add(t):e.className+=(e.className.length?" ":"")+t},removeClass:function(e,t){e.classList?e.classList.remove(t):e.className=e.className.toString().replace(new RegExp("(^|\\s)"+t.split(" ").join("|")+"(\\s|$)","gi")," ")}},getPropertyValue:function(e,r,n,o){function s(e,r){function n(){u&&x.setPropertyValue(e,"display","none")}var l=0;if(8>=f)l=$.css(e,r);else{var u=!1;if(/^(width|height)$/.test(r)&&0===x.getPropertyValue(e,"display")&&(u=!0,x.setPropertyValue(e,"display",x.Values.getDisplayType(e))),!o){if("height"===r&&"border-box"!==x.getPropertyValue(e,"boxSizing").toString().toLowerCase()){var c=e.offsetHeight-(parseFloat(x.getPropertyValue(e,"borderTopWidth"))||0)-(parseFloat(x.getPropertyValue(e,"borderBottomWidth"))||0)-(parseFloat(x.getPropertyValue(e,"paddingTop"))||0)-(parseFloat(x.getPropertyValue(e,"paddingBottom"))||0);return n(),c}if("width"===r&&"border-box"!==x.getPropertyValue(e,"boxSizing").toString().toLowerCase()){var p=e.offsetWidth-(parseFloat(x.getPropertyValue(e,"borderLeftWidth"))||0)-(parseFloat(x.getPropertyValue(e,"borderRightWidth"))||0)-(parseFloat(x.getPropertyValue(e,"paddingLeft"))||0)-(parseFloat(x.getPropertyValue(e,"paddingRight"))||0);return n(),p}}var d;d=i(e)===a?t.getComputedStyle(e,null):i(e).computedStyle?i(e).computedStyle:i(e).computedStyle=t.getComputedStyle(e,null),"borderColor"===r&&(r="borderTopColor"),l=9===f&&"filter"===r?d.getPropertyValue(r):d[r],(""===l||null===l)&&(l=e.style[r]),n()}if("auto"===l&&/^(top|right|bottom|left)$/i.test(r)){var g=s(e,"position");("fixed"===g||"absolute"===g&&/top|left/i.test(r))&&(l=$(e).position()[r]+"px")}return l}var l;if(x.Hooks.registered[r]){var u=r,c=x.Hooks.getRoot(u);n===a&&(n=x.getPropertyValue(e,x.Names.prefixCheck(c)[0])),x.Normalizations.registered[c]&&(n=x.Normalizations.registered[c]("extract",e,n)),l=x.Hooks.extractValue(u,n)}else if(x.Normalizations.registered[r]){var p,d;p=x.Normalizations.registered[r]("name",e),"transform"!==p&&(d=s(e,x.Names.prefixCheck(p)[0]),x.Values.isCSSNullValue(d)&&x.Hooks.templates[r]&&(d=x.Hooks.templates[r][1])),l=x.Normalizations.registered[r]("extract",e,d)}if(!/^[\d-]/.test(l))if(i(e)&&i(e).isSVG&&x.Names.SVGAttribute(r))if(/^(height|width)$/i.test(r))try{l=e.getBBox()[r]}catch(g){l=0}else l=e.getAttribute(r);else l=s(e,x.Names.prefixCheck(r)[0]);return x.Values.isCSSNullValue(l)&&(l=0),v.debug>=2&&console.log("Get "+r+": "+l),l},setPropertyValue:function(e,r,a,n,o){var s=r;if("scroll"===r)o.container?o.container["scroll"+o.direction]=a:"Left"===o.direction?t.scrollTo(a,o.alternateValue):t.scrollTo(o.alternateValue,a);else if(x.Normalizations.registered[r]&&"transform"===x.Normalizations.registered[r]("name",e))x.Normalizations.registered[r]("inject",e,a),s="transform",a=i(e).transformCache[r];else{if(x.Hooks.registered[r]){var l=r,u=x.Hooks.getRoot(r);n=n||x.getPropertyValue(e,u),a=x.Hooks.injectValue(l,a,n),r=u}if(x.Normalizations.registered[r]&&(a=x.Normalizations.registered[r]("inject",e,a),r=x.Normalizations.registered[r]("name",e)),s=x.Names.prefixCheck(r)[0],8>=f)try{e.style[s]=a}catch(c){v.debug&&console.log("Browser does not support ["+a+"] for ["+s+"]")}else i(e)&&i(e).isSVG&&x.Names.SVGAttribute(r)?e.setAttribute(r,a):e.style[s]=a;v.debug>=2&&console.log("Set "+r+" ("+s+"): "+a)}return[s,a]},flushTransformCache:function(e){function t(t){return parseFloat(x.getPropertyValue(e,t))}var r="";if((f||v.State.isAndroid&&!v.State.isChrome)&&i(e).isSVG){var a={translate:[t("translateX"),t("translateY")],skewX:[t("skewX")],skewY:[t("skewY")],scale:1!==t("scale")?[t("scale"),t("scale")]:[t("scaleX"),t("scaleY")],rotate:[t("rotateZ"),0,0]};$.each(i(e).transformCache,function(e){/^translate/i.test(e)?e="translate":/^scale/i.test(e)?e="scale":/^rotate/i.test(e)&&(e="rotate"),a[e]&&(r+=e+"("+a[e].join(" ")+") ",delete a[e])})}else{var n,o;$.each(i(e).transformCache,function(t){return n=i(e).transformCache[t],"transformPerspective"===t?(o=n,!0):(9===f&&"rotateZ"===t&&(t="rotate"),void(r+=t+n+" "))}),o&&(r="perspective"+o+" "+r)}x.setPropertyValue(e,"transform",r)}};x.Hooks.register(),x.Normalizations.register(),v.hook=function(e,t,r){var n=a;return e=o(e),$.each(e,function(e,o){if(i(o)===a&&v.init(o),r===a)n===a&&(n=v.CSS.getPropertyValue(o,t));else{var s=v.CSS.setPropertyValue(o,t,r);"transform"===s[0]&&v.CSS.flushTransformCache(o),n=s}}),n};var S=function(){function e(){return l?T.promise||null:f}function n(){function e(e){function p(e,t){var r=a,i=a,s=a;return g.isArray(e)?(r=e[0],!g.isArray(e[1])&&/^[\d-]/.test(e[1])||g.isFunction(e[1])||x.RegEx.isHex.test(e[1])?s=e[1]:(g.isString(e[1])&&!x.RegEx.isHex.test(e[1])||g.isArray(e[1]))&&(i=t?e[1]:u(e[1],o.duration),e[2]!==a&&(s=e[2]))):r=e,t||(i=i||o.easing),g.isFunction(r)&&(r=r.call(n,w,P)),g.isFunction(s)&&(s=s.call(n,w,P)),[r||0,i,s]}function f(e,t){var r,a;return a=(t||"0").toString().toLowerCase().replace(/[%A-z]+$/,function(e){return r=e,""}),r||(r=x.Values.getUnitType(e)),[a,r]}function d(){var e={myParent:n.parentNode||r.body,position:x.getPropertyValue(n,"position"),fontSize:x.getPropertyValue(n,"fontSize")},a=e.position===N.lastPosition&&e.myParent===N.lastParent,o=e.fontSize===N.lastFontSize;N.lastParent=e.myParent,N.lastPosition=e.position,N.lastFontSize=e.fontSize;var s=100,l={};if(o&&a)l.emToPx=N.lastEmToPx,l.percentToPxWidth=N.lastPercentToPxWidth,l.percentToPxHeight=N.lastPercentToPxHeight;else{var u=i(n).isSVG?r.createElementNS("http://www.w3.org/2000/svg","rect"):r.createElement("div");v.init(u),e.myParent.appendChild(u),$.each(["overflow","overflowX","overflowY"],function(e,t){v.CSS.setPropertyValue(u,t,"hidden")}),v.CSS.setPropertyValue(u,"position",e.position),v.CSS.setPropertyValue(u,"fontSize",e.fontSize),v.CSS.setPropertyValue(u,"boxSizing","content-box"),$.each(["minWidth","maxWidth","width","minHeight","maxHeight","height"],function(e,t){v.CSS.setPropertyValue(u,t,s+"%")}),v.CSS.setPropertyValue(u,"paddingLeft",s+"em"),l.percentToPxWidth=N.lastPercentToPxWidth=(parseFloat(x.getPropertyValue(u,"width",null,!0))||1)/s,l.percentToPxHeight=N.lastPercentToPxHeight=(parseFloat(x.getPropertyValue(u,"height",null,!0))||1)/s,l.emToPx=N.lastEmToPx=(parseFloat(x.getPropertyValue(u,"paddingLeft"))||1)/s,e.myParent.removeChild(u)}return null===N.remToPx&&(N.remToPx=parseFloat(x.getPropertyValue(r.body,"fontSize"))||16),null===N.vwToPx&&(N.vwToPx=parseFloat(t.innerWidth)/100,N.vhToPx=parseFloat(t.innerHeight)/100),l.remToPx=N.remToPx,l.vwToPx=N.vwToPx,l.vhToPx=N.vhToPx,v.debug>=1&&console.log("Unit ratios: "+JSON.stringify(l),n),l}if(o.begin&&0===w)try{o.begin.call(m,m)}catch(y){setTimeout(function(){throw y},1)}if("scroll"===k){var S=/^x$/i.test(o.axis)?"Left":"Top",V=parseFloat(o.offset)||0,C,A,F;o.container?g.isWrapped(o.container)||g.isNode(o.container)?(o.container=o.container[0]||o.container,C=o.container["scroll"+S],F=C+$(n).position()[S.toLowerCase()]+V):o.container=null:(C=v.State.scrollAnchor[v.State["scrollProperty"+S]],A=v.State.scrollAnchor[v.State["scrollProperty"+("Left"===S?"Top":"Left")]],F=$(n).offset()[S.toLowerCase()]+V),s={scroll:{rootPropertyValue:!1,startValue:C,currentValue:C,endValue:F,unitType:"",easing:o.easing,scrollData:{container:o.container,direction:S,alternateValue:A}},element:n},v.debug&&console.log("tweensContainer (scroll): ",s.scroll,n)}else if("reverse"===k){if(!i(n).tweensContainer)return void $.dequeue(n,o.queue);"none"===i(n).opts.display&&(i(n).opts.display="auto"),"hidden"===i(n).opts.visibility&&(i(n).opts.visibility="visible"),i(n).opts.loop=!1,i(n).opts.begin=null,i(n).opts.complete=null,b.easing||delete o.easing,b.duration||delete o.duration,o=$.extend({},i(n).opts,o);var E=$.extend(!0,{},i(n).tweensContainer);for(var j in E)if("element"!==j){var H=E[j].startValue;E[j].startValue=E[j].currentValue=E[j].endValue,E[j].endValue=H,g.isEmptyObject(b)||(E[j].easing=o.easing),v.debug&&console.log("reverse tweensContainer ("+j+"): "+JSON.stringify(E[j]),n)}s=E}else if("start"===k){var E;i(n).tweensContainer&&i(n).isAnimating===!0&&(E=i(n).tweensContainer),$.each(h,function(e,t){if(RegExp("^"+x.Lists.colors.join("$|^")+"$").test(e)){var r=p(t,!0),n=r[0],o=r[1],i=r[2];if(x.RegEx.isHex.test(n)){for(var s=["Red","Green","Blue"],l=x.Values.hexToRgb(n),u=i?x.Values.hexToRgb(i):a,c=0;cO;O++){var z={delay:F.delay,progress:F.progress};O===R-1&&(z.display=F.display,z.visibility=F.visibility,z.complete=F.complete),S(m,"reverse",z)}return e()}};v=$.extend(S,v),v.animate=S;var P=t.requestAnimationFrame||d;return v.State.isMobile||r.hidden===a||r.addEventListener("visibilitychange",function(){r.hidden?(P=function(e){return setTimeout(function(){e(!0)},16)},c()):P=t.requestAnimationFrame||d}),e.Velocity=v,e!==t&&(e.fn.velocity=S,e.fn.velocity.defaults=v.defaults),$.each(["Down","Up"],function(e,t){v.Redirects["slide"+t]=function(e,r,n,o,i,s){var l=$.extend({},r),u=l.begin,c=l.complete,p={height:"",marginTop:"",marginBottom:"",paddingTop:"",paddingBottom:""},f={};l.display===a&&(l.display="Down"===t?"inline"===v.CSS.Values.getDisplayType(e)?"inline-block":"block":"none"),l.begin=function(){u&&u.call(i,i);for(var r in p){f[r]=e.style[r];var a=v.CSS.getPropertyValue(e,r);p[r]="Down"===t?[a,0]:[0,a]}f.overflow=e.style.overflow,e.style.overflow="hidden"},l.complete=function(){for(var t in f)e.style[t]=f[t];c&&c.call(i,i),s&&s.resolver(i)},v(e,p,l)}}),$.each(["In","Out"],function(e,t){v.Redirects["fade"+t]=function(e,r,n,o,i,s){var l=$.extend({},r),u={opacity:"In"===t?1:0},c=l.complete;l.complete=n!==o-1?l.begin=null:function(){c&&c.call(i,i),s&&s.resolver(i)},l.display===a&&(l.display="In"===t?"auto":"none"),v(this,u,l)}}),v}(window.jQuery||window.Zepto||window,window,document)}); \ No newline at end of file diff --git a/node_modules/.bin/build.js b/node_modules/.bin/build.js index 5122ed4b..06eeebb9 100644 --- a/node_modules/.bin/build.js +++ b/node_modules/.bin/build.js @@ -51,26 +51,26 @@ //of its dependencies includes i18n bundles, they may not be included in the //built file unless the locale: section is set above. { - name: "app/main", + name: 'app/main', exclude: [ // "jquery", // "jsPlumb" ] + },{ + name: 'app/notification' } ], paths: { layout: 'layout', jquery: 'lib/jquery-1.11.1.min', // v1.11.1 jQuery //jquery: "lib/jquery-2.1.1.min", // v2.1.1 jQuery - //jqueryUI: "lib/jquery-ui.min", // v1.11.2 jQuery UI default - //jqueryUI: 'lib/jquery-ui-custom.min', // v1.11.2 custom script (without tooltip -> conflict with bootstrap) bootstrap: 'lib/bootstrap.min', // v3.3.0 Bootstrap js code - http://getbootstrap.com/javascript/ text: 'lib/requirejs/text', // v2.0.12 A RequireJS/AMD loader plugin for loading text resources. + throttleDebounce: 'lib/jquery.ba-throttle-debounce.min', // v1.1 Handle/throttle jquery events - http://benalman.com/projects/jquery-throttle-debounce-plugin/ + velocity: 'lib/velocity.min', // v1.2.1 animation engine - http://julian.com/research/velocity/ templates: '../templates', // template dir slidebars: 'lib/slidebars', // v0.10 Slidebars - side menu plugin http://plugins.adchsm.me/slidebars/ - // jsPlumb: 'lib/jsPlumb-1.6.4-min', // v1.4.6 jsPlumb - main map draw plugin http://www.jsplumb.org/ jsPlumb: 'lib/dom.jsPlumb-1.7.2-min', // v1.7.2 jsPlumb (Vanilla)- main map draw plugin http://www.jsplumb.org/ - customScrollbar: 'lib/jquery.mCustomScrollbar.concat.min', // v3.1.11 Custom scroll bars - http://manos.malihu.gr/ datatables: 'lib/jquery.dataTables.min', // v1.10.3 DataTables - tables datatablesBootstrap: 'lib/dataTables.bootstrap', // DataTables - not used (bootstrap style) @@ -81,6 +81,8 @@ easyPieChart: 'lib/jquery.easypiechart.min', // v2.1.6 Easy Pie Chart - HTML 5 pie charts - http://rendro.github.io/easy-pie-chart/ dragToSelect: 'lib/jquery.dragToSelect', // v1.1 Drag to Select - http://andreaslagerkvist.com/jquery/drag-to-select/ hoverIntent: 'lib/jquery.hoverIntent.minified', // v1.8.0 Hover intention - http://cherne.net/brian/resources/jquery.hoverIntent.html + fullScreen: 'lib/jquery.fullscreen.min', // v0.5.0 Full screen mode - https://github.com/private-face/jquery.fullscreen + pnotify: 'lib/pnotify/pnotify.core', // v2.0.1 PNotify - notification core file @@ -94,11 +96,13 @@ }, shim: { - jqueryUI: { - export: '$', + bootstrap: { deps: ['jquery'] }, - bootstrap: { + velocity: { + deps: ['jquery'] + }, + throttleDebounce: { deps: ['jquery'] }, slidebars: { @@ -136,8 +140,8 @@ hoverIntent: { deps : ['jquery'] }, - fontDetect: { - export : 'FontDetect' + fullScreen: { + deps : ['jquery'] } }, diff --git a/node_modules/.bin/readme.txt b/node_modules/.bin/readme.txt index efc67ee8..a0e1cb75 100644 --- a/node_modules/.bin/readme.txt +++ b/node_modules/.bin/readme.txt @@ -1,3 +1,3 @@ -- requireJS optimizer in diesem ordner starten: +- requireJS optimizer start in this dir: node r.js -o build.js \ No newline at end of file diff --git a/sass/bootstrap/_navbar.scss b/sass/bootstrap/_navbar.scss index ed6e4783..d9a83111 100644 --- a/sass/bootstrap/_navbar.scss +++ b/sass/bootstrap/_navbar.scss @@ -250,7 +250,7 @@ } // Uncollapse the nav - @media (min-width: $grid-float-breakpoint) { + // @media (min-width: $grid-float-breakpoint) { float: left; margin: 0; @@ -266,7 +266,7 @@ &.navbar-right:last-child { margin-right: -$navbar-padding-horizontal; } - } + // } } diff --git a/sass/layout/_dialogs.scss b/sass/layout/_dialogs.scss index dbe5e04d..91d97530 100644 --- a/sass/layout/_dialogs.scss +++ b/sass/layout/_dialogs.scss @@ -1,4 +1,8 @@ +// map add dialog ========================================= + + + // map manual dialog ====================================== #pf-manual-scrollspy{ position: relative; diff --git a/sass/layout/_main.scss b/sass/layout/_main.scss index 80945e66..20c12626 100644 --- a/sass/layout/_main.scss +++ b/sass/layout/_main.scss @@ -1,3 +1,13 @@ +body{ + // prevent marking text + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + a{ color: $teal-dark; @@ -18,6 +28,7 @@ em{ } // full screen view of an element +/* .pf-fullscreen{ &:fullscreen, &:-webkit-full-screen, { @@ -33,6 +44,7 @@ em{ background-color: green; } } +*/ // ajax laoding indicator overlay @@ -331,7 +343,14 @@ em{ &.pf-map-connection-jumpbridge{ background-color: $teal-light; - border-color: $teal-light; + border-color: $gray; + background: repeating-linear-gradient( + to right, + $teal-light, + $teal-light 10px, + $gray 10px, + $gray 20px + ); } &.pf-map-connection-wh-eol{ @@ -411,11 +430,24 @@ em{ #pf-head{ a{ + + &:focus{ + color: $teal-dark; + } + &:hover{ text-decoration: none; + + .badge{ + color: $teal-light; + } } } + i{ + margin-right: 2px; + } + .pf-head-menu{ .pf-head-menu-logo{ width: 18px; @@ -435,6 +467,15 @@ em{ } + .badge{ + background-color: $gray; + color: $gray-lighter; + } + + .pf-head-active-user, .pf-head-current-location{ + display: none; // triggered by js + } + } // footer ======================================================= diff --git a/sass/layout/_map.scss b/sass/layout/_map.scss index ff6deb50..9b9fc9a4 100644 --- a/sass/layout/_map.scss +++ b/sass/layout/_map.scss @@ -1,10 +1,14 @@ +$mapHeight: 520px; +$mapWidth: 2500px; + + // start bounce mixin ============================================== @mixin bounce-up-down{ - -webkit-animation-duration: 1s; - animation-duration: 1s; + @include animation-duration( 1s); + @include animation-delay(1s); -webkit-animation-fill-mode: both; animation-fill-mode: both; -webkit-animation-timing-function: linear; @@ -18,14 +22,14 @@ @-webkit-keyframes bounce { 0%, 20%, 50%, 80%, 100% {-webkit-transform: translateY(0);} - 40% {-webkit-transform: translateY(-10px);} - 60% {-webkit-transform: translateY(-5px);} + 40% {-webkit-transform: translateY(-8px);} + 60% {-webkit-transform: translateY(-4px);} } @keyframes bounce { 0%, 20%, 50%, 80%, 100% {transform: translateY(0);} - 40% {transform: translateY(-10px);} - 60% {transform: translateY(-5px);} + 40% {transform: translateY(-8px);} + 60% {transform: translateY(-4px);} } // end bounce mixin ================================================ @@ -35,7 +39,8 @@ .pf-map-wrapper{ position: relative; width: 100%; - height: 530px; + max-width: $mapWidth + 15px; + height: $mapHeight + 30px; overflow: auto; padding: 5px; background: rgba($gray-darker, 0.93); @@ -63,16 +68,50 @@ // 20x20px grid background .pf-grid-small{ - background: inline-image("#{$base-url}/grid_20x20.png") !important; + background: inline-image("#{$base-url}/grid_40x40.png") !important; } .pf-map{ - width: 2000px; - height: 500px; + width: $mapWidth; + height: $mapHeight; position: relative; font-family: $font-family-bold; + // jsPlumb classes ================================================= + ._jsPlumb_target, ._jsPlumb_source{ + + } + + ._jsPlumb_overlay{ + opacity: 1; + @include transition-property(opacity); + @include transition-duration(0.1s); + @include transition-timing-function(ease-in); + } + + + + // hover effect for connections + ._jsPlumb_hover{ + + &._jsPlumb_overlay{ + opacity: 0; // hide opacity on hover + } + + &:not(._jsPlumb_overlay){ + @include bounce-up-down; // label should not bounce + } + } + + // hover effect for systems + ._jsPlumb_target_hover, ._jsPlumb_source_hover{ + @include bounce-up-down; + @include box-shadow(0 6px 12px rgba(0,0,0,.3)); + } + + // ================================================================= + .pf-system{ position: absolute; min-width: 60px; @@ -81,7 +120,15 @@ font-family: $font-family-bold; z-index: 100; - //@include bounce-up-down; + // change border color with transition + @include transition( border-color 0.5s ease-out, box-shadow 0.2s ease-out ); + @include transform( translate3d(0, 0, 0) ); + + &:hover{ + // makes the systems "flying" :) + @include box-shadow(0 6px 12px rgba(0,0,0, 0.3)); + @include transform( translate3d(0, -2px, 0) ); + } @include border-radius(5px); border: { @@ -118,7 +165,7 @@ // =============================================================== .pf-system-body{ - height: 16px; + height: 0px; width: 100%; overflow: hidden; cursor: -moz-grab; @@ -143,6 +190,7 @@ font-size: 10px; .pf-system-body-right{ + text-overflow: ellipsis; float: right; color: $teal; display: none; // hover effect @@ -200,7 +248,6 @@ // locked system .pf-system-locked{ - color: $gray-light; .pf-system-sec{ cursor: default !important; @@ -211,6 +258,7 @@ } .fa-lock{ + color: $gray-light !important; display: inline-block !important; } } @@ -243,6 +291,11 @@ cursor: pointer; stroke-linecap: round; // line endings + path{ + transition-property: stroke; + transition-duration: 0.3s; + } + path:not(:first-child){ stroke: $gray; // inner line } @@ -278,7 +331,7 @@ svg.pf-map-connection-jumpbridge { path:first-child{ - stroke: $teal; + stroke: rgba(255,255,255,0); // invisible border color } path:not(:first-child){ @@ -287,6 +340,10 @@ &:hover{ path:first-child{ + stroke: rgba(255,255,255,0); // invisible border color + } + + path:not(:first-child){ stroke: $gray-lightest; } } @@ -304,7 +361,7 @@ &:hover{ path:first-child{ - stroke: $pink; + stroke: $gray-lightest; } } } diff --git a/sass/smartadmin/_main-colorpallet.scss b/sass/smartadmin/_main-colorpallet.scss index 247cd15d..293cda6a 100644 --- a/sass/smartadmin/_main-colorpallet.scss +++ b/sass/smartadmin/_main-colorpallet.scss @@ -4,7 +4,7 @@ */ .txt-color { &.txt-color-blue { color: $blue !important; } - &.txt-color-blueLight { color:$blueLight !important; } + &.txt-color-blueLight { color: $blueLight !important; } &.txt-color-blueDark { color: $blueDark !important; } &.txt-color-grayLightest { color: $gray-lightest !important; } &.txt-color-gray { color: $gray !important; } @@ -14,7 +14,7 @@ &.txt-color-greenDark { color: $greenDark !important; } &.txt-color-red { color: $red !important; } &.txt-color-yellow { color: $yellow !important; } - &.txt-color-orange { color: #b19a6b !important; } + &.txt-color-orange { color: $orange !important; } &.txt-color-orangeDark { color: $orangeDark !important; } &.txt-color-pink { color: $pink !important; } &.txt-color-pinkDark { color: $pinkDark !important; } diff --git a/sass/smartadmin/_main.scss b/sass/smartadmin/_main.scss index 15812466..1d0f23ab 100644 --- a/sass/smartadmin/_main.scss +++ b/sass/smartadmin/_main.scss @@ -1047,6 +1047,8 @@ input[type="text"]:focus + .input-group-addon { &:hover{ color: $gray-darkest; border-color: transparent transparent $gray-lighter transparent; + margin-top: 1px; + border-top-width: 0; } } .nav-tabs > li.active > a { diff --git a/templates/modules/header.html b/templates/modules/header.html index 2654170b..15873411 100644 --- a/templates/modules/header.html +++ b/templates/modules/header.html @@ -5,15 +5,26 @@
      Menu
    + + +
    \ No newline at end of file