MV = MV || {};
MV.SearchForm = (function() {
    var _sf = {};

    var createFields = function(fieldsArray, searchFormTemplates) {
        var field = '';
        var requiredFields = [];
        var optionalFields = [];
        for (var i = 0; i < fieldsArray.length; i++) {
            var cf = fieldsArray[i];
            if (!searchFormTemplates.searchFields[cf.Id]) { continue };
            field = searchFormTemplates.searchFields[cf.Id].clone();
            if (cf.Required) {
                requiredFields.push(field);
            } else {
                optionalFields.push(field);
            }
        };
        return {
            required: requiredFields,
            optional: optionalFields
        }
    };

    var fieldsetLoader = function(fields, container) {
        container.find('ol').empty();
        if (fields.length > 0) {
            var len = fields.length;
            for (var i = 0; i < len; i++) {
                var f = fields[i];
                container.find('ol').append(f);
            };
        };
        return container;
    };

    return {
        init: function(providerTypeTemplates) {
            _sf = this; //set the reference

            this.fieldsets = null;
            this.searchFormTemplates = {
                searchFields: {},
                fieldsets: providerTypeTemplates.fieldsets
            };

            // load search field templates into a hash
            providerTypeTemplates.allFields.find('li').each(function() {
                _sf.searchFormTemplates.searchFields[this.id.replace('InputElement', '')] = $(this);
            });

            return this;
        },

        create: function(providerTypeSearchFormConfig) {
            this.containers = {
                fieldsets: $('<div></div>').attr('id', providerTypeSearchFormConfig.id + 'Container').addClass('providerTypeFieldsetContainer'),
                required: this.searchFormTemplates.fieldsets.required.clone(),
                optional: this.searchFormTemplates.fieldsets.optional.clone()
            };

            var fields = createFields(providerTypeSearchFormConfig.SearchFields, this.searchFormTemplates);

            this.containers.required = fieldsetLoader(fields.required, this.containers.required);
            this.containers.optional = fieldsetLoader(fields.optional, this.containers.optional);
            if (!fields.optional || fields.optional.length == 0) {
                this.containers.optional.addClass('invisible');
            } else {
                this.containers.optional.removeClass('invisible');
            };

            this.containers.fieldsets.append(this.containers.required).append(this.containers.optional);

            return this.containers.fieldsets;
        },

        createOptionalFields: function(formfields, showSubmitButtonOnly) {
            var fields = createFields(formfields, this.searchFormTemplates);
            if ((fields.optional && fields.optional.length > 0) || showSubmitButtonOnly) {
                fieldsetLoader(fields.optional, this.containers.optional);
                this.containers.optional.find('ol').append(this.searchFormTemplates.searchFields['providerTypeSubmitLi'].clone());
                this.containers.optional.removeClass('invisible');
            } else {
                this.containers.optional.addClass('invisible');
            }
        }
    }
    // module end
})();