window.addEvent('domready', function(){

    if ($('productConfig')) {
        
        $$('#productConfig select').each(function(el, i){
            
            var copy = el.clone();
            copy.setProperty('name', '').addClass('clone');
            
            if (i != 0) copy.setProperty('disabled', 'disabled');
            
            copy.inject(el, 'after');
            el.setStyle('display', 'none');
            
        });
        
        productConfigEvents();
        
    }
    
    $$('table.basket a.delete').each(function(el){
        
        el.addEvent('click', function(e){
            
            if (e) e.preventDefault();
            this.getParent('tr').getElement('input.qty').setProperty('value', 0);
            this.getParent('form').submit();
            
        });
        
    });
    
    if ($('emptyBasket')) {
        
        $('emptyBasket').getElement('input').addEvent('click', function(e){
            
            if (e) e.preventDefault();
            this.getParent('form').getElements('input.qty').each(function(el){
                el.setProperty('value', 0);
            });
            this.getParent('form').submit();
            
        });
        
    }
    
    if ($('toggle_form_delivery') && $('form_delivery')) {
        
        $('toggle_form_delivery').addEvent('click', function(e){
            $('form_delivery').setStyle('display', (this.getProperty('checked') ? 'none' : 'block'));
        }).fireEvent('click');
        
    }
    
    $$('.locality_country').addEvent('change', function(e){
        
        var el = this;
        
        new Request.JSON({
            url: base+'ajax/locality/',
            data: {'country': this.getSelected()[0].getProperty('value')},
            noCache: true,
            onSuccess: function(response, text){
                
                var json = new Hash(response || {});
                var p = el.getParent('div').getElement('p.locality') || el.getParent('section').getElement('.locality');
                
                if ((json.get('status') == 'OK') && json.get('localities')) {
                    
                    var sel = p.getElement('select');
                    
                    sel.getChildren().each(function(opt){
                        if (opt.getProperty('value') != '0') {
                            opt.destroy();
                        }
                    });
                    
                    var localities = new Hash(json.get('localities'));
                    var i=0; localities.each(function(l) { i++; });
                    
                    if (i == 0) {
                        
                        p.setStyle('display', 'none');
                        p.getElement('label').setProperty('text', 'Locality');
                        
                    } else {
                        
                        p.getElement('label').setProperty('text', (json.get('description') ? json.get('description') : 'Locality'));
                        
                        localities.each(function(value, key){
                            new Element('option', { value: key, text: value}).inject(sel);
                        });
                        
                        p.setStyle('display', 'block');
                        
                    }
                    
                }
                
            }
        }).send();
        
    });
    
    $$('p.locality select').each(function(el){
        if (el.getChildren().length == 1) el.getParent('p').setStyle('display', 'none');
    });
    
    if ($('selectDeliveryMethod') && $('toggleDeliveryMethod')) {
        
        var tag = $('selectDeliveryMethod').get('tag');
        
        if (tag == 'select') { // Delivery Method is a <select>
            
            $('selectDeliveryMethod').addEvent('change', function(e){
                var selected = $('selectDeliveryMethod').getSelected()[0];
                $('toggleDeliveryMethod').setStyle('display', (selected.hasClass('hasAddress') ? 'block' : 'none'));
            }).fireEvent('change');
            
        } else if (tag == 'span') { // Delivery method is <input type="radio">
            
            $$('#selectDeliveryMethod input').addEvent('click', function(e){
                var selected = $$('#selectDeliveryMethod input:checked')[0];
                $('toggleDeliveryMethod').setStyle('display', (selected.hasClass('hasAddress') ? 'block' : 'none'));
            }).fireEvent('click');
            
        }
        
    }
    
    $$('.swatches a').each(function(anchor){
        
        var preview = anchor.getElement('span');
        
        if (preview) {
            
            var centre = preview.getSize().x / 2;
            
            mark = new Element('em');
            new Element('em').inject(mark);
            mark.inject(preview, 'top');
            mark.setStyle('left', centre - (mark.getSize().x / 2));
            
            preview.position({
                relativeTo: anchor,
                position: 'centerTop',
                edge: 'centerBottom',
                offset: {x: 0, y: -4}
            });
            
            anchor.addEvents({
                'mouseenter': function() {
                    preview.fade('show');
                },
                'mouseleave': function() {
                    preview.fade('hide');                
                }
            });
            
        }
        
        anchor.addEvent('click', function(e){
            
            if (e) e.preventDefault();
            
            var select = this.getParent('td').getElement('select.clone');
            var value = this.getProperty('rel').replace('opt_', '');
            
            if (select.getProperty('disabled') == true) {
                
                alert('Select from the options above first!');
                
            } else {
                
                select.setProperty('value', value);
                select.fireEvent('change');
                
            }
            
        });
        
    });
    
    if ($('pageOptions') && $('pageOptionsTarget')) {
        
        $$('#pageOptions a').addEvent('click', function(e){
            
            if (e) e.preventDefault();
            
            $$('#pageOptions a').removeClass('active');
            this.addClass('active');
            
            if (this.hasClass('grid')) {
                
                var className = 'grid';
                $('pageOptionsTarget').addClass('gridView');
                $('pageOptionsTarget').removeClass('listView');
                
            } else if (this.hasClass('list')) {
                
                var className = 'list';
                $('pageOptionsTarget').addClass('listView');
                $('pageOptionsTarget').removeClass('gridView');
                
            }
            
            Cookie.write('defaultView', className, {
                domain: window.location.hostname,
                path: '/'
            });
            
        });
        
    }
    
});

function productConfigEvents()
{
    var clones = $$('#productConfig select.clone');
    
    clones.removeEvents();
    
    clones.each(function(clone, i){
        
        clone.addEvent('change', function(e){
            
            $$('#productConfig tr[class^=info_]').addClass('na');
            $('productConfigAddButton').setStyle('display', 'none');
            
            var selectedValue = clone.getSelected().getProperty('value');
            
            clone.getPrevious('select').set('value', selectedValue);
            
            clones.each(function(clone, j){
                
                if (j > (selectedValue == '0' ? i : i+1)) {
                    clone.set('value', '0');
                    clone.setProperty('disabled', 'disabled');
                } else {
                    clone.setProperty('disabled', '');
                    if (j == i+1) {
                        
                        el = clone.getPrevious('select');
                        clone.destroy();
                        
                        var copy = el.clone();
                        copy.setProperty('name', '').addClass('clone');
                        copy.setStyle('display', 'inline');
                        copy.inject(el, 'after');                        
                        
                        clones = productConfigEvents();
                        
                    }
                }
                
            });
            
            var classes = '';
            var counter = 0;
            
            clones.each(function(clone, j){
                
                if (j > i) {
                    
                    clone.set('value', '0');
                    
                } else {
                    
                    if (clone.getSelected().getProperty('value') != '0') {
                        counter++;
                        classes += clone.getSelected().getProperty('class').toString().replace('conf_prod', '');
                        
                    }
                    
                }
                
            });
            
            var c = {};
            
            classes.trim().split(' ').each(function(value){
                c[value] = (value in c ? ++c[value] : 1);
            });
            
            clones.each(function(clone, j){
                
                var td = clone.getParent('td');
                
                if (j > i) {
                    
                    td.getElements('.swatches a').setStyle('display', 'none');
                    
                    clone.getElements('option.conf_prod').each(function(el){
                        
                        el.setProperty('disabled', 'disabled');
                        
                        for (key in c) {
                            
                            if (c[key] == counter) {
                                
                                if (el.hasClass(key)) {
                                    
                                    el.setProperty('disabled', '');
                                    td.getElements('.swatches a.'+key).setStyle('display', 'block');
                                    
                                }
                                
                            }
                            
                        }
                        
                    });
                    
                }
                
            });
            
            $$('option.conf_prod').each(function(el){
                if (el.getProperty('disabled')) el.destroy();
            });
            
            if (clones.length == counter) {
                
                $('productConfig').fade(0.5);
                $$('#productConfig select').setProperty('readonly', 'readonly');
                
                new Request.JSON({
                    url: clone.getParent('form').getProperty('action'),
                    data: $('productConfig').toQueryString(),
                    onSuccess: function(response, text){
                        
                        $('productConfig').fade(1);
                        
                        var json = new Hash(response || {});
                        
                        if ((json.get('status') == 'OK') && json.get('uid') && json.get('info')) {
                            
                            var fieldName = $('productConfigHiddenQty').getProperty('name');
                            
                            var eUid = fieldName.match(/s\[[0-9]+\]\[qty\]\[([0-9]+)\]/);
                            
                            if (eUid && eUid[1]) {
                                
                                fieldName = fieldName.substr(0, (fieldName.length - (eUid[1].length+2)));
                                fieldName += '[' + json.get('uid') + ']'
                                
                                $('productConfigHiddenQty').setProperty('name', fieldName);
                                $('productConfigHiddenQty').setProperty('value', 1);
                                
                            }
                            
                            new Hash(json.get('info')).each(function(value, key){
                                
                                var op = $('productConfig').getElement('tr.info_'+ key);
                                
                                if (op) {
                                    
                                    if (!value) {
                                        
                                        if (!op.hasClass('na')) op.addClass('na');
                                        
                                    } else {
                                        
                                        op.removeClass('na');
                                        op.getElement('td.info').setProperty('html', value);
                                        
                                    }
                                    
                                }
                                
                            });
                            
                            if ($('productConfigVisibleQty')) {
                                
                                $('productConfigVisibleQty').removeEvents();
                                
                                $('productConfigVisibleQty').addEvent('keyup', function(e){
                                    $('productConfigHiddenQty').setProperty('value', this.getProperty('value'));
                                });
                                
                                $('productConfigAddButton').setStyle('display', 'block');
                                
                            }
                            
                        }
                        
                    }
                }).send();
                
            }
            
        });
        
    });
    
    return clones;
}

