// ************************************************************************************
// KeyManager
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.KeyManager = function(element)
{
    Competir.Web.UI.Webparts.Behaviors.KeyManager.initializeBase(this, [element]);
    this._TargetDomElement = null;
    this._TargetControlKeyDownHandler = "";
    this._TargetControlKeyUpHandler = "";
};

// prototype
Competir.Web.UI.Webparts.Behaviors.KeyManager.prototype =
{
	// methods
	initialize: function()
	{
		var obj = this.get_TargetDomElement();
		if (obj)
		{
			obj.onkeydown = Function.createDelegate(this, this.onKeyDown);
			obj.onkeyup = Function.createDelegate(this, this.onKeyUp);
		}
		Competir.Web.UI.Webparts.Behaviors.KeyManager.callBaseMethod(this, "initialize");
	},
	getKeyCode: function(e)
	{
		var rv = 0;
		if (!e)
		{
			if (window.event)
			{
				e = window.event;
			}
		}
		if (e)
		{
			if (e.which)
			{
				rv = e.which;
			}
			else if (e.keyCode)
			{
				rv = e.keyCode;
			}
		}
		return rv;
	},

	// properties
	get_TargetDomElement: function()
	{
		return this._TargetDomElement;
	},
	set_TargetDomElement: function(value)
	{
		if (this._TargetDomElement !== value)
		{
			this._TargetDomElement = value;
			this.raisePropertyChanged("TargetDomElement");
		}
	},
	get_TargetControlKeyDownHandler: function()
	{
		return this._TargetControlKeyDownHandler;
	},
	set_TargetControlKeyDownHandler: function(value)
	{
		if (this._TargetControlKeyDownHandler !== value)
		{
			this._TargetControlKeyDownHandler = value;
			this.raisePropertyChanged("TargetControlKeyDownHandler");
		}
	},
	get_TargetControlKeyUpHandler: function()
	{
		return this._TargetControlKeyUpHandler;
	},
	set_TargetControlKeyUpHandler: function(value)
	{
		if (this._TargetControlKeyUpHandler !== value)
		{
			this._TargetControlKeyUpHandler = value;
			this.raisePropertyChanged("TargetControlKeyUpHandler");
		}
	},

	// event delegates
	onKeyDown: function(e)
	{
		if (this.get_TargetControlKeyDownHandler() != "")
		{
			var keyCode = this.getKeyCode(e);
			if (keyCode != 0)
			{
				var h = eval("this.get_Target()." + this.get_TargetControlKeyDownHandler());
				if (h)
				{
					h.apply(this.get_Target(), [keyCode]);
				}
				else
				{
					this.get_Target().callFromBehavior(this.get_TargetControlKeyDownHandler(), [keyCode]);
				}
			}
		}
	},
	onKeyUp: function()
	{
		if (this.get_TargetControlKeyUpHandler() != "")
		{
			var keyCode = this.getKeyCode(e);
			if (keyCode != 0)
			{
				var h = eval("this.get_Target()." + this.get_TargetControlKeyUpHandler());
				if (h)
				{
					h.apply(this.get_Target(), [keyCode]);
				}
				else
				{
					this.get_Target().callFromBehavior(this.get_TargetControlKeyDownHandler(), [keyCode]);
				}
			}
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.KeyManager.registerClass("Competir.Web.UI.Webparts.Behaviors.KeyManager", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);



// ************************************************************************************
// FocusManager
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.FocusManager = function(element)
{
    Competir.Web.UI.Webparts.Behaviors.FocusManager.initializeBase(this, [element]);
    this._TargetDomElement = null;
    this._TargetControlFocusHandler = "";
    this._TargetControlBlurHandler = "";
};

// prototype
Competir.Web.UI.Webparts.Behaviors.FocusManager.prototype =
{
	// methods
	initialize: function()
	{
		var obj = this.get_TargetDomElement();
		if (obj)
		{
			obj.onfocus = Function.createDelegate(this, this.onFocus);
			obj.onblur = Function.createDelegate(this, this.onBlur);
		}
		Competir.Web.UI.Webparts.Behaviors.FocusManager.callBaseMethod(this, "initialize");
	},

	// properties
	get_TargetDomElement: function()
	{
		return this._TargetDomElement;
	},
	set_TargetDomElement: function(value)
	{
		if (this._TargetDomElement !== value)
		{
			this._TargetDomElement = value;
			this.raisePropertyChanged("TargetDomElement");
		}
	},
	get_TargetControlFocusHandler: function()
	{
		return this._TargetControlFocusHandler;
	},
	set_TargetControlFocusHandler: function(value)
	{
		if (this._TargetControlFocusHandler !== value)
		{
			this._TargetControlFocusHandler = value;
			this.raisePropertyChanged("TargetControlFocusHandler");
		}
	},
	get_TargetControlBlurHandler: function()
	{
		return this._TargetControlBlurHandler;
	},
	set_TargetControlBlurHandler: function(value)
	{
		if (this._TargetControlBlurHandler !== value)
		{
			this._TargetControlBlurHandler = value;
			this.raisePropertyChanged("TargetControlBlurHandler");
		}
	},

	// event delegates
	onFocus: function(e)
	{
		if (this.get_TargetControlFocusHandler() != "")
		{
			var h = eval("this.get_Target()." + this.get_TargetControlFocusHandler());
			if (h)
			{
				h.apply(this.get_Target(), []);
			}
		}
	},
	onBlur: function()
	{
		if (this.get_TargetControlBlurHandler() != "")
		{
			var h = eval("this.get_Target()." + this.get_TargetControlBlurHandler());
			if (h)
			{
				h.apply(this.get_Target(), []);
			}
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.FocusManager.registerClass("Competir.Web.UI.Webparts.Behaviors.FocusManager", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);



// ************************************************************************************
// DefaultValueManager
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.DefaultValueManager = function(element)
{
    Competir.Web.UI.Webparts.Behaviors.DefaultValueManager.initializeBase(this, [element]);
    this._TargetDomElement = null;
    this._InitialValue = "";
};

// prototype
Competir.Web.UI.Webparts.Behaviors.DefaultValueManager.prototype =
{
	// methods
	initialize: function()
	{
		var obj = this.get_TargetDomElement();
		if (obj)
		{
			obj.onfocus = Function.createDelegate(this, this.onFocus);
			obj.onblur = Function.createDelegate(this, this.onBlur);
			this.set_InitialValue(obj.value);
		}
		Competir.Web.UI.Webparts.Behaviors.DefaultValueManager.callBaseMethod(this, "initialize");
	},

	// properties
	get_TargetDomElement: function()
	{
		return this._TargetDomElement;
	},
	set_TargetDomElement: function(value)
	{
		if (this._TargetDomElement !== value)
		{
			this._TargetDomElement = value;
			this.raisePropertyChanged("TargetDomElement");
		}
	},
	get_InitialValue: function()
	{
		return this._InitialValue;
	},
	set_InitialValue: function(value)
	{
		if (this._InitialValue !== value)
		{
			this._InitialValue = value;
			this.raisePropertyChanged("InitialValue");
		}
	},

	// event delegates
	onFocus: function(e)
	{
		var obj = this.get_TargetDomElement();
		if (obj)
		{
			if (obj.value == this.get_InitialValue())
			{
				obj.value = "";
			}
		}
	},
	onBlur: function()
	{
		var obj = this.get_TargetDomElement();
		if (obj)
		{
			if (obj.value == "")
			{
				obj.value = this.get_InitialValue();
			}
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.DefaultValueManager.registerClass("Competir.Web.UI.Webparts.Behaviors.DefaultValueManager", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);



// ************************************************************************************
// BackgroundBlinker
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.BackgroundBlinker = function(element)
{
    Competir.Web.UI.Webparts.Behaviors.BackgroundBlinker.initializeBase(this, [element]);
    this._IsPlaying = false;
    this._Speed = 700;
    this._Iterations = 0;
    this._TargetDomElement = null;
    this._Color = "";
};

// prototype
Competir.Web.UI.Webparts.Behaviors.BackgroundBlinker.prototype =
{
	// methods
	blink: function(targetDomElement)
	{
		if (targetDomElement)
		{
			if (!targetDomElement.isBlinking)
			{
				var blinkEffect = function(control, target, color, iterations, speed)
				{
					this.control = control;
					this.target = target;
					this.color = color;
					if (target.style.color)
					{
						this.originalFgColor = target.style.color;
					}
					else
					{
						var c = "";
						if (target.currentStyle)
						{
							if (target.currentStyle.color)
							{
								c = target.currentStyle.color;
							}
						}
						if (c == "")
						{
							c = "black";
						}
						this.originalFgColor = c;
					}
					if (target.style.backgroundColor)
					{
						this.originalBgColor = target.style.backgroundColor;
					}
					else
					{
						var c = "";
						if (target.currentStyle)
						{
							if (target.currentStyle.backgroundColor)
							{
								c = target.currentStyle.backgroundColor;
							}
						}
						if (c == "")
						{
							c = "transparent";
						}
						this.originalBgColor = c;
					}
					this.iterations = iterations * 2;
					this.speed = speed;
					this.execute = function(pointer)
					{
						pointer = pointer || this;
						pointer.iterations --;
						if (pointer.iterations == 0)
						{
							pointer.target.isBlinking = false;
							pointer.target.style.color = pointer.originalFgColor;
							pointer.target.style.backgroundColor = pointer.originalBgColor;
						}
						else
						{
							pointer.target.isBlinking = true;
							if (pointer.iterations % 2 == 0)
							{
								pointer.target.style.color = pointer.originalFgColor;
								pointer.target.style.backgroundColor = pointer.originalBgColor;
							}
							else
							{
								pointer.target.style.color = pointer.originalBgColor;
								pointer.target.style.backgroundColor = pointer.color;
							}
							setTimeout(function(){ pointer.execute(pointer) }, pointer.speed);
						}
					};
				};
				var e = new blinkEffect(this, targetDomElement, this.get_Color(), this.get_Iterations(), this.get_Speed());
				e.execute();
			}
		}
	},

	// properties
	get_Speed: function()
	{
		return this._Speed;
	},
	set_Speed: function(value)
	{
		if (this._Speed !== value)
		{
			this._Speed = value;
			this.raisePropertyChanged("Speed");
		}
	},
	get_Iterations: function()
	{
		return this._Iterations;
	},
	set_Iterations: function(value)
	{
		if (this._Iterations !== value)
		{
			this._Iterations = value;
			this.raisePropertyChanged("Iterations");
		}
	},
	get_Color: function()
	{
		return this._Color;
	},
	set_Color: function(value)
	{
		if (this._Color !== value)
		{
			this._Color = value;
			this.raisePropertyChanged("Color");
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.BackgroundBlinker.registerClass("Competir.Web.UI.Webparts.Behaviors.BackgroundBlinker", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);



// ************************************************************************************
// Gallery
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.Gallery = function(element)
{
    Competir.Web.UI.Webparts.Behaviors.Gallery.initializeBase(this, [element]);
    this._TargetDomElementClientID = "";
    this._ScrollPosition = 0;
    this._Speed = 30;
	this._Interval = null;
	this.scrollDelegate = Function.createDelegate(this, this.scroll);
};

// prototype
Competir.Web.UI.Webparts.Behaviors.Gallery.prototype =
{
	// methods
	previous: function()
	{
		var obj = this.getChild(this.get_TargetDomElementClientID());
		if (obj)
		{
			this.set_ScrollPosition(obj.scrollTop - parseInt(obj.style.height));
			this.scroll(this);
		}
	},
	next: function()
	{
		var obj = this.getChild(this.get_TargetDomElementClientID());
		if (obj)
		{
			this.set_ScrollPosition(obj.scrollTop + parseInt(obj.style.height));
			this.scroll(this);
		}
	},
	scroll: function()
	{
		var obj = this.getChild(this.get_TargetDomElementClientID());
		if (obj)
		{
			if (!this.get_Interval())
			{
				this.set_Interval(window.setInterval(this.scrollDelegate, this.get_Speed()));
			}
			var d = Math.round((this.get_ScrollPosition() - obj.scrollTop) / 4);
			if (d > 0)
			{
				d = Math.max(d, 1);
			}
			else
			{
				d = Math.min(d, -1);
			}
			if (Math.abs(this.get_ScrollPosition() - obj.scrollTop) > 1)
			{
				obj.scrollTop += d;
			}
			else
			{
				obj.scrollTop = this.get_ScrollPosition();
				clearInterval(this.get_Interval());
				this.set_Interval(null);
			}
		}
	},

	// properties
	get_TargetDomElementClientID: function()
	{
		return this._TargetDomElementClientID;
	},
	set_TargetDomElementClientID: function(value)
	{
		if (this._TargetDomElementClientID !== value)
		{
			this._TargetDomElementClientID = value;
			this.raisePropertyChanged("TargetDomElementClientID");
		}
	},
	get_ScrollPosition: function()
	{
		return this._ScrollPosition;
	},
	set_ScrollPosition: function(value)
	{
		if (this._ScrollPosition !== value)
		{
			this._ScrollPosition = value;
			this.raisePropertyChanged("ScrollPosition");
		}
	},
	get_Speed: function()
	{
		return this._Speed;
	},
	set_Speed: function(value)
	{
		if (this._Speed !== value)
		{
			this._Speed = value;
			this.raisePropertyChanged("Speed");
		}
	},
	get_Interval: function()
	{
		return this._Interval;
	},
	set_Interval: function(value)
	{
		if (this._Interval !== value)
		{
			this._Interval = value;
			this.raisePropertyChanged("Interval");
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.Gallery.registerClass("Competir.Web.UI.Webparts.Behaviors.Gallery", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);



// ************************************************************************************
// Modal
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.Modal = function(element)
{
    Competir.Web.UI.Webparts.Behaviors.Modal.initializeBase(this, [element]);
};

// prototype
Competir.Web.UI.Webparts.Behaviors.Modal.prototype =
{
	// methods
	initialize: function()
	{
		this.get_Target().add_onHide(Function.createDelegate(this, this.onTargetHide));
		this.get_Target().add_onShow(Function.createDelegate(this, this.onTargetShow));
		Competir.Web.UI.Webparts.Behaviors.Modal.callBaseMethod(this, "initialize");
	},

	// event delegates
	onTargetHide: function(sender, args)
	{
		if (window.modal == sender)
		{
			window.modal = null;
		}
		if (!window.modal)
		{
			Competir.Web.UI.toggleObjectsVisibility("OBJECT", true);
		}
	},
	onTargetShow: function(sender, args)
	{
		Competir.Web.UI.toggleObjectsVisibility("OBJECT", false);
		var objBackground = sender.getChild("Background");
		if (objBackground)
		{
			if (!window.modal)
			{
				sender.show(objBackground);
				window.modal = sender;
			}
			else
			{
				if (window.modal != sender)
				{
					sender.hide(objBackground);
				}
			}
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.Modal.registerClass("Competir.Web.UI.Webparts.Behaviors.Modal", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);



// ************************************************************************************
// Callout
// ************************************************************************************
// namespace
Type.registerNamespace("Competir.Web.UI.Webparts.Behaviors");

// constructor
Competir.Web.UI.Webparts.Behaviors.Callout = function(element)
{
	Competir.Web.UI.Webparts.Behaviors.Callout.initializeBase(this, [element]);
	this._onWindowChangeEventDelegate = Function.createDelegate(this, this.refresh);
	this._onClickEventDelegate = Function.createDelegate(this, this._onClick);
	this._TargetDomElement = null;
	this._Position = "Down";
	this._OffsetX = 0;
	this._OffsetY = 0;
};

// prototype
Competir.Web.UI.Webparts.Behaviors.Callout.prototype =
{
	// methods
	initialize: function()
	{
		this.get_element().style.position = "absolute";
		if (window.addEventListener)
		{
			window.addEventListener("resize", this._onWindowChangeEventDelegate, false);
			window.addEventListener("scroll", this._onWindowChangeEventDelegate, false);
			window.addEventListener("click", this._onClickEventDelegate, false);
		}
		else if (document.addEventListener)
		{
			document.addEventListener('resize', this._onWindowChangeEventDelegate, false);
			document.addEventListener('scroll', this._onWindowChangeEventDelegate, false);
			document.addEventListener('click', this._onClickEventDelegate, false);
		}
		else
		{
			window.attachEvent("onresize", this._onWindowChangeEventDelegate);
			window.attachEvent("onscroll", this._onWindowChangeEventDelegate);
			document.attachEvent("onclick", this._onClickEventDelegate);
		}
		Competir.Web.UI.Webparts.Behaviors.Callout.callBaseMethod(this, "initialize");
	},
	dispose: function()
	{
		Competir.Web.UI.Webparts.Behaviors.Callout.callBaseMethod(this, "dispose");
	},
	showFor: function(element, position, offsetX, offsetY)
	{
		if (element)
		{
			this.set_TargetDomElement(element);
			if (position)
			{
				this.set_Position(position);
			}
			if (offsetX)
			{
				this.set_OffsetX(offsetX);
			}
			if (offsetY)
			{
				this.set_OffsetY(offsetY);
			}
			
			var directions = new Array("Up", "Down", "Left", "Right");
			for (var i = 0; i < directions.length; i++)
			{
				var objArrow = this.getChild(directions[i]);
				if (objArrow)
				{
					this.get_Target().hide(objArrow);
					switch (directions[i])
					{
						case "Up":
						case "Down":
							if (this.get_OffsetX() != 0)
							{
								if (objArrow)
								{
									objArrow.style.left = (this.get_OffsetX() * -1);
								}
							}
							if (this.get_Position().toLowerCase() == "up" && directions[i].toLowerCase() == "down")
							{
								this.get_Target().show(objArrow);
							}
							else if (this.get_Position().toLowerCase() == "down" && directions[i].toLowerCase() == "up")
							{
								this.get_Target().show(objArrow);
							}
							break;
						case "Left":
						case "Right":
							if (this.get_OffsetY() != 0)
							{
								if (objArrow)
								{
									objArrow.style.top = (this.get_OffsetY() * -1);
								}
							}
							if (this.get_Position().toLowerCase() == "left" && directions[i].toLowerCase() == "right")
							{
								this.get_Target().show(objArrow);
							}
							else if (this.get_Position().toLowerCase() == "right" && directions[i].toLowerCase() == "left")
							{
								this.get_Target().show(objArrow);
							}
							break;
					}
				}
			}
			
			this.get_Target().show();
			this.refresh();
		}
	},
	computeCoordinate: function(coordinate)
	{
		var rv = 0;
		switch (coordinate)
		{
			case "top":
				if (navigator.userAgent.indexOf("MSIE") == -1)
				{
					rv += document.body.scrollTop;
				}
				switch (this.get_Position().toLowerCase())
				{
					case "up":
						rv -= this.get_element().offsetHeight;
						rv -= this.get_OffsetY();
						break;
					case "down":
						rv += this.get_TargetDomElement().offsetHeight;
						rv += this.get_OffsetY();
						break;
					case "left":
					case "right":
						rv -= this.get_element().offsetHeight * 0.5;
						rv += this.get_TargetDomElement().offsetHeight * 0.5;
						break;
				}
				rv += this.get_OffsetY();
				break;
			case "left":
				if (navigator.userAgent.indexOf("MSIE") == -1)
				{
					rv += document.body.scrollLeft;
				}
				switch (this.get_Position().toLowerCase())
				{
					case "up":
					case "down":
						rv -= this.get_element().offsetWidth * 0.5;
						rv += this.get_TargetDomElement().offsetWidth * 0.5;
						break;
					case "left":
						rv -= this.get_element().offsetWidth;
						break;
					case "right":
						rv += this.get_TargetDomElement().offsetWidth;
						break;
				}
				rv += this.get_OffsetX();
				break;
		}
		var refNode = this.get_TargetDomElement();
		while (refNode)
		{
			switch (coordinate)
			{
				case "top":
					if (refNode.offsetTop != 0)
					{
						rv += refNode.offsetTop;
					}
					break;
				case "left":
					if (refNode.offsetLeft != 0)
					{
						rv += refNode.offsetLeft;
					}
					break;
			}
			refNode = refNode.offsetParent;
		}
		return rv;
	},
	refresh: function()
	{
		if (this.get_TargetDomElement())
		{
			this.get_element().style.top = this.computeCoordinate("top") + "px";
			this.get_element().style.left = this.computeCoordinate("left") + "px";
		}
	},

	// properties
	get_TargetDomElement: function()
	{
		return this._TargetDomElement;
	},
	set_TargetDomElement: function(value)
	{
		if (this._TargetDomElement !== value)
		{
			this._TargetDomElement = value;
			this.raisePropertyChanged("TargetDomElement");
		}
	},
	get_Position: function()
	{
		return this._Position;
	},
	set_Position: function(value)
	{
		if (this._Position !== value)
		{
			this._Position = value;
			this.raisePropertyChanged("Position");
		}
	},
	get_OffsetX: function()
	{
		return this._OffsetX;
	},
	set_OffsetX: function(value)
	{
		if (this._OffsetX !== value)
		{
			this._OffsetX = value;
			this.raisePropertyChanged("OffsetX");
		}
	},
	get_OffsetY: function()
	{
		return this._OffsetY;
	},
	set_OffsetY: function(value)
	{
		if (this._OffsetY !== value)
		{
			this._OffsetY = value;
			this.raisePropertyChanged("OffsetY");
		}
	},

	// event delegates
	_onClick: function(sender, args)
	{
		if (this.get_TargetDomElement())
		{
			if (document.compareDocumentPosition)
			{
				if (this.get_TargetDomElement() != sender.target)
				{
					if ((this.get_element().compareDocumentPosition(sender.target) & 16) == 0)
					{
						this.get_Target().hide();
					}
				}
			}
			else if (this.get_element().contains)
			{
				if (this.get_TargetDomElement() != sender.srcElement)
				{
					if (!this.get_element().contains(sender.srcElement))
					{
						this.get_Target().hide();
					}
				}
			}
		}
	}
};

// registration
Competir.Web.UI.Webparts.Behaviors.Callout.registerClass("Competir.Web.UI.Webparts.Behaviors.Callout", Competir.Web.UI.Webparts.Behaviors.BaseWebpartBehavior);