123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672 |
- /*
- Uniform v1.7.5
- Copyright © 2009 Josh Pyles / Pixelmatrix Design LLC
- http://pixelmatrixdesign.com
- Requires jQuery 1.4 or newer
- Much thanks to Thomas Reynolds and Buck Wilson for their help and advice on this
- Disabling text selection is made possible by Mathias Bynens <http://mathiasbynens.be/>
- and his noSelect plugin. <http://github.com/mathiasbynens/noSelect-jQuery-Plugin>
- Also, thanks to David Kaneda and Eugene Bond for their contributions to the plugin
- License:
- MIT License - http://www.opensource.org/licenses/mit-license.php
- Enjoy!
- */
- (function($) {
- $.uniform = {
- options: {
- selectClass: 'selector',
- radioClass: 'radio',
- checkboxClass: 'checker',
- fileClass: 'uploader',
- filenameClass: 'filename',
- fileBtnClass: 'action',
- fileDefaultText: 'No file selected',
- fileBtnText: 'Choose File',
- checkedClass: 'checked',
- focusClass: 'focus',
- disabledClass: 'disabled',
- buttonClass: 'button',
- activeClass: 'active',
- hoverClass: 'hover',
- useID: true,
- idPrefix: 'uniform',
- resetSelector: false,
- autoHide: true
- },
- elements: []
- };
- if($.browser.msie && $.browser.version < 7){
- $.support.selectOpacity = false;
- }else{
- $.support.selectOpacity = true;
- }
- $.fn.uniform = function(options) {
- options = $.extend($.uniform.options, options);
- var el = this;
- //code for specifying a reset button
- if(options.resetSelector != false){
- $(options.resetSelector).mouseup(function(){
- function resetThis(){
- $.uniform.update(el);
- }
- setTimeout(resetThis, 10);
- });
- }
-
- function doInput(elem){
- $el = $(elem);
- $el.addClass($el.attr("type"));
- storeElement(elem);
- }
-
- function doTextarea(elem){
- $(elem).addClass("uniform");
- storeElement(elem);
- }
-
- function doButton(elem){
- var $el = $(elem);
-
- var divTag = $("<div>"),
- spanTag = $("<span>");
-
- divTag.addClass(options.buttonClass);
-
- if(options.useID && $el.attr("id") != "") divTag.attr("id", options.idPrefix+"-"+$el.attr("id"));
-
- var btnText;
-
- if($el.is("a") || $el.is("button")){
- btnText = $el.text();
- }else if($el.is(":submit") || $el.is(":reset") || $el.is("input[type=button]")){
- btnText = $el.attr("value");
- }
-
- btnText = btnText == "" ? $el.is(":reset") ? "Reset" : "Submit" : btnText;
-
- spanTag.html(btnText);
-
- $el.css("opacity", 0);
- $el.wrap(divTag);
- $el.wrap(spanTag);
-
- //redefine variables
- divTag = $el.closest("div");
- spanTag = $el.closest("span");
-
- if($el.is(":disabled")) divTag.addClass(options.disabledClass);
-
- divTag.bind({
- "mouseenter.uniform": function(){
- divTag.addClass(options.hoverClass);
- },
- "mouseleave.uniform": function(){
- divTag.removeClass(options.hoverClass);
- divTag.removeClass(options.activeClass);
- },
- "mousedown.uniform touchbegin.uniform": function(){
- divTag.addClass(options.activeClass);
- },
- "mouseup.uniform touchend.uniform": function(){
- divTag.removeClass(options.activeClass);
- },
- "click.uniform touchend.uniform": function(e){
- if($(e.target).is("span") || $(e.target).is("div")){
- if(elem[0].dispatchEvent){
- var ev = document.createEvent('MouseEvents');
- ev.initEvent( 'click', true, true );
- elem[0].dispatchEvent(ev);
- }else{
- elem[0].click();
- }
- }
- }
- });
-
- elem.bind({
- "focus.uniform": function(){
- divTag.addClass(options.focusClass);
- },
- "blur.uniform": function(){
- divTag.removeClass(options.focusClass);
- }
- });
-
- $.uniform.noSelect(divTag);
- storeElement(elem);
-
- }
- function doSelect(elem){
- var $el = $(elem);
-
- var divTag = $('<div />'),
- spanTag = $('<span />');
-
- if(!$el.css("display") == "none" && options.autoHide){
- divTag.hide();
- }
- divTag.addClass(options.selectClass);
- if(options.useID && elem.attr("id") != ""){
- divTag.attr("id", options.idPrefix+"-"+elem.attr("id"));
- }
-
- var selected = elem.find(":selected:first");
- if(selected.length == 0){
- selected = elem.find("option:first");
- }
- spanTag.html(selected.html());
-
- elem.css('opacity', 0);
- elem.wrap(divTag);
- elem.before(spanTag);
- //redefine variables
- divTag = elem.parent("div");
- spanTag = elem.siblings("span");
- elem.bind({
- "change.uniform": function() {
- spanTag.text(elem.find(":selected").html());
- divTag.removeClass(options.activeClass);
- },
- "focus.uniform": function() {
- divTag.addClass(options.focusClass);
- },
- "blur.uniform": function() {
- divTag.removeClass(options.focusClass);
- divTag.removeClass(options.activeClass);
- },
- "mousedown.uniform touchbegin.uniform": function() {
- divTag.addClass(options.activeClass);
- },
- "mouseup.uniform touchend.uniform": function() {
- divTag.removeClass(options.activeClass);
- },
- "click.uniform touchend.uniform": function(){
- divTag.removeClass(options.activeClass);
- },
- "mouseenter.uniform": function() {
- divTag.addClass(options.hoverClass);
- },
- "mouseleave.uniform": function() {
- divTag.removeClass(options.hoverClass);
- divTag.removeClass(options.activeClass);
- },
- "keyup.uniform": function(){
- spanTag.text(elem.find(":selected").html());
- }
- });
-
- //handle disabled state
- if($(elem).attr("disabled")){
- //box is checked by default, check our box
- divTag.addClass(options.disabledClass);
- }
- $.uniform.noSelect(spanTag);
-
- storeElement(elem);
- }
- function doCheckbox(elem){
- var $el = $(elem);
-
- var divTag = $('<div />'),
- spanTag = $('<span />');
-
- if(!$el.css("display") == "none" && options.autoHide){
- divTag.hide();
- }
-
- divTag.addClass(options.checkboxClass);
- //assign the id of the element
- if(options.useID && elem.attr("id") != ""){
- divTag.attr("id", options.idPrefix+"-"+elem.attr("id"));
- }
- //wrap with the proper elements
- $(elem).wrap(divTag);
- $(elem).wrap(spanTag);
- //redefine variables
- spanTag = elem.parent();
- divTag = spanTag.parent();
- //hide normal input and add focus classes
- $(elem)
- .css("opacity", 0)
- .bind({
- "focus.uniform": function(){
- divTag.addClass(options.focusClass);
- },
- "blur.uniform": function(){
- divTag.removeClass(options.focusClass);
- },
- "click.uniform touchend.uniform": function(){
- if(!$(elem).attr("checked")){
- //box was just unchecked, uncheck span
- spanTag.removeClass(options.checkedClass);
- }else{
- //box was just checked, check span.
- spanTag.addClass(options.checkedClass);
- }
- },
- "mousedown.uniform touchbegin.uniform": function() {
- divTag.addClass(options.activeClass);
- },
- "mouseup.uniform touchend.uniform": function() {
- divTag.removeClass(options.activeClass);
- },
- "mouseenter.uniform": function() {
- divTag.addClass(options.hoverClass);
- },
- "mouseleave.uniform": function() {
- divTag.removeClass(options.hoverClass);
- divTag.removeClass(options.activeClass);
- }
- });
-
- //handle defaults
- if($(elem).attr("checked")){
- //box is checked by default, check our box
- spanTag.addClass(options.checkedClass);
- }
- //handle disabled state
- if($(elem).attr("disabled")){
- //box is checked by default, check our box
- divTag.addClass(options.disabledClass);
- }
- storeElement(elem);
- }
- function doRadio(elem){
- var $el = $(elem);
-
- var divTag = $('<div />'),
- spanTag = $('<span />');
-
- if(!$el.css("display") == "none" && options.autoHide){
- divTag.hide();
- }
- divTag.addClass(options.radioClass);
- if(options.useID && elem.attr("id") != ""){
- divTag.attr("id", options.idPrefix+"-"+elem.attr("id"));
- }
- //wrap with the proper elements
- $(elem).wrap(divTag);
- $(elem).wrap(spanTag);
- //redefine variables
- spanTag = elem.parent();
- divTag = spanTag.parent();
- //hide normal input and add focus classes
- $(elem)
- .css("opacity", 0)
- .bind({
- "focus.uniform": function(){
- divTag.addClass(options.focusClass);
- },
- "blur.uniform": function(){
- divTag.removeClass(options.focusClass);
- },
- "click.uniform touchend.uniform": function(){
- if(!$(elem).attr("checked")){
- //box was just unchecked, uncheck span
- spanTag.removeClass(options.checkedClass);
- }else{
- //box was just checked, check span
- var classes = options.radioClass.split(" ")[0];
- $("." + classes + " span." + options.checkedClass + ":has([name='" + $(elem).attr('name') + "'])").removeClass(options.checkedClass);
- spanTag.addClass(options.checkedClass);
- }
- },
- "mousedown.uniform touchend.uniform": function() {
- if(!$(elem).is(":disabled")){
- divTag.addClass(options.activeClass);
- }
- },
- "mouseup.uniform touchbegin.uniform": function() {
- divTag.removeClass(options.activeClass);
- },
- "mouseenter.uniform touchend.uniform": function() {
- divTag.addClass(options.hoverClass);
- },
- "mouseleave.uniform": function() {
- divTag.removeClass(options.hoverClass);
- divTag.removeClass(options.activeClass);
- }
- });
- //handle defaults
- if($(elem).attr("checked")){
- //box is checked by default, check span
- spanTag.addClass(options.checkedClass);
- }
- //handle disabled state
- if($(elem).attr("disabled")){
- //box is checked by default, check our box
- divTag.addClass(options.disabledClass);
- }
- storeElement(elem);
- }
- function doFile(elem){
- //sanitize input
- var $el = $(elem);
- var divTag = $('<div />'),
- filenameTag = $('<span>'+options.fileDefaultText+'</span>'),
- btnTag = $('<span>'+options.fileBtnText+'</span>');
-
- if(!$el.css("display") == "none" && options.autoHide){
- divTag.hide();
- }
- divTag.addClass(options.fileClass);
- filenameTag.addClass(options.filenameClass);
- btnTag.addClass(options.fileBtnClass);
- if(options.useID && $el.attr("id") != ""){
- divTag.attr("id", options.idPrefix+"-"+$el.attr("id"));
- }
- //wrap with the proper elements
- $el.wrap(divTag);
- $el.after(btnTag);
- $el.after(filenameTag);
- //redefine variables
- divTag = $el.closest("div");
- filenameTag = $el.siblings("."+options.filenameClass);
- btnTag = $el.siblings("."+options.fileBtnClass);
- //set the size
- if(!$el.attr("size")){
- var divWidth = divTag.width();
- //$el.css("width", divWidth);
- $el.attr("size", divWidth/10);
- }
- //actions
- var setFilename = function()
- {
- var filename = $el.val();
- if (filename === '')
- {
- filename = options.fileDefaultText;
- }
- else
- {
- filename = filename.split(/[\/\\]+/);
- filename = filename[(filename.length-1)];
- }
- filenameTag.text(filename);
- };
- // Account for input saved across refreshes
- setFilename();
- $el
- .css("opacity", 0)
- .bind({
- "focus.uniform": function(){
- divTag.addClass(options.focusClass);
- },
- "blur.uniform": function(){
- divTag.removeClass(options.focusClass);
- },
- "mousedown.uniform": function() {
- if(!$(elem).is(":disabled")){
- divTag.addClass(options.activeClass);
- }
- },
- "mouseup.uniform": function() {
- divTag.removeClass(options.activeClass);
- },
- "mouseenter.uniform": function() {
- divTag.addClass(options.hoverClass);
- },
- "mouseleave.uniform": function() {
- divTag.removeClass(options.hoverClass);
- divTag.removeClass(options.activeClass);
- }
- });
- // IE7 doesn't fire onChange until blur or second fire.
- if ($.browser.msie){
- // IE considers browser chrome blocking I/O, so it
- // suspends tiemouts until after the file has been selected.
- $el.bind('click.uniform.ie7', function() {
- setTimeout(setFilename, 0);
- });
- }else{
- // All other browsers behave properly
- $el.bind('change.uniform', setFilename);
- }
- //handle defaults
- if($el.attr("disabled")){
- //box is checked by default, check our box
- divTag.addClass(options.disabledClass);
- }
-
- $.uniform.noSelect(filenameTag);
- $.uniform.noSelect(btnTag);
-
- storeElement(elem);
- }
-
- $.uniform.restore = function(elem){
- if(elem == undefined){
- elem = $($.uniform.elements);
- }
-
- $(elem).each(function(){
- if($(this).is(":checkbox")){
- //unwrap from span and div
- $(this).unwrap().unwrap();
- }else if($(this).is("select")){
- //remove sibling span
- $(this).siblings("span").remove();
- //unwrap parent div
- $(this).unwrap();
- }else if($(this).is(":radio")){
- //unwrap from span and div
- $(this).unwrap().unwrap();
- }else if($(this).is(":file")){
- //remove sibling spans
- $(this).siblings("span").remove();
- //unwrap parent div
- $(this).unwrap();
- }else if($(this).is("button, :submit, :reset, a, input[type='button']")){
- //unwrap from span and div
- $(this).unwrap().unwrap();
- }
-
- //unbind events
- $(this).unbind(".uniform");
-
- //reset inline style
- $(this).css("opacity", "1");
-
- //remove item from list of uniformed elements
- var index = $.inArray($(elem), $.uniform.elements);
- $.uniform.elements.splice(index, 1);
- });
- };
- function storeElement(elem){
- //store this element in our global array
- elem = $(elem).get();
- if(elem.length > 1){
- $.each(elem, function(i, val){
- $.uniform.elements.push(val);
- });
- }else{
- $.uniform.elements.push(elem);
- }
- }
-
- //noSelect v1.0
- $.uniform.noSelect = function(elem) {
- function f() {
- return false;
- };
- $(elem).each(function() {
- this.onselectstart = this.ondragstart = f; // Webkit & IE
- $(this)
- .mousedown(f) // Webkit & Opera
- .css({ MozUserSelect: 'none' }); // Firefox
- });
- };
- $.uniform.update = function(elem){
- if(elem == undefined){
- elem = $($.uniform.elements);
- }
- //sanitize input
- elem = $(elem);
- elem.each(function(){
- //do to each item in the selector
- //function to reset all classes
- var $e = $(this);
- if($e.is("select")){
- //element is a select
- var spanTag = $e.siblings("span");
- var divTag = $e.parent("div");
- divTag.removeClass(options.hoverClass+" "+options.focusClass+" "+options.activeClass);
- //reset current selected text
- spanTag.html($e.find(":selected").html());
- if($e.is(":disabled")){
- divTag.addClass(options.disabledClass);
- }else{
- divTag.removeClass(options.disabledClass);
- }
- }else if($e.is(":checkbox")){
- //element is a checkbox
- var spanTag = $e.closest("span");
- var divTag = $e.closest("div");
- divTag.removeClass(options.hoverClass+" "+options.focusClass+" "+options.activeClass);
- spanTag.removeClass(options.checkedClass);
- if($e.is(":checked")){
- spanTag.addClass(options.checkedClass);
- }
- if($e.is(":disabled")){
- divTag.addClass(options.disabledClass);
- }else{
- divTag.removeClass(options.disabledClass);
- }
- }else if($e.is(":radio")){
- //element is a radio
- var spanTag = $e.closest("span");
- var divTag = $e.closest("div");
- divTag.removeClass(options.hoverClass+" "+options.focusClass+" "+options.activeClass);
- spanTag.removeClass(options.checkedClass);
- if($e.is(":checked")){
- spanTag.addClass(options.checkedClass);
- }
- if($e.is(":disabled")){
- divTag.addClass(options.disabledClass);
- }else{
- divTag.removeClass(options.disabledClass);
- }
- }else if($e.is(":file")){
- var divTag = $e.parent("div");
- var filenameTag = $e.siblings(options.filenameClass);
- btnTag = $e.siblings(options.fileBtnClass);
- divTag.removeClass(options.hoverClass+" "+options.focusClass+" "+options.activeClass);
- filenameTag.text($e.val());
- if($e.is(":disabled")){
- divTag.addClass(options.disabledClass);
- }else{
- divTag.removeClass(options.disabledClass);
- }
- }else if($e.is(":submit") || $e.is(":reset") || $e.is("button") || $e.is("a") || elem.is("input[type=button]")){
- var divTag = $e.closest("div");
- divTag.removeClass(options.hoverClass+" "+options.focusClass+" "+options.activeClass);
-
- if($e.is(":disabled")){
- divTag.addClass(options.disabledClass);
- }else{
- divTag.removeClass(options.disabledClass);
- }
-
- }
-
- });
- };
- return this.each(function() {
- if($.support.selectOpacity){
- var elem = $(this);
- if(elem.is("select")){
- //element is a select
- if(elem.attr("multiple") != true){
- //element is not a multi-select
- if(elem.attr("size") == undefined || elem.attr("size") <= 1){
- doSelect(elem);
- }
- }
- }else if(elem.is(":checkbox")){
- //element is a checkbox
- doCheckbox(elem);
- }else if(elem.is(":radio")){
- //element is a radio
- doRadio(elem);
- }else if(elem.is(":file")){
- //element is a file upload
- doFile(elem);
- }else if(elem.is(":text, :password, input[type='email']")){
- doInput(elem);
- }else if(elem.is("textarea")){
- doTextarea(elem);
- }else if(elem.is("a") || elem.is(":submit") || elem.is(":reset") || elem.is("button") || elem.is("input[type=button]")){
- doButton(elem);
- }
-
- }
- });
- };
- })(jQuery);
|