/*
 * torForms jQuery Plugin
 * Tor Løkken
 * http://www.enonic.com
 */

(function($) {
    $.fn.torForms = function() {        
        return this.each(function() {        
            if ($(this).is(':checkbox')) {
                $.fn.torForms.checkbox($(this));    
            }
            if ($(this).is(':radio')) {
                $.fn.torForms.radio($(this));    
            }
            if ($(this).is(':text, :password')) {
                $.fn.torForms.text($(this));
            }            
        });
    };    
    
    // Disables the form element
    $.fn.torForms.disable = function(element) {
        element.closest('div').addClass('disabled');
    };
    
    // Enables the form element
    $.fn.torForms.enable = function(element) {
        element.closest('div').removeClass('disabled');
    };
    
    // Checks the form element
    $.fn.torForms.check = function(element) {
        element.attr('checked', 'checked');
        if (element.is(':radio')) {
            $(':radio[name = ' + element.attr('name') + ']').closest('div').removeClass('checked');
        }
        element.closest('div').addClass('checked');
    }
    
    // Unchecks the form element
    $.fn.torForms.uncheck = function(element) {
        element.removeAttr('checked');
        element.closest('div').removeClass('checked');
    }
    
    // General form element events
    $.fn.torForms.formElement = function(element) {
        
        $(element).change(function() {                
            if (this.disabled) {
                $.fn.torForms.disable($(this));
            }
            else {
                $.fn.torForms.enable($(this));
            }
            
            if (this.checked) {
                $.fn.torForms.check($(this));
            }
            else {
                $.fn.torForms.uncheck($(this));
            }
        });
        
        if (element.is(':checked')) {
            $.fn.torForms.check(element);
        }
        if (element.is(':disabled')) {
            $.fn.torForms.disable(element);
        }
        
        element.closest('div').hover(function(e) {
            $(this).toggleClass('hover');
        });
        
        element.focus(function(e) {
            $(this).closest('div').addClass('focus');
        });
        
        element.blur(function(e) {
            $(this).closest('div').removeClass('focus');
        });
    };
    
    // Checkbox specific events
    $.fn.torForms.checkbox = function(element) {
        var newElement = $(document.createElement('div')).addClass('checkbox');
        element.wrap(newElement);
        
        element.closest('div').click(function(e) {
            if (!element.is(':disabled')) {
                $(this).hasClass('checked') ? $.fn.torForms.uncheck(element) : $.fn.torForms.check(element);
            }
        });
        $.fn.torForms.formElement(element);
    };
    
    // Radio specific events
    $.fn.torForms.radio = function(element) {
        var newElement = $(document.createElement('div')).addClass('radio');
        element.wrap(newElement);
        
        element.closest('div').click(function(e) {
            if (!element.is(':disabled')) {
                $.fn.torForms.check(element);
            }
        });
        
        $.fn.torForms.formElement(element);
    };
    
    // Textfield specific events
    $.fn.torForms.text = function(element) {
        var newElement = $(document.createElement('div')).addClass('text').append(document.createElement('span'));
        element.wrap(newElement);
        $.fn.torForms.formElement(element);
    };

})(jQuery);
