(function(){
GupShup.events = {};

GupShup.events.types = new Array("POST_GROUP","DELETE","POST_P2P","POSTING_GROUP_CHANGED", "POSTING_TYPE_CHANGED","POSTING_GROUP_UPDATED",
								"ACCOUNT_SETTINGS_UPDATE","GROUP_SETTINGS_UPDATE","PROFILE_SETTINGS_UPDATE","CREATE_GROUP",
								"SUBSCRIBE","UNSUBSCRIBE",
								"SHARE_GROUP","FLAG_MSG","INVITE","GROUP_VIEW_CHANGED","P2P_TAB_CHANGED","P2P_NAV_CHANGED","WINDOW_ONSCROLL",
								"PROFILE_IMAGE_UPDATED","PROFILE_NAME_UPDATED","SUCCESSFUL_TRANSACTION","UPDATE_TRANSACTION",
								"ENT_MASK_UPDATED");

GupShup.events.isValid = function(name){
	var isValid = false;
	for(var i = 0 ; i < GupShup.events.types.length ; i++)
	{
		if(name == GupShup.events.types[i])
		{
			isValid = true;
			break;
		}
	}
	return isValid;
}
								
								
/*
 * Event Q , holds all newly genrated/published events
 */
GupShup.events.eventsQueue = new Array();
GupShup.events.hookQueue = new Array();

/*Event listener gonna register it self using this
 * hook = {
 * name : 'XXX',
 * handler : function(),
 *  identifier : 'UNIQUE IDENTIFER FOR REGISTRING  ENTITY', //It will be helpful to unregister the hook
 * executeOnce : false
 * }
 */
GupShup.events.register = function(hook){
	if(GupShup.events.isValid(hook.name))
	{
		if(typeof hook.handler == 'function')
			GupShup.events.hookQueue.push(hook);
	}
	else
	{
		if(GupShup.conf.jsDebug)
			alert("Error registering hook: " + hook.name);
	}
};

GupShup.events.unregister = function(identifier){
	var tempHooksQ = new Array();
	var hooksLen = GupShup.events.hookQueue.length;
	for(var j = 0 ; j < hooksLen ; j++ )
	{
		var hook = GupShup.events.hookQueue.pop();
		if(hook.identifier != identifier)
			tempHooksQ.push(hook);  
	}
	
	// Reassing hookQ so that unwanted hooks shud get deleted 	
	GupShup.events.hookQueue = tempHooksQ; 
};

/*Event publisher gonna express its activity
 *  by publishing it event to the world
 *	The event will be added to event Q
 */
GupShup.events.add = function(event){
	if((event instanceof GupShup.html.event) && event.isValid())
	{
		GupShup.events.eventsQueue.push(event);
		GupShup.events.process();
	}	
};

/*
 * All events in the event Q will be processed
 */
GupShup.events.process = function(){
	
	var len = GupShup.events.eventsQueue.length;
	for(var i = 0 ; i < len; i++)
	{
		var event = GupShup.events.eventsQueue.pop();
		var hooksLen = GupShup.events.hookQueue.length;
		for(var j = 0 ; j < hooksLen ; j++ )
		{
			var hook = GupShup.events.hookQueue[j];
			if(hook.name == event.name)
			{
				try
				{
					hook.handler(event);
					event.executeCallBack();
				}
				catch(e)
				{
					if(GupShup.conf.jsDebug)
						alert("Error processing event: " + event.name + " generated by source: " + event.source + " Error: " + e);
				}
			}
		}
	}
}

GupShup.events.clearQ = function(){
	GupShup.events.hookQueue = new Array();
}
})();

(function(){
/* 
 * event = {
 * name : 'XXX',
 * params : {},
 * source : 'pageName',
 * postEventHandler : function()
 * }
 * The event will be added to event Q
 */
GupShup.html.event = function(event){
	this.name = event.name;
	this.params = event.params;
	this.source = event.source;
	this.postEventHandler = event.postEventHandler;
}

GupShup.html.event.prototype.publish = function(){
	GupShup.events.add(this);
}

GupShup.html.event.prototype.isValid = function(){
	return GupShup.events.isValid(this.name);
}

GupShup.html.event.prototype.executeCallBack = function(){
	if(typeof this.postEventHandler == 'function')
		this.postEventHandler(this);
}
GupShup.html.event.prototype.getParamsString = function(){
	return GupShup.util.getQueryStringFromObject(this.params);	
}
})();
