$(function(){ var m = window.meta = {edit:[]}, u; var k = m.key = {}; k.meta = {17:1, 91:1, 93:1, 224:1}; k.down = function(eve){ if($(eve.target).is('input') || eve.repeat){ return } (k.eve = m.eve = eve).which = eve.which || eve.fake || eve.keyCode; if(!eve.fake && eve.which === k.last){ return } if(k.meta[(k.last = eve.which)]){ k.down.meta = m.flip(k.wipe()) || true } if(m.flip.is()){ (k.combo || (k.combo = [])).push(eve.which); m.check('on', eve.which, k.at || (k.at = m.edit)); } if(eve.metaKey && (!k.meta[eve.which])){ k.up(eve) } // on some systems, meta hijacks keyup } k.up = function(eve){ var tmp; if($(eve.target).is('input')){ return } k.eve = m.eve = eve; k.last = null; eve.which = eve.which || eve.fake || eve.keyCode; if(m.flip.is()){ m.check('up', eve.which) } if(tmp = (k.meta[eve.which])){ k.down.meta = false } if(tmp && k.at === m.edit){ k.wipe() } if(27 === eve.which){ return m.flip(false) } } m.flip = function(tmp, aid){ if(aid){ m.flip.aid = true; setTimeout(function(){$(document).one('click',function(eve){m.flip(m.flip.aid = false)})},250); // ugly but important for visual aid. } var board = $('#meta .meta-menu'); ((tmp === false) || (!tmp && board.is(':visible')))? board.addClass('meta-none') : board.removeClass('meta-none'); } m.flip.is = function(){ if(m.flip.aid && ((m.eve||{}).fake || k.at !== m.edit)){ m.flip.aid = false } return !m.flip.aid && $('#meta .meta-menu').is(':visible'); } m.flip.wait = 500; m.check = function(how, key, at){ at = k.at || m.edit; //m.list(at); var edit = at[key], tmp; if(!edit){ return } if(k.eve && k.eve.preventDefault){ k.eve.preventDefault() } if(edit[how]){ edit[how](m.eve); if(k.at !== m.edit && 'up' === how){ if(k.down.meta){ m.list(k.at = m.edit) } else { k.wipe() } } } if('up' != how){ return } edit.back = at; m.list(edit, at); } m.list = function(at){ var l = []; $.each(at, function(i,k){ 'back' != i && k.combo && l.push(k) }); if(!l.length){ return } k.at = at; l = l.sort(function(a,b){ a = a.combo.slice(-1)[0] || 0; if(a.length){ a = a.toUpperCase().charCodeAt(0) } b = b.combo.slice(-1)[0] || 0; if(b.length){ b = b.toUpperCase().charCodeAt(0) } return (a < b)? -1 : 1; }); var $ul = $('#meta .meta-menu ul') $ul.children('li').addClass('meta-none').hide(); setTimeout(function(){ $ul.children('.meta-none').remove() },250); // necessary fix for weird bug glitch $.each(l, function(i, k){ $ul.append($('