RIFF"WEBPVP8 Е�* �>�T�M'��%�u|�� gk�ZaQb�����o����lN���s�_�3��S+���c�€R��y����//����~��H�@�2oF�X ���R@'�:�ꞓ}��a�M,.� ��o��=�p�U�&g<�:���~���t��.�1���cyW�� We�M=�f�Y6v�����(nO���������^- �9(b _�s%{�C|�p�@�����37�}B0��u���i�Գ���� ������5�}���֮M?dz���q�e��N�~�&�N��K�av$]hO�i�C�,��"]�����@����M@�o O[�Æ*;�e]��_; }�p�?��)�'VC� J��L�y� v����18��)7c�d�mߛ�]I� ����d��?�{�.����b)49��c��Zy/��c^��%��/z�å̯�t��rS��Z��Uͩ�h��2����` �7�:��~��zP���Z����?v�R��TD���G����CJ���}�o��fs��̜#b��e"k9,���3�{Or�i��x":���{/ۈ�`�7RČ����(�p:I��%:�ͺ��W(|�=KP��3�7}���������ed��;�3�;�e��8�g�4�9 %v,B�GU�����T% ֯��B+�tR���p������F7�sT��oϱq �h�Rݧ�~*�܈_�Ck���}�nY�>��C�PQ�B��(o�६�qxy������f ���]��}����%=CW�k^t�—]����M�cX�i��%��!�Y������:N=|��wj<9ł��,�s�O�,,�U�!�������e���{���W��989�y*z�=�"E�CyW���N�2�ę��LN�HW��?����`V���DJ=#׶×ܽ$eF���o;b� ��0��&�W���Y�bR�� �Fֵ� `J�an�-Є@�tR�v��e2W��Mn�p��4P1�q ���®w���ũur*�җ.�#�4b���������:���g��ʧ�`R�4�+G�f���niU����$�K-'A�zE&]��Y�H2�4� ��˄�t��Q�4%��L�#��0FS8�Bu����ژ��"����۹�[�JK��4��z�v�ڌ��L*jD0.����?�ڃN��H��J����n�w��6Q(i;��I,.3?|�`���y���D_��(��w��������[��ZYhe�')��D*��kb����c��@� �|S�S3���- ���iq!*��w������Ł��ܩ��*FY���jV�4Q���4�,�ʑV!��N�.�1�KT,��Zp� ���iL�r��Ȧ����"y�tU���PS�ģ��?�QGng_�#yEk��B̝��1hr��ѕ�z*Ԧ�L8T�����H�^�k�-�g�z������w��N����v��RH��E��!0Cؚ)R�@�q�J�qA�r�$k4���om���Ьnu���x�������������y$�8�Z���v� &�+2�|���\r:[,!�Y�C#c��͊�{��7Щ��Y�LVę]�j��)��^���󶦙$�_����Hx>����[ +K�ڏ�1������Q�7@�^{�ik�;'H{�8 �ȇe vR����^� Meq�����Y�MC��U<��O�۫�nAfBf317���x��O�.u@3R}e�`�D��\�z���L��P������y8�?����I�"s`�b 3��ٹd�0��A�/���� ��{b�b������1� ����ka�&T�z�_4���I��PN��8��}N�r��]�՜���ӿ��9�|/.��� �fˑ.�`r�r��U-���7�Rx8L��d$H�m��Ǒ�*x�P{�D�����k��o�ueV�-.��j}���U2��g絍g���s �������aN�X�ҍ���C�� ��X��B�EF���8%p57<�x�Y�e�cϔ�\��C �OAj&N�V���!v��U��~J��j��4�V|��8�R�v�fD�)�HA�3�G��ds�7Z.���= ����+kI2�0=�'� K �H,`�ɴāTE\����E�'/��;���;��a���0"��� �x$J�T��#U=������j-�8�����y c8W����Ԋ�K��_��Y� '%Vg$I�Пq�shE�y�:�m�}�F1(:b�U�~� ���0}�C�}0����#�#}���e�S9��.��SP�m���<�~�y��� ��ɭ�ٮ6N��� ğ��t��A��N�V ������f�+�w�O1�Jq���U�B�T��į���� ��*�=z�x"yU S���� ��// ����W᫮��R�O�2W�M��<-�;�F�`9 �����t�:C{a�8�� <�r'���:�g8%�9J̞�˦��eV�7l�~�#����.yY)$��k�|�!�3���m���XS���J4B���`�����oL[]��aT[�C��@h�T�l��_�e>�����K<'��P�zgk�#fm��V�]�ݽ�j1����H��J��J58��ڱ��@�e&*�w��e���Q��HT8�ֽ��\�Fa�栆�A�ڝӚ׹@�:9`��G�h�7����t<���_˒|�\bU�O�����,M�a�oynGf�޶7�w�i`�m[��XE4�*�8}5��U1���^�B*��_%[����Yb�^���S�l�"A�1�T��ڈ��(???)j�S�n�8v%� Eo��� mE��|�Έ�Ai�3uy5O����7Rܽ���"L��X���1�@�=?5�_'��{j�����Z3L��k��^x6g3i�����r.��N��&��9[��ɓW[+�� 7�����fe�3�K�%��0F��+V�ϛ+3�B�p,y;Z�NGK�uWg䁯9�v��t��ǒx�JY�O��K�iY��#FJy�Bzt�Q^�Y��Uϲ-͖��9��g�X,�X] f�P/�]d�䠾�̔m%Q��겓\q(�%'����/EN�P�1�o��� ���}��'��c�F��Ju��4��0ck�N��w�1��&]a ��^I�)����֓��\;�1��3��� �L��{>�+���a��Jg��#����P���>�5�a<�`>>˔�]�ߎey�-T���ʵ���r���8`dmNm���_mӐK�Ҏ-޴�� ��RQ%�d�l"��l�_��ie0.�$Xh|.jv,���l\ uyj�u\�/� B:�܀�]� _��T��I���lz�&c�A�g{g��O˂�O���O�M�t��7Y�~? ቶ`�7��'�w��#���˚�\��_��� a��d���[Ҭњ��]ɢ�A$ �l�v=E�66d �WA\̬fsǭ}x;';���?�UW�O��{�&|_a�C� |ȹ��pka�|���zf[S�������[�Jcf�A�&�L�U)Pd+)�_�$1�0�z�'�v\u�' +;�!���dž�]h�N�{ku��<��a��.0�,��]q��ZKao=ILo�z�rb&�{@K�i*7nX).�/�̶��ӒU�v �B֝���a��n��تx ���P�AG7M4N�?r;Z�����7�@�wA�q��RM5�8ۭ ��g��8�g���G�Tſ�O�{2��P3r��6�W,/��kC���p�V���~�"���T���6�/<�4�U�>��T�H�Fc�T�D�^I���!�����=&\Em�>b�,|T��d���n��=@\Wzi���D��&�f���1�t�mC�Ih��m��&�������84�!H�i�|�Z���� ��W���g����8�h�B] OvQ�u����+�}n�� FE�+q�&j����I�u��&��=!��T�b�@�ք0 �D�W�W�t�V}�������^�g�Erb`j��2 �wr�\Y5��L�Ρ���_�bNU�)~�e�Z�U�*�����:�vƀu2�W-W��W{KKo0�)��G�K.��{̮���v�/��p� !�� �w;`��b ������F���/���:����I�lm��Vc�,x~m<=|�_�>n����(A�����{�膾���m�,{3 �ӀH=٘�%��[USd��!J�|�f_�/ �߻��)I%���G�ܑ�G |N������d��BU5��qvG�c,���A?!��w��� �S��-i���Fr�P�_��E�+��)��V��f��������~�����������}"sk��cHN�<� 5I�r��1gu�ݗ�,N�I��f��k�s���0��: 0�<�\ͩB�܄ �:�f2A��mҞ�Z�6��3��t�����͟~����J�R9�] �,h������Z�@�{����9��W�il!�:��P��P���wK)���p���!���KuB\�7 uI�?(���/��r3����v,\'�8��qUa�ء���!��(b��n?�YfӸ����r�$���ה�~��_�&�8g�<(Mx$ZO�������u`q��:�N�Q !�%`���h:�� �~>�D���m�^��[V!y�6=� ��m��ѡ��p4�Iꎸ��1cE��QS�ٷ��W�C����*�����Q��=��3���&���-#,åCCG�������9�i��3�C��S[t>���qm����B��s���������o��� J�^s|����r��\ԺΦ�a�{��1��wT'���� �̓Q���B��\xx}��8��Of!��U�n��f�����bA��UD�cC} �r�������c ���^�X���k�Ɩk�6��^E�C�E�sՀ`�Ⱦ,i��v�� ٺe˟�!�co�64x4��A�ah��ˏ<��%�@�*|�\�TY����#:9��|?S�[������G hUw9���z]��D��-J6�m,ʭ��2�Iz�4W9��&���t�߁ R�Z�gP��H�dj�`%ap}�^떟��*fb{�Q) Dd_V����$��,�߁� @D�&f�2��S6��M�ɤ�)Q\F�i���5p��Wb'PN�R�>�����9��]��\8{B8�� ��ю�������%� ӏۙ{]�j,_Y>��!�l���'���H�["��;c?cy��1< 0ϑ���/�AAЛ�� ; �j�(!��1 [)5ݻK ��A7��"[�%"���{��H ���V�� ���m�K���VLn��9鿹8�At΀@����f`�1y�rЅ��q��7Nf���x)y��, 0e�"{�ƨ�"� o �6� �.|Tm.���-r �G� [ed���–q���]�X�oG*�1>�� م�p_Y{δ(N�|s��^{i�`��͒ QӴx+X.ݕ�kP�g]�޿�4��Q|�O��h�*c�W�G�4{~x�k��A:�{Yu�倀#ތM�K!�e�;ȩ����r������'���D&H�$�0�ߜ�w��Sq dH��P�y����z����h��d��"�;0��#I2�F{����. W�wl���|>s�\ŌO�&bO/4(z9ܭua��`��_3d�Qpt�/�P -��#5�,�M��� �pA:©�q�����NW��ډ�A���� �9nʺج���� �TSM��{J6?7��r�@�\����D��� �׶���s�f�TJj?"��D��`?��̒� b�#�%�C*v�$�{�$����5Ծ�F�s��y�e/8��h-�f�̰&(����Gj�L:U� 2�� ����v�_k����Y��gp,�k�WF�R������_C�R��N@���R�@�ߔ?A�w9���F("iNa-S���Q�o�3tDMLh*�#4k�T/iQ��Y*�G��m����)��8�hBm/�I�,g�ﯖ���Z��}�Cz�q@´��d.����L�ŕ�,��1�Z�܌�: ̪���F+J-'��c�tvJ8��]Q-��b��y �6;*J`r_�d ��'�G ~p��)'�C,�%F��E(��2�k�����lР�z�!�=t ��_�0��f7��� ;�p�|�U �%Ace file input element. Custom, simple file input element to style browser's default file input. */ (function($ , undefined) { var multiplible = 'multiple' in document.createElement('INPUT'); var hasFileList = 'FileList' in window;//file list enabled in modern browsers var hasFileReader = 'FileReader' in window; var hasFile = 'File' in window; var Ace_File_Input = function(element , settings) { var self = this; var attrib_values = ace.helper.getAttrSettings(element, $.fn.ace_file_input.defaults); this.settings = $.extend({}, $.fn.ace_file_input.defaults, settings, attrib_values); this.$element = $(element); this.element = element; this.disabled = false; this.can_reset = true; this.$element .off('change.ace_inner_call') .on('change.ace_inner_call', function(e , ace_inner_call){ if(self.disabled) return; if(ace_inner_call === true) return;//this change event is called from above drop event and extra checkings are taken care of there return handle_on_change.call(self); //if(ret === false) e.preventDefault(); }); var parent_label = this.$element.closest('label').css({'display':'block'}) var tagName = parent_label.length == 0 ? 'label' : 'span';//if not inside a "LABEL" tag, use "LABEL" tag, otherwise use "SPAN" this.$element.wrap('<'+tagName+' class="ace-file-input" />'); this.apply_settings(); this.reset_input_field();//for firefox as it keeps selected file after refresh } Ace_File_Input.error = { 'FILE_LOAD_FAILED' : 1, 'IMAGE_LOAD_FAILED' : 2, 'THUMBNAIL_FAILED' : 3 }; Ace_File_Input.prototype.apply_settings = function() { var self = this; this.multi = this.$element.attr('multiple') && multiplible; this.well_style = this.settings.style == 'well'; if(this.well_style) this.$element.parent().addClass('ace-file-multiple'); else this.$element.parent().removeClass('ace-file-multiple'); this.$element.parent().find(':not(input[type=file])').remove();//remove all except our input, good for when changing settings this.$element.after(''+(this.settings.no_icon ? '' : '')+''); this.$label = this.$element.next(); this.$container = this.$element.closest('.ace-file-input'); var remove_btn = !!this.settings.icon_remove; if(remove_btn) { var btn = $('') .appendTo(this.$element.parent()); btn.on(ace.click_event, function(e){ e.preventDefault(); if( !self.can_reset ) return false; var ret = true; if(self.settings.before_remove) ret = self.settings.before_remove.call(self.element); if(!ret) return false; var r = self.reset_input(); return false; }); } if(this.settings.droppable && hasFileList) { enable_drop_functionality.call(this); } } Ace_File_Input.prototype.show_file_list = function($files , inner_call) { var files = typeof $files === "undefined" ? this.$element.data('ace_input_files') : $files; if(!files || files.length == 0) return; ////////////////////////////////////////////////////////////////// if(this.well_style) { this.$label.find('.ace-file-name').remove(); if(!this.settings.btn_change) this.$label.addClass('hide-placeholder'); } this.$label.attr('data-title', this.settings.btn_change).addClass('selected'); for (var i = 0; i < files.length; i++) { var filename = '', format = false; if(typeof files[i] === "string") filename = files[i]; else if(hasFile && files[i] instanceof File) filename = $.trim( files[i].name ); else if(files[i] instanceof Object && files[i].hasOwnProperty('name')) { //format & name specified by user (pre-displaying name, etc) filename = files[i].name; if(files[i].hasOwnProperty('type')) format = files[i].type; if(!files[i].hasOwnProperty('path')) files[i].path = files[i].name; } else continue; var index = filename.lastIndexOf("\\") + 1; if(index == 0)index = filename.lastIndexOf("/") + 1; filename = filename.substr(index); if(format == false) { if((/\.(jpe?g|png|gif|svg|bmp|tiff?)$/i).test(filename)) { format = 'image'; } else if((/\.(mpe?g|flv|mov|avi|swf|mp4|mkv|webm|wmv|3gp)$/i).test(filename)) { format = 'video'; } else if((/\.(mp3|ogg|wav|wma|amr|aac)$/i).test(filename)) { format = 'audio'; } else format = 'file'; } var fileIcons = { 'file' : 'fa fa-file', 'image' : 'fa fa-picture-o file-image', 'video' : 'fa fa-film file-video', 'audio' : 'fa fa-music file-audio' }; var fileIcon = fileIcons[format]; if(!this.well_style) this.$label.find('.ace-file-name').attr({'data-title':filename}).find(ace.vars['.icon']).attr('class', ace.vars['icon'] + fileIcon); else { this.$label.append(''); var type = (inner_call === true && hasFile && files[i] instanceof File) ? $.trim(files[i].type) : ''; var can_preview = hasFileReader && this.settings.thumbnail && ( (type.length > 0 && type.match('image')) || (type.length == 0 && format == 'image') )//the second one is for older Android's default browser which gives an empty text for file.type if(can_preview) { var self = this; $.when(preview_image.call(this, files[i])).fail(function(result){ //called on failure to load preview if(self.settings.preview_error) self.settings.preview_error.call(self, filename, result.code); }) } } } return true; } Ace_File_Input.prototype.reset_input = function() { this.reset_input_ui(); this.reset_input_field(); } Ace_File_Input.prototype.reset_input_ui = function() { this.$label.attr({'data-title':this.settings.btn_choose, 'class':'ace-file-container'}) .find('.ace-file-name:first').attr({'data-title':this.settings.no_file , 'class':'ace-file-name'}) .find(ace.vars['.icon']).attr('class', ace.vars['icon'] + this.settings.no_icon) .prev('img').remove(); if(!this.settings.no_icon) this.$label.find(ace.vars['.icon']).remove(); this.$label.find('.ace-file-name').not(':first').remove(); this.reset_input_data(); //if(ace.vars['old_ie']) ace.helper.redraw(this.$container[0]); } Ace_File_Input.prototype.reset_input_field = function() { //http://stackoverflow.com/questions/1043957/clearing-input-type-file-using-jquery/13351234#13351234 this.$element.wrap('
').parent().get(0).reset(); this.$element.unwrap(); //strangely when reset is called on this temporary inner form //only **IE9/10** trigger 'reset' on the outer form as well //and as we have mentioned to reset input on outer form reset //it causes infinite recusrsion by coming back to reset_input_field //thus calling reset again and again and again //so because when "reset" button of outer form is hit, file input is automatically reset //we just reset_input_ui to avoid recursion } Ace_File_Input.prototype.reset_input_data = function() { if(this.$element.data('ace_input_files')) { this.$element.removeData('ace_input_files'); this.$element.removeData('ace_input_method'); } } Ace_File_Input.prototype.enable_reset = function(can_reset) { this.can_reset = can_reset; } Ace_File_Input.prototype.disable = function() { this.disabled = true; this.$element.attr('disabled', 'disabled').addClass('disabled'); } Ace_File_Input.prototype.enable = function() { this.disabled = false; this.$element.removeAttr('disabled').removeClass('disabled'); } Ace_File_Input.prototype.files = function() { return $(this).data('ace_input_files') || null; } Ace_File_Input.prototype.method = function() { return $(this).data('ace_input_method') || ''; } Ace_File_Input.prototype.update_settings = function(new_settings) { this.settings = $.extend({}, this.settings, new_settings); this.apply_settings(); } Ace_File_Input.prototype.loading = function(is_loading) { if(is_loading === false) { this.$container.find('.ace-file-overlay').remove(); this.element.removeAttribute('readonly'); } else { var inside = typeof is_loading === 'string' ? is_loading : ''; var loader = this.$container.find('.ace-file-overlay'); if(loader.length == 0) { loader = $('
').appendTo(this.$container); loader.on('click tap', function(e) { e.stopImmediatePropagation(); e.preventDefault(); return false; }); this.element.setAttribute('readonly' , 'true');//for IE } loader.empty().append(inside); } } var enable_drop_functionality = function() { var self = this; var dropbox = this.$element.parent(); dropbox .off('dragenter') .on('dragenter', function(e){ e.preventDefault(); e.stopPropagation(); }) .off('dragover') .on('dragover', function(e){ e.preventDefault(); e.stopPropagation(); }) .off('drop') .on('drop', function(e){ e.preventDefault(); e.stopPropagation(); if(self.disabled) return; var dt = e.originalEvent.dataTransfer; var file_list = dt.files; if(!self.multi && file_list.length > 1) {//single file upload, but dragged multiple files var tmpfiles = []; tmpfiles.push(file_list[0]); file_list = tmpfiles;//keep only first file } file_list = processFiles.call(self, file_list, true);//true means files have been selected, not dropped if(file_list === false) return false; self.$element.data('ace_input_method', 'drop'); self.$element.data('ace_input_files', file_list);//save files data to be used later by user self.show_file_list(file_list , true); self.$element.triggerHandler('change' , [true]);//true means ace_inner_call return true; }); } var handle_on_change = function() { var file_list = this.element.files || [this.element.value];/** make it an array */ file_list = processFiles.call(this, file_list, false);//false means files have been selected, not dropped if(file_list === false) return false; this.$element.data('ace_input_method', 'select'); this.$element.data('ace_input_files', file_list); this.show_file_list(file_list , true); return true; } var preview_image = function(file) { var self = this; var $span = self.$label.find('.ace-file-name:last');//it should be out of onload, otherwise all onloads may target the same span because of delays var deferred = new $.Deferred; var getImage = function(src) { $span.prepend(""); var img = $span.find('img:last').get(0); $(img).one('load', function() { imgLoaded.call(null, img); }).one('error', function() { imgFailed.call(null, img); }); img.src = src; } var imgLoaded = function(img) { //if image loaded successfully var size = 50; if(self.settings.thumbnail == 'large') size = 150; else if(self.settings.thumbnail == 'fit') size = $span.width(); $span.addClass(size > 50 ? 'large' : ''); var thumb = get_thumbnail(img, size/**, file.type*/); if(thumb == null) { //if making thumbnail fails $(this).remove(); deferred.reject({code:Ace_File_Input.error['THUMBNAIL_FAILED']}); return; } var w = thumb.w, h = thumb.h; if(self.settings.thumbnail == 'small') {w=h=size;}; $(img).css({'background-image':'url('+thumb.src+')' , width:w, height:h}) .data('thumb', thumb.src) .attr({src:'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg=='}) .show() /////////////////// deferred.resolve(); } var imgFailed = function(img) { //for example when a file has image extenstion, but format is something else $span.find('img').remove(); deferred.reject({code:Ace_File_Input.error['IMAGE_LOAD_FAILED']}); } if(hasFile && file instanceof File) { var reader = new FileReader(); reader.onload = function (e) { getImage(e.target.result); } reader.onerror = function (e) { deferred.reject({code:Ace_File_Input.error['FILE_LOAD_FAILED']}); } reader.readAsDataURL(file); } else { if(file instanceof Object && file.hasOwnProperty('path')) { getImage(file.path);//file is a file name (path) --- this is used to pre-show user-selected image } } return deferred.promise(); } var get_thumbnail = function(img, size, type) { var w = img.width, h = img.height; //**IE10** is not giving correct width using img.width so we use $(img).width() w = w > 0 ? w : $(img).width() h = h > 0 ? h : $(img).height() if(w > size || h > size) { if(w > h) { h = parseInt(size/w * h); w = size; } else { w = parseInt(size/h * w); h = size; } } var dataURL try { var canvas = document.createElement('canvas'); canvas.width = w; canvas.height = h; var context = canvas.getContext('2d'); context.drawImage(img, 0, 0, img.width, img.height, 0, 0, w, h); dataURL = canvas.toDataURL(/*type == 'image/jpeg' ? type : 'image/png', 10*/) } catch(e) { dataURL = null; } if(! dataURL) return null; //there was only one image that failed in firefox completely randomly! so let's double check things if( !( /^data\:image\/(png|jpe?g|gif);base64,[0-9A-Za-z\+\/\=]+$/.test(dataURL)) ) dataURL = null; if(! dataURL) return null; return {src: dataURL, w:w, h:h}; } var processFiles = function(file_list, dropped) { var ret = checkFileList.call(this, file_list, dropped); if(ret === -1) { this.reset_input(); return false; } if( !ret || ret.length == 0 ) { if( !this.$element.data('ace_input_files') ) this.reset_input(); //if nothing selected before, reset because of the newly unacceptable (ret=false||length=0) selection //otherwise leave the previous selection intact?!!! return false; } if (ret instanceof Array || (hasFileList && ret instanceof FileList)) file_list = ret; ret = true; if(this.settings.before_change) ret = this.settings.before_change.call(this.element, file_list, dropped); if(ret === -1) { this.reset_input(); return false; } if(!ret || ret.length == 0) { if( !this.$element.data('ace_input_files') ) this.reset_input(); return false; } //inside before_change you can return a modified File Array as result if (ret instanceof Array || (hasFileList && ret instanceof FileList)) file_list = ret; return file_list; } var getExtRegex = function(ext) { if(!ext) return null; if(typeof ext === 'string') ext = [ext]; if(ext.length == 0) return null; return new RegExp("\.(?:"+ext.join('|')+")$", "i"); } var getMimeRegex = function(mime) { if(!mime) return null; if(typeof mime === 'string') mime = [mime]; if(mime.length == 0) return null; return new RegExp("^(?:"+mime.join('|').replace(/\//g, "\\/")+")$", "i"); } var checkFileList = function(files, dropped) { var allowExt = getExtRegex(this.settings.allowExt); var denyExt = getExtRegex(this.settings.denyExt); var allowMime = getMimeRegex(this.settings.allowMime); var denyMime = getMimeRegex(this.settings.denyMime); var maxSize = this.settings.maxSize || false; if( !(allowExt || denyExt || allowMime || denyMime || maxSize) ) return true;//no checking required var safe_files = []; var error_list = {} for(var f = 0; f < files.length; f++) { var file = files[f]; //file is either a string(file name) or a File object var filename = !hasFile ? file : file.name; if( allowExt && !allowExt.test(filename) ) { //extension not matching whitelist, so drop it if(!('ext' in error_list)) error_list['ext'] = []; error_list['ext'].push(filename); continue; } else if( denyExt && denyExt.test(filename) ) { //extension is matching blacklist, so drop it if(!('ext' in error_list)) error_list['ext'] = []; error_list['ext'].push(filename); continue; } var type; if( !hasFile ) { //in browsers that don't support FileReader API safe_files.push(file); continue; } else if((type = $.trim(file.type)).length > 0) { //there is a mimetype for file so let's check against are rules if( allowMime && !allowMime.test(type) ) { //mimeType is not matching whitelist, so drop it if(!('mime' in error_list)) error_list['mime'] = []; error_list['mime'].push(filename); continue; } else if( denyMime && denyMime.test(type) ) { //mimeType is matching blacklist, so drop it if(!('mime' in error_list)) error_list['mime'] = []; error_list['mime'].push(filename); continue; } } if( maxSize && file.size > maxSize ) { //file size is not acceptable if(!('size' in error_list)) error_list['size'] = []; error_list['size'].push(filename); continue; } safe_files.push(file) } if(safe_files.length == files.length) return files;//return original file list if all are valid ///////// var error_count = {'ext': 0, 'mime': 0, 'size': 0} if( 'ext' in error_list ) error_count['ext'] = error_list['ext'].length; if( 'mime' in error_list ) error_count['mime'] = error_list['mime'].length; if( 'size' in error_list ) error_count['size'] = error_list['size'].length; var event this.$element.trigger( event = new $.Event('file.error.ace'), { 'file_count': files.length, 'invalid_count' : files.length - safe_files.length, 'error_list' : error_list, 'error_count' : error_count, 'dropped': dropped } ); if ( event.isDefaultPrevented() ) return -1;//it will reset input ////////// return safe_files;//return safe_files } /////////////////////////////////////////// $.fn.aceFileInput = $.fn.ace_file_input = function (option,value) { var retval; var $set = this.each(function () { var $this = $(this); var data = $this.data('ace_file_input'); var options = typeof option === 'object' && option; if (!data) $this.data('ace_file_input', (data = new Ace_File_Input(this, options))); if (typeof option === 'string') retval = data[option](value); }); return (retval === undefined) ? $set : retval; }; $.fn.ace_file_input.defaults = { style: false, no_file: 'No File ...', no_icon: 'fa fa-upload', btn_choose: 'Choose', btn_change: 'Change', icon_remove: 'fa fa-times', droppable: false, thumbnail: false,//large, fit, small allowExt: null, denyExt: null, allowMime: null, denyMime: null, maxSize: false, //callbacks before_change: null, before_remove: null, preview_error: null } })(window.jQuery);