/**
 * Class for enabling extra semantic form goodies
 */
function SemanticForm(form) {
	this._element = $(form);
	
	var ie6 = $.browser.msie && jQuery.browser.version.substr(0,1)=="6";
    if (ie6) {
    	$("select", this._element).each(function(index, element) {
        	el.wrap('div', { 'class': 'select-wrapper' });
        });
    }

    $("fieldset.optional", this._element).each(new Delegate(this, this._setupFieldset));
    $(".date", this._element).each(new Delegate(this, this._setDateField));
}

SemanticForm.prototype = {
	_element: null,
	
    /**
     * Sets up the relevant events for an optional fieldset.
     * @param {Number} index The index of the fieldset in the list of optional fieldsets
     * @param {HtmlFieldsetElement} fieldset The optional fieldset to set up
     * @private
     */
    _setupFieldset: function (index, fieldset) {
    	fieldset = $(fieldset);
        var legend = $("legend", fieldset);
        var toggleElement = $('#' + fieldset.attr("rel"));
        
        if (toggleElement.length > 0) {
            toggleElement.parents('.field').addClass('hidden');
        }
        
        if (fieldset.hasClass('default-collapsed')) {
            fieldset.addClass("collapsed");
            this._setCheckbox(toggleElement, true);
        } else {
            fieldset.addClass("expanded");
            this._setCheckbox(toggleElement, false);
        }

        legend.click(new Delegate (this, function() {
            fieldset.toggleClass("expanded");
            fieldset.toggleClass("collapsed");
            this._setCheckbox(toggleElement, !$(toggleElement).attr('checked'));
        }));

		/* #52602: show collapsed fields with errors expanded */
		$(".default-collapsed .error-in-field", this._element).each(new Delegate (this, function(index, element) {
			var fieldset = $(element).parents('.default-collapsed');
			if (fieldset.hasClass("expanded")) {
				return;
			}
			fieldset.toggleClass("expanded");
			fieldset.toggleClass("collapsed");
			var checkbox = fieldset.attr('rel');
			this._setCheckbox(checkbox, false);
		}));
    },
    
    /**
     * Set the supplied checkbox to the supplied boolean
     * @param {HTMLElement} checkbox The checkbox
     * @param {Boolean} checked The new boolean checked value
     * @private
     */
    _setCheckbox: function (checkbox, checked) {
        $(checkbox).attr('checked', checked);
    },
    
    /**
     * Set the supplied input field with a date picker.
     * @param {HTMLElement} field The input field that should behave as a calendar
     * @private
     */
    _setDateField: function (index, field) {
    	$(field).datepicker({ dateFormat: 'dd/mm/yy', firstDay: 1 });
    }
};