/** EventManager **/


/** ------------------------------------------------------------------------------
* definicja klasy eventMap
* Klasa sluzy do przechowywania mappingu
* klucz nazwa eventu
* wartosc lista ids portletow zapisanych na reagowanie na ten event
**/


function eventMap (){
	this.mappingObjects = new Array();
	//medtody
	this.put = eventMap_put;
	this.get = eventMap_get;
	this.removeEvent = eventMap_removeEvent;
	this.removePortletId = eventMap_removePortletId;
}

/*******************/

function eventMap_put(eventName, portletId){
	var index = -1
	for(var i = 0; i < this.mappingObjects.length; i++){
		if(this.mappingObjects[i].eventName == eventName){
			index = i;
		}
	}
	if(index > -1){
		var add = true;
		for(var i = 0; i < this.mappingObjects[index].portletIds.length; i++){
			if(this.mappingObjects[index].portletIds[i] == portletId){
				add = false;
			}
		}
		if(add == true){
			this.mappingObjects[index].portletIds[this.mappingObjects[index].portletIds.length] = portletId;
		}
	}else{
		var mappingObj = new Object();
		mappingObj.eventName = eventName;
		mappingObj.portletIds = new Array();
		mappingObj.portletIds[0] = portletId;
		this.mappingObjects[this.mappingObjects.length] = mappingObj;
	}

}

/*******************/

function eventMap_get(eventName){
	for(var i = 0; i < this.mappingObjects.length; i++){
		if(this.mappingObjects[i].eventName == eventName){
			return this.mappingObjects[i].portletIds;
		}
	}
}

/*******************/

function eventMap_removeEvent(eventName){
	var mappingObjects = [];
	var j = 0;
	for(var i = 0; i < this.mappingObjects.length; i++){
		if(this.mappingObjects[i].eventName != eventName){
			mappingObjects[j] = this.mappingObjects[i];
			j++;
		}
	}
	this.mappingObjects = mappingObjects;
}

/*******************/

function eventMap_removePortletId(eventName, portletId){
	var index = -1
	for(var i = 0; i < this.mappingObjects.length; i++){
		if(this.mappingObjects[i].eventName == eventName){
			index = i;
		}
	}
	if(index > -1){
		var portletIds  = [];
		var j = 0;
		for(var i = 0; i < this.mappingObjects[index].portletIds.length; i++){
			if(this.mappingObjects[index].portletIds[i] != portletId){
				portletIds[j] = this.mappingObjects[index].portletIds[i];
			}
		}
		this.mappingObjects[index].portletIds = portletIds;
	}
}

/** ------------------------------------------------------------------------------
* definicja klasy eventManager
**/

function eventManager (){;
	this.eventMap = new eventMap();
	//metody
	this.addPortlet = eventManager_addPortlet;
	this.removeEvent = eventManager_removeEvent;
	this.removePortlet = eventManager_removePortlet;
	this.fireEvent = eventManager_fireEvent;
}


/*******************/

function eventManager_addPortlet(eventName, portletId){
	this.eventMap.put(eventName, portletId);
}

/*******************/

function eventManager_removeEvent(eventName){
	this.eventMap.removeEvent(eventName);
}

/*******************/

function eventManager_removePortlet(eventName, portletId){
	this.eventMap.removePortletId(eventName, portletId);
}

/*******************/

function eventManager_fireEvent(jsonEvent){
	if(typeof(jsonEvent) == 'string'){
		jsonEvent = eval('(' + jsonEvent + ')');
	}
	var idsList = this.eventMap.get(jsonEvent.eventType);
	if(idsList && idsList != null){
		for(var i = 0; i < idsList.length; i++){
			try{
				eval("callback_" + idsList[i] + "('" + jsonDictEventToJSON(jsonEvent) + "')");
			}catch(err){
				// alert('Errorbbb: ' + err);// zakomentowac
			}
		}
	}
}

/** ------------------------------------------------------------------------------
* definicja klasy jsonDictEvent
**/

function jsonDictEvent(eventType, subType, value, paramId){
	this.eventType = eventType;
	this.subType = subType;
	this.value = value;
}
function jsonDictEventToJSON(jsonEvent){
	var json = '{';
	json += '"eventType":"' + jsonEvent.eventType + '",';
	json += '"subType":"' + jsonEvent.subType + '",';
	json += '"value":"' + jsonEvent.value + '"';
	json += '}';
	return json;
}
