1/* 2--- 3 4script: Element.Forms.js 5 6name: Element.Forms 7 8description: Extends the Element native object to include methods useful in managing inputs. 9 10license: MIT-style license 11 12authors: 13 - Aaron Newton 14 15requires: 16 - Core/Element 17 - String.Extras 18 - MooTools.More 19 20provides: [Element.Forms] 21 22... 23*/ 24 25Element.implement({ 26 27 tidy: function(){ 28 this.set('value', this.get('value').tidy()); 29 }, 30 31 getTextInRange: function(start, end){ 32 return this.get('value').substring(start, end); 33 }, 34 35 getSelectedText: function(){ 36 if (this.setSelectionRange) return this.getTextInRange(this.getSelectionStart(), this.getSelectionEnd()); 37 return document.selection.createRange().text; 38 }, 39 40 getSelectedRange: function(){ 41 if (this.selectionStart != null){ 42 return { 43 start: this.selectionStart, 44 end: this.selectionEnd 45 }; 46 } 47 48 var pos = { 49 start: 0, 50 end: 0 51 }; 52 var range = this.getDocument().selection.createRange(); 53 if (!range || range.parentElement() != this) return pos; 54 var duplicate = range.duplicate(); 55 56 if (this.type == 'text'){ 57 pos.start = 0 - duplicate.moveStart('character', -100000); 58 pos.end = pos.start + range.text.length; 59 } else { 60 var value = this.get('value'); 61 var offset = value.length; 62 duplicate.moveToElementText(this); 63 duplicate.setEndPoint('StartToEnd', range); 64 if (duplicate.text.length) offset -= value.match(/[\n\r]*$/)[0].length; 65 pos.end = offset - duplicate.text.length; 66 duplicate.setEndPoint('StartToStart', range); 67 pos.start = offset - duplicate.text.length; 68 } 69 return pos; 70 }, 71 72 getSelectionStart: function(){ 73 return this.getSelectedRange().start; 74 }, 75 76 getSelectionEnd: function(){ 77 return this.getSelectedRange().end; 78 }, 79 80 setCaretPosition: function(pos){ 81 if (pos == 'end') pos = this.get('value').length; 82 this.selectRange(pos, pos); 83 return this; 84 }, 85 86 getCaretPosition: function(){ 87 return this.getSelectedRange().start; 88 }, 89 90 selectRange: function(start, end){ 91 if (this.setSelectionRange){ 92 this.focus(); 93 this.setSelectionRange(start, end); 94 } else { 95 var value = this.get('value'); 96 var diff = value.substr(start, end - start).replace(/\r/g, '').length; 97 start = value.substr(0, start).replace(/\r/g, '').length; 98 var range = this.createTextRange(); 99 range.collapse(true); 100 range.moveEnd('character', start + diff); 101 range.moveStart('character', start); 102 range.select(); 103 } 104 return this; 105 }, 106 107 insertAtCursor: function(value, select){ 108 var pos = this.getSelectedRange(); 109 var text = this.get('value'); 110 this.set('value', text.substring(0, pos.start) + value + text.substring(pos.end, text.length)); 111 if (select !== false) this.selectRange(pos.start, pos.start + value.length); 112 else this.setCaretPosition(pos.start + value.length); 113 return this; 114 }, 115 116 insertAroundCursor: function(options, select){ 117 options = Object.append({ 118 before: '', 119 defaultMiddle: '', 120 after: '' 121 }, options); 122 123 var value = this.getSelectedText() || options.defaultMiddle; 124 var pos = this.getSelectedRange(); 125 var text = this.get('value'); 126 127 if (pos.start == pos.end){ 128 this.set('value', text.substring(0, pos.start) + options.before + value + options.after + text.substring(pos.end, text.length)); 129 this.selectRange(pos.start + options.before.length, pos.end + options.before.length + value.length); 130 } else { 131 var current = text.substring(pos.start, pos.end); 132 this.set('value', text.substring(0, pos.start) + options.before + current + options.after + text.substring(pos.end, text.length)); 133 var selStart = pos.start + options.before.length; 134 if (select !== false) this.selectRange(selStart, selStart + current.length); 135 else this.setCaretPosition(selStart + text.length); 136 } 137 return this; 138 } 139 140});
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.