1'use strict'; 2 3(function() { 4 function FileUpload(o) { 5 var element; 6 var $element; 7 var wrapper; 8 var $wrapper; 9 var remove; 10 var label; 11 12 var self = this; 13 14 function __construct(o) { 15 element = o.element || document.getElementById(o.id); 16 if(!element) { throw 'FileUpload: invalid element'; } 17 18 create_control(); 19 20 init_observer(); 21 22 element.addEventListener('change', element_change, false); 23 remove.addEventListener('click', remove_click, false); 24 } 25 26 function create_control() { 27 var id = element.id; 28 29 if('' === id) { 30 id = 'file_' + uuidv4(); 31 element.id = id; 32 } 33 34 var class_name = '' === element.className ? '' : ' ' + element.className; 35 var style_attr = element.attributes['style']; 36 var style = !style_attr ? '' : style_attr.value; 37 38 element.removeAttribute('style'); 39 element.removeAttribute['class']; 40 $element = $(element); 41 42 wrapper = create_unselectable_element('label'); 43 wrapper.className = 'file' + class_name; 44 wrapper.setAttribute('style', style); 45 wrapper.for = id; 46 47 $wrapper = $(wrapper); 48 49 remove = create_unselectable_element('a'); 50 remove.className = 'remove'; 51 wrapper.appendChild(remove); 52 53 label = create_unselectable_element('span'); 54 label.title = 'Select...'; 55 label.innerHTML = 'Select....'; 56 wrapper.appendChild(label); 57 58 element.parentNode.insertBefore(wrapper, element.nextSibling); 59 wrapper.insertBefore(element, wrapper.childNodes[1]); 60 } 61 62 function element_change(e) { 63 var arr = ('' + element.value).replace(/\\/g, '/').split('/'); 64 var file = arr[arr.length - 1].trim(); 65 if('' === file) { 66 $wrapper.removeClass('on'); 67 file = 'Select...'; 68 } else { 69 $wrapper.addClass('on'); 70 } 71 72 label.innerHTML = file; 73 label.title = file; 74 } 75 76 function remove_click(e) { 77 e.preventDefault(); 78 79 element.value = ''; 80 $wrapper.removeClass('on'); 81 label.innerHTML = 'Select...'; 82 label.title = 'Select...'; 83 84 return false; 85 } 86 87 function init_observer() { 88 if(!window.MutationObserver) { 89 setInterval(update_attributes, 100); 90 } else { 91 var o = new MutationObserver(function(m_arr, o) { 92 for(var i = 0, m; m = m_arr[i]; ++i) { 93 if(element !== m.target) { continue; } 94 95 if('attributes' === m.type) { 96 update_attributes(); 97 } 98 } 99 }); 100 101 o.observe(element, { attributes: true }); 102 } 103 } 104 105 function update_attributes() { 106 $wrapper.toggleClass('input-field-invalid', $element.hasClass('input-field-invalid')); 107 } 108 109 __construct(o); 110 } 111 112 HTMLInputElement.prototype.file_upload = function(o) { 113 o = o || { }; 114 o.element = this; 115 116 new FileUpload(o); 117 } 118 119 window.FileUpload = FileUpload; 120})();
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.