/*
* 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
*
*
*
* 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); }; window.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();});});
};
/* 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($('
').css({zIndex: 100-index}));
var width = $select.outerWidth()-2; /*lil bit of modding here*/
$select.addClass('jNiceHidden').after('
');
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($('').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:
return;
break;
}
$('ul a', $wrapper).removeClass('selected').eq(selectedIndex).addClass('selected');
$('em: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){
$ul.append('