/**
 * Manages "color variant" behavior.
 * @author Adam J. McIntyre
 */

ColorVariantManager = function() {
    //private shorthand references to YUI utilities:
    var yue = YAHOO.util.Event,
            yus = YAHOO.util.Selector,
            yud = YAHOO.util.Dom;


    var currentEl = selectedEl = originalVariantId = '';
    var variants = templates = [];
    return {
        categoryClick: function(el) {
            var els = yud.getElementsByClassName('color', 'div', el.parentNode,
                    function(o) {
                        if(o == el) {
                            yud.addClass(o, 'selected');
                            var dataEl = yud.getLastChild(el);
                            var flyoutId = dataEl.getAttribute('data-parentId');
                            var variantId = dataEl.id.substr(dataEl.id.lastIndexOf('_') + 1);
                            document.getElementById('item_' + flyoutId + '_img').src = '/static/images/icons/blank.gif';
                            var im = new Image();
                            im.onload = function() {
                                document.getElementById('item_' + flyoutId + '_img').src = im.src;
                            };
                            im.src = dataEl.getAttribute('data-image');
                            document.getElementById('data_price_' + flyoutId).innerHTML = dataEl.getAttribute('data-price');
                            document.getElementById('data_color_' + flyoutId).innerHTML = dataEl.getAttribute('data-label');
                            document.getElementById('data_url_' + flyoutId).href = dataEl.getAttribute('data-href');
                            document.getElementById('data_url_ft_' + flyoutId).href = dataEl.getAttribute('data-href');
                        }
                        else {
                            yud.removeClass(o, 'selected');
                        }
                    });
        },
        init: function(el) {
            if(YAHOO.lang.isString(el)) {
                el = (yud.get(el)) ? yud.get(el) : yus.query(el);
            }
            if(YAHOO.lang.isUndefined(el)) {
                return;
            }

            var variants = yus.query('.color', el.parentNode);
            for(var i = 0; i < variants.length; i++) {
                variants[i].pos = i;
            }

            ColorVariantManager.installListeners(el);
        },
        installListeners: function(el) {
            if((YAHOO.lang.isArray(el) && (el.length > 0)) || (YAHOO.lang.isObject(el) && !YAHOO.lang.isNull(el))) {
                yue.addListener(el, 'click', function(e) {
                    yue.stopEvent(e);
                    ColorVariantManager.detailClick(this);
                });
            }
        },
        detailClick: function(el) {
            if(yud.hasClass(el, 'selected')) {
                return;
            }
            currentEl = el;
            var idStr = el.originalId || el.id;
            var v = (!YAHOO.lang.isUndefined(el.v)) ? el.v : this.getVariant(idStr.substr(idStr.lastIndexOf('_') + 1));
            if(!v) {
                return;
            }

            el.v = v;  // add a reference to the object

            var fo = new YAHOO.util.Anim('swapTarget', {
                opacity: {
                    to: 0
                }
            },
                    0.10);
            fo.onStart.subscribe(function() {
                yud.setStyle('loader', 'opacity', '0.99')
            });
            fo.animate();

            if(v.target) {
                var originalEl = el;
                if(el.cloneId) {
                    // if clicked within a clone, reference the cloned target
                    ColorVariantManager.executeOnTarget(el, v, v.target + el.cloneId);
                    originalEl = yud.get(el.originalId);
                }
                ColorVariantManager.executeOnTarget(originalEl, v, v.target);
            } else {
                // This condition may no longer be in use...
                var idx = Carousels.highlighted.id.substr(Carousels.highlighted.id.lastIndexOf('-') + 1);
                idx--;
                var currentPv = v.representativeView;
                var enlargeEls = yud.getElementsByClassName('enlargeImg', 'a', 'hero');
                var mbEls = yud.getElementsByClassName('ProductViews', 'li', 'mediaBar');
                var count = 0;
                var grp = aClient.getGroup('Product Views');
                for(var i in v.productViews) {
                    enlargeEls[count].href = v.productViews[i].large;
                    grp[v.productViews[i].large] = count;
                    grp.items[count] = enlargeEls[count];
                    var mbEl = yud.getFirstChild(mbEls[count]);
                    mbEl.href = v.productViews[i].view;
                    yud.getFirstChild(mbEl).src = v.productViews[i].thumb;
                    if(count == idx) {
                        currentPv = v.productViews[i].view;
                    }
                    count++;
                    var im = new Image();
                    im.onload = function() {
                        var tg = document.getElementById('swapTarget');
                        tg.src = currentPv;
                        var fi = new YAHOO.util.Anim('swapTarget', {
                            opacity: {
                                to: 0.99
                            }
                        },
                                0.10);
                        fi.onStart.subscribe(function() {
                            yud.setStyle('loader', 'opacity', '0')
                        });
                        fi.animate();
                    }
                    im.src = currentPv;
                }
            }
            if(document.getElementById('label_price')) {
                document.getElementById('label_price').innerHTML = v.price;
            }
            document.getElementById('label_productNumber').innerHTML = nikon.utils.locale.get("ProductDetail.Hero.ProductNumber") + ' ' + v.productNumber;
            var buttons_wtb = yud.get('buttons_wtb');
            var btnTemplate = (v.nikonMall) ? 'mall' : 'wtb';
            var btn = yus.query('a', buttons_wtb)[0];
            var templateHTML = this.processTemplate(btnTemplate, v);
            YAHOO.ksv.base.HTMLReplaceSelf(btn, templateHTML);
        },
        executeOnTarget: function(el, v, target) {
            /* requires ksv extension media.js @27.Apr.2010 */
            var media = YAHOO.ksv.mediaControl.getMedia(target);
            var c = media.instance;
            if(media.type == 'carousel') {
                var currentProdView = c.selected;
                var thumbs = c.getElementForItems();
                var originalThumbs = yus.query('li', c.element.originalDOM);
                var count = 0;
                for(var i in v.productViews) {
                    /* the following set of conditionals should be broken out into another single function */
                    var anchor = yus.query('a', thumbs[count])[0];
                    if(anchor) {
                        anchor.href = v.productViews[i].large + '?targetMedia=' + v.productViews[i].view;
                    }
                    var img = yus.query('img', thumbs[count])[0];
                    if(img) {
                        img.src = v.productViews[i].thumb;
                    }

                    if(originalThumbs) {
                        var originalAnchor = yus.query('a', originalThumbs[count])[0];
                        if(originalAnchor) {
                            originalAnchor.href = v.productViews[i].large + '?spotlight=' + v.productViews[i].view;
                        }

                        var originalImg = yus.query('img', originalThumbs[count])[0];
                        if(originalImg) {
                            originalImg.src = v.productViews[i].thumb;
                        }
                    }

                    if(c.viewPane[count]) {
                        var spotlightImg = yus.query('img', c.viewPane[count])[0];
                        if(spotlightImg) {
                            var enlarge = yud.getAncestorByTagName(spotlightImg, 'a');
                            if(enlarge) {
                                enlarge.href = v.productViews[i].large;
                            }
                            var container = yud.getAncestorByClassName(spotlightImg, 'media-target');
                            spotlightImg.src = container ? v.productViews[i].large : v.productViews[i].view;
                        }
                    }
                    count++;
                }
            } else {
                /* uh-oh! */
            }

            // set selected
            var lastSelected = yus.query('.color.selected', el.parentNode)[0];
            yud.removeClass(lastSelected, 'selected');
            yud.addClass(el, 'selected');

            var selectedVariant = yus.query('.swatch_name', el)[0];
            if(selectedVariant) {
                var selectedVariantName = selectedVariant.innerHTML;
                var paginationColorName = yus.query('.spotlight-pagination-colorname', c.viewPane.pagination)[0];
                if(paginationColorName && selectedVariantName) {
                    paginationColorName.innerHTML = selectedVariantName;
                }
            }
        },
        lightboxClick: function(variantId) {
            var v = this.getVariant(variantId);
            this.swapEnlargeImg(v);
            var els = yud.getElementsByClassName('color', 'div', 'container_lbVariants');
            for(var i = 0; i < els.length; i++) {
                if(els[i].id.indexOf(variantId) > -1) {
                    yud.addClass(els[i], 'selected');
                }
                else {
                    yud.removeClass(els[i], 'selected');
                }
            }
            document.getElementById('aImg').src = selectedEl.href;
            document.getElementById('label_colorName').innerHTML = v.name;
            document.getElementById('variant_label').innerHTML = v.name + '&nbsp;';
        },
        swapEnlargeImg: function(variant) {
            if(typeof variant != 'object') {
                variant = this.getVariant(variant);
            }
            var enlargeEls = yud.getElementsByClassName('enlargeImg', 'a', 'hero');
            var count = 0;
            var grp = aClient.getGroup('Product Views');
            for(var i in variant.productViews) {
                enlargeEls[count].href = variant.productViews[i].large;
                grp[variant.productViews[i].large] = count;
                grp.items[count] = enlargeEls[count];
                count++;
            }
        },
        resetEnlargeImg: function() {
            this.swapEnlargeImg(originalVariantId);
        },
        setOriginalColor: function(id) {
            originalVariantId = id;
        },
        setSelectedEl: function(el) {
            selectedEl = el;
        },
        addVariant: function(id, o) {
            variants[id] = o;
            return this;
        },
        getVariant: function(id) {
            return variants[id] || null;
        },
        getAllVariants: function() {
            return variants;
        },
        setCurrentEl: function(id) {
            currentEl = id;
        },
        addTemplate: function(id, html) {
            templates[id] = html;
        },
        getTemplate: function(id) {
            return templates[id];
        },
        processTemplate: function(tId, variant) {
            var html = this.getTemplate(tId);
            for(var i in variant) {
                html = html.replace('[' + i + ']', variant[i]).replace('&amp;', '&');
            }
            return html;
        }
    }
}();

YAHOO.util.Event.onDOMReady(function (ev) {
    ColorVariantManager.init('#container_colors .color');
});

