/********************************************************************************************************************************
* Licensed Materials - Property of IBM                                                                                          *
*                                                                                                                               *
* IBM Cognos Products: AGS                                                                                                      *
*                                                                                                                               *
* (C) Copyright IBM Corp. 2005, 2008                                                                                            *
*                                                                                                                               *
* US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *
*********************************************************************************************************************************/

/**
this holds on to how many agent items of a particular type there are
*/
function AgentItemsReferenceTracker(){
	this.agentItemRefs = new Object();	
}

AgentItemsReferenceTracker.prototype.toString = function(){
	var state = "\n     *******   topic references     *******\n";
	
	for(var modelItem in this.agentItemRefs){
		state += modelItem + " (" + this.agentItemRefs[modelItem] + " references)\n";	
	}
	
	return state
}

AgentItemsReferenceTracker.prototype.addReference = function(modelItem){
	var count = 0;
	
	if(this.agentItemRefs[modelItem]){
		count = this.agentItemRefs[modelItem];
	}
	
	this.agentItemRefs[modelItem] = ++count;
}

AgentItemsReferenceTracker.prototype.addReferences = function(modelItems){
	for(var i = 0; modelItems && modelItems.length && i < modelItems.length; i++){
		this.addReference(modelItems[i]);
	}
}

/*
call the tree to delete removed references. an optional text_edit_action
accompanies to allow text changes to be bundled with the agent item changes and tracked
*/
AgentItemsReferenceTracker.prototype.removeReferences = function(modelItems){
	
	var deleted_items = new Array();
		
	for(var i = 0; modelItems && modelItems.length && i < modelItems.length; i++){
		var deleted_item = this.removeReference(modelItems[i]);
		
		if(deleted_item){
			deleted_items.push(deleted_item);	
		}
	}
	
	return deleted_items;
}

AgentItemsReferenceTracker.prototype.removeReference = function(modelItem){
	var count = 0;
	var deleted_item;
	
	if(this.agentItemRefs[modelItem]){
		count = this.agentItemRefs[modelItem];
		
		if(count > 1){
			this.agentItemRefs[modelItem] = --count;
		}else if(count == 1){
			delete this.agentItemRefs[modelItem];
			//call to the agentItems tree
			//deleted_item = deleteDataItem(modelItem);
		}else{
			//this is probably bad
			alert("warning: ags count for model item " + modelItem + " is now " + count);
		}
	}
	return deleted_item;
}

AgentItemsReferenceTracker.prototype.countReferences = function(modelItem){
	var count = 0;
	
	if(this.agentItemRefs[modelItem]){
		count = this.agentItemRefs[modelItem];
	}
	
	return count;
}

AgentItemsReferenceTracker.prototype.getReferencedModelItems = function(modelItem){
	var modelItems = new Array();
	
	for(var modelItem in this.agentItemRefs){
		if(modelItem && this.agentItemRefs[modelItem] > 0){
			modelItems.push(modelItem);
		}	
	}
	
	return modelItems;
}