1/** 2* This package includes 3* shortcuts 4* toolset 5* 6**/ 7 8/** 9 * http://www.openjs.com/scripts/events/keyboard_shortcuts/ 10 * Version : 2.01.B 11 * By Binny V A 12 * License : BSD 13 */ 14shortcut = { 15 'all_shortcuts':{},//All the shortcuts are stored in this array 16 'add': function(shortcut_combination,callback,opt) { 17 //Provide a set of default options 18 var default_options = { 19 'type':'keydown', 20 'propagate':false, 21 'disable_in_input':false, 22 'target':document, 23 'keycode':false 24 } 25 if(!opt) opt = default_options; 26 else { 27 for(var dfo in default_options) { 28 if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo]; 29 } 30 } 31 32 var ele = opt.target; 33 if(typeof opt.target == 'string') ele = document.getElementById(opt.target); 34 var ths = this; 35 shortcut_combination = shortcut_combination.toLowerCase(); 36 37 //The function to be called at keypress 38 var func = function(e) { 39 e = e || window.event; 40 41 if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields 42 var element; 43 if(e.target) element=e.target; 44 else if(e.srcElement) element=e.srcElement; 45 if(element.nodeType==3) element=element.parentNode; 46 47 if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return; 48 } 49 50 //Find Which key is pressed 51 if (e.keyCode) code = e.keyCode; 52 else if (e.which) code = e.which; 53 var character = String.fromCharCode(code); 54 55 if(code == 188) character=","; //If the user presses , when the type is onkeydown 56 if(code == 190) character="."; //If the user presses , when the type is onkeydown 57 58 var keys = shortcut_combination.split("+"); 59 //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked 60 var kp = 0; 61 62 //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken 63 var shift_nums = { 64 "`":"~", 65 "1":"!", 66 "2":"@", 67 "3":"#", 68 "4":"$", 69 "5":"%", 70 "6":"^", 71 "7":"&", 72 "8":"*", 73 "9":"(", 74 "0":")", 75 "-":"_", 76 "=":"+", 77 ";":":", 78 "'":"\"", 79 ",":"<", 80 ".":">", 81 "/":"?", 82 "\\":"|" 83 } 84 //Special Keys - and their codes 85 var special_keys = { 86 'esc':27, 87 'escape':27, 88 'tab':9, 89 'space':32, 90 'return':13, 91 'enter':13, 92 'backspace':8, 93 94 'scrolllock':145, 95 'scroll_lock':145, 96 'scroll':145, 97 'capslock':20, 98 'caps_lock':20, 99 'caps':20, 100 'numlock':144, 101 'num_lock':144, 102 'num':144, 103 104 'pause':19, 105 'break':19, 106 107 'insert':45, 108 'home':36, 109 'delete':46, 110 'end':35, 111 112 'pageup':33, 113 'page_up':33, 114 'pu':33, 115 116 'pagedown':34, 117 'page_down':34, 118 'pd':34, 119 120 'left':37, 121 'up':38, 122 'right':39, 123 'down':40, 124 125 '=':61, 126 127 'add':107, 128 'subtract':109, 129 130 'f1':112, 131 'f2':113, 132 'f3':114, 133 'f4':115, 134 'f5':116, 135 'f6':117, 136 'f7':118, 137 'f8':119, 138 'f9':120, 139 'f10':121, 140 'f11':122, 141 'f12':123, 142 143 'dash':173, 144 '+':187, 145 '-':189 146 } 147 148 var modifiers = { 149 shift: { wanted:false, pressed:false}, 150 ctrl : { wanted:false, pressed:false}, 151 alt : { wanted:false, pressed:false}, 152 meta : { wanted:false, pressed:false} //Meta is Mac specific 153 }; 154 155 if(e.ctrlKey) modifiers.ctrl.pressed = true; 156 if(e.shiftKey) modifiers.shift.pressed = true; 157 if(e.altKey) modifiers.alt.pressed = true; 158 if(e.metaKey) modifiers.meta.pressed = true; 159 160 for(var i=0; k=keys[i],i<keys.length; i++) { 161 //Modifiers 162 if(k == 'ctrl' || k == 'control') { 163 kp++; 164 modifiers.ctrl.wanted = true; 165 166 } else if(k == 'shift') { 167 kp++; 168 modifiers.shift.wanted = true; 169 170 } else if(k == 'alt') { 171 kp++; 172 modifiers.alt.wanted = true; 173 } else if(k == 'meta') { 174 kp++; 175 modifiers.meta.wanted = true; 176 } else if(k.length > 1) { //If it is a special key 177 if(special_keys[k] == code) kp++; 178 179 } else if(opt['keycode']) { 180 if(opt['keycode'] == code) kp++; 181 182 } else { //The special keys did not match 183 if(character == k) kp++; 184 else { 185 if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase 186 character = shift_nums[character]; 187 if(character == k) kp++; 188 } 189 } 190 } 191 } 192 193 if(kp == keys.length && 194 modifiers.ctrl.pressed == modifiers.ctrl.wanted && 195 modifiers.shift.pressed == modifiers.shift.wanted && 196 modifiers.alt.pressed == modifiers.alt.wanted && 197 modifiers.meta.pressed == modifiers.meta.wanted) { 198 callback(e); 199 200 if(!opt['propagate']) { //Stop the event 201 //e.cancelBubble is supported by IE - this will kill the bubbling process. 202 e.cancelBubble = true; 203 e.returnValue = false; 204 205 //e.stopPropagation works in Firefox. 206 if (e.stopPropagation) { 207 e.stopPropagation(); 208 e.preventDefault(); 209 } 210 return false; 211 } 212 } 213 } 214 this.all_shortcuts[shortcut_combination] = { 215 'callback':func, 216 'target':ele, 217 'event': opt['type'] 218 }; 219 //Attach the function with the event 220 if(ele.addEventListener) ele.addEventListener(opt['type'], func, false); 221 else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func); 222 else ele['on'+opt['type']] = func; 223 }, 224 225 //Remove the shortcut - just specify the shortcut and I will remove the binding 226 'remove':function(shortcut_combination) { 227 shortcut_combination = shortcut_combination.toLowerCase(); 228 var binding = this.all_shortcuts[shortcut_combination]; 229 delete(this.all_shortcuts[shortcut_combination]) 230 if(!binding) return; 231 var type = binding['event']; 232 var ele = binding['target']; 233 var callback = binding['callback']; 234 235 if(ele.detachEvent) ele.detachEvent('on'+type, callback); 236 else if(ele.removeEventListener) ele.removeEventListener(type, callback, false); 237 else ele['on'+type] = false; 238 } 239} 240 241 242 243 244 245/** 246 * This is the javascript for creating a cargo rte in the project editor. 247 * It may have originated from another plugin 248 * @author Cargo 249 */ 250 251var feedButtons = new Array(); 252var feedLinks = new Array(); 253var feedOpenTags = new Array(); 254var feedCanvases = new Array(); 255var feedToolbars = new Array(); 256 257 258function feedButton(id, display, tagStart, tagEnd, access, tit, img, open) { 259 this.id = id; // used to name the toolbar button 260 this.display = display; // label on button 261 this.tagStart = tagStart; // open tag 262 this.tagEnd = tagEnd; // close tag 263 this.access = access; // access key 264 this.tit = tit; // title 265 this.img = img; // image for button 266 this.open = open; // set to -1 if tag does not need to be closed 267} 268 269 270feedButtons[feedButtons.length] = new feedButton( 271 'feed_strong' 272 ,' B ' 273 ,'<b>','</b>' 274 ,'s' 275 ,'Bold' 276 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_bold.svg') 277 ); 278 279feedButtons[feedButtons.length] = new feedButton( 280 'feed_em' 281 ,' i ' 282 ,'<i>','</i>' 283 ,'e' 284 ,'Italic' 285 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_italic.svg') 286 ); 287 288 289/* 290 feedButtons[feedButtons.length] = new feedButton( 291 'feed_quote' 292 ,' quote ' 293 ,'<blockquote>','</blockquote>' 294 ,'q' 295 ,'Quote' 296 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_quote.svg') 297 ); 298*/ 299 300feedButtons[feedButtons.length] = new feedButton( 301 'feed_link' 302 ,' link ' 303 ,'<a>','</a>' 304 ,'a' 305 ,'Insert link' 306 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_link.svg') 307 ); // special case 308 309feedButtons[feedButtons.length] = new feedButton( 310 'feed_slide' 311 ,' slideshow ' 312 ,'{slideshow}','{/slideshow}' 313 ,'s' 314 ,'Make a slideshow' 315 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_slideshow.svg') 316 ); // special case 317 318 319feedButtons[feedButtons.length] = new feedButton( 320 'feed_fullscreen' 321 ,' fullscreen ' 322 ,'{fullscreen}','' 323 ,'f' 324 ,'Insert fullscreen viewer button' 325 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_fullscreen.svg') 326 ,'' 327 ); // special case 328 329feedButtons[feedButtons.length] = new feedButton( 330 'feed_audio' 331 ,' audio ' 332 ,'{audio}','' 333 ,'d' 334 ,'Insert audio' 335 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_audio.svg') 336 ,'' 337 ); // special case 338 339 340feedButtons[feedButtons.length] = new feedButton( 341 'feed_video' 342 ,' video ' 343 ,'{video}','' 344 ,'v' 345 ,'Get or upload a video' 346 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_video.svg') 347 ,'' 348 ); // special case 349 350//function feedButton(id, display, tagStart, tagEnd, access, tit, img, open) { 351 352feedButtons[feedButtons.length] = new feedButton( 353 'files' 354 ,' files ' 355 ,'','' 356 ,'v' 357 ,'Upload a file' 358 ,Cargo.Location.GetPathAbs('/_gfx/svg/toolbar_files.svg') 359 ,'' 360 ); // special case 361 362 363function feedLink() { 364 this.display = ''; 365 this.URL = ''; 366 this.newWin = 0; 367} 368 369function feedShowButton(key, button, i) { 370 var content; 371 if (button.id == 'feed_link') { 372 content = ('<a href="javascript:feedInsertLink(getCanvas(\''+key+'\'), ' + i + ');" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 373 } else if (button.id == 'feed_fullscreen') { 374 content = ('<a href="javascript:feedInsertContent(getCanvas(\''+key+'\'), \'' + feedButtons[i].tagStart + '\');" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 375 } else if (button.id == 'feed_slide') { 376 content = ('<a href="javascript:feedInsertTag(getCanvas(\''+key+'\'), ' + i + ');" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 377 } else if (button.id == 'feed_video') { 378 content = ('<a href="javascript:feedInsertVideo(getCanvas(\''+key+'\'), ' + i + ');" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 379 } else if(button.id == 'feed_audio') { 380 content = ('<a href="javascript:feedInsertAudio(getCanvas(\''+key+'\'), ' + i + ');" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 381 } else if(button.id == 'files') { 382 content = ('<a href="javascript:toggleFiles();" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 383 } else { 384 content = ('<a href="javascript:feedInsertTag(getCanvas(\''+key+'\'), ' + i + ');" onfocus="this.blur()" title="' + button.tit + '"/><img src="' + button.img + '" border="0" /></a>'); 385 } 386 return content; 387} 388 389function toggleFiles() { 390 $('#post_files').toggle(); 391 // return false; 392} 393 394function feedAddTag(button) { 395 if (feedButtons[button].tagEnd != '') { 396 feedOpenTags[feedOpenTags.length] = button; 397 } 398} 399 400function feedRemoveTag(button) { 401 for (i = 0; i < feedOpenTags.length; i++) { 402 if (feedOpenTags[i] == button) { 403 feedOpenTags.splice(i, 1); 404 } 405 } 406} 407 408function feedCheckOpenTags(button) { 409 var tag = 0; 410 for (i = 0; i < feedOpenTags.length; i++) { 411 if (feedOpenTags[i] == button) { 412 tag++; 413 } 414 } 415 if (tag > 0) { 416 return true; // tag found 417 } 418 else { 419 return false; // tag not found 420 } 421} 422 423function feedCloseAllTags() { 424 var count = feedOpenTags.length; 425 for (o = 0; o < count; o++) { 426 feedInsertTag(feedCanvas, feedOpenTags[feedOpenTags.length - 1]); 427 } 428} 429/** 430 * @depcrecated use constructor below 431 */ 432function feedToolbar() { 433 //console.log("feedToolbar"); 434 feedCanvases["default"] = document.getElementById('description'); 435 for (var i = 0; i < feedButtons.length; i++) { 436 feedShowButton("default", feedButtons[i], i); 437 } 438} 439function feedToolbarUnique(key, canvas, toolbar) { 440 //console.log("feedToolbarUnique: " + key); 441 feedCanvases[key] = canvas; 442 feedToolbars[key] = toolbar; 443 var contentstr = ""; 444 for (var i = 0; i < feedButtons.length; i++) { 445 contentstr += feedShowButton(key, feedButtons[i], i); 446 } 447 toolbar.innerHTML = contentstr; 448} 449 450// insertion code 451function feedInsertTag(myField, i) 452{ 453 //IE support 454 if (document.selection) 455 { 456 myField.focus(); 457 sel = document.selection.createRange(); 458 if (sel.text.length > 0) { 459 sel.text = feedButtons[i].tagStart + sel.text + feedButtons[i].tagEnd; 460 } 461 else { 462 sel.text = feedButtons[i].tagStart + feedButtons[i].tagEnd; 463 feedAddTag(i); 464 } 465 myField.focus(); 466 } 467 //MOZILLA/NETSCAPE support 468 else if (myField.selectionStart || myField.selectionStart == '0') 469 { 470 var startPos = myField.selectionStart; 471 var endPos = myField.selectionEnd;
472 var cursorPos = endPos; 473 474 var scrollTop, scrollLeft; 475 if( myField.type == 'textarea' && typeof myField.scrollTop != 'undefined' ) 476 { // remember old position 477 scrollTop = myField.scrollTop; 478 scrollLeft = myField.scrollLeft; 479 } 480 481 if (startPos != endPos) 482 { // some text selected 483 myField.value = myField.value.substring(0, startPos) 484 + feedButtons[i].tagStart 485 + myField.value.substring(startPos, endPos) 486 + feedButtons[i].tagEnd 487 + myField.value.substring(endPos, myField.value.length); 488 cursorPos += feedButtons[i].tagStart.length + feedButtons[i].tagEnd.length; 489 } 490 else { 491 myField.value = myField.value.substring(0, startPos) 492 + feedButtons[i].tagStart + feedButtons[i].tagEnd 493 + myField.value.substring(endPos, myField.value.length); 494 feedRemoveTag(i); 495 cursorPos = startPos + feedButtons[i].tagStart.length; 496 } 497 498 if( typeof scrollTop != 'undefined' ) 499 { // scroll to old position 500 myField.scrollTop = scrollTop; 501 myField.scrollLeft = scrollLeft; 502 } 503 504 myField.focus(); 505 myField.selectionStart = cursorPos; 506 myField.selectionEnd = cursorPos; 507 } 508 else 509 { // Browser not especially supported 510 myField.value += feedButtons[i].tagStart + feedButtons[i].tagEnd; 511 feedRemoveTag(i); 512 myField.focus(); 513 } 514 515 CargoAdmin.LivePreview.Preview(); 516} 517 518function feedInsertContent(myField, myValue) { 519 //IE support 520 if (document.selection) { 521 myField.focus(); 522 sel = document.selection.createRange(); 523 sel.text = myValue; 524 myField.focus(); 525 } 526 //MOZILLA/NETSCAPE support 527 else if (myField.selectionStart || myField.selectionStart == '0') { 528 var startPos = myField.selectionStart; 529 var endPos = myField.selectionEnd; 530 myField.value = myField.value.substring(0, startPos) 531 + myValue 532 + myField.value.substring(endPos, myField.value.length); 533 myField.focus(); 534 myField.selectionStart = startPos + myValue.length; 535 myField.selectionEnd = startPos + myValue.length; 536 } else { 537 myField.value += myValue; 538 myField.focus(); 539 } 540 541 CargoAdmin.LivePreview.Preview(); 542} 543 544function feedInsertLink(myField, i, defaultValue) { 545 if (!defaultValue) { 546 defaultValue = 'http://'; 547 } 548 if (!feedCheckOpenTags(i)) { 549 var URL = prompt('URL:' ,defaultValue); 550 if (URL) { 551 feedButtons[i].tagStart = '<a href="' + URL + '" target="_blank">'; 552 feedInsertTag(myField, i); 553 } 554 } 555 else { 556 feedInsertTag(myField, i); 557 } 558 559 CargoAdmin.LivePreview.Preview(); 560} 561 562function feedInsertAudio(myField, i, defaultValue) { 563 if (!defaultValue) { 564 defaultValue = 'http://example.com/example.mp3'; 565 } 566 if (!feedCheckOpenTags(i)) { 567 var URL = prompt('Enter URL to external MP3 file:' ,defaultValue); 568 if (URL) { 569 if(URL == defaultValue) URL = ""; 570 feedButtons[i].tagStart = '{audio=' + URL + '}'; 571 feedInsertTag(myField, i); 572 } 573 } 574 else { 575 feedInsertTag(myField, i); 576 } 577 578 CargoAdmin.LivePreview.Preview(); 579} 580 581function feedInsertVideo(myField, i, defaultValue) { 582 if (!defaultValue) { 583 defaultValue = 'http://example.com/example.mov'; 584 } 585 if (!feedCheckOpenTags(i)) { 586 var URL = prompt('Enter URL to external Video file: (QT H.264 or FLV)' ,defaultValue); 587 if (URL) { 588 if(isUrl(URL)) { 589 if(URL == defaultValue) URL = ""; 590 feedButtons[i].tagStart = '{video=' + URL; 591 feedButtons[i].tagStart += ' width=640 height=360'; 592 feedButtons[i].tagStart += ' poster=https://cargocollective.com/example/posterframe.jpg'; 593 feedButtons[i].tagStart += '}'; 594 feedInsertTag(myField, i); 595 596 } else { 597 feedButtons[i].tagStart = URL; 598 feedInsertTag(myField, i); 599 } 600 } 601 } 602 else { 603 feedInsertTag(myField, i); 604 } 605 606 CargoAdmin.LivePreview.Preview(); 607} 608 609function isUrl(s) { 610 if (/(http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/.test(s) && s.indexOf("http://") < 2) { 611 return true; 612 } 613 614 return false; 615} 616 617 618////////////////////////////////////////////////////////////////////////// 619////////////////////////////////////////////////////////////////////////// 620 621function addCategory(myField,cat) { 622 var lastChar = myField.value.charAt(myField.value.length-1); 623 var secLastChar = myField.value.charAt(myField.value.length-2); 624 //IE support 625 if (document.selection) { 626 myField.focus();
627 if(myField.value == 'Separate with commas') myField.value = cat; 628 else if(lastChar == ',') myField.value += ' ' + cat; 629 else if(secLastChar == ',') myField.value += cat; 630 else myField.value += ', ' + cat; 631 } 632 //MOZILLA/NETSCAPE support 633 else if (myField.selectionStart || myField.selectionStart == '0') { 634 var startPos = myField.selectionStart; 635 var endPos = myField.selectionEnd; 636 if(myField.value == 'Separate with commas') myField.value = cat; 637 else if(lastChar == ',') { 638 myField.value = myField.value.substring(0, startPos) 639 + ' ' + cat 640 + myField.value.substring(endPos, myField.value.length); 641 } else if(secLastChar == ',') { 642 myField.value = myField.value.substring(0, startPos) 643 + ' ' + cat 644 + myField.value.substring(endPos, myField.value.length); 645 } else { 646 myField.value = myField.value.substring(0, startPos) 647 + ', ' + cat 648 + myField.value.substring(endPos, myField.value.length); 649 } 650 myField.focus(); 651 myField.selectionStart = startPos + myValue.length; 652 myField.selectionEnd = startPos + myValue.length; 653 } else { 654 if(myField.value == 'Separate with commas') myField.value = cat; 655 else if(lastChar == ',') myField.value += ' ' + cat; 656 else if(secLastChar == ',') myField.value += cat; 657 else myField.value += ', ' + cat; 658 } 659} 660 661 662////////////////////////////////////////////////////////////////////////// 663////////////////////////////////////////////////////////////////////////// 664/** 665 * This function is used to add support for multiple text areas on the page 666 */ 667function getCanvas(key) { 668 var c = feedCanvases[key]; 669 if(c === undefined) { 670 c = feedCanvases["default"] || undefined; 671 } 672 return c; 673}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.