/* * jNice * version: 1.0 (11.26.08) * by Sean Mooney (sean@whitespace-creative.com)  * Examples at: http://www.whitespace-creative.com/jquery/jnice/ * Dual licensed under the MIT and GPL licenses: *   http://www.opensource.org/licenses/mit-license.php *   http://www.gnu.org/licenses/gpl.html * * To Use: place in the head  *  <link href="inc/style/jNice.css" rel="stylesheet" type="text/css" /> *  <script type="text/javascript" src="inc/js/jquery.jNice.js"></script> * * And apply the jNice class to the form you want to style * * To Do: Add textareas, Add File upload * ******************************************** */(function($){	$.fn.jNice = function(options){		var self = this;		var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */		/* Apply document listener */		$(document).mousedown(checkExternalClick);		/* each form */		return this.each(function(){			$('input:submit, input:reset, input:button', this).each(ButtonAdd);			$('button').focus(function(){$(this).addClass('jNiceFocus')}).blur(function(){$(this).removeClass('jNiceFocus')});			$('input:text:visible, input:password', this).each(TextAdd);			/* If this is safari we need to add an extra class */			if (safari){$('.jNiceInputWrapper').each(function(){$(this).addClass('jNiceSafari').find('input').css('width', $(this).width()+11);});}			$('input:checkbox', this).each(CheckAdd);			$('input:radio', this).each(RadioAdd);			$('select', this).each(function(index){SelectAdd(this, index);});			/* Add a new handler for the reset action */			$(this).bind('reset',function(){var action = function(){Reset(this);};indow.setTimeout(action, 10);});			$('.jNiceHidden').css({opacity:0});		});			};/* End the Plugin */	var Reset = function(form){		var sel;		$('.jNiceSelectWrapper select', form).each(function(){sel = (this.selectedIndex<0) ? 0 : this.selectedIndex;$('ul', $(this).parent()).each(function(){$('a:eq('+ sel +')', this).click();});});		$('a.jNiceCheckbox, a.jNiceRadio', form).removeClass('jNiceChecked');		$('input:checkbox, input:radio', form).each(function(){if(this.checked){$('a', $(this).parent()).addClass('jNiceChecked');}});	};	var RadioAdd = function(){		var $input = $(this).addClass('jNiceHidden').wrap('<span class="jRadioWrapper jNiceWrapper"></span>');		var $wrapper = $input.parent();		var $a = $('<span class="jNiceRadio"></span>');		$wrapper.prepend($a);		/* Click Handler */		$a.click(function(){				var $input = $(this).addClass('jNiceChecked').siblings('input').attr('checked',true);				/* uncheck all others of same name */				$('input:radio[name="'+ $input.attr('name') +'"]').not($input).each(function(){					$(this).attr('checked',false).siblings('.jNiceRadio').removeClass('jNiceChecked');				});				return false;		});		$input.click(function(){			if(this.checked){				var $input = $(this).siblings('.jNiceRadio').addClass('jNiceChecked').end();				/* uncheck all others of same name */				$('input:radio[name="'+ $input.attr('name') +'"]').not($input).each(function(){					$(this).attr('checked',false).siblings('.jNiceRadio').removeClass('jNiceChecked');				});			}		}).focus(function(){$a.addClass('jNiceFocus');}).blur(function(){$a.removeClass('jNiceFocus');});		/* set the default state */		if (this.checked){$a.addClass('jNiceChecked');}	};	var CheckAdd = function(){		var $input = $(this).addClass('jNiceHidden').wrap('<span class="jNiceWrapper"></span>');		var $wrapper = $input.parent().append('<span class="jNiceCheckbox"></span>');		/* Click Handler */		var $a = $wrapper.find('.jNiceCheckbox').click(function(){				var $a = $(this);				var input = $a.siblings('input')[0];				if (input.checked===true){					input.checked = false;					$a.removeClass('jNiceChecked');				}				else {					input.checked = true;					$a.addClass('jNiceChecked');				}				return false;		});		$input.click(function(){			if(this.checked){$a.addClass('jNiceChecked');}			else {$a.removeClass('jNiceChecked');}		}).focus(function(){$a.addClass('jNiceFocus');}).blur(function(){$a.removeClass('jNiceFocus');});				/* set the default state */		if (this.checked){$('.jNiceCheckbox', $wrapper).addClass('jNiceChecked');}	};	var TextAdd = function(){/* *		JOBZIPPERS EXTENSION: *		disable text input replacement * *		var $input = $(this).addClass('jNiceInput').wrap('<div class="jNiceInputWrapper"><div class="jNiceInputInner"></div></div>');		var $wrapper = $input.parents('.jNiceInputWrapper');		$input.focus(function(){ 			$wrapper.addClass('jNiceInputWrapper_hover');		}).blur(function(){			$wrapper.removeClass('jNiceInputWrapper_hover');		});*/	};	var ButtonAdd = function(){/* * JOBZIPPERS EXTENSION: *  * disable button replacmenet *		var value = $(this).attr('value');		$(this).replaceWith('<button id="'+ this.id +'" name="'+ this.name +'" type="'+ this.type +'" class="'+ this.className +'" value="'+ value +'"><span><span>'+ value +'</span></span>');*/	};	/* Hide all open selects */	var SelectHide = function(){			$('.jNiceSelectWrapper ul:visible').hide();	};	/* Check for an external click */	var checkExternalClick = function(event) {		if ($(event.target).parents('.jNiceSelectWrapper').length === 0) {SelectHide();}	};	var SelectAdd = function(element, index){		var $select = $(element);		index = index || $select.css('zIndex')*1;		index = (index) ? index : 0;		/* First thing we do is Wrap it */		$select.wrap($('<div class="jNiceWrapper"></div>').css({zIndex: 100-index}));		var width = $select.width();        /*         * JOBZIPPERS EXTENSION:         *         * Grid System requires an extra 16 pixels of width (= padding-x in input.text         */        width += 16;        $select.css({width: width +'px'});        /*         * JOBZIPPERS EXTENSION:         *         * Safari width fix         *         */        var is_chrome = /chrome/.test( navigator.userAgent.toLowerCase());        var safari = $.browser.safari; /* We need to check for safari to fix the input:text problem */        //if (safari && !is_chrome) width += 25;        /* JOBZIPPERS EXTENSION:         *         * Append standard css classes         */        cssClass = $($select).attr("class");		$select.addClass('jNiceHidden').after('<div class="jNiceSelectWrapper '+cssClass+'"><div><span class="jNiceSelectText"></span><span class="jNiceSelectOpen"></span></div><ul></ul></div>');		var $wrapper = $(element).siblings('.jNiceSelectWrapper').css({width: width +'px'});		$('.jNiceSelectText, .jNiceSelectWrapper ul', $wrapper).width( width - $('.jNiceSelectOpen', $wrapper).width());		/* IF IE 6 */		if ($.browser.msie && jQuery.browser.version < 7) {			$select.after($('<iframe style="width: '+width+'px;" src="javascript:\'\';" marginwidth="0" marginheight="0" align="bottom" scrolling="no" tabIndex="-1" frameborder="0"></iframe>').css({height: $select.height()+4 +'px'}));		}		/* Now we add the options */		SelectUpdate(element);		/* Apply the click handler to the Open */		$('div', $wrapper).click(function(){			var $ul = $(this).siblings('ul');			if ($ul.css('display')=='none'){SelectHide();} /* Check if box is already open to still allow toggle, but close all other selects */			$ul.slideToggle();			var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);			$ul.animate({scrollTop: offSet});			return false;		});		/* Add the key listener */		$select.keydown(function(e){			var selectedIndex = this.selectedIndex;			switch(e.keyCode){				case 40: /* Down */					if (selectedIndex < this.options.length - 1){selectedIndex+=1;}					break;				case 38: /* Up */					if (selectedIndex > 0){selectedIndex-=1;}					break;				default: /* Any Character */                    if(e.keyCode <= 20 || e.keyCode >= 100) // abort                    {                        return;                        break;                    }                    var foundSomething = false;                    $('option', $select).each(function(i){                                                if(!foundSomething)                        {                            var $li = $(this);                            if(!$li.hasClass("hidden"))                            {                                //alert(this.text);                                if(e.keyCode == this.text.charCodeAt(0))                                {                                    selectedIndex = i;                                    foundSomething = true; // stop at first hit                                }                            }                        }                    });					break;			}			$('ul a', $wrapper).removeClass('selected').eq(selectedIndex).addClass('selected');			$('span:eq(0)', $wrapper).html($('option:eq('+ selectedIndex +')', $select).attr('selected', 'selected').text());			return false;		}).focus(function(){$wrapper.addClass('jNiceFocus');}).blur(function(){$wrapper.removeClass('jNiceFocus');});	};	var SelectUpdate = function(element){		var $select = $(element);		var $wrapper = $select.siblings('.jNiceSelectWrapper');		var $ul = $wrapper.find('ul').find('li').remove().end().hide();		$('option', $select).each(function(i){            /*                JOBZIPPERS EXTENSION:                only show li element if it doesn't have a class 'hidden'                ORIGINAL:                $ul.append('<li><a href="#" index="'+ i +'">'+ this.text +'</a></li>');            */            var $li = $(this);            if(!$li.hasClass("hidden"))            {                $ul.append('<li><a href="#" index="'+ i +'">'+ this.text +'</a></li>');            }		});		/* Add click handler to the a */		$ul.find('a').click(function(){			$('a.selected', $wrapper).removeClass('selected');			$(this).addClass('selected');				/* Fire the onchange event */			if ($select[0].selectedIndex != $(this).attr('index') && $select[0].onchange) {$select[0].selectedIndex = $(this).attr('index');$select[0].onchange();}			$select[0].selectedIndex = $(this).attr('index');			$('span:eq(0)', $wrapper).html($(this).html());			$ul.hide();			return false;		});		/* Set the defalut */		$('a:eq('+ $select[0].selectedIndex +')', $ul).click();	};	var SelectRemove = function(element){		var zIndex = $(element).siblings('.jNiceSelectWrapper').css('zIndex');		$(element).css({zIndex: zIndex}).removeClass('jNiceHidden');		$(element).siblings('.jNiceSelectWrapper').remove();	};	/* Utilities */	$.jNice = {			SelectAdd : function(element, index){SelectAdd(element, index);},			SelectRemove : function(element){SelectRemove(element);},			SelectUpdate : function(element){SelectUpdate(element);}	};/* End Utilities */	/* Automatically apply to any forms with class jNice */	$(function(){$('form.jNice').jNice();});})(jQuery);