/**
* ListenerHandler
*/
function ListenerHandler(){
	this.subjects = new HashMap();
}

ListenerHandler.prototype.addSubject = function(subjectKey){

	var subject = this.findSubject(subjectKey);
	
	var parentSubject = this.findSubjectsParent(subjectKey); 
	
	//only add subject if not all ready exists.
	if((subject==null || subject==undefined) && parentSubject!=null && parentSubject!=undefined){
	
		var keys = new Array();
		keys = subjectKey.split(".");
		var key = keys[keys.length-1];
	
		parentSubject.addChildSubject(key);
	
		//alert("subject: " + key + " created in parent: " + parentSubject.name);
	
	}else if((subject==null || subject==undefined) && parentSubject==null || parentSubject==undefined){
	
		this.subjects.put(subjectKey,new Subject(subjectKey));
		//alert("subject: " + subjectKey + " created as root subject.");
	}
};


ListenerHandler.prototype.getChildSubject = function(parentSubject,subjectKey){

	if(parentSubject==null){
		return null;
	}

	return parentSubject.getChildSubject(subjectKey);
};


ListenerHandler.prototype.findSubjectsParent = function(subjectKey){

	if(subjectKey.indexOf(".")!=-1){

		//alert("findSubjectsParent invoked with key: " + subjectKey);

		var keys = new Array(); 
		keys = subjectKey.split(".");
	
		//get root subject.
		parentSubject = this.subjects.get(keys[0]);
	
		//loop over the remaining keys in array.
		for(var i=1; (keys.length-1)!=i ; i++){
		
			if(this.getChildSubject(parentSubject,keys[i])!=null)
			{
				parentSubject = this.getChildSubject(parentSubject,keys[i]);
			}else{
				//break;
			}
		}
		return parentSubject;
	}
	return null;
};

/**
* findSubject
*
*/
ListenerHandler.prototype.findSubject = function(subjectKey){

	if(subjectKey.indexOf(".")!=-1){

		var keys = new Array(); 
		keys = subjectKey.split(".");

		//get root subject.
		var tmpSubject = this.subjects.get(keys[0]);

		//if(tmpSubject!=undefined){
			//alert("root subject is: "  + tmpSubject.name);
		//}

		//loop over the remaining keys in array.
		for(var i=1; keys.length != i ; i++){
			
			//alert("looking for subject with key: " + keys[i] + " in subject: " + tmpSubject.name);
			
			if(tmpSubject!=null){
				tmpSubject = this.getChildSubject(tmpSubject,keys[i]);
			}
		}
	
		//if(tmpSubject!=null){
			//	alert("for " + subjectKey + "returning subject: " + tmpSubject.name);
		
		//}else{
		
			//alert("for " + subjectKey + " returning null");
		//}
	
		return tmpSubject;

	}else{
		return this.subjects.get(subjectKey);	
	}
	
};

ListenerHandler.prototype.removeSubject = function(subjectKey){

	var subject = this.findSubjectsParent(subjectKey);

	//this is a root subject.
	if(subject==null){
		this.subjects.remove(subjectKey);
	}else{
		subject.removeChildSubject(subjectKey);
	}
};

ListenerHandler.prototype.removeListenerFromAllSubjects = function(listener){
	//search and remove listener from all subjects.
};


ListenerHandler.prototype.removeListenerFromSubject = function(subjectKey,listener){

	//code to get the rigth subject search must be done over a subjects child.  
	var subject = this.findSubject(subjectKey);
	
	if(subject==null || subject==undefined){
		alert("no subject exists with name: " + subjectKey);
	}else{
		subject.remove(listener.name);
		//alert("Listner: " + listener.name + " removed from subject: " + subjectKey);
	}
};

ListenerHandler.prototype.registerListenerToSubject = function(subjectKey,listener){
	
	//code to get the rigth subject search must be done over a subjects childs.  
	
	var subject = this.findSubject(subjectKey);
	
	if(subject==null || subject==undefined){
		alert("no subject exists with name: " + subjectKey);
	}else{
		subject.registerListenerToSubject(listener);
	}	
};

/*
* notifyListenersToSubjectAboutChange
*
*
*/
ListenerHandler.prototype.notifyListenersToSubjectAboutChange = function(subjectKey){
	//get subject.
	var subject = this.findSubject(subjectKey);
	
	if(!subject) return;
	
	subject.notifyListenersAboutChange();
};

/*
* notifyListenersToSubjectAboutChangeStop
*
*
*/
ListenerHandler.prototype.notifyListenersToSubjectAboutChangeStop = function(subjectKey){
  	  	
 	//get subject.
	var subject = this.findSubject(subjectKey);
	
	if(subject==null || subject==undefined){
		return;
	}


	
	subject.notifyListenersAboutChangeStop();
};
/**
*
*/
ListenerHandler.prototype.notifyListenersToSubject = function(subjectKey,object){

	//get subject.
	var subject = this.findSubject(subjectKey);
	
	if(!subject) return;
	//alert("NotifyListenersToSubject on subject: "  + subject.name);
	subject.notifyListeners(object);
};

// TODO: a better name here in global space?
function pop(form){
 	var str = "";
  	for(var i in form){
  	    if (form.hasOwnProperty(i)) {
  		str += i + " = " + form[i] + " | ";
            }
  	}
  	alert(str);
 }
  

