(function() {
var L = YAHOO.lang, Dom = YAHOO.util.Dom;
var oEL;

oEL = ZC.Core.EventListener.Create('Alert');
	/**
	 * Event handler, called when the event fires.
	 * @param {Object} oWidget the widget that the event fired on
	 * @param {Object} oEvent the custom event that fired
	 * @param {Object} oSrcEvent the browser event that caused this event to fire (if available)
	 */
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	ZC.JSManager.Alert(this.aDef.Message);
}

oEL = ZC.Core.EventListener.Create('EnableDisable');

oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	var bEnable, sEnabledClass, sDisabledClass, sPopulateWhenDisabledFrom, oPopulateFromWidget;
   	bEnable = this._SearchLists(oWidget.GetValue(), this.aDef.EnableWhenSrcEquals, this.aDef.EnableWhenSrcNotEquals);

	sEnabledClass = this.aDef.EnabledClass || '';
	sDisabledClass = this.aDef.DisabledClass || 'disabled';

	this.oDestWidget.Enable(bEnable, sEnabledClass, sDisabledClass);
	sPopulateWhenDisabledFrom = this.aDef.PopulateWhenDisabledFrom;
	if (sPopulateWhenDisabledFrom && !bEnable)
	{
		oPopulateFromWidget = ZC.JSManager.GetWidget(sPopulateWhenDisabledFrom);
		if (oPopulateFromWidget)
			this.oDestWidget.SetValue(oPopulateFromWidget.GetValue());
	}	
}

oEL = ZC.Core.EventListener.Create('EnableDisableTab');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	this.oTabView = ZC.JSManager.GetWidget(this.aDef.TabViewName);
	if (!L.isUndefined(this.oTabView))
	{
		var bEnable = this._SearchLists(oWidget.GetValue(), this.aDef.EnableWhenSrcEquals, this.aDef.EnableWhenSrcNotEquals);
		this.oTabView.EnableTab(this.aDef.TabID, bEnable);
	}
}

/**
 * TODO: the whole SelectOrUpload widget possibly wants replacing
 * it could probably be done with a ShowHide eventlistener
 */
oEL = ZC.Core.EventListener.Create('SelectOrUpload');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	var sDestId = this.oDestWidget._elInput.id;
	var eSelectDiv = Dom.get('div.' + sDestId + '.select');
	var eUploadDiv = Dom.get('div.' + sDestId + '.upload');

	if (oWidget.GetValue() == 1)
	{
		eSelectDiv.style.display='block';
		eUploadDiv.style.display='none';
	}
	else
	{
		eSelectDiv.style.display='none';
		eUploadDiv.style.display='block';
	}
}

oEL = ZC.Core.EventListener.Create('SetOptionsFromJSArray');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	if (!L.isUndefined(window[this.aDef.ArrayName]))
	{
		var aNewOptions = window[this.aDef.ArrayName][oWidget.GetValue()];
		this.oDestWidget.SetAttrib('Options', aNewOptions);
	}
}

oEL = ZC.Core.EventListener.Create('SetValue_FromSource');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	oDestWidget.SetValue(oWidget.GetValue());
}

oEL = ZC.Core.EventListener.Create('ShowHideElements');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	var bShow = this._SearchLists(oWidget.GetValue(), this.aDef.ShowWhenSrcEquals, this.aDef.ShowWhenSrcNotEquals);
	var Elements;

	if (this.aDef.ElementType && this.aDef.ElementClass)
	{
		Elements = YAHOO.util.Selector.query(this.aDef.ElementType + '.' + this.aDef.ElementClass);
	}
	else if (this.aDef.ElementID)
	{
		Elements = this.aDef.ElementID;
	}
	else
	{
		// ElementType + ElementClass, or ElementID not specified. Default to the destination widget.
		this.oDestWidget.Show(bShow);
		return;
	}

	if (bShow)
	{
		Dom.removeClass(Elements, 'hide');
	}
	else
	{
		Dom.batch(Elements, function(el)
		{
			el.blur();
			Dom.addClass(el, 'hide');
		});
	}
}

oEL = ZC.Core.EventListener.Create('CallJSFunction');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	if (this.aDef.JSArgs)
	{
		eval(this.aDef.JSFunction + '(' + this.aDef.JSArgs + ');');
	}
	else
	{
		var fn = window[this.aDef.JSFunction];
		if (L.isFunction(fn))
			fn();
	}
}

oEL = ZC.Core.EventListener.Create('SetRelatedOptions_FromSource');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	var elDest = Dom.get(this.aDef.ID + ".1");
	if (elDest)
		setOptionsRelatedTo(elDest, oWidget.GetValue());
}

oEL = ZC.Core.EventListener.Create('SetRelatedOptions_FromInitialValue');
oEL.prototype.HandleEvent = function(oWidget, oEvent, oSrcEvent)
{
	var sID = this.aDef.ID;
	var elDest = Dom.get(sID + '.1');
	var elInitial = Dom.get(sID + '.initial');

	var opt = oWidget.GetValue() + '-' + elInitial.value;
	for (var i = 0, iMax = elDest.length; i < iMax; i++)
	{
		if (elDest.options[i].value == opt)
		{
			elDest.value=(opt);
			return;
		}
	}
}

})();
