123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972 |
- /**
- * @fileOverview Misc jQuery plugins maintained by the phpVirtualBox project for
- * the phpVirtualBox project. These are either solely authored by
- * the project or so heavily modified that they can no longer be
- * separately maintained
- * @author Ian Moore (imoore76 at yahoo dot com)
- * @version $Id: jquery.projectPlugins.js 595 2015-04-17 09:50:36Z imoore76 $
- * @copyright Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
- *
- */
-
- /**
- * Override _title method of dialog to accept HTML
- *
- * http://stackoverflow.com/questions/14488774/using-html-in-a-dialogs-title-in-jquery-ui-1-10
- */
- $.widget("ui.dialog", $.extend({}, $.ui.dialog.prototype, {
- _title: function(title) {
- title.html(this.options.title ? this.options.title : " ");
- }
- }));
- /**
- * Adds deprecated enable/disableSelection to jquery.
- *
- * Taken from jQuery source.
- *
- */
- $.support.selectstart = "onselectstart" in document.createElement( "div" );
-
- $.fn.extend({
- disableSelection: function() {
- return this.on( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
- ".ui-disableSelection", function( event ) {
- event.preventDefault();
- });
- },
-
- enableSelection: function() {
- return this.off( ".ui-disableSelection" );
- }
- });
-
- /**
- *
- * Add hover and hoverClass functionality to jquery
- *
- */
-
- (function($) {
-
-
- /* Mimic jquery hover function deprecated in jquery 1.9 */
- $.fn.hover = function(onenter, onleave) {
-
- this.each(function() {
- $(this).on("mouseenter", onenter).on("mouseleave", onleave);
- });
-
- return $(this);
-
- }
-
- /* Add / remove class onmouseenter/leave */
- $.fn.hoverClass = function(hclass) {
-
- this.each(function() {
- $(this).on("mouseenter",function(){
- $(this).addClass(hclass);
- }).on("mouseleave", function(){
- $(this).removeClass(hclass);
- });
- });
-
- return $(this);
-
- }
-
- })(jQuery);
-
-
-
- /**
- * Restore jQuery.browser functionality. Taken from:
- *
- * https://github.com/jquery/jquery-migrate/blob/master/src/core.js
- *
- */
- jQuery.uaMatch = function( ua ) {
-
- ua = ua.toLowerCase();
-
- var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
- /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
- /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
- /(msie) ([\w.]+)/.exec( ua ) ||
- ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
- [];
-
- return {
- browser: match[ 1 ] || "",
- version: match[ 2 ] || "0"
- };
- };
-
- // Don't clobber any existing jQuery.browser in case it's different
- if ( !jQuery.browser ) {
- matched = jQuery.uaMatch( navigator.userAgent );
- browser = {};
-
- if ( matched.browser ) {
- browser[ matched.browser ] = true;
- browser.version = matched.version;
- }
-
- // Chrome is Webkit, but Webkit is also Safari.
- if ( browser.chrome ) {
- browser.webkit = true;
- } else if ( browser.webkit ) {
- browser.safari = true;
- }
-
- jQuery.browser = browser;
- }
-
-
- /**
- * Modified version of http://archive.plugins.jquery.com/project/TextFill
- */
- ;(function($) {
- $.fn.textFill = function(options) {
-
- var maxFontSize = options.maxFontPixels;
- var maxHeight = parseInt(options.height);
- var maxWidth = parseInt(options.width);
-
- var ourText = $(this);
-
- var fontSize = parseInt(ourText.css('font-size'));
- var fontSizeOrig = fontSize;
- var textHeight = $(ourText).outerHeight(true);
- var textWidth = $(ourText).outerWidth(true);
-
- do {
- ourText.css('font-size', fontSize++);
- textHeight = $(ourText).outerHeight(true);
- textWidth = $(ourText).outerWidth(true);
-
- } while(textHeight <= maxHeight && textWidth <= maxWidth && fontSize <= maxFontSize);
-
- fontSize--;
- return ourText.css({'font-size':(fontSize)+'px','top':(fontSize > fontSizeOrig ? '-1' : '0') + 'px'});
- };
- })(jQuery);
-
-
-
- /**
- *
- * phpVirtualBox tree view for snapshots
- *
- */
-
- (function($) {
-
-
- $.fn.vbtree = function(options, toplevel) {
-
- if(!toplevel)
- var toplevel = this;
-
- this.each(function() {
-
- $(this).addClass('vboxTreeView').children('li').each(function(i,li){
-
- // Change class
- /////////////////////
- var children = $(li).children('ul').length;
- var last = !$(this).next().is('li');
- var classadd = null;
-
- // Children and last
- if(children && !last) {
- classadd = 'collapsable';
- // Children but no last
- } else if(children && last) {
- classadd = 'lastCollapsable';
- } else if(!children && last) {
- classadd = 'last';
- }
- $(li).addClass(classadd);
-
- // Insert hitarea
- var d = document.createElement('div');
- $(d).addClass('hitarea').addClass((classadd ? classadd + '-hitarea' : '')).click(function(){
-
- if(!$(this).data('toggleClicked')) {
-
- $(this).data('toggleClicked', true);
-
- if($(this).hasClass('last-hitarea')) return;
- if($(this).hasClass('lastCollapsable-hitarea'))
- $(this).addClass('lastExpandable-hitarea').removeClass('lastCollapsable-hitarea').parent().parent().children('ul').css({'display':'none'});
- else
- $(this).addClass('expandable-hitarea').removeClass('collapsable-hitarea').parent().parent().children('ul').css({'display':'none'});
-
- } else {
-
- $(this).data('toggleClicked', false);
-
- if($(this).hasClass('last-hitarea')) return;
- if($(this).hasClass('lastExpandable-hitarea'))
- $(this).addClass('lastCollapsable-hitarea').removeClass('lastExpandable-hitarea').parent().parent().children('ul').css({'display':''});
- else
- $(this).addClass('collapsable-hitarea').removeClass('expandable-hitarea').parent().parent().children('ul').css({'display':''});
- }
-
- return false;
- });
-
- $(li).children('div').first().prepend(d);
-
- // Tree each UL under li one
- $(li).children('ul').vbtree({},toplevel);
-
-
- });
-
- });
-
- return this;
-
- };
-
- })(jQuery);
-
- /**
- *
- * phpVirtualBox medium (disk / CD image etc.) select box
- *
- * Copyright (C) 2010-2015 Ian Moore (imoore76 at yahoo dot com)
- *
- */
-
- (function($) {
-
- $.fn.mediumselect = function(options) {
-
- /* Public access to select medium */
- if(options.selectMedium) {
- $('#'+$(this).attr('id')+'-mediumselect-'+options.selectMedium).click();
- return;
- }
-
- /* Defaults */
- if(!options.type) options.type = 'HardDisk';
- if(!options.media) options.media = [];
-
- /* Internal Select Medium */
- function _selectmedium(d,sel) {
-
- if($(d).hasClass('vboxMediumReadOnly')) {
- $(sel).addClass('vboxMediumSelectReadOnly').addClass('vboxMediumReadOnly');
- } else {
- $(sel).removeClass('vboxMediumSelectReadOnly').removeClass('vboxMediumReadOnly');
- }
-
- // Set text
- $(sel).html(($(d).data('label') ? $(d).data('label') : ''));
-
- // Hide list
- $('#'+$(sel).attr('id')+'-list').hide();
-
- // Set hidden select box value and
- // trigger change
- var old = $('#'+$(sel).data('origId'));
- $(old).val($(d).data('id'));
- $(old).trigger('change',old);
-
-
- }
-
-
-
- /* Generate and return list item */
- function listItem(m,sel,old,children) {
-
- var li = document.createElement('li');
-
-
- var d = document.createElement('div');
- d.setAttribute('id',$(sel).attr('id')+'-'+m.attachedId);
-
- var opt = $(old).children('option[value='+m.attachedId+']');
-
- if($(opt).hasClass('vboxMediumReadOnly')) {
- $(d).addClass('vboxMediumReadOnly');
- $(li).addClass('vboxMediumReadOnly');
- }
-
- if($(opt).attr('title')) {
- $(d).attr('title',$(opt).attr('title'));
- $(d).tipped({'source':'title'});
- }
-
- $(d).addClass('vboxMediumSelectDiv').on("mouseenter",function(){$(this).addClass('vboxMediumSelectHover');}).on("mouseleave",function(){$(this).removeClass('vboxMediumSelectHover');});
- $(d).html(m.label);
- $(d).data('label',m.label);
- $(d).data('id',m.attachedId);
-
- $(d).click(function(){_selectmedium(this,sel);});
-
- $(li).append(d);
-
- // Traverse children
- if(children && m.children && m.children.length) {
- var ul = document.createElement('ul');
- for(var c = 0; c < m.children.length; c++) {
- $(ul).append(listItem(m.children[c],sel,old,true));
- }
- $(li).append(ul);
- }
-
- return li;
- }
-
- /* Show list */
- function showList(sel) {
-
- var list = $('#'+$(sel).attr('id')+'-list');
- var sTop = $(sel).offset().top + $(sel).outerHeight();
- var sLeft = $(sel).offset().left;
- var sWidth = $(sel).outerWidth() + $(sel).closest('table').find('.vboxMediumSelectImg').outerWidth();
-
- // Hide menu when clicking anywhere else
- $(document).one('click',function(){$(list).hide();});
-
- $(list).css({'left':sLeft+'px','top':sTop+'px','min-width':sWidth}).show();
-
- return false;
-
- }
-
- /*
- * Main
- */
- this.each(function() {
-
- // Generate select box replacement
- if(!$('#'+$(this).attr('id')+'-mediumselect').attr('id')) {
-
- var sel = document.createElement('div');
- $(sel).data('origId', $(this).attr('id'));
- $(sel).attr('id',$(this).attr('id')+'-mediumselect');
- $(sel).attr('class','vboxMediumSelect');
- $(sel).on('click',function(){
- if($('#'+$(this).data('origId')+'-table').hasClass('vboxDisabled')) return;
- return showList(this);
- });
-
- $(this).hide();
-
- var img = document.createElement('div');
- img.setAttribute('id',$(this).attr('id')+'-mediumselectimg');
- img.setAttribute('class','vboxMediumSelectImg');
- $(img).click(function(e){
- $(e.target).closest('table').find('div.vboxMediumSelect').trigger('click');
- return false;
- });
-
- var tbl = document.createElement('table');
- $(tbl).attr('id',$(this).attr('id')+'-table');
- $(tbl).attr('class','vboxMediumSelect');
- $(tbl).css({'padding':'0px','margin':'0px','border':'0px','width':'100%','border-spacing':'0px'});
- var tr = document.createElement('tr');
- var td = document.createElement('td');
- $(td).attr({'class':'vboxMediumSelectTableLeft'}).css({'padding':'0px','margin':'0px','width':'100%'});
- $(td).append(sel);
- $(tr).append(td);
- var td = document.createElement('td');
- $(td).attr({'class':'vboxMediumSelectTableRight'}).css({'padding':'0px','margin':'0px','width':'auto'});
- $(td).append(img);
- $(tr).append(td);
- $(tbl).append(tr);
-
- // Handle enabled / disabled
- $(tbl).on('enable',function(){
- $(this).removeClass('vboxDisabled');
- }).on('disable',function(){
- $(this).addClass('vboxDisabled');
- });
-
- $(this).before(tbl);
-
-
- var list = document.createElement('ul');
- $(list).attr('id',$(this).attr('id')+'-mediumselect-list');
- $(list).attr('class', 'vboxMediumSelect');
- $(list).css({'display':'none'});
-
- $('#vboxPane').append(list);
- }
-
- // Hide list if it exists
- $('#'+$(this).attr('id')+'-mediumselect-list').hide();
-
- $('#'+$(this).attr('id')+'-mediumselectimg').css({'background-image':'url(images/downArrow.png)'});
-
- // Compile list
- var list = $('#'+$(this).attr('id')+'-mediumselect-list');
- $(list).children().remove();
-
- var sel = $('#'+$(this).attr('id')+'-mediumselect');
- var old = this;
-
- for(var i = 0; i < options.media.length; i++) {
- if(options.media[i].base && options.media[i].id != options.media[i].base) continue;
- $(list).append(listItem(options.media[i],sel,old,options.showdiff));
- }
-
- // Set initial text and styles
- var oldopt = $(this).children('option:eq('+Math.max($(this).prop('selectedIndex'),0)+')');
-
- if(!$(oldopt).val()) {
- _selectmedium($(list).find('div').first(), sel, old);
- } else {
- _selectmedium($('#'+$(sel).attr('id')+'-'+$(oldopt).val()), sel, old);
- }
- }); // </ .each() >
-
- return this;
-
- }; // </mediumselect()>
-
- })(jQuery);
-
-
- //jQuery File Tree Plugin
- //
- // Version 1.01
- //
- // Cory S.N. LaViska
- // A Beautiful Site (http://abeautifulsite.net/)
- // 24 March 2008
- //
- // Visit http://abeautifulsite.net/notebook.php?article=58 for more information
- //
- // Usage: $('.fileTreeDemo').fileTree( options, callback )
- //
- // Options: root - root folder to display; default = /
- // script - location of the serverside AJAX file to use; default = jqueryFileTree.php
- // folderEvent - event to trigger expand/collapse; default = click
- // expandSpeed - default = 500 (ms); use -1 for no animation
- // collapseSpeed - default = 500 (ms); use -1 for no animation
- // expandEasing - easing function to use on expand (optional)
- // collapseEasing - easing function to use on collapse (optional)
- // multiFolder - whether or not to limit the browser to one subfolder at a time
- // loadMessage - Message to display while initial tree loads (can be HTML)
- //
- // History:
- //
- // 1.01 - updated to work with foreign characters in directory/file names (12 April 2008)
- // 1.00 - released (24 March 2008)
- //
- // TERMS OF USE
- //
- // This plugin is dual-licensed under the GNU General Public License and the MIT License and
- // is copyright 2008 A Beautiful Site, LLC.
- //
- // 2010-05-12 - Modified by Ian Moore for phpVirtualBox
- //
- //
- if(jQuery) (function($){
-
- $.extend($.fn, {
- fileTree: function(o, h) {
- // Defaults
- if( !o ) var o = {};
- if( o.root == undefined ) o.root = '/';
- if( o.script == undefined ) o.script = vboxEndpointConfig.filebrowser;
- if( o.expandSpeed == undefined ) o.expandSpeed= 500;
- if( o.collapseSpeed == undefined ) o.collapseSpeed= 500;
- if( o.expandEasing == undefined ) o.expandEasing = null;
- if( o.collapseEasing == undefined ) o.collapseEasing = null;
- if( o.multiFolder == undefined ) o.multiFolder = true;
- if( o.loadMessage == undefined ) o.loadMessage = trans('Loading ...','UIVMDesktop');
- if( o.scrollTo == undefined ) o.scrollTo = null;
- if( o.dirsOnly == undefined) o.dirsOnly = false;
-
- var top = this;
-
- $(this).each( function() {
-
- function showTree(c, t, fullpath) {
-
- // If a UL is not the target, find or create it
- if($(c).prop('tagName') != 'UL') {
- var target = $(c).children('UL').first();
- if(target.length) {
- c = $(target);
- } else {
- var rootList = $('<ul />').addClass("jqueryFileTree");
- $(c).append(rootList);
- c = rootList;
- }
- }
-
- // If data is already loaded, just show it
- if($(c).children().length) {
- $(c).slideDown({ duration: o.expandSpeed, easing: o.expandEasing });
- return;
- }
-
- $(c).append($('<li />').addClass("wait").text(o.loadMessage));
-
- $.post(o.script, JSON.stringify({ 'dir': t, 'dirsOnly' : (o.dirsOnly ? true : false), 'fullpath' : (fullpath ? true : false)}), function(data) {
-
- $(c).children('.wait').remove();
- $(c).append(toHTML(data));
-
- if(o.scrollTo) {
- var sto = $(o.scrollTo).find('a.vboxListItemSelected').first();
- if(sto.length) {
- $(o.scrollTo).scrollTo($(sto),{'axis':'y','offset':{'top':-15}});
- }
- }
- bindTree(c);
-
- }, "json");
- }
-
- function folderElement(data) {
- return $('<li/>').addClass("folder")
- .addClass(data.expanded ? 'expanded' : 'collapsed')
- .addClass('vboxListItem')
- .append(
- $('<a/>').attr({'href':'#','name':data.path,'rel':data.path})
- .addClass(data.selected ? 'vboxListItemSelected' : '')
- .text(data.name)
- );
- }
-
- function fileElement(data) {
- return $('<li/>').addClass('file file_' + data.ext +' vboxListItem')
- .append(
- $('<a/>').attr({'href':'#','name':data.path,'rel':data.path}).text(data.name)
- );
- }
- function toHTML(data) {
-
- data.sort(function(a,b){
- if(a.type == b.type)
- return strnatcasecmp(a.path, b.path);
- return a.type == 'folder' ? -1 : 1
- });
-
- var elms = [];
- for(var i = 0; i < data.length; i++) {
-
- // Folder
- if(data[i].type == 'folder') {
- var direlm = folderElement(data[i]);
- if(data[i].expanded) {
- var listelm = $('<ul/>').addClass('jqueryFileTree');
- var children = toHTML(data[i].children);
- for(var a = 0; a < children.length; a++) {
- $(listelm).append(children[a]);
- }
- $(direlm).append(listelm);
- }
- elms.push(direlm);
-
-
- // File
- } else {
- elms.push(fileElement(data[i]));
- }
- }
- return elms;
- }
-
- function bindTree(t) {
- // Expand / collapse
- $(t).find('LI A').on('dblclick', function(e) {
- e.preventDefault();
- // Folder
- if( $(this).parent().hasClass('folder') ) {
-
- // Is collapsed. Expand
- if( $(this).parent().hasClass('collapsed') ) {
- // Expand
- if( !o.multiFolder ) {
- $(top).find('UL').slideUp({ duration: o.collapseSpeed, easing: o.collapseEasing })
- $(top).find('LI.folder').removeClass('expanded').addClass('collapsed');
- }
- $(this).parent().removeClass('collapsed').addClass('expanded');
- showTree( $(this).parent(), $(this).attr('name') );
-
- // Is expanded. Collapse
- } else {
- // Collapse
- $(this).parent().removeClass('expanded').addClass('collapsed')
- .children('UL').slideUp({ duration: o.collapseSpeed, easing: o.collapseEasing });
- }
- } else {
- h($(this).attr('name'));
- }
- return false;
-
- }).on('click', function() {
- $(top).find('.vboxListItemSelected').removeClass('vboxListItemSelected');
- $(this).addClass('vboxListItemSelected');
- return false;
- });
- }
- // Loading message
- var rootList = $('<ul />').addClass("jqueryFileTree");
- $(this).empty().append(rootList);
- // Get the initial file list
- showTree( rootList, o.root, true);
- });
-
- return this;
- }
- });
-
- })(jQuery);
-
-
- /* jQuery Context Menu Plugin
-
- Version 1.01
-
- Cory S.N. LaViska
- A Beautiful Site (http://abeautifulsite.net/)
-
- More info: http://abeautifulsite.net/2008/09/jquery-context-menu-plugin/
-
- //
- // Terms of Use
- //
- // This plugin is dual-licensed under the GNU General Public License
- // and the MIT License and is copyright A Beautiful Site, LLC.
- //
-
- This jQuery plugin now hardly resembles the original.
- --Ian Moore
-
-
- */
- if(jQuery)( function() {
-
- $.extend($.fn, {
-
- contextMenu: function(o, callback) {
- // Defaults
- if( o.menu == undefined ) return false;
- if( o.inSpeed == undefined ) o.inSpeed = 150;
- if( o.outSpeed == undefined ) o.outSpeed = 75;
- // 0 needs to be -1 for expected results (no fade)
- if( o.inSpeed == 0 ) o.inSpeed = -1;
- if( o.outSpeed == 0 ) o.outSpeed = -1;
- if( o.button == undefined) o.button = 2;
- if( o.clickthrough == undefined) o.clickthrough = false;
-
- // Loop each context menu
- $(this).each( function() {
-
- var el = $(this);
- var menu = $('#'+o.menu);
-
- // Simulate a true click
- $(this).mousedown( function(e) {
-
- if( $(el).hasClass('disabled') ) return true;
-
- if(!( e.button == o.button || (o.button == 0 && e.button == 1 && $.browser.msie))) return;
- if(o.clickthrough) $(el).trigger('click');
- var evt = e;
- evt.stopPropagation();
-
- $(this).mouseup( function(e) {
-
- if( $(this).hasClass('disabled') ) return true;
-
- e.stopPropagation();
-
- var srcElement = $(this);
- $(this).off('mouseup');
-
-
- if( evt.button == o.button || (o.button == 0 && evt.button == 1 && $.browser.msie)) {
-
- // Menu setup function
- if(o.menusetup) {
- o.menusetup(el);
- }
- // Hide context menus that may be showing
- $("ul.contextMenu").hide();
-
- showMenu(srcElement, menu, o.mode, e);
-
- $(document).one('mouseup', function() {
- $(menu).fadeOut(o.outSpeed);
- $("ul.contextMenu").hide();
- });
- }
- });
- });
-
- /*
- * Initialize menu items
- *
- */
- var menuItems = function(menu, srcElement, level) {
-
- // When items are selected
- $(menu).addClass('contextMenu').data({'level':level}).disableSelection().children('li').off('mouseup').on('mouseup', function(e) {
-
- if($(this).hasClass('disabled')) {
- return;
- }
-
- $("ul.contextMenu").hide();
-
- // Callback
- if( callback ) {
- var aElm = $(this).children('a');
- if($(aElm)[0]) {
- callback( aElm.attr('href').substr(1), $(srcElement), null, aElm);
- } else {
- $(this).children('.vboxMenuAcceptClick').click();
- }
- }
-
-
- }).on("mouseenter", function(e, li) {
-
- $('#vboxPane').trigger('contextMenuShowLevel',
- {'level':$(this).parent().data('level'), 'id':$(this).parent().attr('id')}
- );
-
- $(menu).find('LI.vboxHover').removeClass('vboxHover');
- if($(this).hasClass('disabled')) return;
-
- $(this).addClass('vboxHover');
-
- var subMenuId = $(this).data('subId');
- if(subMenuId) showMenu($(this),$('#'+subMenuId),'submenu',e);
-
- }).on("mouseleave",function() {
-
- $(menu).find('LI.vboxHover').removeClass('vboxHover');
-
- }).children('a').off('click').on('click',function(e){
- e.preventDefault();
- return false;
- });
-
- // Sub menu initialization
- $(menu).children('li').children('ul').each(function() {
-
- var plink = $(this).siblings('a').first();
- var subId = $(this).attr('id');
- if(!subId) {
- var href = plink.attr('href').replace('#','');
- subId = href + '-Submenu';
- $(this).attr('id', subId);
- }
- $(this).addClass('contextMenu contextSubMenu').data({'level':level+1}).parent().addClass('contextMenuParent').data({'subId':subId,'level':level});
- var html = plink.html();
- plink.html('<table class="vboxInvisible" style="width:100%"><tr><td style="text-align:left">'+html+'</td><td style="text-align:right; width: 22px;"><img src="images/rightArrow.png" /></td></tr></table>');
-
- // Hide menus trigger
- var smenu = this;
- $('#vboxPane').on('contextMenuShowLevel',function(e,c){
- if($(smenu).data('level') >= c.level && $(smenu).attr('id') != c.id)
- $(smenu).hide();
- });
-
- // Reloop through setup
- menuItems($(this), srcElement, ++level);
-
- $(this).detach().appendTo($('#vboxPane'));
-
-
- });
-
-
- };
-
-
- /*
- *
- * Activate menu items
- *
- */
-
- var showMenu = function(srcElement, menu, mode, e) {
-
- // Check menu
- if(!$(menu)[0]) {
- return;
- }
-
- // Hide all other menus at this level
- $('#vboxPane').trigger('contextMenuShowLevel', {'level':$(menu).data('level'), 'id':$(menu).attr('id')});
-
- // Detect mouse position
- var d = {};
-
- var x = null;
- var y = null;
-
- if(mode == 'menu') {
- x = $(srcElement).offset().left;
- y = $(srcElement).offset().top + $(srcElement).outerHeight();
- } else if(mode == 'submenu') {
- y = $(srcElement).offset().top;
- x = $(srcElement).offset().left + $(srcElement).outerWidth();
- } else {
-
- if( self.innerHeight ) {
- d.pageYOffset = self.pageYOffset;
- d.pageXOffset = self.pageXOffset;
- d.innerHeight = self.innerHeight;
- d.innerWidth = self.innerWidth;
- } else if( document.documentElement &&
- document.documentElement.clientHeight ) {
- d.pageYOffset = document.documentElement.scrollTop;
- d.pageXOffset = document.documentElement.scrollLeft;
- d.innerHeight = document.documentElement.clientHeight;
- d.innerWidth = document.documentElement.clientWidth;
- } else if( document.body ) {
- d.pageYOffset = document.body.scrollTop;
- d.pageXOffset = document.body.scrollLeft;
- d.innerHeight = document.body.clientHeight;
- d.innerWidth = document.body.clientWidth;
- }
-
- $(menu).css({'left':0,'top':0});
-
- (e.pageX) ? x = e.pageX : x = e.clientX + d.scrollLeft;
- (e.pageY) ? y = e.pageY : y = e.clientY + d.scrollTop;
-
-
- }
-
- // shift left if submenu
- if($(menu).data('level')) x-=3;
-
- //adjust to ensure menu is inside viewable screen
- var right = x + $(menu).outerWidth();
- var bottom = y + $(menu).outerHeight();
-
- var windowWidth = $(window).width() + $(window).scrollLeft()-5;
- var windowHeight = $(window).height() + $(window).scrollTop()-5;
-
- x = (right > windowWidth) ? x - (right - windowWidth) : x;
- y = (bottom > windowHeight) ? y - (bottom - windowHeight) : y;
-
-
- $(menu).one('menuLoaded',function(){
- menuItems(menu, srcElement);
- });
-
- // Check for callback if nothing is present
- if($(menu).children().length == 0 && $(menu).data('callback')) {
-
-
- var m = window[$(menu).data('callback')](menu);
-
- // New menu returned?
- if(m) {
- $(m).addClass('contextSubMenu contextMenuLevel' + ($(menu).data('level')+1)).data('level',($(menu).data('level')+1));
- // Hide menus trigger
- $('#vboxPane').on('contextMenuShowLevel',function(e,c){
- if($(m).data('level') >= c.level && $(m).attr('id') != c.id) $(m).hide();
- });
-
- menuItems(m, srcElement, $(menu).data('level')+1);
-
- showMenu(srcElement, m, 'submenu', e);
-
- return;
- }
- } else {
- menuItems(menu, srcElement, $(menu).data('level'));
- }
-
- // Menu show
- $(menu).css({ top: y, left: x}).show();//.fadeIn(o.inSpeed);
-
-
- };
-
- // Setup menu
- menuItems(menu, el, 0);
-
-
- // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)
- $(el).add($('UL.contextMenu')).on('contextmenu', function() { return false; });
-
- });
- return $(this);
- },
-
- // Disable context menu items on the fly
- disableContextMenuItems: function(o) {
- if( o == undefined ) {
- // Disable all
- $(this).find('LI').addClass('disabled');
- return( $(this) );
- }
- $(this).each( function() {
- if( o != undefined ) {
- var d = o.split(',');
- for( var i = 0; i < d.length; i++ ) {
- $(this).find('A[href="' + d[i] + '"]').closest('li').addClass('disabled');
-
- }
- }
- });
- return( $(this) );
- },
-
- // Enable context menu items on the fly
- enableContextMenuItems: function(o) {
- if( o == undefined ) {
- // Enable all
- $(this).find('LI.disabled').removeClass('disabled');
- return( $(this) );
- }
- $(this).each( function() {
- if( o != undefined ) {
- var d = o.split(',');
- for( var i = 0; i < d.length; i++ ) {
- $(this).find('A[href="' + d[i] + '"]').closest('li').removeClass('disabled');
-
- }
- }
- });
- return( $(this) );
- },
-
- // Disable context menu(s)
- disableContextMenu: function() {
- $(this).each( function() {
- $(this).addClass('disabled');
- });
- return( $(this) );
- },
-
- // Enable context menu(s)
- enableContextMenu: function() {
- $(this).each( function() {
- $(this).removeClass('disabled');
- });
- return( $(this) );
- },
-
- // Destroy context menu(s)
- destroyContextMenu: function() {
- // Destroy specified context menus
- $(this).each( function() {
- // Disable action
- $(this).off('mousedown').off('mouseup');
- });
- return( $(this) );
- }
-
- });
- })(jQuery);
|