﻿(function ($) {
    
    // Creates a concept loader control
    $.fn.conceptLoader = function (options, request, aggregate) {

        if (typeof options === 'object') {

            this.each(function () {

                $.extend(this, { conceptLoader: { options: options } });

            });

        }
        else if (options === 'loadConcepts') {

            var promises = [];

            this.each(function () {

                var _this = this;

                if (typeof request === 'undefined' || request == null) {

                    promises.push(apiHelper.get(apiHelper.methods.library.conceptChildren, this.conceptLoader.options.rootConcept).done(function (concepts) {

                        var source = [];

                        // Clear previous
                        $(_this).html('');

                        $.each(concepts, function (index, concept) {

                            var element = $(templateProcessor.expandTemplate(_this.conceptLoader.options.itemTemplate, concept));

                            $(_this).trigger('itemBound', [concept, element.html()]);

                            source.push(element);

                        });

                        $(_this).append(source);

                    }).fail(function (jqXHR, textStatus, errorThrown) {

                        $(_this).trigger('loadConceptsFailed', [jqXHR, textStatus, errorThrown]);

                    }));

                }
                else if (typeof aggregate === 'undefined' || aggregate == null) {

                    var payload = request;

                    if (payload.length === 0)
                        return;

                    payload[0]['aggregations'] = [{
                        field: indexFieldMapping.product.concept.conceptId,
                        filters: [{ field: indexFieldMapping.product.concept.parentId, value: _this.conceptLoader.options.rootConcept }],
                        sort: '_term',
                        merge: 'concept'
                    }];

                    // Execute search
                    apiHelper.post(apiHelper.methods.product.find, request, 0, '', 0).done(function (output) {

                        var result = output.aggregations.find(function (item) { return item.name === 'concepts'; });

                        $.each(result.results.sort(function (a, b) { return a.mappedItem.sortOrder - b.mappedItem.sortOrder; }), function (index, item) {

                            var element = $(templateProcessor.expandTemplate(_this.conceptLoader.options.itemTemplate, item.mappedItem));

                            $(_this).trigger('itemBound', [item.mappedItem, element]);
                            $(_this).append(element);

                        });

                    }).fail(function (jqXHR, textStatus, errorThrown) {

                        $(_this).trigger('loadConceptsFailed', [jqXHR, textStatus, errorThrown]);

                    });

                }
                else {

                    var payload = request;

                    if (payload.length === 0)
                        return;

                    payload[0]['aggregations'] = [{
                        field: aggregate,
                        sort: '_term'
                    }];

                    // Execute search
                    apiHelper.post(apiHelper.methods.product.find, request, 0, '', 0).done(function (output) {
                       
                        var result = output.aggregations.find(function (item) { return item.name === aggregate; });
                        
                        $.each(result.results, function (index, item) {

                            var number = 0;
                            
                            if (item.value.indexOf('-') != -1)
                                number = parseInt(item.value.toString().substring(0, item.value.indexOf('-')));

                            var element = $(templateProcessor.expandTemplate(_this.conceptLoader.options.itemTemplate, { conceptNumber: number, name: item.value, id: item.value }));

                            $(_this).trigger('itemBound', [item.value, element]);
                            $(_this).append(element);

                        });

                    }).fail(function (jqXHR, textStatus, errorThrown) {

                        $(_this).trigger('loadConceptsFailed', [jqXHR, textStatus, errorThrown]);

                    });

                }

            });

            if (promises.length === 1)
                return promises[0];
            else if (promises.length === 0)
                return null;

            return promises;

        }

        return this;

    }

})(jQuery);