/*
|
|
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);
|