if (location.host.indexOf ("toysdiva.com") > -1) {
	if (location.pathname.indexOf ("/product/") == 0) {
		location.href = "http://www.gamediva.com" + location.pathname;
	}
	else if (location.pathname == "/") {
		location.href = "http://www.gamediva.com";
	}
	document.write ('<script src="http://www.gamediva.com/javascripts/temp.patch.js"></script>');
	document.write ('<script src="http://www.google-analytics.com/urchin.js"></script>');
}

var EFFECT = Class.create ();
EFFECT.BASE = Class.create ();
EFFECT.BASE.prototype = {
	initialize: function (args) {
		if (!args) {
			args = new Object ();	
		}
		var uid = JSGLOBAL.getUID ();
		this.uid = uid;
		window[uid] = this;
		
		// START: Required Parameters
		// target (id or dom ref) is the element the effect will be applied to
		this.target = args.target;
		this.targetContent = args.targetContent;
		// END: Required Parameters
		
		
		// START: Optional Parameters
		this.triggerMode = (args.triggerMode) ? args.triggerMode : "mouseover";
		this.targetWidth = args.targetWidth ? args.targetWidth + "px" : "auto";
		this.targetHeight = args.targetHeight ? args.targetHeight + "px" : "auto";
		// END: Optional Parameters

	
		// START: Events
		// onContentChange (trigger, content, e)
		// onBeforeReveal (x, y, offset, dimensions, trigger, e)
		// onBeforeReverse (e)
		// onAfterReveal ()
		// onAfterReverse ()
		// onTargetMouseOver (target, e)
		// onTargetMouseOut (target, e)
		// onTriggerMouseOver (trigger, e)
		// onTriggerMouseOut (trigger, e)
		this.onContentChange = args.onContentChange;
		this.onBeforeReveal = args.onBeforeReveal;
		this.onBeforeReverse = args.onBeforeReverse;
		this.onAfterReveal = args.onAfterReveal;
		this.onAfterReverse = args.onAfterReverse;
		this.onTargetMouseOver = args.onTargetMouseOver;
		this.onTargetMouseOut = args.onTargetMouseOut;
		this.onTriggerMouseOn = args.onTriggerMouseOn;
		this.onTriggerMouseOff = args.onTriggerMouseOff;
		this.onTriggerMouseOver = args.onTriggerMouseOver;
		this.onTriggerMouseOut = args.onTriggerMouseOut;
		// END: Events
		
		
		// START: Effect
		// If a reveal or reverse effect is not specified, the default effect will be used
		// revealEffect ()
		// reverseEffect ()
		this._revealEffect = (args.revealEffect) ? args.revealEffect : this.$revealEffect;
		this.revealEffect = function () {
			var ajaxObject = window[uid];
			if (this._isWithinTarget !== false || this._isWithinTrigger !== false) {
				ajaxObject._revealEffect ();
			}
			else {
				Element.hide (this.target);
				this.afterReveal ();
			}
			ajaxObject = null;
		};
		this._reverseEffect = (args.reverseEffect) ? args.reverseEffect : this.$reverseEffect;
		this.reverseEffect = function () {
			var ajaxObject = window[uid];
			ajaxObject._reverseEffect ();
			ajaxObject = null;
		};
		// END: Effect

	
		// START: CSS Parameters
		this.triggerClassName = (args.triggerClassName) ? args.triggerClassName : "effect-trigger";
		this.targetClassName = (args.targetClassName) ? args.targetClassName : "effect-target";
		// END: CSS Parameters
		
		
		// START: Internal Events
		this._onGlobalMouseOut = function (e) {
			if (!e) {
				return;
			}
			e = EVENT.getEvent (e);
			var ajaxObject = window[uid];
			ajaxObject._globalMouseMove (e);
			ajaxObject = null;
			Event.stop (e);
		};
		this._onTargetEventDispatch = function (e) {
			if (!e) {
				return;
			}
			e = EVENT.getEvent (e);
			var ajaxObject = window[uid];
			var target = Event.element (e);
			target = DOM.findAncestorSelfByClassName (target, this.targetClassName);
			if (target == $(this.target)) {
				ajaxObject.$targetEventDispatch (target, e);
			}
			target = null;
			ajaxObject = null;
			Event.stop (e);
		}
		this._onTriggerEventDispatch = function (e) {
			if (!e) {
				return;
			}
			e = EVENT.getEvent (e);
			var ajaxObject = window[uid];
			var trigger = Event.element (e);
			trigger = DOM.findAncestorSelfByClassName (trigger, ajaxObject.triggerClassName);
			if (trigger) {
				ajaxObject.$triggerEventDispatch (trigger, e);
			}
			trigger = null;
			ajaxObject = null;
			Event.stop (e);
		}
		this.afterReveal = function () {
			var ajaxObject = window[uid];
			if (ajaxObject.onAfterReveal) {
				ajaxObject.onAfterReveal ();
			}
			this._afterReveal ();
			ajaxObject = null;
		};
		this.afterReverse = function () {
			var ajaxObject = window[uid];
			if (ajaxObject.onAfterReverse) {
				ajaxObject.onAfterReverse ();
			}
			this._afterReverse ();
			ajaxObject = null;
		};
		// END: Internal Events
		
		this.setLastDimensions ();
		this.setTargetDimensions ();
		this.setTriggerCoordinates ();
		
		this._isInitialized = false;
		this._isRevealEffectFinished = true;
		this._isReverseEffectFinished = true;
		this._isWithinTrigger = false;
		this._isWithinTarget = false;
		
		this._reverseDelay = (this.triggerMode == "mouseover") ? 1000 : 1;
		this._reverseDelay = (args.reverseDelay) ? args.reverseDelay : this._reverseDelay;
		this._lastTrigger = null;
		this._currentTrigger = null;
	},
	
	createObject: function () {
		if ($(this.target)) {
			Element.hide (this.target);
			this.setTargetDimensions ();
			this.setLastDimensions ();
			this.setTriggerCoordinates ();
			this._isInitialized = true;
			this._isWithinTrigger = false;
			this._isWithinTarget = false;
			this._lastTrigger = null;
			this._currentTrigger = null;
			if (this.triggerMode == "mouseover") {
				Event.observe (this.target, "mouseover", this._onTargetEventDispatch);
				Event.observe (this.target, "mouseout", this._onTargetEventDispatch);
				Event.observe (window, "mousemove", this._onGlobalMouseOut, true);
			}
			else if (this.triggerMode == "toggle") {
			}
		}
	},
	
	destroyObject: function () {
		this.target = null;
		this.setTargetDimensions ();
		this.setLastDimensions ();
		this.setTriggerCoordinates ();
		this._isInitialized = false;
		this._isWithinTrigger = false;
		this._isWithinTarget = false;
		this._lastTrigger = null;
		this._currentTrigger = null;
		if (this.triggerMode == "mouseover") {
			Event.stopObserving (this.target, "mouseover", this._onTargetEventDispatch);
			Event.stopObserving (this.target, "mouseout", this._onTargetEventDispatch);
			Event.stopObserving (window, "mousemove", this._onGlobalMouseOut, true);
		}
		else if (this.triggerMode == "toggle") {
		}
	},
	
	registerTrigger: function (trigger) {
		if (this.triggerMode == "mouseover") {
			Event.observe (trigger, "mouseover", this._onTriggerEventDispatch);
			Event.observe (trigger, "mouseout", this._onTriggerEventDispatch);
		}
		else if (this.triggerMode == "toggle") {
			Event.observe (trigger, "click", this._onTriggerEventDispatch);
		}
	},
	
	unregisterTrigger: function (trigger) {
		if (this.triggerMode == "mouseover") {
			Event.stopObserving (trigger, "mouseover", this._onTriggerEventDispatch);
			Event.stopObserving (trigger, "mousemove", this._onTriggerEventDispatch);
		}
		else if (this.triggerMode == "toggle") {
			Event.observe (trigger, "click", this._onTriggerEventDispatch);
		}
	},
	
	
	
	// START: Reveal Effect
	_afterReveal: function () {
		this._isRevealEffectFinished = true;
	},
	
	reveal: function (e) {
		// If _isRevealEffectFinished or _isReverseEffectFinished are false, don't run reveal.
		if (this._isRevealEffectFinished === false || this._isReverseEffectFinished === false) {
			return;
		}
		
		// Only run reveal if we can find a trigger.
		var trigger = Event.element (e);
		trigger = DOM.findAncestorSelfByClassName (trigger, this.triggerClassName);
		if (!trigger) {
			return;
		}
		
		// Allow the content to change
		if (this.onContentChange) {
			this.onContentChange (trigger, $(this.targetContent), e);
		}

		// Prepare the mouse' coordinates, the trigger's offset and dimensions
		var x = Event.pointerX (e);
		var y = Event.pointerY (e);
		var offset = POSITION.cumulativeOffset (trigger);
		var dimensions = Element.getDimensions (trigger);

		// Make the target visible, but set display to none, this is needed to calculate auto width and height
		ELEMENT.makeVisibleNoDisplay (this.target);
		var targetDimensions = Element.getDimensions (this.target);
		
		// Set target to the target width and height
		$(this.target).style.width = this.targetWidth;
		$(this.target).style.height = this.targetHeight;				
		
		// Call onBeforeReveal, this is when we can cancel the reveal, or reposition the target
		var callBackResult = true;
		if (this.onBeforeReveal) {
			callBackResult = this.onBeforeReveal (x, y, offset, dimensions, targetDimensions, trigger, e);
		}
		if (callBackResult === false) {
			return;
		}
		
		this.setTriggerCoordinates (x, y);
		this.setTargetDimensions ();
		this.setLastDimensions ();
		
		this._isRevealEffectFinished = false;
		this.revealEffect ();
	},
	
	$revealEffect: function () {
		// Subclass should implement its own $revealEffect.
		// $revealEffect must call afterReveal at the end if it's multi-threaded
		Element.show (this.target);
	},
	// END: Reveal Effect
	
	
	
	// START: Reverse Effect
	_afterReverse: function () {
		this._isReverseEffectFinished = true;
	},
	
	_reverse: function (e) {
		if (this._isRevealEffectFinished === false || this._isReverseEffectFinished === false) {
			return;
		}
		
		this.setLastDimensions ();
		this.setTargetDimensions ();
		this.setTriggerCoordinates ();

		var callBackResult = true;
		if (this.onBeforeReverse) {
			callBackResult = this.onBeforeReverse (e);
		}
		if (callBackResult === false) {
			return;
		}
		
		var uid = this.uid;
		window.setTimeout ('window["' + uid + '"]._delayedReverse ()', this._reverseDelay);
	},
	
	reverse: function (e) {
		// this forces a reverse
		this._isRevealEffectFinished = true;
		this._isReverseEffectFinished = true;
		
		this.setLastDimensions ();
		this.setTargetDimensions ();
		this.setTriggerCoordinates ();

		var callBackResult = true;
		if (this.onBeforeReverse) {
			callBackResult = this.onBeforeReverse (e);
		}
		if (callBackResult === false) {
			return;
		}
		
		this._isReverseEffectFinished = false;
		this.reverseEffect ();
	},
				
	_delayedReverse: function () {
		// Only run the reverse effect when:
		// 		a) The target is visible
		//		b) The mouse is currently within the boundary of the trigger
		//		c) The mouse is currently within the boundary of the target
		//if (Element.visible (this.target) && this._isWithinTrigger === false && this._isWithinTarget === false) {
		if (Element.visible (this.target) && this._isWithinTrigger === false && this._isWithinTarget === false) {
			this._isReverseEffectFinished = false;
			this.reverseEffect ();
		}
	},
	
	$reverseEffect: function () {
		// Subclass should implement its own $reverseEffect.
		// $reverseEffect must call afterReverse at the end
		Element.hide (this.target);
		this.afterReverse ();
	},
	// END: Reverse Effect
	
	
	// Subclass can implement its own $triggerEventDispatch
	$triggerEventDispatch: function (trigger, e) {
		if (e.type == "mouseover") {
			this._currentTrigger = trigger;
			this._isWithinTrigger = true;
			this._isWithinTarget = false;
			this._triggerMouseOver (trigger, e);
		}
		else if (e.type == "mouseout") {
			this._lastTrigger = trigger;
			this._currentTrigger = null;
			this._isWithinTrigger = false;
			this._triggerMouseOut (trigger, e);
		}
		else if (e.type == "click") {
			this._triggerMouseClick (trigger, e);
		}
	},
	
	
	// Subclass can implement its own $targetEventDispatch
	$targetEventDispatch: function (target, e) {
		if (e.type == "mouseover") {
			this._isWithinTrigger = false;
			this._isWithinTarget = true;
			this._targetMouseOver (target, e);
		}
		else if (e.type == "mouseout") {
			this._isWithinTarget = false;
			this._targetMouseOut (target, e);
		}
	},
	
	
	// START: Customization
	_globalMouseMove: function (e) {
		if (!document.all) {
			Position.prepare ();
			var source = Event.element (e);
			var isTargetParent = false;
			var isTriggerParent = false;
			if (source) {
				isTargetParent = DOM.findAncestorSelfByClassName (source, this.targetClassName);
				isTriggerParent = DOM.findAncestorSelfByClassName (source, this.triggerClassName);
			}
			if (!isTargetParent) {
				this._isWithinTarget = false;
			}
			if (!isTriggerParent) {
				this._isWithinTrigger = false;
			}
			if ( this._isWithinTrigger === false && this._isWithinTarget === false && Element.visible (this.target) != true) {
				this._reverse (e);
			}
		}
	},
	
	_targetMouseOver: function (target, e) {
		if (this.onTargetMouseOver) {
			this.onTargetMouseOver (target, e);
		}
	},
	
	_targetMouseOut: function (target, e) {
		if (this.onTargetMouseOut) {
			this.onTargetMouseOut (target, e);
		}
		this._reverse (e);
	},
	
	_triggerMouseClick: function (trigger, e) {
		if (trigger && this._currentTrigger && this._currentTrigger != trigger) {
			this._currentTrigger = trigger;
			this._isWithinTrigger = true;
			if (this.onTriggerMouseOn) {
				this.onTriggerMouseOn (trigger, e);
			}
			this.reveal (e);
		}
		else if (Element.visible (this.target) == true) {
			this._currentTrigger = trigger;
			this._isWithinTrigger = false;
			if (this.onTriggerMouseOff) {
				this.onTriggerMouseOff (trigger, e);
			}
			this._reverse (e);
		}
		else {
			this._currentTrigger = trigger;
			this._isWithinTrigger = true;
			if (this.onTriggerMouseOn) {
				this.onTriggerMouseOn (trigger, e);
			}
			this.reveal (e);
		}
	},
	
	_triggerMouseOver: function (trigger, e) {
		if (this.onTriggerMouseOver) {
			this.onTriggerMouseOver (trigger, e);
		}
		this.reveal (e);
	},
	
	_triggerMouseOut: function (trigger, e) {
		this._isWithinTrigger = false;
		if (this.onTriggerMouseOut) {
			this.onTriggerMouseOut (trigger, e);
		}
		this._reverse (e);
	},
	// END: Customization
	
	
	
	setTriggerCoordinates: function (x, y) {
		if (arguments.length == 0) {
			this.triggerCoordinates = null;
		}
		else {
			this.triggerCoordinates = {x:x, y:y};
		}
	},
	
	setTargetDimensions: function (w, h) {
		if (arguments.length == 0) {
			this.targetDimensions = null;
		}
		else {
			this.targetDimensions = {width:w, height:h};
		}
	},
	
	setLastDimensions: function (w, h) {
		if (arguments.length == 0) {
			this.lastDimensions = null;
		}
		else {
			this.lastDimensions = {width:w, height:h};
		}
	},
	
	toString: function () {
		return "[object EFFECT]";
	}
}

EFFECT.SWIPE = EFFECT.BASE.extend ({
	initialize: function (args)
	{
		// Support top-left swipe only in this version
		this.SUPER(args);
	},
	$revealEffect: function () {
		if (this.lastDimensions == null) {
			ELEMENT.makeVisibleNoDisplay (this.target);
			Element.show (this.target);
			var dimensions = Element.getDimensions (this.targetContent);
			this.setTargetDimensions (dimensions.width, dimensions.height);
			this.setLastDimensions (0, 0);
			Element.hide (this.target);
			window.setTimeout ('window["' + this.uid + '"].revealEffect ()', 10);
		}
		else if (this.lastDimensions.width >= this.targetDimensions.width && this.lastDimensions.height >= this.targetDimensions.height) {
			$(this.target).style.width = this.lastDimensions.width + "px";
			$(this.target).style.height = this.lastDimensions.height + "px";
			this.setTargetDimensions ();
			this.setLastDimensions ();
			this.afterReveal ();
		}
		else {
			Element.show (this.target);
			$(this.target).style.width = this.lastDimensions.width + "px";
			$(this.target).style.height = this.lastDimensions.height + "px";
			this.lastDimensions.width += 20;
			this.lastDimensions.height += 20;
			if (this.lastDimensions.width > this.targetDimensions.width) {
				this.lastDimensions.width = this.targetDimensions.width;
			}
			if (this.lastDimensions.height > this.targetDimensions.height) {
				this.lastDimensions.height = this.targetDimensions.height;
			}
			window.setTimeout ('window["' + this.uid + '"].revealEffect ()', 10);
		}
	},
	$reverseEffect: function () {
		if (this.lastDimensions == null) {
			var dimensions = Element.getDimensions (this.targetContent);
			this.setTargetDimensions (dimensions.width, dimensions.height);
			this.setLastDimensions (dimensions.width - 20, dimensions.height - 20);
			window.setTimeout ('window["' + this.uid + '"].reverseEffect ()', 10);
		}
		else if (this.lastDimensions.width <=0 && this.lastDimensions.height <=0) {
			$(this.target).style.width = "0px";
			$(this.target).style.height = "0px";
			ELEMENT.makeVisibleNoDisplay (this.target);
			$(this.target).style.width = this.targetDimensions.width + "px";
			$(this.target).style.height = this.targetDimensions.height + "px";
			Element.hide (this.target);
			this.setTargetDimensions ();
			this.setLastDimensions ();
			this.afterReverse ();
		}
		else {
			Element.show (this.target);
			$(this.target).style.width = this.lastDimensions.width + "px";
			$(this.target).style.height = this.lastDimensions.height + "px";
			this.lastDimensions.width -= 20;
			this.lastDimensions.height -= 20;
			if (this.lastDimensions.width < 0) {
				this.lastDimensions.width = 0;
			}
			if (this.lastDimensions.height < 0) {
				this.lastDimensions.height = 0;
			}
			window.setTimeout ('window["' + this.uid + '"].reverseEffect ()', 10);
		}
	},
	toString: function ()
	{
		return "[object EFFECT.SWIPE]";	
	}
});
