PageSourceSearch

https://pgrweb.go.cr/DenunciaWeb/js/jquery.MultiFile.js

js pgrweb.go.cr collected 2026-09-24 08:49:47 UTC 22,189 bytes, 538 lines download raw bytes

1/*
2 ### jQuery Multiple File Upload Plugin v1.47 - 2010-03-26 ###
3 * Home: http://www.fyneworks.com/jquery/multiple-file-upload/
4 * Code: http://code.google.com/p/jquery-multifile-plugin/
5 *
6 * Dual licensed under the MIT and GPL licenses:
7 *   http://www.opensource.org/licenses/mit-license.php
8 *   http://www.gnu.org/licenses/gpl.html
9 ###
10*/
11
12/*# AVOID COLLISIONS #*/
13; if (window.jQuery) (function ($) {
14    /*# AVOID COLLISIONS #*/
15
16    // plugin initialization
17    $.fn.MultiFile = function (options) {
18        if (this.length == 0) return this; // quick fail
19
20        // Handle API methods
21        if (typeof arguments[0] == 'string') {
22            // Perform API methods on individual elements
23            if (this.length > 1) {
24                var args = arguments;
25                return this.each(function () {
26                    $.fn.MultiFile.apply($(this), args);
27                });
28            };
29            // Invoke API method handler
30            $.fn.MultiFile[arguments[0]].apply(this, $.makeArray(arguments).slice(1) || []);
31            // Quick exit...
32            return this;
33        };
34
35        // Initialize options for this call
36        var options = $.extend(
37			{}/* new object */,
38			$.fn.MultiFile.options/* default options */,
39			options || {} /* just-in-time options */
40		);
41
42        // Empty Element Fix!!!
43        // this code will automatically intercept native form submissions
44        // and disable empty file elements
45        $('form')
46		.not('MultiFile-intercepted')
47		.addClass('MultiFile-intercepted')
48		.submit($.fn.MultiFile.disableEmpty);
49
50        //### http://plugins.jquery.com/node/1363
51        // utility method to integrate this plugin with others...
52        if ($.fn.MultiFile.options.autoIntercept) {
53            $.fn.MultiFile.intercept($.fn.MultiFile.options.autoIntercept /* array of methods to intercept */);
54            $.fn.MultiFile.options.autoIntercept = null; /* only run this once */
55        };
56
57        // loop through each matched element
58        this
59		 .not('.MultiFile-applied')
60			.addClass('MultiFile-applied')
61		.each(function () {
62		    //#####################################################################
63		    // MAIN PLUGIN FUNCTIONALITY - START
64		    //#####################################################################
65
66		    // BUG 1251 FIX: http://plugins.jquery.com/project/comments/add/1251
67		    // variable group_count would repeat itself on multiple calls to the plugin.
68		    // this would cause a conflict with multiple elements
69		    // changes scope of variable to global so id will be unique over n calls
70		    window.MultiFile = (window.MultiFile || 0) + 1;
71		    var group_count = window.MultiFile;
72
73		    // Copy parent attributes - Thanks to Jonas Wagner
74		    // we will use this one to create new input elements
75		    var MultiFile = { e: this, E: $(this), clone: $(this).clone() };
76
77		    //===
78
79		    //# USE CONFIGURATION
80		    if (typeof options == 'number') options = { max: options };
81		    var o = $.extend({},
82             $.fn.MultiFile.options,
83             options || {},
84                         ($.metadata ? MultiFile.E.metadata() : ($.meta ? MultiFile.E.data() : null)) || {}, /* metadata options */
85                                     {} /* internals */
86            );
87		    // limit number of files that can be selected?
88		    if (!(o.max > 0) /*IsNull(MultiFile.max)*/) {
89		        o.max = MultiFile.E.attr('maxlength');
90		        if (!(o.max > 0) /*IsNull(MultiFile.max)*/) {
91		            o.max = (String(MultiFile.e.className.match(/\b(max|limit)\-([0-9]+)\b/gi) || ['']).match(/[0-9]+/gi) || [''])[0];
92		            if (!(o.max > 0)) o.max = -1;
93		            else o.max = String(o.max).match(/[0-9]+/gi)[0];
94		        }
95		    };
96		    o.max = new Number(o.max);
97		    // limit extensions?
98		    o.accept = o.accept || MultiFile.E.attr('accept') || '';
99		    if (!o.accept) {
100		        o.accept = (MultiFile.e.className.match(/\b(accept\-[\w\|]+)\b/gi)) || '';
101		        o.accept = new String(o.accept).replace(/^(accept|ext)\-/i, '');
102		    };
103
104		    //===
105
106		    // APPLY CONFIGURATION
107		    $.extend(MultiFile, o || {});
108		    MultiFile.STRING = $.extend({}, $.fn.MultiFile.options.STRING, MultiFile.STRING);
109
110		    //===
111
112		    //#########################################
113		    // PRIVATE PROPERTIES/METHODS
114		    $.extend(MultiFile, {
115		        n: 0, // How many elements are currently selected?
116		        slaves: [], files: [],
117		        instanceKey: MultiFile.e.id || 'MultiFile' + String(group_count), // Instance Key?
118		        generateID: function (z) { return MultiFile.instanceKey + (z > 0 ? '_F' + String(z) : ''); },
119		        trigger: function (event, element) {
120		            var handler = MultiFile[event], value = $(element).attr('value');
121		            if (handler) {
122		                var returnValue = handler(element, value, MultiFile);
123		                if (returnValue != null) return returnValue;
124		            }
125		            return true;
126		        }
127		    });
128
129		    //===
130
131		    // Setup dynamic regular expression for extension validation
132		    // - thanks to John-Paul Bader: http://smyck.de/2006/08/11/javascript-dynamic-regular-expresions/
133		    if (String(MultiFile.accept).length > 1) {
134		        MultiFile.accept = MultiFile.accept.replace(/\W+/g, '|').replace(/^\W|\W$/g, '');
135		        MultiFile.rxAccept = new RegExp('\\.(' + (MultiFile.accept ? MultiFile.accept : '') + ')$', 'gi');
136		    };
137
138		    //===
139
140		    // Create wrapper to hold our file list
141		    MultiFile.wrapID = MultiFile.instanceKey + '_wrap'; // Wrapper ID?
142		    MultiFile.E.wrap('<div class="MultiFile-wrap" id="' + MultiFile.wrapID + '"></div>');
143		    MultiFile.wrapper = $('#' + MultiFile.wrapID + '');
144
145		    //===
146
147		    // MultiFile MUST have a name - default: file1[], file2[], file3[]
148		    MultiFile.e.name = MultiFile.e.name || 'file' + group_count + '[]';
149
150		    //===
151
152		    if (!MultiFile.list) {
153		        // Create a wrapper for the list
154		        // * OPERA BUG: NO_MODIFICATION_ALLOWED_ERR ('list' is a read-only property)
155		        // this change allows us to keep the files in the order they were selected
156		        MultiFile.wrapper.append('<div class="MultiFile-list" id="' + MultiFile.wrapID + '_list"></div>');
157		        MultiFile.list = $('#' + MultiFile.wrapID + '_list');
158		    };
159		    MultiFile.list = $(MultiFile.list);
160
161		    //===
162
163		    // Bind a new element
164		    MultiFile.addSlave = function (slave, slave_count) {
165		        //if(window.console) console.log('MultiFile.addSlave',slave_count);
166
167		        // Keep track of how many elements have been displayed
168		        MultiFile.n++;
169		        // Add reference to master element
170		        slave.MultiFile = MultiFile;
171
172		        // BUG FIX: http://plugins.jquery.com/node/1495
173		        // Clear identifying properties from clones
174		        if (slave_count > 0) slave.id = slave.name = '';
175
176		        // Define element's ID and name (upload components need this!)
177		        //slave.i
177d = slave.id || MultiFile.generateID(slave_count);
178		        if (slave_count > 0) slave.id = MultiFile.generateID(slave_count);
179		        //FIX for: http://code.google.com/p/jquery-multifile-plugin/issues/detail?id=23
180
181		        // 2008-Apr-29: New customizable naming convention (see url below)
182		        // http://groups.google.com/group/jquery-dev/browse_frm/thread/765c73e41b34f924#
183		        slave.name = String(MultiFile.namePattern
184                 /*master name*/.replace(/\$name/gi, $(MultiFile.clone).attr('name'))
185                 /*master id  */.replace(/\$id/gi, $(MultiFile.clone).attr('id'))
186                 /*group count*/.replace(/\$g/gi, group_count)//(group_count>0?group_count:''))
187                 /*slave count*/.replace(/\$i/gi, slave_count)//(slave_count>0?slave_count:''))
188                );
189
190		        // If we've reached maximum number, disable input slave
191		        if ((MultiFile.max > 0) && ((MultiFile.n - 1) > (MultiFile.max)))//{ // MultiFile.n Starts at 1, so subtract 1 to find true count
192		            slave.disabled = true;
193		        //};
194
195		        // Remember most recent slave
196		        MultiFile.current = MultiFile.slaves[slave_count] = slave;
197
198		        // We'll use jQuery from now on
199		        slave = $(slave);
200
201		        // Clear value
202		        slave.val('').attr('value', '')[0].value = '';
203
204		        // Stop plugin initializing on slaves
205		        slave.addClass('MultiFile-applied');
206
207		        // Triggered when a file is selected
208		        slave.change(function () {
209		            //if(window.console) console.log('MultiFile.slave.change',slave_count);
210
211		            // Lose focus to stop IE7 firing onchange again
212		            $(this).blur();
213
214		            //# Trigger Event! onFileSelect
215		            if (!MultiFile.trigger('onFileSelect', this, MultiFile)) return false;
216		            //# End Event!
217
218		            //# Retrive value of selected file from element
219		            var ERROR = '', v = String(this.value || ''/*.attr('value)*/);
220
221		            // check extension
222		            if (MultiFile.accept && v && !v.match(MultiFile.rxAccept))//{
223		                ERROR = MultiFile.STRING.denied.replace('$ext', String(v.match(/\.\w{1,4}$/gi)));
224		            //}
225		            //};
226
227		            // Disallow duplicates
228		            for (var f in MultiFile.slaves)//{
229		                if (MultiFile.slaves[f] && MultiFile.slaves[f] != this)//{
230		                    //console.log(MultiFile.slaves[f],MultiFile.slaves[f].value);
231		                    if (MultiFile.slaves[f].value == v)//{
232		                        ERROR = MultiFile.STRING.duplicate.replace('$file', v.match(/[^\/\\]+$/gi));
233		            //};
234		            //};
235		            //};
236
237		            // Create a new file input element
238		            var newEle = $(MultiFile.clone).clone();// Copy parent attributes - Thanks to Jonas Wagner
239		            //# Let's remember which input we've generated so
240		            // we can disable the empty ones before submission
241		            // See: http://plugins.jquery.com/node/1495
242		            newEle.addClass('MultiFile');
243
244		            // Handle error
245		            if (ERROR != '') {
246		                // Handle error
247		                MultiFile.error(ERROR);
248
249		                // 2007-06-24: BUG FIX - Thanks to Adrian Wróbel <adrian [dot] wrobel [at] gmail.com>
250		                // Ditch the trouble maker and add a fresh new element
251		                MultiFile.n--;
252		                MultiFile.addSlave(newEle[0], slave_count);
253		                slave.parent().prepend(newEle);
254		                slave.remove();
255		                return false;
256		            };
257
258		            // Hide this element (NB: display:none is evil!)
259		            $(this).css({ position: 'absolute', top: '-3000px' });
260
261		            // Add new element to the form
262		            slave.after(newEle);
263
264		            // Update list
265		            MultiFile.addToList(this, slave_count);
266
267		            // Bind functionality
268		            MultiFile.addSlave(newEle[0], slave_count + 1);
269
270		            //# Trigger Event! afterFileSelect
271		            if (!MultiFile.trigger('afterFileSelect', this, MultiFile)) return false;
272		            //# End Event!
273
274		        }); // slave.change()
275
276		        // Save control to element
277		        $(slave).data('MultiFile', MultiFile);
278
279		    };// MultiFile.addSlave
280		    // Bind a new element
281
282
283
284		    // Add a new file to the list
285		    MultiFile.addToList = function (slave, slave_count) {
286		        //if(window.console) console.log('MultiFile.addToList',slave_count);
287
288		        //# Trigger Event! onFileAppend
289		        if (!MultiFile.trigger('onFileAppend', slave, MultiFile)) return false;
290		        //# End Event!
291
292		        // Create label elements
293		        var
294                 r = $('<div class="MultiFile-label"></div>'),
295                 v = String(slave.value || ''/*.attr('value)*/),
296                 a = $('<span class="MultiFile-title" title="' + MultiFile.STRING.selected.replace('$file', v) + '">' + MultiFile.STRING.file.replace('$file', v.match(/[^\/\\]+$/gi)[0]) + '</span>'),
297                 b = $('<a class="MultiFile-remove" href="#' + MultiFile.wrapID + '">' + MultiFile.STRING.remove + '</a>');
298
299		        // Insert label
300		        MultiFile.list.append(
301                 r.append(b, ' ', a)
302                );
303
304		        b
305                                        .click(function () {
306
307                                            //# Trigger Event! onFileRemove
308                                            if (!MultiFile.trigger('onFileRemove', slave, MultiFile)) return false;
309                                            //# End Event!
310
311                                            MultiFile.n--;
312                                            MultiFile.current.disabled = false;
313
314                                            // Remove element, remove label, point to current
315                                            MultiFile.slaves[slave_count] = null;
316                                            $(slave).remove();
317                                            $(this).parent().remove();
318
319                                            // Show most current element again (move into view) and clear selection
320                                            $(MultiFile.current).css({ position: '', top: '' });
321                                            $(MultiFile.current).reset().val('').attr('value', '')[0].value = '';
322
323                                            //# Trigger Event! afterFileRemove
324                                            if (!MultiFile.trigger('afterFileRemove', slave, MultiFile)) return false;
325                                            //# End Event!
326
327                                            return false;
328                                        });
329
330		        //# Trigger Event! afterFileAppend
331		        if (!MultiFile.trigger('afterFileAppend', slave, MultiFile)) return false;
332		        //# End Event!
333
334		    }; // MultiFile.addToList
335		    // Add element to selected files list
336
337
338
339		    // Bind functionality to the first element
340		    if (!MultiFile.MultiFile) MultiFile.addSlave(MultiFile.e, 0);
341
342		    // Increment control count
343		    //MultiFile.I++; // using window.MultiFile
344		    MultiFile.n++;
345
346		    // Save control to element
347		    MultiFile.E.data('MultiFile', MultiFile);
348
349
350		    //#####################################################################
351		    // MAIN PLUGIN FUNCTIONALITY - END
352		    //#####################################################################
353		}); // each element
354    };
355
356    /*--------------------------------------------------------*/
357
358    /*
359		### Core functionality and API ###
360	*/
361    $.extend($.fn.MultiFile, {
362        /**
363         * This method removes all selected files
364         *
365         * Returns a jQuery collection of all affected elements.
366         *
367         * @name reset
368         * @type jQuery
369         * @cat Plugins/MultiFile
370         * @author Diego A. (http://www.fyneworks.com/)
371         *
372         * @example $.fn.MultiFile.reset();
373         */
374        reset: function () {
375            var settings = $(this).data('MultiFile');
376            //if(settings) settings.wrapper.find('a.MultiFile-remove').click();
377            if (settings) settings.list.find('a.MultiFile-remove').click();
378            return $(this);
379        },
380
381
382        /**
383         * This utility makes it easy to disable all 'empty' file elements in the document before submitting a form.
384         * It marks the affected elements so they can be easily re-enabled after the form submission or validation.
385         *
386         * Returns a jQuery collection of all affected elements.
387         *
388         * @name disableEmpty
389         * @type jQuery
390         * @cat Plugins/MultiFile
391         * @author Diego A. (http://www.fyneworks.com/)
392         *
393         * @example $.fn.MultiFile.disableEmpty();
394         * @param String class (optional) A string specifying a class to be applied to all affected elements - Default: 'mfD'.
395         */
396        disableEmpty: function (klass) {
397            klass = (typeof (klass) == 'string' ? klass : '') || 'mfD';
398            var o = [];
399            $('input:file.MultiFile').each(function () { if ($(this).val() == '') o[o.length] = this; });
400            return $(o).each(function () { this.disabled = true }).addClass(klass);
401        },
402
403
404        /**
405			* This method re-enables 'empty' file elements that were disabled (and marked) with the $.fn.MultiFile.disableEmpty method.
406			*
407			* Returns a jQuery collection of all affected elements.
408			*
409			* @name reEnableEmpty
410			* @type jQuery
411			* @cat Plugins/MultiFile
412			* @author Diego A. (http://www.fyneworks.com/)
413			*
414			* @example $.fn.MultiFile.reEnableEmpty();
415			* @param String klass (optional) A string specifying the class that was used to mark affected elements - Default: 'mfD'.
416			*/
417        reEnableEmpty: function (klass) {
418            klass = (typeof (klass) == 'string' ? klass : '') || 'mfD';
419            return $('input:file.' + klass).removeClass(klass).each(function () { this.disabled = false });
420        },
421
422
423        /**
424			* This method will intercept other jQuery plugins and disable empty file input elements prior to form submission
425			*
426	
427			* @name intercept
428			* @cat Plugins/MultiFile
429			* @author Diego A. (http://www.fyneworks.com/)
430			*
431			* @example $.fn.MultiFile.intercept();
432			* @param Array methods (optional) Array of method names to be intercepted
433			*/
434        intercepted: {},
435        intercept: function (methods, context, args) {
436            var method, value; args = args || [];
437            if (args.constructor.toString().indexOf("Array") < 0) args = [args];
438            if (typeof (methods) == 'function') {
439                $.fn.MultiFile.disableEmpty();
440                value = methods.apply(context || window, args);
441                //SEE-http://code.google.com/p/jquery-multifile-plugin/issues/detail?id=27
442                setTimeout(function () { $.fn.MultiFile.reEnableEmpty() }, 1000);
443                return value;
444            };
445            if (methods.constructor.toString().indexOf("Array") < 0) methods = [methods];
446            for (var i = 0; i < methods.length; i++) {
447                method = methods[i] + ''; // make sure that we have a STRING
448                if (method) (function (method) { // make sure that method is ISOLATED for the interception
449                    $.fn.MultiFile.intercepted[method] = $.fn[method] || function () { };
450                    $.fn[method] = function () {
451                        $.fn.MultiFile.disableEmpty();
452                        value = $.fn.MultiFile.intercepted[method].apply(this, arguments);
453                        //SEE-http://code.google.com/p/jquery-multifile-plugin/issues/detail?id=27
454                        setTimeout(function () { $.fn.MultiFile.reEnableEmpty() }, 1000);
455                        return value;
456                    }; // interception
457                })(method); // MAKE SURE THAT method IS ISOLATED for the interception
458            };// for each method
459        } // $.fn.MultiFile.intercept
460
461    });
462
463    /*--------------------------------------------------------*/
464
465    /*
466		### Default Settings ###
467		eg.: You can override default control like this:
468		$.fn.MultiFile.options.accept = 'gif|jpg';
469	*/
470    $.fn.MultiFile.options = { //$.extend($.fn.MultiFile, { options: {
471        accept: '', // accepted file extensions
472        max: -1,    // maximum number of selectable files
473
474        // name to use for newly created elements
475        namePattern: '$name', // same name by default (which creates an array)
476
477        // STRING: collection lets you show messages in different languages
478        STRING: {
479            remove: 'x',
480            denied: 'El archivo $ext no es valido.\nIntente de nuevo...',
481            file: '$file',
482            selected: 'Archivo seleccionado: $file',
483            duplicate: 'El archivo ya fue seleccionado:\n$file'
484        },
485
486        // name of methods that should be automcatically intercepted so the plugin can disable
487        // extra file elements that are empty before execution and automatically re-enable them afterwards
488        autoIntercept: ['submit', 'ajaxSubmit', 'ajaxForm', 'validate', 'valid' /* array of methods to intercept */],
489
490        // error handling function
491        error: function (s) {
492            /*
493			ERROR! blockUI is not currently working in IE
494			if($.blockUI){
495				$.blockUI({
496					message: s.replace(/\n/gi,'<br/>'),
497					css: { 
498						border:'none', padding:'15px', size:'12.0pt',
499						backgroundColor:'#900', color:'#fff',
500						opacity:'.8','-webkit-border-radius': '10px','-moz-border-radius': '10px'
501					}
502				});
503				window.setTimeout($.unblockUI, 2000);
504			}
505			else//{// save a byte!
506			*/
507            alert(s);
508            //}// save a byte!
509        }
510    }; //} });
511
512    /*--------------------------------------------------------*/
513
514    /*
515		### Additional Methods ###
516		Required functionality outside the plugin's scope
517	*/
518
519    // Native input reset method - because this alone doesn't always work: $(element).val('').attr('value', '')[0].value = '';
520    $.fn.reset = function () { return this.each(function () { try { this.reset(); } catch (e) { } }); };
521
522    /*--------------------------------------------------------*/
523
524    /*
525		### Default implementation ###
526		The plugin will attach itself to file inputs
527		with the class 'multi' when the page loads
528	*/
529    $(function () {
530        //$("input:file.multi").MultiFile();
531        $("input[type=file].multi").MultiFile();
532    });
533
534
535
536    /*# AVOID COLLISIONS #*/
537})(jQuery);
538/*# AVOID COLLISIONS #*/

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.