// ==============================================================================================
// Copyright (c) 2000-2005
// CARE Internet Services B.V.
// All Rights Reserved
// ==============================================================================================
// $Workfile: class.interface.element.1.js$
// $Date: 20-02-06 05:07:26 PM$
// $Revision: 3$
// $Author: bob$
// $NoKeyword$
// ----------------------------------------------------------------------------------------------

// ==============================================================================================================================
// Class InterfaceElement1
// ==============================================================================================================================
function InterfaceElement1 (sId) {
	if ( arguments.length > 0 ) this.construct(sId);
}

//-----------------------------------------------------------------
// Method InterfaceElement1.construct()
//-----------------------------------------------------------------
InterfaceElement1.prototype.construct = function (sId) {
	this.__is_interfaceelement = true;
	this.id = sId;
	this.translations = new Array();
	this.listeners = new Array();
	this.listenersAllEvents = new Array();
	if ( !this.__is_interface && window['INTERFACES'] && window['INTERFACES'].length > 0  ) 
		this.interfaceObject = window['INTERFACES'][window['INTERFACES'].length-1];
	// addEventHandler(window, 'unload', this, 'destructor');
}

//-----------------------------------------------------------------
// Method InterfaceElement1.destructor()
//-----------------------------------------------------------------
InterfaceElement1.prototype.destructor = function () {
	/*
	if ( this._eventhandlers ) {
		var h;
		for ( var i in this._eventhandlers ) {
			h = this._eventhandlers[i];
			removeEventHandler(h.target, h.eventType, h.listener, h.fnHandler);
			h.target = null;
			h.listener = null;
			h.fnHandler = null;
			delete h.target;
			delete h.listener;
			delete h.fnHandler;
			delete h;
			this._eventhandlers[i] = null;
			delete this._eventhandlers[i];
		}
	}
	*/
	removeEventHandler(window, 'unload', this, 'destructor');
	for ( var i in this ) 
		if ( typeof(this[i]) == 'object' ) {
			if ( (this[i]) && (this[i]['length']) && (this[i]['length'] > 0) ) {
				// alert(i);
				for ( var j = 0; j < this[i].length; j++ ) {
					this[i][j] = null;
					delete this[i][j];
				}
				this[i] = null;
				delete this[i];
			} else {
				this[i] = null;
				delete this[i];
			}
		}
}

//-----------------------------------------------------------------
// Method InterfaceElement1._self()
//-----------------------------------------------------------------
InterfaceElement1.prototype._self = function () {
	return this.interfaceObject._createReference(this);
}

//-----------------------------------------------------------------
// Method InterfaceElement1.self()
//-----------------------------------------------------------------
InterfaceElement1.prototype.self = function () {
	return this.interfaceObject._createReference(this);
}

//-----------------------------------------------------------------
// Method InterfaceElement1.setTranslation()
//-----------------------------------------------------------------
InterfaceElement1.prototype.setTranslation = function (sLabel, sText) {
	this.translations[sLabel] = sText;
}

//-----------------------------------------------------------------
// Method InterfaceElement1.getTranslation()
//-----------------------------------------------------------------
InterfaceElement1.prototype.getTranslation = function (sLabel) {
	if ( this.translations[sLabel] ) 
		return this.translations[sLabel];
	else
		return sLabel;
}

//-----------------------------------------------------------------
// Method InterfaceElement1.initExecute()
//-----------------------------------------------------------------
InterfaceElement1.prototype.initExecute = function () {
	var aArgs = new Array();
	if ( (arguments.length > 0) && (typeof(arguments[0]) == 'string') )
		aArgs.push(this);
	for ( var i = 0; i < arguments.length; i++ )
		aArgs.push(arguments[i]);
	this.interfaceObject.initExecute.apply(this.interfaceObject, aArgs);
}

//-----------------------------------------------------------------
// Method InterfaceElement1.propagateEvent()
//-----------------------------------------------------------------
InterfaceElement1.prototype.propagateEvent = function (oEvent) {
	// if ( oEvent.name == 'activate' )
	// 	alert(this.id);
	this.captureEvent(oEvent);
	if ( this.listeners[oEvent.name] )
		for ( var i = 0; i < this.listeners[oEvent.name].length; i++ )
			this.listeners[oEvent.name][i].propagateEvent(oEvent);
	for ( var i = 0; i < this.listenersAllEvents.length; i++ )
		this.listenersAllEvents[i].propagateEvent(oEvent);
}

//-----------------------------------------------------------------
// Method InterfaceElement1.captureEvent()
//-----------------------------------------------------------------
InterfaceElement1.prototype.captureEvent = function (oEvent) {
	// override in derive class
}

//-----------------------------------------------------------------
// Method InterfaceElement1.sendEvent()
//-----------------------------------------------------------------
InterfaceElement1.prototype.sendEvent = function () {
	if ( arguments.length > 0 ) {
		if ( typeof(arguments[0]) == 'object' ) {
			var oEvent = arguments[0];
		} else {
			var oEvent = new InterfaceEvent1(this, arguments[0]);
			for ( var i = 1; i < arguments.length; i++ )
				oEvent.addSubject(arguments[i]);
		}
		this.propagateEvent(oEvent);
	}
}


//-----------------------------------------------------------------
// Method InterfaceElement1.addListener()
//-----------------------------------------------------------------
InterfaceElement1.prototype.addListener = function (oListener, sEventName) {
	if ( sEventName ) {
		if ( !this.listeners[sEventName] )
			this.listeners[sEventName] = new Array();
		this.listeners[sEventName].push(oListener);
	} else {
		this.listenersAllEvents.push(oListener);
	}
}

//-----------------------------------------------------------------
// Method InterfaceElement1.removeListener()
//-----------------------------------------------------------------
InterfaceElement1.prototype.removeListener = function (oListener, sEventName) {
	if ( sEventName ) {
		if ( this.listeners[sEventName] ) 
			for ( var i = this.listeners[sEventName].length - 1; i >= 0; i-- )
				if ( this.listeners[sEventName][i] == oListener )
					this.listeners[sEventName].splice(i, 1);
					
	} else {
		this.listenersAllEvents.push(oListener);
		for ( var i = this.listenersAllEvents.length - 1; i >= 0; i-- )
			if ( this.listenersAllEvents[i] == oListener )
				this.listenersAllEvents.splice(i, 1);
	}
}

//-----------------------------------------------------------------
// Method InterfaceElement1.listen()
//-----------------------------------------------------------------
InterfaceElement1.prototype.listen = function (oSender, sEventName) {
	oSender.addListener(this, sEventName);
}

//-----------------------------------------------------------------
// Method InterfaceElement1.stopListen()
//-----------------------------------------------------------------
InterfaceElement1.prototype.stopListen = function (oSender, sEventName) {
	oSender.removeListener(this, sEventName);
}


// ==============================================================================================================================
// InterfaceEvent1 class
// ==============================================================================================================================
function InterfaceEvent1(oSource, sName) {
	if ( arguments.length > 0 ) this.construct(oSource, sName);
}

//-----------------------------------------------------------------
// Method InterfaceEvent1.construct()
//-----------------------------------------------------------------
InterfaceEvent1.prototype.construct = function (oSource, sName) {
	this.source = oSource;
	this.name = sName;
	this.subject = new Array();
}

//-----------------------------------------------------------------
// Method InterfaceEvent1.addSubject()
//-----------------------------------------------------------------
InterfaceEvent1.prototype.addSubject = function (oSubject) {
	this.subject.push(oSubject);
}
