/*
 * 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); }; 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();});});
                $('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 cid = $(this).attr("id"); 
                var $input = $(this).addClass('jNiceHidden').wrap('<span class="jNiceWrapper"></span>');
                var $wrapper = $input.parent().append('<span class="jNiceCheckbox" id="'+cid+'"></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(){
                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(){
                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: 10-index}));
                var width = $select.width();
                $select.addClass('jNiceHidden').after('<div class="jNiceSelectWrapper"><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 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();
						$ul.show();
                        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');
                        $('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){
                        $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);


