/**
 * 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 = nikonLabel.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');
});