/**
 * Copyright(C) 2005-2006 InstanColor
 */

/**
 * Extensions
 */
Effect.Show = function(element) {
	Element.show(element);
}
Effect.Hide = function(element) {
	Element.hide(element);
}
Event.isInside = function(event)
{
	if (!event) var event = window.event;
	var target = (window.event) ? event.srcElement : event.target;
	var related = (event.relatedTarget) ? event.relatedTarget : event.toElement;
	return related && related.id && related.id.indexOf(target.id) >= 0;
}

/**
 * Util
 */
var Util = {

	handlers: {},

	addHandler: function(className, handler, options)
	{
		if (!this.handlers[className]) this.handlers[className] = new Array();
		this.handlers[className].push([ handler, options||{} ]);
	},

	callHandlers: function(className, element)
	{
		if (!this.hasHandlerFor(className)) return;
		var hArray = this.handlers[className];
		for (var i=0; i < hArray.length; i++) {
			var handler = hArray[i][0];
			var options = hArray[i][1];
			handler(element, options);
		}
	},

	hasHandlerFor: function(className)
	{
		return this.handlers[className] ? true : false;
	},

	setup: function()
	{
		var elements = document.getElementsByTagName('*');
		if (!elements) return;
		for (var i=0; i < elements.length; i++) {
			Element.classNames(elements[i])._each(function(className) {
				if (Util.hasHandlerFor(className)) Util.callHandlers(className, elements[i]);
			});
		}
	},

	_findClassByPrefix: function(element, prefix)
	{
		var activator = null;
		var regexp = new RegExp('\s*'+(prefix||'for_')+'([^ ]+)\s*', 'i');
		var result = regexp.exec(element.className);
		return result && result.length > 1 ? result[1] : null;
	},

	_findActivator: function(element, prefix)
	{
		var elementName = Util._findClassByPrefix(element, prefix);
		if (!elementName) return null;
		return $(elementName);
	},

	_clearLinkActivator: function(activator)
	{
		if (activator.tagName.toLowerCase() != "a") return;
		try {
			activator.removeAttribute("href");
		} catch (e) {}
		activator.style.cursor = "pointer";
	},

	tooltipActivator: function(element)
	{
		var activator = Util._findActivator(element);
		if (!activator) return;
		activator.Tooltip = element;
		Tooltip.init(activator);
	},

	hoverActivator: function(element)
	{
		Event.observe(element, 'mouseover', function() { Element.addClassName(element, "hover") });
		Event.observe(element, 'mouseout',  function() { Element.removeClassName(element, "hover") });
	},

	hClickActivator: function(element)
	{
		Util.hoverActivator(element);
		var fName = Util._findClassByPrefix(element, 'call_');
		if (fName && window[fName]) {
		    element.style.cursor = "pointer";
			Event.observe(element, 'click', function() { window[fName](element) });
		}
	},

	navAreaActivator: function(element)
	{
		var fName = Util._findClassByPrefix(element, 'call_');
		var navArea = $(element.id + 'Nav');
		if (navArea) {
		    navArea.style.cursor = "pointer";
		    element.style.cursor = "pointer";
			try { element.removeAttribute("href"); } catch (e) {}
			Event.observe(element, 'mouseover', function(e){ Effect.Show(navArea); }, false);
			Event.observe(element, 'mouseout', function(e){ if (!Event.isInside(e)) Effect.Hide(navArea); }, false);
			if (fName && window[fName]) {
				Event.observe(element, 'click', function() { window[fName](element) }, false);
				Event.observe(navArea, 'click', function() { window[fName](element) }, false);
			}
		}
	},

	showHideActivator: function(element, options)
	{
		var EFFECTS = {
			grow: [ 'Grow', 'Shrink' ],
			slide: [ 'SlideDown', 'SlideUp' ],
			blind: [ 'BlindDown', 'BlindUp' ],
			appear: [ 'Appear', 'Fade' ],
			simple: [ 'Show', 'Hide' ]
		};
		var effect = options.effect || 'simple';
		var toggle = EFFECTS[effect] ? EFFECTS[effect] : EFFECTS['simple'];
		var activator = Util._findActivator(element);
		if (!activator) return;
		Util._clearLinkActivator(activator);
		activator.isHidden = true;
		Event.observe(activator, 'click', function() {
			if (activator.isHidden) {
				Element.addClassName(activator, "hidden")
			} else {
				Element.removeClassName(activator, "hidden")
			}
			Effect[activator.isHidden ? toggle[1] : toggle[0]](element, options);
			activator.isHidden = !activator.isHidden;
			return false;
		});
	},

	spinsActivator: function(element, options) {
		var spinUpActivator = Util._findActivator(element, 'spinUp_');
		var spinDownActivator = Util._findActivator(element, 'spinDown_');
		var delta = options.delta || 1;
		var updater = options.updater || Util._spinUpdater;
		if (spinUpActivator) {
			Util._clearLinkActivator(spinUpActivator);
			Event.observe(spinUpActivator, 'click', function() { updater(element, +delta, options) });
		}
		if (spinDownActivator) {
			Util._clearLinkActivator(spinDownActivator);
			Event.observe(spinDownActivator, 'click', function() { updater(element, -delta, options) });
		}
	},

	_spinUpdater: function(element, delta, options) {
		var minLimit = options.minLimit;
		var maxLimit = options.maxLimit;
		switch (element.tagName.toLowerCase()) {
			case 'input':
				element.value = eval(element.value + '+('+delta+')');
				if (minLimit != undefined && minLimit != null && element.value < minLimit)
					element.value = minLimit;
				if (maxLimit != undefined && maxLimit != null && element.value > maxLimit)
					element.value = maxLimit;
				break;
			default:
				element.innerHTML = eval(element.innerHTML + '+('+delta+')');
				if (minLimit != undefined && minLimit != null && element.innerHTML < minLimit)
					element.innerHTML = minLimit;
				if (maxLimit != undefined && maxLimit != null && element.innerHTML > maxLimit)
					element.innerHTML = maxLimit;
				break;
		}
	},

	addEvent: function(element, event, handler, useCapture)
	{
		Event.observe(element, event, handler, useCapture);
		/*
		if (element.addEventListener) {
			element.addEventListener(event, handler, false);
		} else if (element.attachEvent) {
			element.attachEvent('on' + event, handler);
		}
		*/
	},

	addMiniCartQty: function(idx, delta)
	{
		var element = $('miniCartItem_'+idx);
		var container = $('selectedPhotos');
		if (!container || container.busy) return;
		container.busy = true;
		var id = element.id.substring(element.id.lastIndexOf('_')+1);
		var qty = eval(element.innerHTML + '+('+delta+')');
		element.innerHTML = '<img src="images/watch.gif" alt="wait..." />';
		IcolorUtils.changeCartQty(id, qty, function(response) {
			if (!response.hasError) {
				if (response.content == 0) {
					var itemContainer = element.parentNode.parentNode;
					Effect.Shrink(itemContainer, {
						afterFinishInternal: function(effect) { with(Element) {
							[hide, undoClipping, undoPositioned].call(effect.effects[0].element);
							container.innerHTML = response.properties.miniCart;
						}}
					});
				} else {
					container.innerHTML = response.properties.miniCart;
				}
			}
			container.busy = false;
		});
	},

	_fixTooltipWithSafariForm: function() {
		var body = document.getElementsByTagName('BODY')[0];
		if (!body) return;
		Event.observe(body, 'click', function(event){
			Tooltip.toggle(Tooltip.CURRENT_TOOLTIP, event);
			if (!navigator.appVersion.match(/Safari|KHTML/)) return;
			if (!event) var event = window.event;
			var target = (window.event) ? event.srcElement : event.target;
			if (target.tagName != 'INPUT') return;
			var type = target.type || '';
			if (type.toLowerCase() != 'submit' || !target.form) return;
			target.form.submit();
		}, false);
	},

	_start: function()
	{
		Util.addEvent(window, 'load', function(){
			Util.setup();
			Util._fixTooltipWithSafariForm();
		});
	}

}

try {
	Util.addHandler('spinButtons', Util.spinsActivator, { minLimit: 1 });
	Util.addHandler('hClick', Util.hClickActivator);
	Util.addHandler('navArea', Util.navAreaActivator);
	Util._start();
} catch (e) {}
