Subversion Repositories DevTools

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5048 dpurdie 1
/**
2
 * jQuery Form Validator Module: File
3
 * ------------------------------------------
4
 * Created by Victor Jonsson <http://www.victorjonsson.se>
5
 *
6
 * The following validators will be added by this module:
7
 *  - mime type
8
 *  - file size
9
 *  - file extension
10
 *
11
 * @website http://formvalidator.net/
12
 * @license Dual licensed under the MIT or GPL Version 2 licenses
13
 * @version 2.2.beta.69
14
 */
15
(function($, window) {
16
 
17
    'use strict';
18
 
19
    var SUPPORTS_FILE_READER = typeof window.FileReader != 'undefined',
20
 
21
        /**
22
         * @return {Array}
23
         */
24
            _getTypes = function($input) {
25
            var allowedTypes = $.split( ($input.valAttr('allowing') || '').toLowerCase() );
26
 
27
            if( $.inArray('jpg', allowedTypes) > -1 && $.inArray('jpeg', allowedTypes) == -1)
28
                allowedTypes.push('jpeg');
29
            else if( $.inArray('jpeg', allowedTypes) > -1 && $.inArray('jpg', allowedTypes) == -1)
30
                allowedTypes.push('jpg');
31
            return allowedTypes;
32
        },
33
 
34
        /**
35
         * @param {Object} obj
36
         * @param {String} key
37
         * @param {String} insert
38
         * @param {Object} lang
39
         */
40
            _generateErrorMsg = function(obj, key, insert, lang) {
41
            var msg = lang[key];
42
            obj.errorMessageKey = ''; // only use message attached to this object
43
            obj.errorMessage = msg.replace('\%s', insert);
44
        },
45
 
46
        /**
47
         * @param {String} msg
48
         */
49
            _log = function(msg) {
50
            if( window.console && window.console.log ) {
51
                window.console.log(msg);
52
            }
53
        };
54
 
55
    /*
56
     * Validate mime type (falls back on validate_extension in older browsers)
57
     */
58
    $.formUtils.addValidator({
59
        name : 'mime',
60
        validatorFunction : function(str, $input, conf, language) {
61
 
62
            if( SUPPORTS_FILE_READER ) {
63
                var valid = true,
64
                    files = $input.get(0).files || [],
65
                    mime = '',
66
                    allowedTypes = _getTypes($input);
67
 
68
                if( files.length ) {
69
                    $.each(files, function(i, file) {
70
                        valid = false;
71
                        mime = file.type || '';
72
                        $.each(allowedTypes, function(j, type) {
73
                            valid = mime.indexOf(type) > -1;
74
                            if( valid ) {
75
                                return false;
76
                            }
77
                        });
78
                        return valid;
79
                    });
80
 
81
                    if( !valid ) {
82
                        _log('Trying to upload a file with mime type '+mime+' which is not allowed');
83
                        _generateErrorMsg(this, 'wrongFileType', allowedTypes.join(', '), language);
84
                    }
85
                }
86
 
87
                return valid;
88
 
89
            } else {
90
                _log('FileReader not supported by browser, will check file extension');
91
                return $.formUtils.validators.validate_extension.validatorFunction(str, $input);
92
            }
93
        },
94
        errorMessage : '',
95
        errorMessageKey: 'wrongFileType'
96
    });
97
 
98
    /**
99
     * Validate file extension
100
     */
101
    $.formUtils.addValidator({
102
        name : 'extension',
103
        validatorFunction : function(value, $input, conf, language) {
104
            var valid = true,
105
                _this = this,
106
                allowedTypes = _getTypes($input);
107
 
108
            $.each($input.get(0).files || [value], function(i, file) {
109
                var val = typeof file == 'string' ? file : (file.value || file.fileName || file.name),
110
                    ext = val.substr( val.lastIndexOf('.')+1 );
111
 
112
                if( $.inArray(ext.toLowerCase(), allowedTypes) == -1 ) {
113
                    valid = false;
114
                    _generateErrorMsg(_this, 'wrongFileType', allowedTypes.join(', '), language);
115
                    return false;
116
                }
117
            });
118
            return valid;
119
        },
120
        errorMessage : '',
121
        errorMessageKey: 'wrongFileType'
122
    });
123
 
124
    /**
125
     * Validate file size
126
     */
127
    $.formUtils.addValidator({
128
        name : 'size',
129
        validatorFunction : function(val, $input, conf, language) {
130
            var maxSize = $input.valAttr('max-size');
131
            if( !maxSize ) {
132
                _log('Input "'+$input.attr('name')+'" is missing data-validation-max-size attribute');
133
                return true;
134
            } else if( !SUPPORTS_FILE_READER ) {
135
                return true; // no fallback available
136
            }
137
 
138
            var maxBytes = $.formUtils.convertSizeNameToBytes(maxSize),
139
                valid = true;
140
 
141
            $.each($input.get(0).files || [], function(i, file) {
142
                valid = file.size <= maxBytes;
143
                return valid;
144
            });
145
 
146
            if( !valid ) {
147
                _generateErrorMsg(this, 'wrongFileSize', maxSize, language);
148
            }
149
            return valid;
150
        },
151
        errorMessage : '',
152
        errorMessageKey: 'wrongFileSize'
153
    });
154
 
155
    /**
156
     * Make this function accessible via formUtils for unit tests
157
     * @param {String} sizeName
158
     * @return {Number}
159
     */
160
    $.formUtils.convertSizeNameToBytes = function(sizeName) {
161
        sizeName = sizeName.toUpperCase();
162
        if( sizeName.substr(sizeName.length-1, 1) == 'M' ) {
163
            return parseInt(sizeName.substr(0, sizeName.length-1), 10) * 1024 * 1024;
164
        } else if( sizeName.substr(sizeName.length-2, 2) == 'MB' ) {
165
            return parseInt(sizeName.substr(0, sizeName.length-2), 10) * 1024 * 1024;
166
        } else if( sizeName.substr(sizeName.length-2, 2) == 'KB' ) {
167
            return parseInt(sizeName.substr(0, sizeName.length-2), 10) * 1024;
168
        } else if( sizeName.substr(sizeName.length-1, 1) == 'B' ) {
169
            return parseInt(sizeName.substr(0, sizeName.length-1), 10);
170
        } else {
171
            return parseInt(sizeName, 10);
172
        }
173
    };
174
 
175
    /*
176
     * This event listener will remove error messages for file
177
     * inputs when file changes
178
     */
179
    $(window).one('validatorsLoaded formValidationSetup', function(evt, $form) {
180
        var $inputs;
181
        if( $form ) {
182
            $inputs = $form.find('input[type="file"]');
183
        } else {
184
            $inputs = $('input[type="file"]');
185
        }
186
 
187
        $inputs.filter('*[data-validation]').bind('change', function() {
188
            $(this)
189
                .removeClass('error')
190
                .parent()
191
                .find('.form-error').remove();
192
        });
193
    });
194
 
195
})(jQuery, window);