/*
* 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(jQuery) {
    jQuery.fn.jNice = function(options) {
        var self = this;
        var safari = jQuery.browser.safari; /* We need to check for safari to fix the input:text problem */
        /* Apply document listener */
        jQuery(document).mousedown(checkExternalClick);
        /* each form */
        return this.each(function() {
            jQuery('input:submit, input:reset, input:button', this).each(ButtonAdd);
            jQuery('button').focus(function() { jQuery(this).addClass('jNiceFocus') }).blur(function() { jQuery(this).removeClass('jNiceFocus') });
            // KNE: replaced input:text:visible with input:text
            jQuery('input:text, input:password', this).each(TextAdd);
            //ADDED by JRH
            jQuery('textarea', this).each(TextAreaAdd);
            /* If this is safari we need to add an extra class */
            if (safari) { jQuery('.jNiceInputWrapper').each(function() { jQuery(this).addClass('jNiceSafari'); }); } /*.find('input').css('width', jQuery(this).width()+11)*/
            jQuery('input:checkbox', this).each(CheckAdd);
            jQuery('input:radio', this).each(RadioAdd);
            jQuery('select', this).each(function(index) { SelectAdd(this, index); });
            /* Add a new handler for the reset action */
            jQuery(this).bind('reset', function() { var action = function() { Reset(this); }; window.setTimeout(action, 10); });
            jQuery('.jNiceHidden').css({ opacity: 0 });
        });
    }; /* End the Plugin */

    var Reset = function(form) {
        var sel;
        jQuery('.jNiceSelectWrapper select', form).each(function() { sel = (this.selectedIndex < 0) ? 0 : this.selectedIndex; jQuery('ul', jQuery(this).parent()).each(function() { jQuery('a:eq(' + sel + ')', this).click(); }); });
        jQuery('a.jNiceCheckbox, a.jNiceRadio', form).removeClass('jNiceChecked');
        jQuery('input:checkbox, input:radio', form).each(function() { if (this.checked) { jQuery('a', jQuery(this).parent()).addClass('jNiceChecked'); } });
    };

    var RadioAdd = function() {
        var jQueryinput = jQuery(this).addClass('jNiceHidden').wrap('<span class="jRadioWrapper jNiceWrapper"></span>');
        var jQuerywrapper = jQueryinput.parent();
        var jQuerya = jQuery('<span class="jNiceRadio"></span>');
        jQuerywrapper.prepend(jQuerya);
        /* Click Handler */
        jQuerya.click(function() {
            var jQueryinput = jQuery(this).addClass('jNiceChecked').siblings('input').attr('checked', true);
            /* uncheck all others of same name */
            jQuery('input:radio[name="' + jQueryinput.attr('name') + '"]').not(jQueryinput).each(function() {
                jQuery(this).attr('checked', false).siblings('.jNiceRadio').removeClass('jNiceChecked');
            });
            return false;
        });
        jQueryinput.click(function() {
            if (this.checked) {
                var jQueryinput = jQuery(this).siblings('.jNiceRadio').addClass('jNiceChecked').end();
                /* uncheck all others of same name */
                jQuery('input:radio[name="' + jQueryinput.attr('name') + '"]').not(jQueryinput).each(function() {
                    jQuery(this).attr('checked', false).siblings('.jNiceRadio').removeClass('jNiceChecked');
                });
            }
        }).focus(function() { jQuerya.addClass('jNiceFocus'); }).blur(function() { jQuerya.removeClass('jNiceFocus'); });

        /* set the default state */
        if (this.checked) { jQuerya.addClass('jNiceChecked'); }
    };

    var CheckAdd = function() {
        var jQueryinput = jQuery(this).addClass('jNiceHidden').wrap('<span class="jNiceWrapper"></span>');
        var jQuerywrapper = jQueryinput.parent().append('<span class="jNiceCheckbox"></span>');
        /* Click Handler */
        var jQuerya = jQuerywrapper.find('.jNiceCheckbox').click(function() {
            var jQuerya = jQuery(this);
            var input = jQuerya.siblings('input')[0];
            if (input.checked === true) {
                input.checked = false;
                jQuerya.removeClass('jNiceChecked');
            }
            else {
                input.checked = true;
                jQuerya.addClass('jNiceChecked');
            }
            return false;
        });
        jQueryinput.click(function() {
            if (this.checked) { jQuerya.addClass('jNiceChecked'); }
            else { jQuerya.removeClass('jNiceChecked'); }
        }).focus(function() { jQuerya.addClass('jNiceFocus'); }).blur(function() { jQuerya.removeClass('jNiceFocus'); });

        /* set the default state */
        if (this.checked) { jQuery('.jNiceCheckbox', jQuerywrapper).addClass('jNiceChecked'); }
    };

    var TextAdd = function() {
        if (jQuery(this).hasClass('smalltext'))
            var jQueryinput = jQuery(this).addClass('jNiceInput').wrap('<div class="jNiceInputWrapperSmall"><div class="jNiceInputInnerSmall"></div></div>');
        else
            var jQueryinput = jQuery(this).addClass('jNiceInput').wrap('<div class="jNiceInputWrapper"><div class="jNiceInputInner"></div></div>');
        var jQuerywrapper = jQueryinput.parents('.jNiceInputWrapper');
        jQueryinput.focus(function() {
            jQuerywrapper.addClass('jNiceInputWrapper_hover');
        }).blur(function() {
            jQuerywrapper.removeClass('jNiceInputWrapper_hover');
        });
    };

    var TextAreaAdd = function() {
        var jQueryinput = jQuery(this).addClass('jNiceInput').wrap('<div class="jNiceTextAreaWrapper"><div class="jNiceTextAreaInner"></div></div>');
        var jQuerywrapper = jQueryinput.parents('.jNiceTextAreaWrapper');
        jQueryinput.focus(function() {
            jQuerywrapper.addClass('jNiceTextAreaWrapper_hover');
        }).blur(function() {
            jQuerywrapper.removeClass('jNiceTextAreaWrapper_hover');
        });
    };

    var ButtonAdd = function() {
        var value = jQuery(this).attr('value');
        jQuery(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() {
        jQuery('.jNiceSelectWrapper ul:visible').hide();
    };

    /* Check for an external click */
    var checkExternalClick = function(event) {
        if (jQuery(event.target).parents('.jNiceSelectWrapper').length === 0) { SelectHide(); }
    };

    var SelectAdd = function(element, index) {
        var jQueryselect = jQuery(element);
        index = index || jQueryselect.css('zIndex') * 1;
        index = (index) ? index : 0;
        /* First thing we do is Wrap it */
        jQueryselect.wrap(jQuery('<div class="jNiceWrapper"></div>').css({ zIndex: 100 - index }));
        var width = jQueryselect.width();
        jQueryselect.addClass('jNiceHidden').after('<div class="jNiceSelectWrapper"><div><span class="jNiceSelectText"></span><span class="jNiceSelectOpen"></span></div><ul></ul></div>');
        var jQuerywrapper = jQuery(element).siblings('.jNiceSelectWrapper').css({ width: width + 'px' });
        jQuery('.jNiceSelectText, .jNiceSelectWrapper ul', jQuerywrapper).width(width - jQuery('.jNiceSelectOpen', jQuerywrapper).width());
        /* IF IE 6 */
        if (jQuery.browser.msie && jQuery.browser.version < 7) {
            jQueryselect.after(jQuery('<iframe src="javascript:\'\';" marginwidth="0" marginheight="0" align="bottom" scrolling="no" tabIndex="-1" frameborder="0"></iframe>').css({ height: jQueryselect.height() + 4 + 'px' }));
        }
        /* Now we add the options */
        SelectUpdate(element);
        /* Apply the click handler to the Open */
        jQuery('div', jQuerywrapper).click(function() {
            var jQueryul = jQuery(this).siblings('ul');
            if (jQueryul.css('display') == 'none') { SelectHide(); } /* Check if box is already open to still allow toggle, but close all other selects */
            jQueryul.slideToggle();
            var offSet = (jQuery('a.selected', jQueryul).offset().top - jQueryul.offset().top);
            jQueryul.animate({ scrollTop: offSet });
            return false;
        });
        /* Add the key listener */
        jQueryselect.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;
            }
            jQuery('ul a', jQuerywrapper).removeClass('selected').eq(selectedIndex).addClass('selected');
            jQuery('span:eq(0)', jQuerywrapper).html(jQuery('option:eq(' + selectedIndex + ')', jQueryselect).attr('selected', 'selected').text());
            return false;
        }).focus(function() { jQuerywrapper.addClass('jNiceFocus'); }).blur(function() { jQuerywrapper.removeClass('jNiceFocus'); });
    };

    var SelectUpdate = function(element) {
        var jQueryselect = jQuery(element);
        var jQuerywrapper = jQueryselect.siblings('.jNiceSelectWrapper');
        var jQueryul = jQuerywrapper.find('ul').find('li').remove().end().hide();
        jQuery('option', jQueryselect).each(function(i) {
            jQueryul.append('<li><a href="#" index="' + i + '">' + this.text + '</a></li>');
        });
        /* Add click handler to the a */
        jQueryul.find('a').click(function() {
            jQuery('a.selected', jQuerywrapper).removeClass('selected');
            jQuery(this).addClass('selected');
            /* Fire the onchange event */
            if (jQueryselect[0].selectedIndex != jQuery(this).attr('index') && jQueryselect[0].onchange) { jQueryselect[0].selectedIndex = jQuery(this).attr('index'); jQueryselect[0].onchange(); }
            jQueryselect[0].selectedIndex = jQuery(this).attr('index');
            jQuery('span:eq(0)', jQuerywrapper).html(jQuery(this).html());
            jQueryul.hide();
            return false;
        });
        /* Set the defalut */
        jQuery('a:eq(' + jQueryselect[0].selectedIndex + ')', jQueryul).click();
    };

    var SelectRemove = function(element) {
        var zIndex = jQuery(element).siblings('.jNiceSelectWrapper').css('zIndex');
        jQuery(element).css({ zIndex: zIndex }).removeClass('jNiceHidden');
        jQuery(element).siblings('.jNiceSelectWrapper').remove();
    };

    /* Utilities */
    jQuery.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 */
    jQuery(function() { jQuery('form.jNice').jNice(); });
})

