
(function($) {
    $.fn.variations = function(options) {

        // if nothing is selected, return nothing; can't chain anyway
        if (!this.length) {
            return;
        }

        // build main options before element iteration
        $.fn.variations.options = $.extend({}, $.fn.variations.defaults, options);

        // selected attributes
        $.fn.variations.selected = {};

        // selected attributes
        $.fn.variations.optionsCount = 0;

        // if script and noscript container dont exist, return nothing
        if (!$($.fn.variations.options.noScriptSelector).length || !$($.fn.variations.options.scriptSelector).length) {
            return;
        }

        $.fn.variations.buildVariations();

        $('.variationAttribute').live('change', $.fn.variations.setAvailability);
    };

    // plugin defaults
    $.fn.variations.defaults = {
        noScriptSelector : '#variationsNoScript',
        scriptSelector : '#variationsScript',
        optionsSelector : '#variationOptions',
        labelSelector : '#variationLabel',
        optionSeparator : ' | '
    };

    $.fn.variations.setAvailability = function() {
        var optionKey = $(this).attr('name').replace(/variationOption/,'');
        var attribute = $(this).attr('value');
        if (attribute != '') {
            $.fn.variations.selected[optionKey] = attribute;
        }
        $(this).parents('.onlyVariationOption').children('label.selected').removeClass('selected');
        $('label[for="' + $(this).attr('id') + '"]').addClass('selected');
        var keyConstruct = {};
        for (var i in $.fn.variations.attributes) {
            if (i == optionKey) {
                keyConstruct[i] = attribute;
            } else {
                keyConstruct[i] = '';
            }
        }
        //jQuery.navigator.debug([''],'');
        var count = 0;
        var selected = 0;
        for (i in $.fn.variations.attributes) {
            //jQuery.navigator.output($.fn.variations.selected);
            if ($.fn.variations.selected[i]) {
                selected++;
            }
            if (i != optionKey) {
                $('input[name="variationOption' + i + '"]').attr('disabled',false);
                $('input[name="variationOption' + i + '"]').parent('label.notAvailable').attr('title','');
                $('input[name="variationOption' + i + '"]').parent('label.notAvailable').removeClass('notAvailable');
                for (var j in $.fn.variations.attributes[i]['attributes']) {
                    //jQuery.navigator.sortDebug(j);
                    //jQuery.navigator.sortDebug(variantKey);
                    var variantKeyObj = keyConstruct;
                    variantKeyObj[i] = j;
                    var variantKeyArray = [];
                    //jQuery.navigator.sortDebug(variantKey);
                    for (var k in variantKeyObj) {
                        variantKeyArray[variantKeyArray.length] = variantKeyObj[k];
                    }
                    //jQuery.navigator.sortDebug(variantKeyArray.join('-'));
                    if (!$.fn.variations.variant[variantKeyArray.join('-')]) {
                        $('label[for="variationOption' + i + count + '"]').addClass('notAvailable');
                        $('label[for="variationOption' + i + count + '"]').attr('title','Artikel nicht verfügbar');
                        $('#variationOption' + i + count).attr('disabled','disabled');
                    }
                    count++;
                }
            }
        }
        if (selected == $.fn.variations.optionsCount) {
            var variationID = '';
            for (var l in $.fn.variations.selected) {
                if (variationID == '') {
                    variationID += $.fn.variations.selected[l];
                } else {
                    variationID += '-' + $.fn.variations.selected[l];
                }
            }
            $('#variationError').hide();
            $('#variations').val($.fn.variations.variant[variationID]['value']);
        }
    };

    $.fn.variations.buildVariations = function() {
        var variant = [];
        var optionKeys = $($.fn.variations.options.optionsSelector).val();
            optionKeys = optionKeys.split($.fn.variations.options.optionSeparator);
        var label   = $($.fn.variations.options.labelSelector).val();
            label   = label.split($.fn.variations.options.optionSeparator);
        var options = [];
        for (var i = 0; i < optionKeys.length; i++) {
            $.fn.variations.optionsCount++;
            options[optionKeys[i]] = {'label': label[i], 'attributes': []}
        }

        //new jQuery.navigator(options, 'options');
        //jQuery.navigator.output($.fn.variations.selected);


        $($.fn.variations.options.noScriptSelector).children('select').children('option').each(function() {
            var attributes = $(this).text();
                attributes = attributes.split($.fn.variations.options.optionSeparator);
            var name = '';
            for (var i = 0; i < attributes.length; i++) {
                if (typeof($(this).attr('rel')) != 'undefined' && optionKeys[i] == 6) {
                    options[optionKeys[i]].attributes[attributes[i]] = $(this).attr('rel');
                } else {
                    options[optionKeys[i]].attributes[attributes[i]] = '';
                }
                if (i == 0) {
                    name += attributes[i];
                } else {
                    name += '-' + attributes[i];
                }
            }
            for (i = 0; i < attributes.length; i++) {
                if (i == 0) variant[name] = {'value': $(this).attr('value')};
                variant[name][optionKeys[i]] = attributes[i];
            }
        });
        $.fn.variations.variant = variant;
        $.fn.variations.attributes = options;
        //var debug = new jQuery.navigator($.fn.variations.attributes, 'options');
        //jQuery.navigator.sortDebug($.fn.variations.variant);
        $($.fn.variations.options.noScriptSelector).html('');
        $.fn.variations.output();
    };

    $.fn.variations.output = function() {
        var opt = $.fn.variations.attributes;
        $($.fn.variations.options.scriptSelector).append('<input type="hidden" name="variations" id="variations" value="" />');
        var background = '';
        for (var i in opt) {
            var optionsContainer = $('<div />').attr('class', 'variationOption');
            optionsContainer.append('<h4>' + opt[i]['label'] + ':</h4><div class="onlyVariationOption"></div>');
            var k = 0;
            for (var j in opt[i]['attributes']) {
                background = '';
                if (opt[i]['attributes'][j] != '') {
                    background = 'background-color:' + opt[i]['attributes'][j];
                }
                optionsContainer.children('.onlyVariationOption').append('<label for="variationOption' + i + k + '"><input type="radio" name="variationOption' + i + '" class="variationAttribute" id="variationOption' + i + k + '" value="' + j + '"/><span class="variationOption' + i + '_' + k + '" style="' + background + '">' + j + '</span></label>');
                k++;
            }
            optionsContainer.appendTo($($.fn.variations.options.scriptSelector));
        }
    };
})(jQuery);
