latest ui code fixes merged in opnfv repo 05/38805/1
authorKoren Lev <korenlev@gmail.com>
Sun, 6 Aug 2017 08:41:38 +0000 (11:41 +0300)
committerKoren Lev <korenlev@gmail.com>
Sun, 6 Aug 2017 08:41:38 +0000 (11:41 +0300)
Change-Id: Ib6d7f81e4a85286b7b30d332c757f7eb1bb519f3
Signed-off-by: Koren Lev <korenlev@gmail.com>
54 files changed:
ui/.eslintrc.js [new file with mode: 0644]
ui/.gitignore [new file with mode: 0644]
ui/.meteor/.finished-upgraders [new file with mode: 0644]
ui/.meteor/.gitignore [new file with mode: 0644]
ui/.meteor/.id [new file with mode: 0644]
ui/.meteor/packages [new file with mode: 0644]
ui/.meteor/platforms [new file with mode: 0644]
ui/.meteor/release [new file with mode: 0644]
ui/.meteor/versions [new file with mode: 0644]
ui/client/lib/jquery.multilevelpushmenu.css [deleted file]
ui/client/lib/jquery.multilevelpushmenu.js [deleted file]
ui/imports/api/environments/configuration-groups/amqp-configuration.js
ui/imports/api/environments/configuration-groups/mysql-configuration.js
ui/imports/api/scheduled-scans/methods.js
ui/imports/api/scheduled-scans/scheduled-scans.js
ui/imports/api/scheduled-scans/server/methods.js
ui/imports/api/scheduled-scans/server/publications.js
ui/imports/lib/images-for-node-type.js
ui/imports/ui/actions/environment-panel.actions.js
ui/imports/ui/actions/graph-tooltip-window.actions.js
ui/imports/ui/actions/main-app.actions.js
ui/imports/ui/actions/navigation.js
ui/imports/ui/actions/search-interested-parties.js
ui/imports/ui/actions/tree-node.actions.js
ui/imports/ui/actions/vedge-info-window.actions.js
ui/imports/ui/components/env-amqp-credentials-info/env-amqp-credentials-info.html
ui/imports/ui/components/env-open-stack-db-credentials-info/env-open-stack-db-credentials-info.html
ui/imports/ui/components/mt-input/mt-input.js
ui/imports/ui/components/mt-radios/mt-radios.js
ui/imports/ui/components/mt-select/mt-select.js
ui/imports/ui/components/network-graph-manager/network-graph-manager.js
ui/imports/ui/components/network-graph/network-graph.js
ui/imports/ui/components/network-graph/network-graph.styl
ui/imports/ui/components/new-scanning/new-scanning.js
ui/imports/ui/components/scheduled-scan/scheduled-scan.js
ui/imports/ui/components/scheduled-scans-list/scheduled-scans-list.js
ui/imports/ui/components/selectable-ordered-input/selectable-ordered-input.js
ui/imports/ui/lib/environment-tree-node-behavior.js
ui/imports/ui/lib/input-model.js
ui/imports/ui/lib/inventory-tree-node-behavior.js
ui/imports/ui/lib/select-model.js
ui/imports/ui/reducers/environment-panel.reducer.js
ui/imports/ui/reducers/graph-tooltip-window.reducer.js
ui/imports/ui/reducers/i18n.reducer.js
ui/imports/ui/reducers/index.js
ui/imports/ui/reducers/main-app.reducer.js
ui/imports/ui/reducers/navigation.js
ui/imports/ui/reducers/search-interested-parties.js
ui/imports/ui/reducers/tree-node.reducer.js
ui/imports/ui/reducers/vedge-info-window.reducer.js
ui/imports/ui/store/index.js
ui/imports/ui/store/store.js
ui/run [new file with mode: 0755]
ui/run-dev.sh [new file with mode: 0755]

diff --git a/ui/.eslintrc.js b/ui/.eslintrc.js
new file mode 100644 (file)
index 0000000..913c6f3
--- /dev/null
@@ -0,0 +1,50 @@
+module.exports = {
+    "env": {
+        "browser": true,
+        "commonjs": true,
+        "es6": true,
+        "node": true,
+        "meteor": true
+    },
+    "extends": "eslint:recommended",
+    "parserOptions": {
+        "sourceType": "module"
+    },
+    "rules": {
+        "indent": [
+            "error",
+            2
+        ],
+        "linebreak-style": [
+            "error",
+            "unix"
+        ],
+        "quotes": [
+            "error",
+            "single",
+            {
+              "allowTemplateLiterals": true
+            }
+        ],
+        "semi": [
+            "error",
+            "always"
+        ],
+        "no-console": 0,
+        "no-unused-vars": [
+          "error", 
+          { "argsIgnorePattern": "^_" }
+        ]
+    },
+    "globals": {
+        "Iron": true,
+        "jQuery": true,
+        "d3Graph": true,
+        "d3": true,
+        "$": true,
+        "toastr": true,
+        "google": true,
+        "moment": true,
+        "WOW": true,
+    }
+};
diff --git a/ui/.gitignore b/ui/.gitignore
new file mode 100644 (file)
index 0000000..619933a
--- /dev/null
@@ -0,0 +1,3 @@
+**/*.swp
+**/*.directory
+node_modules/
diff --git a/ui/.meteor/.finished-upgraders b/ui/.meteor/.finished-upgraders
new file mode 100644 (file)
index 0000000..ce276f3
--- /dev/null
@@ -0,0 +1,16 @@
+# This file contains information which helps Meteor properly upgrade your
+# app when you run 'meteor update'. You should check it into version control
+# with your project.
+
+notices-for-0.9.0
+notices-for-0.9.1
+0.9.4-platform-file
+notices-for-facebook-graph-api-2
+1.2.0-standard-minifiers-package
+1.2.0-meteor-platform-split
+1.2.0-cordova-changes
+1.2.0-breaking-changes
+1.3.0-split-minifiers-package
+1.4.0-remove-old-dev-bundle-link
+1.4.1-add-shell-server-package
+1.4.3-split-account-service-packages
diff --git a/ui/.meteor/.gitignore b/ui/.meteor/.gitignore
new file mode 100644 (file)
index 0000000..4083037
--- /dev/null
@@ -0,0 +1 @@
+local
diff --git a/ui/.meteor/.id b/ui/.meteor/.id
new file mode 100644 (file)
index 0000000..6041321
--- /dev/null
@@ -0,0 +1,7 @@
+# This file contains a token that is unique to your project.
+# Check it into your repository along with the rest of this directory.
+# It can be used for purposes such as:
+#   - ensuring you don't accidentally deploy one app on top of another
+#   - providing package authors with aggregated statistics
+
+ryedun1uy1llg1szr22d
diff --git a/ui/.meteor/packages b/ui/.meteor/packages
new file mode 100644 (file)
index 0000000..a63ed10
--- /dev/null
@@ -0,0 +1,48 @@
+# Meteor packages used by this project, one per line.
+# Check this file (and the other files in this directory) into your repository.
+#
+# 'meteor add' and 'meteor remove' will edit this file for you,
+# but you can also edit it by hand.
+
+meteor-base@1.0.4             # Packages every Meteor app needs to have
+mobile-experience@1.0.4       # Packages for a great mobile UX
+mongo@1.1.16                   # The database Meteor supports right now
+blaze-html-templates@1.0.4    # Compile .html files into Meteor Blaze views
+session@1.1.7                 # Client-side reactive dictionary for your app
+jquery@1.11.10                  # Helpful client-side library
+tracker@1.1.2                 # Meteor's client-side reactive programming library
+
+es5-shim@4.6.15                # ECMAScript 5 compatibility for older browsers.
+ecmascript@0.7.2              # Enable ECMAScript2015+ syntax in app code
+
+http@1.2.12
+iron:router
+twbs:bootstrap
+standard-minifier-css@1.3.4
+standard-minifier-js@2.0.0
+limemakers:three
+pcel:loading
+spectrum:material-design-lite
+timmyg:wow
+accounts-ui@1.1.9
+accounts-password@1.3.5
+zimme:active-route
+gwendall:auth-client-callbacks
+meteortoys:allthings
+fortawesome:fontawesome
+chrismbeckett:toastr
+stolinski:stylus-multi
+shell-server@0.2.3
+reactive-dict@1.1.8
+tmeasday:publish-counts
+modules@0.8.1
+aldeed:simple-schema
+mdg:validated-method
+aldeed:collection2
+meteorhacks:aggregate
+momentjs:moment
+tsega:bootstrap3-datetimepicker
+alanning:roles
+percolate:migrations
+npm-bcrypt
+natestrauser:publish-performant-counts
diff --git a/ui/.meteor/platforms b/ui/.meteor/platforms
new file mode 100644 (file)
index 0000000..efeba1b
--- /dev/null
@@ -0,0 +1,2 @@
+server
+browser
diff --git a/ui/.meteor/release b/ui/.meteor/release
new file mode 100644 (file)
index 0000000..605b4e1
--- /dev/null
@@ -0,0 +1 @@
+METEOR@1.4.4.1
diff --git a/ui/.meteor/versions b/ui/.meteor/versions
new file mode 100644 (file)
index 0000000..4f3b155
--- /dev/null
@@ -0,0 +1,138 @@
+accounts-base@1.2.16
+accounts-password@1.3.5
+accounts-ui@1.1.9
+accounts-ui-unstyled@1.2.1
+alanning:roles@1.2.16
+aldeed:collection2@2.10.0
+aldeed:collection2-core@1.2.0
+aldeed:schema-deny@1.1.0
+aldeed:schema-index@1.1.1
+aldeed:simple-schema@1.5.3
+allow-deny@1.0.5
+autoupdate@1.3.12
+babel-compiler@6.18.2
+babel-runtime@1.0.1
+base64@1.0.10
+binary-heap@1.0.10
+blaze@2.3.2
+blaze-html-templates@1.1.2
+blaze-tools@1.0.10
+boilerplate-generator@1.0.11
+caching-compiler@1.1.9
+caching-html-compiler@1.1.2
+callback-hook@1.0.10
+check@1.2.5
+chrismbeckett:toastr@2.1.2_1
+coffeescript@1.12.3_1
+ddp@1.2.5
+ddp-client@1.3.4
+ddp-common@1.2.8
+ddp-rate-limiter@1.0.7
+ddp-server@1.3.14
+deps@1.0.12
+diff-sequence@1.0.7
+ecmascript@0.7.3
+ecmascript-runtime@0.3.15
+ejson@1.0.13
+email@1.2.1
+es5-shim@4.6.15
+fastclick@1.0.13
+fortawesome:fontawesome@4.7.0
+geojson-utils@1.0.10
+gwendall:auth-client-callbacks@0.1.0
+hot-code-push@1.0.4
+html-tools@1.0.11
+htmljs@1.0.11
+http@1.2.12
+id-map@1.0.9
+iron:controller@1.0.12
+iron:core@1.0.11
+iron:dynamic-template@1.0.12
+iron:layout@1.0.12
+iron:location@1.0.11
+iron:middleware-stack@1.1.0
+iron:router@1.1.2
+iron:url@1.1.0
+jquery@1.11.10
+launch-screen@1.1.1
+less@2.7.9
+limemakers:three@0.75.0
+livedata@1.0.18
+localstorage@1.0.12
+logging@1.1.17
+mdg:validated-method@1.1.0
+mdg:validation-error@0.5.1
+meteor@1.6.1
+meteor-base@1.0.4
+meteorhacks:aggregate@1.3.0
+meteorhacks:collection-utils@1.2.0
+meteortoys:allthings@3.0.0
+meteortoys:authenticate@3.0.0
+meteortoys:autopub@3.0.0
+meteortoys:blueprint@3.0.0
+meteortoys:email@3.0.0
+meteortoys:hotreload@3.0.0
+meteortoys:listen@3.0.0
+meteortoys:method@3.0.4
+meteortoys:pub@3.0.4
+meteortoys:result@3.0.0
+meteortoys:shell@3.0.0
+meteortoys:status@3.0.0
+meteortoys:sub@3.0.0
+meteortoys:throttle@3.0.0
+meteortoys:toykit@3.0.4
+minifier-css@1.2.16
+minifier-js@2.0.0
+minimongo@1.0.21
+mobile-experience@1.0.4
+mobile-status-bar@1.0.14
+modules@0.8.2
+modules-runtime@0.7.10
+momentjs:moment@2.18.1
+mongo@1.1.16
+mongo-id@1.0.6
+mongo-livedata@1.0.12
+msavin:jetsetter@2.0.0
+msavin:mongol@2.0.1
+natestrauser:publish-performant-counts@0.1.2
+npm-bcrypt@0.9.2
+npm-mongo@2.2.24
+observe-sequence@1.0.16
+ordered-dict@1.0.9
+pcel:loading@1.0.3
+percolate:migrations@0.9.8
+promise@0.8.8
+raix:eventemitter@0.1.3
+random@1.0.10
+rate-limit@1.0.8
+reactive-dict@1.1.8
+reactive-var@1.0.11
+reload@1.1.11
+retry@1.0.9
+routepolicy@1.0.12
+service-configuration@1.0.11
+session@1.1.7
+sha@1.0.9
+shell-server@0.2.3
+spacebars@1.0.15
+spacebars-compiler@1.1.2
+spectrum:material-design-lite@0.0.4
+srp@1.0.10
+standard-minifier-css@1.3.4
+standard-minifier-js@2.0.0
+stolinski:stylus-multi@1.4.3
+templating@1.3.2
+templating-compiler@1.3.2
+templating-runtime@1.3.2
+templating-tools@1.1.2
+timmyg:wow@1.0.1
+tmeasday:publish-counts@0.8.0
+tracker@1.1.2
+tsega:bootstrap3-datetimepicker@4.17.37_1
+twbs:bootstrap@3.3.6
+ui@1.0.13
+underscore@1.0.10
+url@1.1.0
+webapp@1.3.15
+webapp-hashing@1.0.9
+zimme:active-route@2.3.2
diff --git a/ui/client/lib/jquery.multilevelpushmenu.css b/ui/client/lib/jquery.multilevelpushmenu.css
deleted file mode 100644 (file)
index 407cda9..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************************/
-/* Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others */
-/*                                                                                      */
-/* All rights reserved. This program and the accompanying materials                     */
-/* are made available under the terms of the Apache License, Version 2.0                */
-/* which accompanies this distribution, and is available at                             */
-/* http://www.apache.org/licenses/LICENSE-2.0                                           */
-/****************************************************************************************/
-.multilevelpushmenu_wrapper {
-       position: absolute;
-       overflow: hidden;
-       min-width: 100%;
-       min-height: 100%;
-       margin: 0;
-       padding: 0;
-}
-
-.multilevelpushmenu_wrapper .levelHolderClass {
-       position: absolute;
-       overflow: hidden;
-       top: 0;
-       background: #336ca6;
-       width: auto;
-       min-height: 100%;
-       font-family: 'Open Sans Condensed', sans-serif;
-       font-size: 1em;
-       zoom: 1;
-}
-
-.multilevelpushmenu_wrapper .ltr {
-       margin-left: -100%;
-       left: 0;
-       -moz-box-shadow: 5px 0 5px -5px #1f4164;
-       -webkit-box-shadow: 5px 0 5px -5px #1f4164;
-       box-shadow: 5px 0 5px -5px #1f4164;
-       filter: progid:DXImageTransform.Microsoft.Shadow(color=#1f4164,direction=90,strength=2);
-}
-
-.multilevelpushmenu_wrapper .rtl {
-       margin-right: -100%;
-       right: 0;
-       -moz-box-shadow: 5px 0 5px 5px #1f4164;
-       -webkit-box-shadow: 5px 0 5px 5px #1f4164;
-       box-shadow: 5px 0 5px 5px #1f4164;
-       filter: progid:DXImageTransform.Microsoft.Shadow(color=#1f4164,direction=270,strength=2);
-}
-
-.multilevelpushmenu_wrapper .multilevelpushmenu_inactive {
-       background: #2e6196;
-}
-
-.multilevelpushmenu_wrapper h2 {
-       font-size: 1.5em;
-       line-height: 1em;
-       font-weight: bold;
-       color: #1f4164;
-       padding: 0 .4em 0 .4em;
-}
-
-.multilevelpushmenu_wrapper ul {
-       list-style: none;
-       padding: 0;
-       margin: 0;
-}
-
-.multilevelpushmenu_wrapper li {
-       cursor: pointer;
-       border-top: 1px solid #295685;
-       padding: .4em .4em .4em .4em;
-}
-
-.multilevelpushmenu_wrapper li:last-child {
-       border-bottom: 1px solid #295685;
-}
-
-.multilevelpushmenu_wrapper li:hover {
-       background-color: #295685;
-}
-
-.multilevelpushmenu_wrapper a {
-       display: block;
-       outline: none;
-       overflow: hidden;
-       font-size: 1.5em;
-       line-height: 1em;
-       padding: .2em .2em;
-       text-decoration: none;
-       color: #fff;
-}
-
-.multilevelpushmenu_wrapper a:hover {
-       color: #ffe;
-}
-
-.multilevelpushmenu_wrapper .backItemClass {
-       display: block;
-       padding: .4em .4em .4em .4em;
-       background: #2e6196;
-       border-top: 1px solid #295685;
-}
-
-.multilevelpushmenu_wrapper .floatRight {
-       float: right;
-}
-
-.multilevelpushmenu_wrapper .floatLeft {
-       float: left;
-}
-
-.multilevelpushmenu_wrapper .cursorPointer {
-       cursor: pointer;
-}
-
-.multilevelpushmenu_wrapper .iconSpacing_ltr {
-       padding: 0 .4em 0 0;
-}
-
-.multilevelpushmenu_wrapper .iconSpacing_rtl {
-       padding: 0 0 0 .4em;
-}
\ No newline at end of file
diff --git a/ui/client/lib/jquery.multilevelpushmenu.js b/ui/client/lib/jquery.multilevelpushmenu.js
deleted file mode 100644 (file)
index 0b2a24d..0000000
+++ /dev/null
@@ -1,1148 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
-/**
- * jquery.multilevelpushmenu.js v2.1.4
- *
- * Licensed under the MIT license.
- * http://www.opensource.org/licenses/mit-license.php
- * 
- * Copyright 2013-2014, Make IT d.o.o.
- * http://multi-level-push-menu.make.rs
- * https://github.com/adgsm/multi-level-push-menu
- */
-(function ( $ ) {
-       $.fn.multilevelpushmenu = function( options ) {
-               "use strict";
-               var args = arguments,
-                       returnValue = null;
-               
-               this.each(function(){
-                       var instance = this,
-                               $this = $( this ),
-                               $container = ( $this.context != undefined ) ? $this : $( 'body' ),
-                               menu = ( options && options.menu != undefined ) ? options.menu : $this.find( 'nav' ),
-                               clickEventType, dragEventType;
-
-                       // Settings
-                       var settings = $.extend({
-                               container: $container,
-                               containersToPush: null,
-                               menuID: ( ( $container.prop( 'id' ) != undefined && $container.prop( 'id' ) != '' ) ? $container.prop( 'id' ) : this.nodeName.toLowerCase() ) + "_multilevelpushmenu",
-                               wrapperClass: 'multilevelpushmenu_wrapper',
-                               menuInactiveClass: 'multilevelpushmenu_inactive',
-                               menu: menu,
-                               menuWidth: 0,
-                               menuHeight: 0,
-                               collapsed: false,
-                               fullCollapse: false,
-                               direction: 'ltr',
-                               backText: 'Back',
-                               backItemClass: 'backItemClass',
-                               backItemIcon: 'fa fa-angle-right',
-                               groupIcon: 'fa fa-angle-left',
-                               mode: 'overlap',
-                               overlapWidth: 40,
-                               preventItemClick: true,
-                               preventGroupItemClick: true,
-                               swipe: 'both',
-                               durationSlideOut: 400,
-                               durationSlideDown: 500,
-                               durationTransition: 400,
-                               onCollapseMenuStart: function() {},
-                               onCollapseMenuEnd: function() {},
-                               onExpandMenuStart: function() {},
-                               onExpandMenuEnd: function() {},
-                               onGroupItemClick: function() {},
-                               onItemClick: function() {},
-                               onTitleItemClick: function() {},
-                               onBackItemClick: function() {},
-                               onMenuReady: function() {},
-                               onMenuSwipe: function() {}
-                       }, options );
-
-                       // Store a settings reference withint the element's data
-                       if (!$.data(instance, 'plugin_multilevelpushmenu')) {
-                               $.data(instance, 'plugin_multilevelpushmenu', settings);
-                               instance.settings = $.data(instance, 'plugin_multilevelpushmenu');
-                       }
-
-                       // Exposed methods
-                       var methods = {
-                               // Initialize menu
-                               init: function () {
-                                       return initialize.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Collapse menu
-                               collapse: function () {
-                                       return collapseMenu.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Expand menu
-                               expand: function () {
-                                       return expandMenu.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Menu expanded
-                               menuexpanded: function () {
-                                       return menuExpanded.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Active menu
-                               activemenu: function () {
-                                       return activeMenu.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Find menu(s) by title
-                               findmenusbytitle: function () {
-                                       return findMenusByTitle.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Find item(s) by name
-                               finditemsbyname: function () {
-                                       return findItemsByName.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Find path to root menu collection
-                               pathtoroot: function () {
-                                       return pathToRoot.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Find shared path to root of two menus
-                               comparepaths: function () {
-                                       return comparePaths.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Get/Set settings options
-                               option: function () {
-                                       return manageOptions.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Add item(s)
-                               additems: function () {
-                                       return addItems.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Remove item(s)
-                               removeitems: function () {
-                                       return removeItems.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Size DOM elements
-                               redraw: function () {
-                                       return sizeDOMelements.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Returns visible level holders
-                               visiblemenus: function () {
-                                       return visibleLevelHolders.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Returns visible level holders
-                               hiddenmenus: function () {
-                                       return hiddenLevelHolders.apply(this, Array.prototype.slice.call(arguments));
-                               },
-                               // Propagate event to underneath layer
-                               propagateevent: function () {
-                                       return propagateEvent.apply(this, Array.prototype.slice.call(arguments));
-                               }
-                       };
-
-                       // IE 8 and modern browsers, prevent event propagation
-                       function stopEventPropagation( e ){
-                               if ( e.stopPropagation && e.preventDefault ) {
-                                       e.stopPropagation();
-                                       e.preventDefault();
-                               }
-                               else {
-                                       e.cancelBubble = true;
-                                       e.returnValue = false;
-                               }
-                       }
-
-                       // propagate event to underneath layer
-                       // http://jsfiddle.net/E9zTs/2/
-                       function propagateEvent( $element , event ) {
-                               if( $element == undefined || event == undefined ) return false;
-                               $element.on( event , function ( e , ee ) {
-                                       $element.hide();
-                                       try {
-                                               if(!e.pageX || !e.pageY) return false;
-                                               ee = ee || {
-                                                       pageX: e.pageX,
-                                                       pageY: e.pageY
-                                               };
-                                               var next = document.elementFromPoint( ee.pageX , ee.pageY );
-                                               next = ( next.nodeType == 3 ) ? next.parentNode : next //Opera
-                                               $( next ).trigger( event , ee );
-                                       }
-                                       catch ( err ) {
-                                               $.error( 'Error while propagating event: ' + err.message );
-                                       }
-                                       finally {
-                                               $element.show();
-                                       }
-                               });
-                       }
-
-                       // Create DOM structure if it does not already exist within the container (input: array)
-                       function createDOMStructure() {
-                               var $mainWrapper = $( "<nav />" )
-                                   .prop( { "id" : instance.settings.menuID, "className" : instance.settings.wrapperClass } )
-                                   .appendTo( instance.settings.container );
-                               createNestedDOMStructure( instance.settings.menu, $mainWrapper );
-                       }
-                       function createNestedDOMStructure( menus, $wrapper ){
-                               if( menus.level == undefined ) menus.level = 0;
-                               $.each( menus, function(){
-                                       var $levelHolder = $( "<div />" )
-                                           .attr( { "class" : "levelHolderClass" + ( ( instance.settings.direction == 'rtl' ) ? " rtl" : " ltr" ), "data-level" : menus.level, "style" : ( ( instance.settings.direction == 'rtl' ) ? "margin-right: " : "margin-left: " ) + ( ( menus.level == 0 && !instance.settings.collapsed ) ? 0 : "-200%" ) } )
-                                           .appendTo( $wrapper ),
-                                           extWidth = ( isValidDim( instance.settings.menuWidth ) || ( isInt( instance.settings.menuWidth ) && instance.settings.menuWidth > 0 ) );
-                                       $levelHolder.bind( dragEventType ,  function(e){
-                                               holderSwipe( e, $levelHolder );
-                                       });
-                                       if( this.id != undefined ) $levelHolder.attr( { "id" : this.id } );
-                                       var $title = $( "<h2 />" )
-                                               .attr( { "style" : "text-align: " + ( ( instance.settings.direction == 'rtl' ) ? "right" : "left" ) } )
-                                           .text( this.title )
-                                           .appendTo( $levelHolder ),
-                                           $titleIcon = $( "<i />" )
-                                           .prop( { "class" : ( ( instance.settings.direction == 'rtl' ) ? "floatLeft" : "floatRight" ) + " cursorPointer " + this.icon } )
-                                           .prependTo( $title );
-                                       $titleIcon.bind( clickEventType ,  function(e){
-                                               titleIconClick(e, $levelHolder, menus);
-                                       });
-                                       if( menus.level > 0 ) createBackItem( $levelHolder );
-                                       var $itemGroup = $( "<ul />" )
-                                           .appendTo( $levelHolder );
-                                       $.each(this.items, function(){
-                                               createItem( this, $levelHolder , -1 );
-                                       })
-                               });
-                       }
-
-                       // Update DOM structure if it already exists in container (input: HTML markup)
-                       function updateDOMStructure() {
-                               var $mainWrapper = ( instance.settings.container.find( 'nav' ).length > 0 ) ? instance.settings.container.find( 'nav' ) : instance.settings.menu;
-                               if( $mainWrapper.length == 0 ) return false;
-                               $mainWrapper.prop( { "id" : instance.settings.menuID, "className" : instance.settings.wrapperClass } );
-                               updateNestedDOMStructure( $mainWrapper );
-                       }
-                       function updateNestedDOMStructure( $wrapper ){
-                               if( $wrapper.level == undefined ) $wrapper.level = 0;
-                               $.each( $wrapper, function(){
-                                       var $levelHolder = $( "<div />" )
-                                           .attr( { "class" : "levelHolderClass" + ( ( instance.settings.direction == 'rtl' ) ? " rtl" : " ltr" ), "data-level" : $wrapper.level, "style" : ( ( instance.settings.direction == 'rtl' ) ? "margin-right: " : "margin-left: " ) + ( ( $wrapper.level == 0 && !instance.settings.collapsed ) ? 0 : "-200%" ) } )
-                                           .appendTo( $wrapper ),
-                                           extWidth = ( isValidDim( instance.settings.menuWidth ) || ( isInt( instance.settings.menuWidth ) && instance.settings.menuWidth > 0 ) );
-                                       $levelHolder.bind( dragEventType ,  function(e){
-                                               holderSwipe( e, $levelHolder );
-                                       });
-                                       var $title = $wrapper.children( 'h2' );
-                                       $title.attr( { "style" : "text-align: " + ( ( instance.settings.direction == 'rtl' ) ? "right" : "left" ) } );
-                                       $title.appendTo( $levelHolder );
-                                       var $titleIcon = $title.children( 'i' );
-                                       $titleIcon.addClass( ( ( instance.settings.direction == 'rtl' ) ? "floatLeft" : "floatRight" ) + " cursorPointer" );
-                                       $titleIcon.bind( clickEventType , function(e){
-                                               titleIconClick(e, $levelHolder, $wrapper);
-                                       });
-                                       if( $wrapper.level > 0 ) createBackItem( $levelHolder );
-                                       var $itemGroup = $wrapper.children( 'ul' );
-                                       $itemGroup.appendTo( $levelHolder );
-                                       $.each($itemGroup.children( 'li' ), function(){
-                                               var $item = $( this );
-                                               $item.attr( { "style" : "text-align: " + ( ( instance.settings.direction == 'rtl' ) ? "right" : "left" ) } );
-                                               var $itemAnchor = $item.children( 'a' );
-                                               var $itemIcon = $itemAnchor.children( 'i' );
-                                               $itemIcon.addClass( ( ( instance.settings.direction == 'rtl' ) ? "floatLeft" : "floatRight" ) );
-                                               if($item.children( 'ul' ).length > 0) {
-                                                       $itemAnchor.bind( clickEventType , function(e){
-                                                               itemGroupAnchorClick( e, $levelHolder, $item );
-                                                       });
-                                                       createItemGroupIcon( $itemAnchor );
-                                                       $item.level = $wrapper.level + 1;
-                                                       updateNestedDOMStructure($item);
-                                               } else {
-                                                       $itemAnchor.bind( clickEventType , function(e){
-                                                               itemAnchorClick( e, $levelHolder, $item );
-                                                       });
-                                               }
-                                       })
-                               });
-                       }
-
-                       // Click event for title icon
-                       function titleIconClick( e, $levelHolder, menus ) {
-                               if( $(instance).find( 'div.levelHolderClass' ).is(':animated') ) return false;
-                               instance.settings.onTitleItemClick.apply(this, Array.prototype.slice.call([e, $levelHolder, instance.settings]));
-                               stopEventPropagation(e);
-                               var instanceFC = ( instance.settings.direction == 'rtl' ) ?
-                                       parseInt( $levelHolder.css( 'margin-right' ) ) < 0
-                                       :
-                                       parseInt( $levelHolder.css( 'margin-left' ) ) < 0;
-                               if( menus.level == 0 && instanceFC ) {
-                                       expandMenu();
-                               }
-                               else {
-                                       var $nextLevelHolders = instance.settings.container
-                                               .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                               .filter(function(){
-                                                       var retObjs = ( instance.settings.direction == 'rtl' ) ?
-                                                       (($( this ).attr( 'data-level' ) > $levelHolder.attr( 'data-level' )) && ( parseInt( $( this ).css( 'margin-right' ) ) >= 0 ) )
-                                                       :
-                                                       (($( this ).attr( 'data-level' ) > $levelHolder.attr( 'data-level' )) && ( parseInt( $( this ).css( 'margin-left' ) ) >= 0 ) );
-                                                       return retObjs;
-                                               }),
-                                               $prevLevelHolders = instance.settings.container
-                                               .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                               .filter(function(){
-                                                       var retObjs = ( instance.settings.direction == 'rtl' ) ?
-                                                       (($( this ).attr( 'data-level' ) <= $levelHolder.attr( 'data-level' )) && ( parseInt( $( this ).css( 'margin-right' ) ) >= 0 ) )
-                                                       :
-                                                       (($( this ).attr( 'data-level' ) <= $levelHolder.attr( 'data-level' )) && ( parseInt( $( this ).css( 'margin-left' ) ) >= 0 ) );
-                                                       return retObjs;
-                                               }),
-                                               collapseAll = ( $nextLevelHolders.length == 0 && $prevLevelHolders.length == 1 ) ? collapseMenu() : collapseMenu( parseInt( $levelHolder.attr( 'data-level' ) ) );
-                               }
-                               $levelHolder.css( 'visibility' , 'visible' );
-                               $levelHolder.find( '.' + instance.settings.backItemClass ).css( 'visibility' , 'visible' );
-                               $levelHolder.find( 'ul' ).css( 'visibility' , 'visible' );
-                               $levelHolder.removeClass( instance.settings.menuInactiveClass );
-                       }
-
-                       // Create Back item DOM elements
-                       function createBackItem( $levelHolder ) {
-                               var $backItem = $( "<div />" )
-                                   .attr( { "class" : instance.settings.backItemClass } )
-                                   .appendTo( $levelHolder ),
-                                   $backItemAnchor = $( "<a />" )
-                                   .prop( { "href" : "#" } )
-                                   .text( instance.settings.backText )
-                                   .appendTo( $backItem ),
-                                   $backItemIcon = $( "<i />" )
-                                   .prop( { "class" : ( ( instance.settings.direction == 'rtl' ) ? "floatLeft " : "floatRight " ) + instance.settings.backItemIcon } )
-                                   .prependTo( $backItemAnchor );
-                               $backItemAnchor.bind( clickEventType , function(e){
-                                       backItemAnchorClick(e, $levelHolder);
-                               });
-                       }
-
-                       // Click event for back item
-                       function backItemAnchorClick( e, $levelHolder ) {
-                               if( $(instance).find( 'div.levelHolderClass' ).is(':animated') ) return false;
-                               instance.settings.onBackItemClick.apply(this, Array.prototype.slice.call([e, $levelHolder, instance.settings]));
-                               stopEventPropagation(e);
-                               collapseMenu( parseInt( $levelHolder.attr( 'data-level' ) - 1 ) );
-                       }
-
-                       // Click event for group items
-                       function itemGroupAnchorClick( e, $levelHolder, $item ) {
-                               if( $(instance).find( 'div.levelHolderClass' ).is(':animated') ) return false;
-                               instance.settings.onGroupItemClick.apply(this, Array.prototype.slice.call([e, $levelHolder, $item, instance.settings]));
-                               expandMenu( $item.find( 'div:first' ) );
-                               if( instance.settings.preventGroupItemClick ) stopEventPropagation(e);
-                       }
-
-                       // Create item group DOM element
-                       function createItemGroupIcon( $itemAnchor ) {
-                               var $itemGroupIcon = $( "<i />" )
-                                       .attr( { "class" : ( ( instance.settings.direction == 'rtl' ) ? " floatRight iconSpacing_rtl " : " floatLeft iconSpacing_ltr " ) + instance.settings.groupIcon } )
-                                       .prependTo( $itemAnchor );
-                       }
-
-                       // Create item DOM element
-                       function createItem() {
-                               var item = arguments[0],
-                                       $levelHolder = arguments[1],
-                                       position = arguments[2],
-                                       $itemGroup = $levelHolder.find( 'ul:first' ),
-                                       $item = $( "<li />" );
-                                       ( position < ( $itemGroup.children( 'li' ).length ) && position >= 0 ) ? 
-                                               $item.insertBefore( $itemGroup.children( 'li' ).eq( position ) ) : $item.appendTo( $itemGroup );
-                                       $item.attr( { "style" : "text-align: " + ( ( instance.settings.direction == 'rtl' ) ? "right" : "left" ) } );
-                                   if( item.id != undefined ) $item.attr( { "id" : item.id } );
-                                       var $itemAnchor = $( "<a />" )
-                                   .prop( { "href" : item.link } )
-                                   .text( item.name )
-                                   .appendTo( $item ),
-                                   $itemIcon = $( "<i />" )
-                                       .prop( { "class" : ( ( instance.settings.direction == 'rtl' ) ? "floatLeft " : "floatRight " ) + item.icon } )
-                                   .prependTo( $itemAnchor );
-                               if(item.items) {
-                                       $itemAnchor.bind( clickEventType , function(e){
-                                               itemGroupAnchorClick( e, $levelHolder, $item );
-                                       });
-                                       createItemGroupIcon( $itemAnchor );
-                                       item.items.level = parseInt( $levelHolder.attr( 'data-level' ), 10 ) + 1;
-                                       createNestedDOMStructure(item.items, $item);
-                               } else {
-                                       $itemAnchor.bind( clickEventType , function(e){
-                                               itemAnchorClick( e, $levelHolder, $item );
-                                       });
-                               }
-                       }
-
-                       // Click event for items
-                       function itemAnchorClick( e, $levelHolder, $item ) {
-                               instance.settings.onItemClick.apply(this, Array.prototype.slice.call([e, $levelHolder, $item, instance.settings]));
-                               if( instance.settings.preventItemClick ) stopEventPropagation(e);
-                       }
-
-                       // Swipe/Drag event for holders
-                       function holderSwipe( emd, $levelHolder ) {
-                               var extRes = instance.settings.onMenuSwipe.apply(this, Array.prototype.slice.call([emd, $levelHolder, instance.settings]));
-                               if( extRes == false ) return false;
-                               if( $(instance).find( 'div.levelHolderClass' ).is(':animated') ) return false;
-                               var level = ( $levelHolder.attr( 'data-level' ) > 0 ) ? $levelHolder.attr( 'data-level' ) - 1 : undefined;
-                               if( emd.type == 'touchmove' && instance.settings.swipe != 'desktop' ) {
-                                       stopEventPropagation( emd );
-                                       emd = ( emd.touches ) ? emd : emd.originalEvent;
-                                       if( !emd.touches || emd.touches.length <= 0 ) return false;
-                                       var touch = emd.touches[0];
-                                       instance.settings.container.unbind( 'touchend' );
-                                       instance.settings.container.bind( 'touchend' , function( emm ) {
-                                               stopEventPropagation( emm );
-                                               $levelHolder.significance = 0;
-                                               $levelHolder.swipeStart = 0;
-                                               instance.settings.container.unbind( 'touchend' );
-                                       });
-                                       if ( $levelHolder.swipeStart != undefined && $levelHolder.swipeStart != 0 ) {
-                                               $levelHolder.significance = touch.pageX - $levelHolder.swipeStart;
-                                       }
-                                       else {
-                                               $levelHolder.significance = 0;
-                                               $levelHolder.swipeStart = touch.pageX;
-                                               return true;
-                                       }
-                                       if( Math.abs( $levelHolder.significance ) > instance.settings.overlapWidth*.3 ) {
-                                               if( instance.settings.direction == 'rtl' ) $levelHolder.significance *= ( -1 );
-                                               ( $levelHolder.significance > 0 ) ? expandMenu( ( level == undefined ) ? level : $levelHolder ) : collapseMenu( level );
-                                               $levelHolder.significance = 0;
-                                               $levelHolder.swipeStart = 0;
-                                       }
-                               }
-                               else if( instance.settings.swipe != 'touchscreen' ) {
-                                       stopEventPropagation( emd );
-                                       var significance = 0;
-                                       $levelHolder.unbind( 'mousemove' );
-                                       $levelHolder.bind( 'mousemove' ,  function( emm ){
-                                               significance = emm.clientX - emd.clientX;
-                                               if( Math.abs( significance ) > instance.settings.overlapWidth*.3 ) {
-                                                       $levelHolder.unbind( 'mousemove' );
-                                                       if( instance.settings.direction == 'rtl' ) significance *= ( -1 );
-                                                       ( significance > 0 ) ? expandMenu( ( level == undefined ) ? level : $levelHolder ) : collapseMenu( level );
-                                                       return true;
-                                               }
-                                       });
-                                       instance.settings.container.unbind( 'mouseup' );
-                                       instance.settings.container.bind( 'mouseup' ,  function(e){
-                                               stopEventPropagation( e );
-                                               $levelHolder.unbind( 'mousemove' );
-                                               instance.settings.container.unbind( 'mouseup' );
-                                       });
-                               }
-                       }
-
-                       // Returns visible level holders
-                       function visibleLevelHolders() {
-                               var $visibleLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               var retObjs = ( instance.settings.direction == 'rtl' ) ?
-                                                       ( parseInt( $( this ).css( 'margin-right' ) ) >= 0 && $( this ).position().left < instance.settings.container.width() - instance.settings.overlapWidth )
-                                                       :
-                                                       ( parseInt( $( this ).css( 'margin-left' ) ) >= 0 && $( this ).position().left >= 0 );
-                                               return retObjs;
-                                       });
-                               if( $visibleLevelHolders.length < 1 ) $visibleLevelHolders = false;
-                               return $visibleLevelHolders;
-                       }
-
-                       // Returns hidden level holders
-                       function hiddenLevelHolders() {
-                               var $hiddenLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               var retObjs = ( instance.settings.direction == 'rtl' ) ?
-                                                       ( ( $( this ).position().left > instance.settings.container.width() || parseInt( $( this ).css( 'margin-right' ) ) < 0 ) )
-                                                       :
-                                                       ( ( $( this ).position().left < 0 || parseInt( $( this ).css( 'margin-left' ) ) < 0 ) );
-                                               return retObjs;
-                                       });
-                               if( $hiddenLevelHolders.length < 1 ) $hiddenLevelHolders = false;
-                               return $hiddenLevelHolders;
-                       }
-
-                       // Sizing DOM elements per creation/update
-                       function sizeDOMelements() {
-                               if( !instance.redraw ) {
-                                       instance.redraw = true;
-                                       var forceWidth = arguments[0],
-                                               forceHeight = arguments[1],
-                                               filter = arguments[2],
-                                               ieShadowFilterDistortion = ($('#' + instance.settings.menuID + ' div.levelHolderClass').first().css('filter').match(/DXImageTransform\.Microsoft\.Shadow/)) ? $('#' + instance.settings.menuID + ' div.levelHolderClass').first().get(0).filters.item("DXImageTransform.Microsoft.Shadow").strength : 0,
-                                               maxWidth = ( forceWidth == undefined ) ? Math.max.apply( null,
-                                               $('#' + instance.settings.menuID + ' div.levelHolderClass').map(function(){ return $(this).width(); }).get() ) - ieShadowFilterDistortion : forceWidth - ieShadowFilterDistortion,
-                                               maxLevel = Math.max.apply( null,
-                                               $('#' + instance.settings.menuID + ' div.levelHolderClass').map(function(){ return $(this).attr( 'data-level' ); }).get() ),
-                                               extWidth = ( isValidDim( instance.settings.menuWidth ) || ( isInt( instance.settings.menuWidth ) && instance.settings.menuWidth > 0 ) ),
-                                               extHeight = ( isValidDim( instance.settings.menuHeight ) || ( isInt( instance.settings.menuHeight ) && instance.settings.menuHeight > 0 ) ),
-                                               $objects = ( filter == undefined ) ? $('#' + instance.settings.menuID + ' div.levelHolderClass' ) : filter,
-                                               currWidth;
-                                       if ( !extWidth && instance.menuWidth != undefined ) maxWidth = instance.menuWidth;
-                                       ( extWidth && forceWidth == undefined ) ? $objects.width(instance.settings.menuWidth) : $objects.width( maxWidth );
-                                       if( extWidth ){
-                                               if( ( $objects.width() == 0 || ( isValidDim( instance.settings.menuWidth ) && instance.settings.menuWidth.indexOf( '%' ) != -1 ) ) && forceWidth == undefined ) {
-                                                       $objects.css( 'min-width' , '' );
-                                                       $objects.width( parseInt( instance.settings.container.parent().width() * parseInt( instance.settings.menuWidth )/100 ) )
-                                               };
-                                               maxWidth = $objects.width() - ieShadowFilterDistortion;
-                                               $objects.css( 'min-width' , $objects.width() - ieShadowFilterDistortion + 'px' );
-                                       }
-                                       var maxExtWidth = ( extWidth && forceWidth == undefined ) ? ( $objects.width() - ieShadowFilterDistortion + maxLevel * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) ) : ( maxWidth + maxLevel * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) ),
-                                               maxHeight = ( forceHeight == undefined ) ? Math.max.apply( null,
-                                               $('#' + instance.settings.menuID + ' div.levelHolderClass').map(function(){ return $(this).height(); }).get() ) : forceHeight;
-
-                                       instance.settings.container.css( 'min-height' , '' );
-                                       instance.settings.container.children( 'nav:first' ).css( 'min-height' , '' );
-                                       if( extHeight ) {
-                                               instance.settings.container.height( instance.settings.menuHeight );
-                                               instance.settings.container.css( 'min-height' , instance.settings.menuHeight );
-                                               instance.settings.container.children( 'nav:first' ).css( 'min-height' , instance.settings.menuHeight );
-                                               $('#' + instance.settings.menuID).height(instance.settings.menuHeight);
-                                               maxHeight = instance.settings.container.height();
-                                       }
-                                       else {
-                                               $('#' + instance.settings.menuID).height( maxHeight );
-                                       }
-                                       instance.settings.container.css( 'min-height' , maxHeight + 'px' );
-                                       instance.settings.container.children( 'nav:first' ).css( 'min-height' , maxHeight + 'px' );
-                                       instance.settings.container.width( maxExtWidth );
-                                       instance.settings.container.height( maxHeight );
-                                       var $baseLevelHolder = $('#' + instance.settings.menuID + ' div.levelHolderClass:first'),
-                                               $visibleLevelHolders = visibleLevelHolders(),
-                                               $hiddenLevelHolders = hiddenLevelHolders(),
-                                               $activeLevelHolder = activeMenu(),
-                                               activeLevel = ( $activeLevelHolder.length == 1 ) ? $activeLevelHolder.attr( 'data-level' ) : 0;
-                                       if( $visibleLevelHolders )
-                                               $visibleLevelHolders.each(function(){
-                                                       if ( instance.settings.mode == 'overlap' )
-                                                               $( this ).width( $( this ).width() + ( parseInt( activeLevel , 10) - parseInt( $( this ).attr( 'data-level' ) , 10) ) * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) );
-                                               });
-                                       if( $hiddenLevelHolders )
-                                               $hiddenLevelHolders.each(function(){
-                                               ( instance.settings.direction == 'rtl' ) ?
-                                                       $( this ).css( 'margin-right' , ( $( this ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && !instance.settings.fullCollapse ) ? $( this ).width() * (-1) + instance.settings.overlapWidth : $( this ).width() * (-2) )
-                                                       :
-                                                       $( this ).css( 'margin-left' , ( $( this ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && !instance.settings.fullCollapse ) ? $( this ).width() * (-1) + instance.settings.overlapWidth : $( this ).width() * (-2) );
-                                               });
-                                       currWidth = $baseLevelHolder.width() + parseInt( $baseLevelHolder.css( ( instance.settings.direction == 'rtl' ) ? 'margin-right' : 'margin-left' ) , 10 );
-                                       sizeElementWidth( instance.settings.container , currWidth );
-                                       instance.menuWidth = maxWidth;
-                                       instance.menuHeight = maxHeight;
-                                       instance.redraw = false;
-                               }
-                       }
-                       
-                       // Simple/singe DOM element width sizing 
-                       function sizeElementWidth( $element , size ) {
-                               if( $element == undefined || size == undefined ) return false;
-                               $element.css( 'min-width' , '' );
-                               $element.css( 'min-width' , size + 'px' );
-                               $element.children( 'nav:first' ).css( 'min-width' , '' );
-                               $element.children( 'nav:first' ).css( 'min-width' , size + 'px' );
-                               $element.width( size );
-                       }
-
-                       // Hide wrappers in browsers that
-                       // does not understand negative margin in %
-                       // before DOM element got its dimensions
-                       function fixLazyBrowsers() {
-                               var $baseLevelHolder = $('#' + instance.settings.menuID + ' div.levelHolderClass:first'),
-                               $hiddenLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               var retObjs = ( instance.settings.direction == 'rtl' ) ?
-                                                       ( ( $( this ).position().left > instance.settings.container.width() || parseInt( $( this ).css( 'margin-right' ) ) < 0 ) && $( this ).attr( 'data-level' ) > $baseLevelHolder.attr( 'data-level' ) )
-                                                       :
-                                                       ( ( $( this ).position().left < 0 || parseInt( $( this ).css( 'margin-left' ) ) < 0 ) && $( this ).attr( 'data-level' ) > $baseLevelHolder.attr( 'data-level' ) );
-                                               return retObjs;
-                                       });
-                               $hiddenLevelHolders.each(function(){
-                                       if( instance.settings.direction == 'rtl' ){
-                                               $( this ).css( 'margin-right' , ( ( $( this ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && !instance.settings.collapsed ) ? 0 : (-2) * $( this ).width() ) )
-                                       }
-                                       else {
-                                               $( this ).css( 'margin-left' , ( ( $( this ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && !instance.settings.collapsed ) ? 0 : (-2) * $( this ).width() ) );
-                                       }
-                               });
-                               if( instance.settings.direction == 'rtl' ){
-                                       $baseLevelHolder.css( 'margin-right' , ( !instance.settings.collapsed ) ? 0 : (-2) * $baseLevelHolder.width() )
-                               }
-                               else {
-                                       $baseLevelHolder.css( 'margin-left' , ( !instance.settings.collapsed ) ? 0 : (-2) * $baseLevelHolder.width() );
-                               }
-                       }
-
-                       // Is integer
-                       function isInt( n ) {
-                               return typeof n === 'number' && parseFloat( n ) == parseInt( n, 10 ) && !isNaN( n );
-                       }
-
-                       // Is Valid CSS dimension
-                       function isValidDim( s ) {
-                               return typeof s === 'string' && ( s.indexOf( '%' ) != -1 || s.indexOf( 'px' ) != -1 || s.indexOf( 'em' ) != -1 );
-                       }
-
-                       // Initialize menu level push menu
-                       function initialize(){
-                               var execute = ( options && options.menu != undefined ) ? createDOMStructure() : updateDOMStructure();
-                               propagateEvent( instance.settings.container , clickEventType );
-                               sizeDOMelements();
-                               fixLazyBrowsers();
-                               startMode( instance.settings.collapsed );
-                               instance.settings.onMenuReady.apply(this, Array.prototype.slice.call([instance.settings]));
-                               return $this;
-                       }
-
-                       // Initialize menu in collapsed/expanded mode 
-                       function startMode( mode ) {
-                               if( mode ) {
-                                       var $baseLevelHolder = $('#' + instance.settings.menuID + ' div.levelHolderClass:first');
-                                       $baseLevelHolder.find( 'ul' ).hide();
-                                       $baseLevelHolder.addClass( instance.settings.menuInactiveClass );
-                                       if( instance.settings.direction == 'rtl' ) {
-                                               $baseLevelHolder.stop().animate({
-                                                       marginRight: ( ( -1 ) * $baseLevelHolder.width() + ( ( instance.settings.fullCollapse ) ? 0 : instance.settings.overlapWidth ) )
-                                               }, instance.settings.durationSlideOut)
-                                       }
-                                       else {
-                                               $baseLevelHolder.stop().animate({
-                                                       marginLeft:  ( ( -1 ) * $baseLevelHolder.width() + ( ( instance.settings.fullCollapse ) ? 0 : instance.settings.overlapWidth ) )
-                                               }, instance.settings.durationSlideOut);
-                                       }
-                               }
-                       }
-
-                       // Push container(s) of choice
-                       function pushContainers( absMove ) {
-                               if( instance.settings.containersToPush == null ) return false;
-                               $.each( instance.settings.containersToPush, function() {
-                                       var lMr = parseInt( $( this ).css( 'margin-left' ) ),
-                                               lM = isInt( lMr ) ? lMr : 0,
-                                               rMr = parseInt( $( this ).css( 'margin-right' ) ),
-                                               rM = isInt( rMr ) ? rMr : 0;
-                                       $( this ).stop().animate({
-                                               marginLeft:  lM + ( ( instance.settings.direction == 'rtl' ) ? (-1) : 1 ) * absMove,
-                                               marginRight: rM + ( ( instance.settings.direction == 'rtl' ) ? 1 : (-1) ) * absMove
-                                       }, instance.settings.durationSlideOut);
-                               });
-                       }
-
-                       // Collapse menu
-                       function collapseMenu() {
-                               if( $(instance).find( 'div.levelHolderClass' ).is(':animated') ) return false;
-                               instance.settings.onCollapseMenuStart.apply(this, Array.prototype.slice.call([instance.settings]));
-                               var level = arguments[0],
-                                       callbacks = arguments[1],
-                                       collapingObjects = {},
-                                       ieShadowFilterDistortion,lwidth, lpush, lMarginLeft, lMarginLeftFC,
-                                       $baseLevelHolder = $('#' + instance.settings.menuID + ' div.levelHolderClass:first'),
-                                       collapseAll = ( level == undefined ) ? true : false,
-                                       currWidth;
-                               collapingObjects[ 'collapsingEnded' ] = false;
-                               if( typeof level == 'object' ) {
-                                       level = level.attr( 'data-level' );
-                               }
-                               else if( typeof level == 'string' ){
-                                       var $selectedLevelHolder = findMenusByTitle( level );
-                                       if( $selectedLevelHolder && $selectedLevelHolder.length == 1 ) {
-                                               level = $selectedLevelHolder.attr( 'data-level' );
-                                       }
-                                       else {
-                                               level = $baseLevelHolder.attr( 'data-level' );
-                                       }
-                               }
-                               else if( level == undefined || !isInt( level ) || level < 0 ) {
-                                       level = $baseLevelHolder.attr( 'data-level' );
-                               }
-                               if( callbacks == undefined && typeof callbacks != 'object' ) {
-                                       callbacks = [ { 'method' : instance.settings.onCollapseMenuEnd, 'args' : [instance.settings] } ];
-                               } else {
-                                       $.merge(callbacks, [ { 'method' : instance.settings.onCollapseMenuEnd, 'args' : [instance.settings] } ]);
-                               }
-                               var $nextLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               var retObjs = ( instance.settings.direction == 'rtl' ) ? 
-                                               ($( this ).attr( 'data-level' ) > level) && (parseInt( $( this ).css( 'margin-right' ) ) >= 0 && $( this ).position().left < instance.settings.container.width() - instance.settings.overlapWidth )
-                                               :
-                                               ($( this ).attr( 'data-level' ) > level) && (parseInt( $( this ).css( 'margin-left' ) ) >= 0 && $( this ).position().left >= 0 );
-                                               return retObjs;
-                                       }),
-                                       $prevLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               var retObjs = ( instance.settings.direction == 'rtl' ) ? 
-                                               ($( this ).attr( 'data-level' ) <= level) && (parseInt( $( this ).css( 'margin-right' ) ) >= 0 && $( this ).position().left < instance.settings.container.width() - instance.settings.overlapWidth )
-                                               :
-                                               ($( this ).attr( 'data-level' ) <= level) && (parseInt( $( this ).css( 'margin-left' ) ) >= 0 && $( this ).position().left >= 0 );
-                                               return retObjs;
-                                       });
-                               if( $prevLevelHolders.length > 0 ) {
-                                       collapingObjects[ 'prevAnimEnded' ] = false;
-                                       $nextLevelHolders.each(function( key, val ){
-                                               ieShadowFilterDistortion = ($( val ).css('filter').match(/DXImageTransform\.Microsoft\.Shadow/)) ? $( val ).get(0).filters.item("DXImageTransform.Microsoft.Shadow").strength : 0;
-                                               lwidth = ( instance.settings.mode == 'overlap' ) ? $( val ).width() - ( $nextLevelHolders.length + $prevLevelHolders.length - $( val ).attr( 'data-level' ) - 1) * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) - ieShadowFilterDistortion : $( val ).width() - ieShadowFilterDistortion
-                                               if( instance.settings.direction == 'rtl' ) {
-                                                       $( val ).stop().animate({
-                                                               marginRight : ( (-1) * lwidth ),
-                                                               width: lwidth
-                                                       }, instance.settings.durationTransition);
-                                               }
-                                               else {
-                                                       $( val ).stop().animate({
-                                                               marginLeft : ( (-1) * lwidth ),
-                                                               width: lwidth
-                                                       }, instance.settings.durationTransition);
-                                               }
-                                       });
-                                       collapingObjects[ 'nextAnimEnded' ] = ( $nextLevelHolders.length > 0 ) ? false : true ;
-                                       $nextLevelHolders.last().queue(function(){
-                                               collapingObjects[ 'nextAnimEnded' ] = true;
-                                               animatedEventCallback( collapingObjects , callbacks );
-                                       });
-                                       $prevLevelHolders.each(function( key, val ){
-                                               ieShadowFilterDistortion = ($( val ).css('filter').match(/DXImageTransform\.Microsoft\.Shadow/)) ? $( val ).get(0).filters.item("DXImageTransform.Microsoft.Shadow").strength : 0;
-                                               var $makeLevelHolderVisible = $prevLevelHolders.filter(function(){
-                                                       return $( this ).attr( 'data-level' ) == level;
-                                               });
-                                               $makeLevelHolderVisible.css( 'visibility' , 'visible' );
-                                               $makeLevelHolderVisible.find( '.' + instance.settings.backItemClass ).css( 'visibility' , 'visible' );
-                                               $makeLevelHolderVisible.find( 'ul' ).css( 'visibility' , 'visible' );
-                                               $makeLevelHolderVisible.removeClass( instance.settings.menuInactiveClass );
-                                               lwidth = ( instance.settings.mode == 'overlap' ) ? $( val ).width() - $nextLevelHolders.length * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) - ieShadowFilterDistortion : $( val ).width() - ieShadowFilterDistortion;
-                                               if( instance.settings.direction == 'rtl' ) {
-                                                       $( val ).stop().animate({
-                                                               width: lwidth,
-                                                               marginRight : ( $( val ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && collapseAll ) ?
-                                                                       ( instance.settings.fullCollapse ) ?
-                                                                               ( -1 ) * $( val ).width()
-                                                                               :
-                                                                               ( ( -1 ) * $( val ).width() + ( ( instance.settings.mode == 'overlap' ) ? $nextLevelHolders.length + 1 : 1 ) * instance.settings.overlapWidth )
-                                                                       :
-                                                                       0
-                                                       }, instance.settings.durationSlideOut, function(){
-                                                               if( $( val ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && collapseAll ){
-                                                                       $baseLevelHolder.children( 'ul' ).first().hide(instance.settings.durationSlideDown, function(){
-                                                                               $baseLevelHolder.addClass( instance.settings.menuInactiveClass );
-                                                                       });
-                                                               }
-                                                               currWidth = $baseLevelHolder.width() + parseInt( $baseLevelHolder.css( 'margin-right' ) , 10 );
-                                                               sizeElementWidth( instance.settings.container , currWidth );
-                                                       });
-                                               }
-                                               else {
-                                                       $( val ).stop().animate({
-                                                               width: lwidth,
-                                                               marginLeft : ( $( val ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && collapseAll ) ?
-                                                                       ( instance.settings.fullCollapse ) ?
-                                                                               ( -1 ) * $( val ).width()
-                                                                               :
-                                                                               ( ( -1 ) * $( val ).width() + ( ( instance.settings.mode == 'overlap' ) ? $nextLevelHolders.length + 1 : 1 ) * instance.settings.overlapWidth )
-                                                                       :
-                                                                       0
-                                                       }, instance.settings.durationSlideOut, function(){
-                                                               if( $( val ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && collapseAll ){
-                                                                       $baseLevelHolder.children( 'ul' ).first().hide(instance.settings.durationSlideDown, function(){
-                                                                               $baseLevelHolder.addClass( instance.settings.menuInactiveClass );
-                                                                       });
-                                                               }
-                                                               currWidth = $baseLevelHolder.width() + parseInt( $baseLevelHolder.css( 'margin-left' ) , 10 );
-                                                               sizeElementWidth( instance.settings.container , currWidth );
-                                                       });
-                                               }
-                                               lpush = ( instance.settings.mode == 'overlap' ) ? ( (-1) * ( $nextLevelHolders.length * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) ) ) : 0 ;
-                                               if( $( val ).attr( 'data-level' ) == $baseLevelHolder.attr( 'data-level' ) && collapseAll ){
-                                                       var blpush = ( instance.settings.fullCollapse ) ? ( -1 ) * ( $baseLevelHolder.width() - ieShadowFilterDistortion ) : ( -1 ) * ( $baseLevelHolder.width() - ieShadowFilterDistortion ) + instance.settings.overlapWidth;
-                                                       pushContainers( blpush );
-                                               }
-                                               else {
-                                                       pushContainers( lpush );
-                                               }
-                                       });
-                                       $prevLevelHolders.last().queue(function(){
-                                               collapingObjects[ 'prevAnimEnded' ] = true;
-                                               animatedEventCallback( collapingObjects , callbacks );
-                                       });
-                               }
-                               collapingObjects[ 'collapsingEnded' ] = true;
-                               animatedEventCallback( collapingObjects , callbacks );
-                               return $this;
-                       }
-
-                       // Expand Menu helper
-                       function expandMenuActions() {
-                               if( $(instance).find( 'div.levelHolderClass' ).is(':animated') ) return false;
-                               instance.settings.onExpandMenuStart.apply(this, Array.prototype.slice.call([instance.settings]));
-                               var menuTitle = arguments[0],
-                                       callbacks = arguments[1],
-                                       ieShadowFilterDistortion, lwidth, lpush, blpush, currWidth,
-                                       expandingObjects = {},
-                                       $baseLevelHolder = $('#' + instance.settings.menuID + ' div.levelHolderClass:first'),
-                                       baseExpand = ( menuTitle == undefined ) ? true : false,
-                                       baseLevelHolderCollapsed = ( instance.settings.direction == 'rtl' ) ?
-                                               parseInt( $baseLevelHolder.css( 'margin-right' ), 10 ) < 0 || $baseLevelHolder.position().left >= instance.settings.container.width() - instance.settings.overlapWidth
-                                               :
-                                               parseInt( $baseLevelHolder.css( 'margin-left' ), 10 ) < 0 || $baseLevelHolder.position().left < 0;
-                               expandingObjects[ 'expandingEnded' ] = false;
-                               if( callbacks == undefined && typeof callbacks != 'object' ) {
-                                       callbacks = [ { 'method' : instance.settings.onExpandMenuEnd, 'args' : [instance.settings] } ];
-                               } else {
-                                       $.merge(callbacks, [ { 'method' : instance.settings.onExpandMenuEnd, 'args' : [instance.settings] } ]);
-                               }
-                               if( baseExpand ) {
-                                       expandingObjects[ 'baseAnimEnded' ] = false;
-                                       $baseLevelHolder.removeClass( instance.settings.menuInactiveClass );
-                                       currWidth = $baseLevelHolder.width();
-                                       sizeElementWidth( instance.settings.container , currWidth );
-                                       if( instance.settings.direction == 'rtl' ) {
-                                               $baseLevelHolder.stop().animate({
-                                                       marginRight: 0
-                                               }, instance.settings.durationSlideOut, function(){
-                                                       $baseLevelHolder.children( 'ul' ).first().show(instance.settings.durationSlideDown , function(){
-                                                               expandingObjects[ 'baseAnimEnded' ] = true;
-                                                               animatedEventCallback( expandingObjects , callbacks );
-                                                       });
-                                               });
-                                       }
-                                       else {
-                                               $baseLevelHolder.stop().animate({
-                                                       marginLeft: 0
-                                               }, instance.settings.durationSlideOut, function(){
-                                                       $baseLevelHolder.children( 'ul' ).first().show(instance.settings.durationSlideDown , function(){
-                                                               expandingObjects[ 'baseAnimEnded' ] = true;
-                                                               animatedEventCallback( expandingObjects , callbacks );
-                                                       });
-                                               });
-                                       }
-                                       blpush = ( instance.settings.fullCollapse ) ? $baseLevelHolder.width() : $baseLevelHolder.width() - instance.settings.overlapWidth;
-                                       var pushbm = ( !menuExpanded( $baseLevelHolder ) ) ? pushContainers( blpush ) : null;
-                               } else {
-                                       var $selectedLevelHolder;
-                                       if( typeof menuTitle == 'object' ) {
-                                               $selectedLevelHolder = menuTitle;
-                                       }
-                                       else if( typeof menuTitle == 'string' ){
-                                               $selectedLevelHolder = findMenusByTitle( menuTitle );
-                                       }
-                                       else {
-                                               $selectedLevelHolder = null;
-                                               $.error( 'Provided menu selector is not valid' );
-                                       }
-                                       if( $selectedLevelHolder && $selectedLevelHolder.length == 1 ) {
-                                               var $activeLevelHolder = activeMenu(),
-                                                       activeLevel = ( $activeLevelHolder.length == 1 ) ? $activeLevelHolder.attr( 'data-level' ) : 0,
-                                                       baseWidth = $selectedLevelHolder.width(),
-                                                       setToOpenHolders = pathToRoot( $selectedLevelHolder );
-                                               expandingObjects[ 'setToOpenAnimEnded' ] = false;
-                                               if( setToOpenHolders ) {
-                                                       var parentLevelHoldersLen = $( setToOpenHolders ).length - 1;
-                                                       $baseLevelHolder.find( 'ul' ).each(function(){
-                                                               $( this ).show(0);
-                                                       });
-                                                       $( setToOpenHolders ).find( 'ul' ).css( 'visibility' , 'hidden' );
-                                                       $( setToOpenHolders ).find( 'div' ).css( 'visibility' , 'visible' );
-                                                       $( setToOpenHolders ).find( '.' + instance.settings.backItemClass ).css( 'visibility' , 'hidden' );
-                                                       $( setToOpenHolders ).each( function( key, val ) {
-                                                               ieShadowFilterDistortion = ($( val ).css('filter').match(/DXImageTransform\.Microsoft\.Shadow/)) ? $( val ).get(0).filters.item("DXImageTransform.Microsoft.Shadow").strength : 0;
-                                                               lwidth = baseWidth - ieShadowFilterDistortion + ( parentLevelHoldersLen - $( val ).attr( 'data-level' ) ) * ( instance.settings.overlapWidth + ieShadowFilterDistortion );
-                                                               if(instance.settings.container.width() < lwidth && instance.settings.mode == 'overlap' )
-                                                                       sizeElementWidth( instance.settings.container , lwidth );
-                                                               if( instance.settings.direction == 'rtl' ) {
-                                                                       $( val ).stop().animate({
-                                                                               marginRight: 0,
-                                                                               width: ( instance.settings.mode == 'overlap' ) ? lwidth : baseWidth - ieShadowFilterDistortion
-                                                                       }, instance.settings.durationTransition, function(){
-                                                                               $( val ).addClass( instance.settings.menuInactiveClass );
-                                                                       });
-                                                               }
-                                                               else {
-                                                                       $( val ).stop().animate({
-                                                                               marginLeft: 0,
-                                                                               width: ( instance.settings.mode == 'overlap' ) ? lwidth : baseWidth - ieShadowFilterDistortion
-                                                                       }, instance.settings.durationTransition, function(){
-                                                                               $( val ).addClass( instance.settings.menuInactiveClass );
-                                                                       });
-                                                               }
-                                                       });
-                                                       $( setToOpenHolders ).last().queue(function(){
-                                                               $( this ).removeClass( instance.settings.menuInactiveClass );
-                                                               expandingObjects[ 'setToOpenAnimEnded' ] = true;
-                                                               animatedEventCallback( expandingObjects , callbacks );
-                                                       });
-                                                       if( baseLevelHolderCollapsed ) {
-                                                               blpush = ( instance.settings.fullCollapse ) ? $baseLevelHolder.width() : ( $baseLevelHolder.width() - instance.settings.overlapWidth );
-                                                               pushContainers( blpush );
-                                                       }
-                                                       if( instance.settings.mode == 'overlap' ){
-                                                               lpush = ( ( baseLevelHolderCollapsed ) ? ( baseWidth + ( parentLevelHoldersLen -  ( ( instance.settings.fullCollapse ) ? 0 : 1 ) ) * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) ) : ( ( parentLevelHoldersLen - activeLevel ) * ( instance.settings.overlapWidth + ieShadowFilterDistortion ) ) );
-                                                               pushContainers( lpush );
-                                                       }
-                                                       $selectedLevelHolder.css( 'visibility' , 'visible' );
-                                                       $selectedLevelHolder.find( '.' + instance.settings.backItemClass ).css( 'visibility' , 'visible' );
-                                                       $selectedLevelHolder.find( 'ul' ).css( 'visibility' , 'visible' );
-                                                       $selectedLevelHolder.removeClass( instance.settings.menuInactiveClass );
-                                               }
-                                               else {
-                                                       $.error( 'Invalid menu object provided' );
-                                               }
-                                       }
-                                       else {
-                                               $.error( 'No or too many menus named ' + menuTitle );
-                                       }
-                               }
-                               expandingObjects[ 'expandingEnded' ] = true;
-                               animatedEventCallback( expandingObjects , callbacks );
-                       }
-
-                       // Expand menu
-                       function expandMenu() {
-                               var menu = arguments[0],
-                                       $expandLevelHolder,
-                                       $activeLevelHolder = activeMenu(),
-                                       $sharedLevelHolders, collapseLevel, $searchRes;
-                               if( typeof menu == 'object' ) {
-                                       $expandLevelHolder = menu;
-                               }
-                               else if( typeof menu == 'string' ){
-                                       $searchRes = findMenusByTitle( menu );
-                                       if($searchRes) {
-                                               $expandLevelHolder = $searchRes.eq( 0 );
-                                       }
-                                       else {
-                                               $.error( menu + ' menu level does not exist!' );
-                                       }
-                               }
-                               else {
-                                       $expandLevelHolder = $('#' + instance.settings.menuID + ' div.levelHolderClass:first');
-                               }
-                               $sharedLevelHolders = comparePaths( $expandLevelHolder , $activeLevelHolder, true );
-                               collapseLevel = ( $sharedLevelHolders.length > 0 ) ? Math.max.apply( null,
-                                       $sharedLevelHolders.map(function(){ return $(this).attr( 'data-level' ); }).get() ) : 0;
-                               if( collapseLevel < $activeLevelHolder.attr( 'data-level' ) ) {
-                                       collapseMenu( collapseLevel , [ { 'method' : expandMenuActions, 'args' : arguments } ] );
-                               }
-                               else {
-                                       expandMenuActions.apply( this, Array.prototype.slice.call( arguments ) );
-                               }
-                               return $this;
-                       }
-
-                       // Find menu(s) by Title text
-                       function findMenusByTitle() {
-                               var menuTitle = arguments[0],
-                                       response,
-                                       $selectedLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               return ( ($( this ).children( 'h2' ).text() == menuTitle ) );
-                                       });
-                               if( $selectedLevelHolders.length > 0 ) {
-                                       returnValue = $selectedLevelHolders;
-                                       response = returnValue;
-                               }
-                               else {
-                                       returnValue = false;
-                                       response = returnValue;
-                               }
-                               return response;
-                       }
-
-                       // Find item(s) by Name
-                       function findItemsByName() {
-                               var itemName = arguments[0],
-                                       response,
-                                       $selectedItems = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass li' )
-                                       .filter(function(){
-                                               return ( ($( this ).children( 'a' ).text() == itemName ) );
-                                       });
-                               if( $selectedItems.length > 0 ) {
-                                       returnValue = $selectedItems;
-                                       response = returnValue;
-                               }
-                               else {
-                                       returnValue = false;
-                                       response = returnValue;
-                               }
-                               return response;
-                       }
-
-                       // Find pathToRoot for provided menu
-                       function pathToRoot() {
-                               var $selectedLevelHolder = arguments[0],
-                                       $parentLevelHolders, setToOpenHolders, response;
-                               if( $selectedLevelHolder == undefined || $selectedLevelHolder.length != 1 ) {
-                                       returnValue = false;
-                                       return returnValue;
-                               };
-                               $parentLevelHolders = $selectedLevelHolder.parents( 'div.levelHolderClass' );
-                               setToOpenHolders = $.merge( $parentLevelHolders.get().reverse(), $selectedLevelHolder.get() );
-                               returnValue = setToOpenHolders;
-                               return returnValue;
-                       }
-
-                       // Finds the same part of the path to root of two provided menus 
-                       function comparePaths() {
-                               var $levelHolder0 = arguments[0],
-                                       $levelHolder1 = arguments[1],
-                                       mode = ( arguments[2] != undefined ) ? arguments[2] : false,
-                                       $parentLevelHolders0, $parentLevelHolders1, setParents0, setParents1, lPath, sPath, comparePath, response;
-                               if( $levelHolder0 == undefined || $levelHolder1 == undefined ) {
-                                       returnValue = false;
-                                       return returnValue;
-                               };
-                               $parentLevelHolders0 = ( $levelHolder0.length == 1 ) ? $levelHolder0.parents( 'div.levelHolderClass' ) : null;
-                               $parentLevelHolders1 = ( $levelHolder1.length == 1 ) ? $levelHolder1.parents( 'div.levelHolderClass' ) : null;
-                               setParents0 = ( $parentLevelHolders0 != null ) ? $.merge( $parentLevelHolders0.get().reverse(), $levelHolder0.get() ) : [];
-                               setParents1 = ( $parentLevelHolders1 != null ) ? $.merge( $parentLevelHolders1.get().reverse(), $levelHolder1.get() ) : [];
-                               lPath = ( setParents0.length >= setParents1.length  ) ? setParents0 : setParents1;
-                               sPath = ( lPath === setParents0  ) ? setParents1 : setParents0;
-                               comparePath = $( lPath ).filter(function() {
-                                       return ( mode ) ? ( $.inArray( this, sPath ) != -1 ) : ( $.inArray( this, sPath ) == -1 );
-                               });
-                               returnValue = comparePath;
-                               return returnValue;
-                       }
-
-                       // Active menu
-                       function activeMenu() {
-                               var $activeLevelHolders = instance.settings.container
-                                       .find( '#' + instance.settings.menuID + ' div.levelHolderClass' )
-                                       .filter(function(){
-                                               var retObjs = ( instance.settings.direction == 'rtl' ) ?
-                                                       ((parseInt( $( this ).css( 'margin-right' ) ) >= 0 && $( this ).position().left < instance.settings.container.width() - instance.settings.overlapWidth ) )
-                                                       :
-                                                       ((parseInt( $( this ).css( 'margin-left' ) ) >= 0 && $( this ).position().left >= 0 ) );
-                                               return retObjs;
-                                       }),
-                                       maxLevel = Math.max.apply( null,
-                                       $activeLevelHolders.map(function(){ return $(this).attr( 'data-level' ); }).get() ),
-                                       $activeLevelHolder = $activeLevelHolders.filter(function(){
-                                               return $( this ).attr( 'data-level' ) == maxLevel;
-                                       });
-                               returnValue = $activeLevelHolder;
-                               return returnValue;
-                       }
-
-                       // Menu expanded
-                       function menuExpanded() {
-                               var $levelHolder = arguments[0],
-                                       returnValue = false;
-                               if( $levelHolder == undefined ) return returnValue;
-
-                               var check = ( instance.settings.direction == 'rtl' ) ?
-                                       ( parseInt( $levelHolder.css( 'margin-right' ) ) >= 0 && $levelHolder.position().left < instance.settings.container.width() - instance.settings.overlapWidth )
-                                       :
-                                       ( parseInt( $levelHolder.css( 'margin-left' ) ) >= 0 && $levelHolder.position().left >= 0 );
-                               return check;
-                       }
-
-                       // Add item(s)
-                       function addItems() {
-                               var items = arguments[0],
-                                       $levelHolder = arguments[1],
-                                       position = arguments[2];
-                               if( $levelHolder == undefined || typeof items != 'object' || !$levelHolder ) return false;
-                               if( items.level == undefined ) items.level = parseInt( $levelHolder.attr( 'data-level' ) , 10 );
-                               if( position == undefined ) position = 0;
-                               var $itemGroup = $levelHolder.find( 'ul:first' );
-                               $.each(items, function() {
-                                       if( this.name != undefined )
-                                               createItem( this, $levelHolder, position );
-                               });
-                               sizeDOMelements( instance.menuWidth );
-                               return $this;
-                       }
-
-                       // Remove item(s)
-                       function removeItems() {
-                               var $items = arguments[0];
-                               if( $items == undefined || typeof $items != 'object' || $items.length == 0 ) return false;
-                               $items.remove();
-                               var $activeMenu = activeMenu();
-                               if( $activeMenu.length == 1 ) {
-                                       $activeMenu.css( 'visibility' , 'visible' );
-                                       $activeMenu.find( '.' + instance.settings.backItemClass ).css( 'visibility' , 'visible' );
-                                       $activeMenu.find( 'ul' ).css( 'visibility' , 'visible' );
-                                       $activeMenu.removeClass( instance.settings.menuInactiveClass );
-                                       var widthDiff = $activeMenu.width() - instance.menuWidth;
-                                       if( widthDiff != 0 ) {
-                                               var $visibleLevelHolders = visibleLevelHolders();
-                                               if( $visibleLevelHolders )
-                                                       $visibleLevelHolders.each(function(){
-                                                               $( this ).width( $( this ).width() - widthDiff );
-                                                       });
-                                       }
-                               }
-                               sizeDOMelements( instance.menuWidth );
-                               return $this;
-                       }
-
-                       // Manage multiple animated events and associated callbacks
-                       function animatedEventCallback( animatedObjects, callbacks ) {
-                               var doCallBack = true;
-                               $.each( animatedObjects, function( key, val ){
-                                       doCallBack = doCallBack && val;
-                               });
-                               if( doCallBack )
-                                       window.setTimeout(function(){
-                                               $.each( callbacks, function( key, val ){
-                                                       val['method'].apply( this, Array.prototype.slice.call( val['args'] ) );
-                                               });
-                                       }, 1);
-                       }
-
-                       // Get/set settings options
-                       function manageOptions() {
-                               var response = false;
-                               if( instance.settings[arguments[0]] != undefined ) {
-                                       if( arguments[1] != undefined )
-                                               instance.settings[arguments[0]] = arguments[1];
-                                       response = instance.settings[arguments[0]];
-                               } else {
-                                       $.error('No option ' + arguments[0] + ' found in jQuery.multilevelpushmenu');
-                               }
-                               return response;
-                       }
-                       
-                       // Mobile check
-                       // http://coveroverflow.com/a/11381730/989439
-                       function mobileCheck() {
-                               var check = false;
-                               (function(a){if(/(android|ipad|playbook|silk|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check = true})(navigator.userAgent||navigator.vendor||window.opera);
-                               return check;
-                       }
-
-                       if( mobileCheck() ) {
-                               clickEventType = 'touchend';
-                               dragEventType = 'touchmove';
-                       }
-                       else {
-                               clickEventType = 'click';
-                               dragEventType = 'mousedown';
-                       }
-
-                       // Invoke called method or init
-                       if ( methods[options] ) {
-                               returnValue = methods[options].apply(this, Array.prototype.slice.call(args, 1));
-                               return returnValue;
-                       } else if (typeof options === 'object' || !options) {
-                               returnValue = methods.init.apply(this, arguments);
-                               return returnValue;
-                       } else {
-                               $.error('No ' + options + ' method found in jQuery.multilevelpushmenu');
-                       }
-
-                       // Return object instance or option value
-                       if (!returnValue) {
-                               returnValue = this;
-                       }
-               });
-               return returnValue;
-       }
-}( jQuery ));
index 83a15cf..7b7ddaf 100644 (file)
@@ -25,5 +25,5 @@ export const AMQPSchema = new SimpleSchema({
     type: String, 
     defaultValue: 'rabbitmquser'
   },
-  password: { type: String },
+  pwd: { type: String },
 });
index 1921432..97eab29 100644 (file)
@@ -19,7 +19,7 @@ export const MysqlSchema = new SimpleSchema({
     regEx: SimpleSchema.RegEx.IP,
     defaultValue: '10.0.0.1'
   },
-  password: { type: String },
+  pwd: { type: String },
   port: { 
     type: String,
     regEx: portRegEx,
index 22f8110..06cdea7 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { ValidatedMethod } from 'meteor/mdg:validated-method';
 import * as R from 'ramda';
 
index 66ae5d1..54d4565 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { Mongo } from 'meteor/mongo';
 import { SimpleSchema } from 'meteor/aldeed:simple-schema';
 import { Constants } from '/imports/api/constants/constants';
index 17ed990..4a6c508 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { check } from 'meteor/check';
 import * as R from 'ramda';
 import { ScheduledScans } from '../scheduled-scans';
index 97acc21..9359c20 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { Meteor } from 'meteor/meteor';
 import * as R from 'ramda';
 import { Counts } from 'meteor/tmeasday:publish-counts';
index 5846f46..fb8e582 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 export let imagesForNodeType = {
   'instance': 'ic_computer_black_48dp_2x.png',
   'pnic': 'ic_dns_black_48dp_2x.png',
index fb7350c..ca8489c 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 export const SET_ENV_NAME = 'SET_ENV_NAME';
index 08c48b6..297cb7c 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 export const ACTIVATE_GRAPH_TOOLTIP_WINDOW = 'ACTIVATE_GRAPH_TOOLTIP_WINDOW';
index 1daafa1..7d1a730 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 export const SET_MAIN_APP_SELECTED_ENVIRONMENT = 'SET_MAIN_APP_SELECTED_ENVIRONMENT';
index 06b1501..f9c86b5 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 const SET_CURRENT_NODE = 'SET_CURRENT_NODE';
index 1eb9b78..98b413b 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 const ADD_SEARCH_INTERESTED_PARTY = 'ADD_SEARCH_INTERESTED_PARTY';
index 0fad8c9..f463321 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 export const UPDATE_TREE_NODE_INFO = 'UPDATE_TREE_NODE_INFO';
index 0431648..2ff3031 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 export const ACTIVATE_VEDGE_INFO_WINDOW = 'ACTIVATE_VEDGE_INFO_WINDOW';
index b6187e6..02b923d 100644 (file)
@@ -79,8 +79,8 @@
 
     <div class="col-sm-3">
       {{> InputModel(createInputArgs
-            value=model.passwor
-            key="password"
+            value=model.pw
+            key="pwd"
             type="password"
             disabled=disabled
             placeholder="Password")
index 11421a0..13967d5 100644 (file)
@@ -79,8 +79,8 @@
 
     <div class="col-sm-3">
       {{> InputModel(createInputArgs
-            value=model.passwor
-            key="password"
+            value=model.pw
+            key="pwd"
             type="password"
             disabled=disabled
             placeholder="Password")
index f8192ef..729adb9 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: MtInput 
  */
index e2c3169..a8f7f7c 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: MtRadios 
  */
index 48a2141..95190e2 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: MtSelect 
  */
index 7022bcc..16637ea 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: NetworkGraphManager 
  */
@@ -229,10 +221,14 @@ function addNodeToGraph(node, graphData) {
     name: node._id._str,
   };
 
-  newNode = R.ifElse(R.isNil, 
-    R.always(newNode),
-    R.assocPath(['_osmeta', 'host'], R.__, newNode)
-  )(node.host);
+  let groupMarkers = ['host', 'switch'];
+  let groupKey = R.find((key) => {
+    if (R.isNil(R.path([key], node))) { return false; }
+    return true;
+  })(groupMarkers);
+  if (groupKey) {
+    newNode = R.assocPath(['_osmeta', 'groupId'], node[groupKey], newNode);
+  }
 
   let nodes = R.unionWith(R.eqBy(R.prop('_osid')), graphData.nodes, [newNode]);
   let links = expandLinks(graphData.links, nodes);
@@ -253,18 +249,19 @@ function calcIsReady(graphData) {
 
 function calcGroups(nodes) {
   return R.reduce((accGroups, node) => {
-    let host = R.path(['_osmeta', 'host'], node);
-    if (R.isNil(host)) {
+    let groupId = R.path(['_osmeta', 'groupId'], node);
+    if (R.isNil(groupId)) {
       return accGroups;
     }
 
-    let groupIndex = R.findIndex(R.propEq('_osid', host), accGroups);
+    let groupIndex = R.findIndex(R.propEq('_osid', groupId), accGroups);
     let group = null;
     if (groupIndex < 0) {
       let group = { 
-        _osid: host,
+        _osid: groupId,
         leaves: [node],
         isExpanded: true,
+        name: groupId,
       };
       accGroups = R.append(group, accGroups);
 
index 49e41a8..04a33b0 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: NetworkGraph 
  */
@@ -389,12 +381,22 @@ function renderView(force,
   function tickFn() {
     let svgGroups = mainEl.selectAll('.group');
     svgGroups
+      .attr('transform', function (d) {
+        let x = R.path(['bounds', 'x'], d);
+        let y = R.path(['bounds', 'y'], d);
+        return `translate(${x},${y})`;
+      })
+    ;
+    /*
       .attr('x', function (d) { 
         return R.path(['bounds', 'x'], d); 
       })
       .attr('y', function (d) { 
         return R.path(['bounds', 'y'], d);
       })
+      */
+
+    svgGroups.selectAll('.group-shape')
       .attr('width', function (d) { 
         if (d.bounds) { return d.bounds.width(); } 
       })
@@ -402,6 +404,15 @@ function renderView(force,
         if (d.bounds) { return d.bounds.height(); } 
       });
 
+    svgGroups.selectAll('.group-name')
+      .attr('x', function(d) { 
+        return (d.bounds.width() / 2);
+      })
+      .attr('y', function(_d) { 
+        return 30;
+      })
+    ;
+
     let svgNodes = mainEl.selectAll('.node');
     svgNodes.attr('transform', function(d) {
       return 'translate(' + d.x + ',' + d.y + ')';
@@ -470,20 +481,44 @@ function genSvgGroups(g, groups, drag, onRenderViewReq) {
   let svgGroups = g.selectAll('.group')
       .data(groups, (d) => d._osid);
 
-  //let rects = 
-  svgGroups.enter()
+  let enterGroups = svgGroups.enter();
+
+  let groupsContainers = 
+    enterGroups
+      .append('g')
+        .attr('class', 'group')
+        .attr('data-group-id', (d) => d._osid)
+        .call(drag)
+        .on('click', function (d) {
+          console.log('click', d);
+          d.isExpanded = !d.isExpanded;
+          onRenderViewReq();
+        });
+
+  groupsContainers
     .append('rect')
+      .attr('class', 'group-shape')
       .attr('rx', 8)
       .attr('ry', 8)
-      .attr('class', 'group')
-      .attr('data-group-id', (d) => d._osid)
       .style('fill', function (_d, _i) { return 'lightblue'; })
-      .call(drag)
-      .on('click', function (d) {
-        console.log('click', d);
-        d.isExpanded = !d.isExpanded;
-        onRenderViewReq();
-      });
+  ;
+
+  groupsContainers
+    .append('text')
+    .text(function(d) { 
+      return d.name;
+    })
+    .attr('class', 'group-name')
+    .attr('x', function(d) { 
+      return (d.bounds.width() / 2);
+    })
+    .attr('y', function(_d) { 
+      return 30;
+    })
+    .attr('dy', '.25em')
+    .attr('text-anchor', 'middle')
+    .attr('font-size', 20)
+  ;
 
   svgGroups.exit()
     .remove();
@@ -552,10 +587,10 @@ function calcClosedGroupsNodes(rejectedGroups, prevViewNodes) {
 function calcNodesAndRejectedNodes(originalNodes, originalGroups) {
   let rejectedNodes = [];
   let nodes = R.reject((node) => {
-    let host = R.path(['_osmeta', 'host'], node);
-    if (R.isNil(host)) { return false; }
+    let groupId = R.path(['_osmeta', 'groupId'], node);
+    if (R.isNil(groupId)) { return false; }
 
-    let group = R.find(R.propEq('_osid', host), originalGroups);
+    let group = R.find(R.propEq('_osid', groupId), originalGroups);
     if (R.isNil(group)) { return false; }
 
     if (group.isExpanded) { return false; } 
@@ -596,8 +631,8 @@ function calcLinksAndRejectedLinks(originalLinks, rejectedNodes) {
 
 function calcNewLinksForRejectedSource(rejectedSourceLinks, nodes, prevLinks) {
   let newLinksForRejectedSource = R.reduce((acc, link) => {
-    let host = R.path(['_osmeta', 'host'], link.source);
-    let groupNodeId = `${host}-group-node`;
+    let groupId = R.path(['_osmeta', 'groupId'], link.source);
+    let groupNodeId = `${groupId}-group-node`;
     let newSource = R.find(R.propEq('_osid', groupNodeId), nodes);
     if (R.isNil(newSource)) { 
       throw 'error in new links for rejected source function';
@@ -628,8 +663,8 @@ function calcNewLinksForRejectedSource(rejectedSourceLinks, nodes, prevLinks) {
 
 function calcNewLinksForRejectedTarget(rejectedLinks, nodes, prevLinks) {
   let newLinks = R.reduce((acc, link) => {
-    let host = R.path(['_osmeta', 'host'], link.target);
-    let groupNodeId = `${host}-group-node`;
+    let groupId = R.path(['_osmeta', 'groupId'], link.target);
+    let groupNodeId = `${groupId}-group-node`;
     let newTarget = R.find(R.propEq('_osid', groupNodeId), nodes);
     if (R.isNil(newTarget)) { 
       throw 'error in new links for rejected target function';
@@ -660,8 +695,8 @@ function calcNewLinksForRejectedTarget(rejectedLinks, nodes, prevLinks) {
 
 function calcNewLinksForRejectedBoth(rejectedLinks, nodes, prevLinks) {
   let newLinks = R.reduce((acc, link) => {
-    let targetHost = R.path(['_osmeta', 'host'], link.target);
-    let sourceHost = R.path(['_osmeta', 'host'], link.source);
+    let targetHost = R.path(['_osmeta', 'groupId'], link.target);
+    let sourceHost = R.path(['_osmeta', 'groupId'], link.source);
     let groupSourceNodeId = `${sourceHost}-group-node`;
     let groupTargetNodeId = `${targetHost}-group-node`;
 
index 114cc96..d5f7ce2 100644 (file)
@@ -6,13 +6,18 @@
     width: 100%;
     height: 100%;
     
-    .group {
-      stroke: #fff;
-      stroke-width: 1.5px;
-      cursor: move;
-      opacity: 0.7;
-    } 
+    .group 
+      .group-shape
+        stroke: #fff;
+        stroke-width: 1.5px;
+        cursor: move;
+        opacity: 0.7;
 
+      .group-name
+        fill: rgba(133, 133, 133, 0.52);
+        font-weight: 400;
+        line-height: 20px;
+        font-family: 'Helvetica', 'Arial', sans-serif;
 
     .link-group 
       text
index 1995ded..891d2b3 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: NewScanning 
  */
index 3bcc591..4092d00 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: ScheduledScan 
  */
index 7aa76e9..bd85afd 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: ScheduledScansList 
  */
index 30b740f..15c46fe 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * Template Component: SelectableOrderedInput 
  */
index 86286a4..12f0407 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { Inventory } from '/imports/api/inventories/inventories';
 
 export let EnvironmentTreeNodeBehavior = {
index 5a5be84..a60f842 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 /*
  * file: input-model.js
  */
index ecf9c60..c8bf4fd 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { Inventory } from '/imports/api/inventories/inventories';
 //import * as R from 'ramda';
 
index da553b5..c902f93 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda'; 
 
 export const createSelectArgs = function (params) {
index bac0e72..d06052f 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 import * as actions from '/imports/ui/actions/environment-panel.actions';
index 67f96f1..4489fb6 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 import * as actions from '/imports/ui/actions/graph-tooltip-window.actions';
index 8771aad..28815f7 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import * as R from 'ramda';
 
 const defaultState = { 
index 6ee909d..936f68a 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { combineReducers } from 'redux';
 
 import { navigation } from './navigation';
index abc4574..e5e1489 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 import * as actions from '/imports/ui/actions/main-app.actions';
index de78ee5..d7ab503 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 import * as actions from '/imports/ui/actions/navigation';
index 26220c2..f4963d2 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 import * as actions from '/imports/ui/actions/search-interested-parties';
index 0a6ec73..5e9420d 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 //import { Mongo } from 'meteor/mongo';
 import * as R from 'ramda';
 
index d1be629..0cedc6a 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import * as R from 'ramda';
 
 import * as actions from '/imports/ui/actions/vedge-info-window.actions';
index fc5e2f5..af0813b 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { Store } from './store';
 
 export { Store };
index 76da6a9..acefce2 100644 (file)
@@ -1,11 +1,3 @@
-/////////////////////////////////////////////////////////////////////////////////////////
-// Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others /
-//                                                                                      /
-// All rights reserved. This program and the accompanying materials                     /
-// are made available under the terms of the Apache License, Version 2.0                /
-// which accompanies this distribution, and is available at                             /
-// http://www.apache.org/licenses/LICENSE-2.0                                           /
-/////////////////////////////////////////////////////////////////////////////////////////
 import { createStore, applyMiddleware, compose } from 'redux';
 import thunk from 'redux-thunk';
 import calipsoApp from '/imports/ui/reducers/index';
diff --git a/ui/run b/ui/run
new file mode 100755 (executable)
index 0000000..ec4aa7c
--- /dev/null
+++ b/ui/run
@@ -0,0 +1,2 @@
+# run meteor with different mongo 
+MONGO_URL=mongodb://localhost:27017/osdna meteor run
diff --git a/ui/run-dev.sh b/ui/run-dev.sh
new file mode 100755 (executable)
index 0000000..d35659e
--- /dev/null
@@ -0,0 +1,10 @@
+########################################################################################
+# Copyright (c) 2017 Koren Lev (Cisco Systems), Yaron Yogev (Cisco Systems) and others #
+#                                                                                      #
+# All rights reserved. This program and the accompanying materials                     #
+# are made available under the terms of the Apache License, Version 2.0                #
+# which accompanies this distribution, and is available at                             #
+# http://www.apache.org/licenses/LICENSE-2.0                                           #
+########################################################################################
+# run meteor with different mongo 
+MONGO_URL=mongodb://osdna:Oki9wse3@10.56.20.80:27017/osdna meteor run