/* * bootstrap-filestyle * doc: http://dev.tudosobreweb.com.br/bootstrap-filestyle/ * github: https://github.com/markusslima/bootstrap-filestyle * * Copyright (c) 2014 Markus Vinicius da Silva Lima * Version 1.1.0 * Licensed under the MIT license. */ (function ($) { "use strict"; var Filestyle = function (element, options) { this.options = options; this.$elementFilestyle = []; this.$element = $(element); }; Filestyle.prototype = { clear: function () { this.$element.val(''); this.$elementFilestyle.find(':text').val(''); }, destroy: function () { this.$element .removeAttr('style') .removeData('filestyle') .val(''); this.$elementFilestyle.remove(); }, disabled: function (value) { if (value === true) { if (!this.options.disabled) { this.$element .attr('disabled', 'true'); this.$elementFilestyle.find('label').attr('disabled', 'true'); this.options.disabled = true; } } else if (value === false) { if (this.options.disabled) { this.$element .removeAttr('disabled'); this.$elementFilestyle.find('label').removeAttr('disabled'); this.options.disabled = false; } } else { return this.options.disabled; } }, buttonBefore: function (value) { if (value === true) { if (!this.options.buttonBefore) { this.options.buttonBefore = true; if (this.options.input) { this.$elementFilestyle.remove(); this.constructor(); this.pushNameFiles(); } } } else if (value === false) { if (this.options.buttonBefore) { this.options.buttonBefore = false; if (this.options.input) { this.$elementFilestyle.remove(); this.constructor(); this.pushNameFiles(); } } } else { return this.options.buttonBefore; } }, icon: function (value) { if (value === true) { if (!this.options.icon) { this.options.icon = true; this.$elementFilestyle.find('label').prepend(this.htmlIcon()); } } else if (value === false) { if (this.options.icon) { this.options.icon = false; this.$elementFilestyle.find('.glyphicon').remove(); } } else { return this.options.icon; } }, input: function (value) { if (value === true) { if (!this.options.input) { this.options.input = true; if (this.options.buttonBefore) { this.$elementFilestyle.append(this.htmlInput()); } else { this.$elementFilestyle.prepend(this.htmlInput()); } this.$elementFilestyle.find('.badge').remove(); var content = '', files = []; if (this.$element[0].files === undefined) { files[0] = {'name': this.$element[0].value}; } else { files = this.$element[0].files; } for (var i = 0; i < files.length; i++) { content += files[i].name.split("\\").pop() + ', '; } if (content !== '') { this.$elementFilestyle.find(':text').val(content.replace(/\, $/g, '')); } this.$elementFilestyle.find('.group-span-filestyle').addClass('input-group-btn'); } } else if (value === false) { if (this.options.input) { this.options.input = false; this.$elementFilestyle.find(':text').remove(); var files = []; if (this.$element[0].files === undefined) { files[0] = {'name': this.$element[0].value}; } else { files = this.$element[0].files; } if (files.length > 0) { this.$elementFilestyle.find('label').append(' <span class="badge">'+files.length+'</span>'); } this.$elementFilestyle.find('.group-span-filestyle').removeClass('input-group-btn'); } } else { return this.options.input; } }, size: function (value) { if (value !== undefined) { var btn = this.$elementFilestyle.find('label'), input = this.$elementFilestyle.find('input'); btn.removeClass('btn-lg btn-sm'); input.removeClass('input-lg input-sm'); if (value != 'nr') { btn.addClass('btn-'+value); input.addClass('input-'+value); } } else { return this.options.size; } }, buttonText: function (value) { if (value !== undefined) { this.options.buttonText = value; this.$elementFilestyle.find('label span').html(this.options.buttonText); } else { return this.options.buttonText; } }, buttonName: function (value) { if (value !== undefined) { this.options.buttonName = value; this.$elementFilestyle.find('label').attr({'class': 'btn '+this.options.buttonName}); } else { return this.options.buttonName; } }, iconName: function (value) { if (value !== undefined) { this.$elementFilestyle.find('.glyphicon').attr({'class': '.glyphicon ' + this.options.iconName}); } else { return this.options.iconName; } }, htmlIcon: function () { if (this.options.icon) { return '<span class="glyphicon '+this.options.iconName+'"></span> '; } else { return ''; } }, htmlInput: function () { if (this.options.input) { return '<input type="text" class="form-control '+(this.options.size=='nr'?'':'input-'+this.options.size)+'" disabled> '; } else { return ''; } }, // puts the name of the input files pushNameFiles: function () { var content = '', files = []; if (this.$element[0].files === undefined) { files[0] = {'name': this.$element.value}; } else { files = this.$element[0].files; } for (var i = 0; i < files.length; i++) { content += files[i].name.split("\\").pop() + ', '; } if (content !== '') { this.$elementFilestyle.find(':text').val(content.replace(/\, $/g, '')); } else { this.$elementFilestyle.find(':text').val(''); } }, constructor: function () { var _self = this, html = '', id = this.$element.attr('id'), files = [], btn = '', $label, $labelFocusableContainer; if (id === '' || !id) { id = 'filestyle-'+$('.bootstrap-filestyle').length; this.$element.attr({'id': id}); } btn = '<span class="group-span-filestyle '+(this.options.input ? 'input-group-btn' : '') +'">'+ '<label for="'+id+'" class="btn '+this.options.buttonName+' '+(this.options.size=='nr'?'':'btn-'+this.options.size)+'" '+(this.options.disabled?'disabled="true"':'')+'>'+ this.htmlIcon()+this.options.buttonText+ '</label>'+ '</span>'; html = this.options.buttonBefore ? btn+this.htmlInput() : this.htmlInput()+btn; this.$elementFilestyle = $('<div class="bootstrap-filestyle input-group">'+html+'</div>'); $label = this.$elementFilestyle.find('label'); $labelFocusableContainer = $label.parent(); $labelFocusableContainer .attr('tabindex', "0") .keypress(function(e) { if (e.keyCode === 13 || e.charCode === 32) { $label.click(); } }); // hidding input file and add filestyle this.$element .css({'position':'absolute','clip':'rect(0,0,0,0)'}) .attr('tabindex', "-1") .after(this.$elementFilestyle); if (this.options.disabled) { this.$element.attr('disabled', 'true'); } // Getting input file value this.$element.change(function () { var content = ''; if (this.files === undefined) { files[0] = {'name': this.value}; } else { files = this.files; } for (var i = 0; i < files.length; i++) { content += files[i].name.split("\\").pop() + ', '; } if (content !== '') { _self.$elementFilestyle.find(':text').val(content.replace(/\, $/g, '')); } else { _self.$elementFilestyle.find(':text').val(''); } if (_self.options.input == false) { if (_self.$elementFilestyle.find('.badge').length == 0) { _self.$elementFilestyle.find('label').append(' <span class="badge">'+files.length+'</span>'); } else if (files.length == 0) { _self.$elementFilestyle.find('.badge').remove(); } else { _self.$elementFilestyle.find('.badge').html(files.length); } } else { _self.$elementFilestyle.find('.badge').remove(); } }); // Check if browser is Firefox if (window.navigator.userAgent.search(/firefox/i) > -1) { // Simulating choose file for firefox this.$elementFilestyle.find('label').click(function () { _self.$element.click(); return false; }); } } }; var old = $.fn.filestyle; $.fn.filestyle = function (option, value) { var get = '', element = this.each(function () { if ($(this).attr('type') === 'file') { var $this = $(this), data = $this.data('filestyle'), options = $.extend({}, $.fn.filestyle.defaults, option, typeof option === 'object' && option); if (!data) { $this.data('filestyle', (data = new Filestyle(this, options))); data.constructor(); } if (typeof option === 'string') { get = data[option](value); } } }); if (typeof get !== undefined) { return get; } else { return element; } }; $.fn.filestyle.defaults = { 'buttonText': 'Choose file', 'iconName': 'glyphicon-folder-open', 'buttonName': 'btn-default', 'size': 'nr', 'input': true, 'icon': true, 'buttonBefore': false, 'disabled': false }; $.fn.filestyle.noConflict = function () { $.fn.filestyle = old; return this; }; // Data attributes register $(function() { $('.filestyle').each(function () { var $this = $(this), options = { 'input': $this.attr('data-input') === 'false' ? false : true, 'icon': $this.attr('data-icon') === 'false' ? false : true, 'buttonBefore': $this.attr('data-buttonBefore') === 'true' ? true : false, 'disabled': $this.attr('data-disabled') === 'true' ? true : false, 'size': $this.attr('data-size'), 'buttonText': $this.attr('data-buttonText'), 'buttonName': $this.attr('data-buttonName'), 'iconName': $this.attr('data-iconName') }; $this.filestyle(options); }); }); })(window.jQuery);