var UserOverlay = {
	overlays: new Array(),
	hookings: { 'sx': ['br','bl'], 'dx': ['tl','tr'], 'up': ['bl','tl'], 'dn': ['tr','br'] },
	buttons_title: {
		chat: 'chatta',
		message: 'invia un messaggio',
		sms: 'scrivi un sms',
		mms: 'scrivi un mms',
		generic_message: 'invia messaggio',
		friendlist_add: 'aggiungi alla buddylist',
		friendlist_remove: 'togli dalla buddylist',
		kiss: 'bacia',
		blacklist_add: 'blocca',
		blacklist_remove: 'sblocca'
	},
	_target: null,
	_timer: null,
	
	// Contiene, per ogni utente, le proprie features
	buttons: new Array(),
	
	// Tiene traccia degli overlay a cui sono già state assegnate azioni
	overlayActions: new Array(),
	
	create: function (anchorId, features, profile, mini) {
		// Recupero l'orientamento overlay dalla classe del div
		var item = YAHOO.util.Dom.get(anchorId);
		if(item) var pos = UserOverlay.getPositionClass(item.className);
		
		var line = ((pos == 'sx' || pos == 'dx') ? 'vline' : 'hline');

		var context = [anchorId];
		context = context.concat(UserOverlay.hookings[pos]);
		context.push(['beforeShow', 'windowResize']);
		var settings = { visible: false, zIndex: 700, context: context };
		
		// l'overlay assume come nome _id
		overlayName = '_' + anchorId;

		// Rimozione overlay precedente
		var item = YAHOO.util.Dom.get(overlayName);
		if(item) {
			var parent = item.parentNode;
			parent.removeChild(item);
			YAHOO.util.Event.removeListener(anchorId, 'mouseover');
		}
		
		if(features) features = UserOverlay.filterFeatures(features);
				
		// creazione overlay
		UserOverlay.overlays[overlayName] = new YAHOO.widget.Overlay(overlayName, settings);

		// UserOverlay.overlays[overlayName].setHeader(UserOverlay._createHeader(pos));
		// UserOverlay.overlays[overlayName].setBody(UserOverlay._createBody(features, profile));
		// UserOverlay.overlays[overlayName].setFooter(UserOverlay._createFooter(pos));
		
		UserOverlay.overlays[overlayName].setHeader("");
		
		var body = UserOverlay._createOverlay(features, profile, pos);
		UserOverlay.overlays[overlayName].setBody(body);
		
		UserOverlay.overlays[overlayName].setFooter("");
		
		UserOverlay.overlays[overlayName].render(document.body);

		// Impostazione classe orizzontale o verticale
		UserOverlay.setDirection(overlayName, line, mini);
		
		// binding eventi
		var params = {
			overlay: UserOverlay.overlays[overlayName],
			anchorId: anchorId,
			pos: pos,
			profile: profile,
			mini: mini
		};
		YAHOO.util.Event.addListener(anchorId, "mouseover", UserOverlay.anchorOver, params, true);
		YAHOO.util.Event.addListener(anchorId, "mouseout", UserOverlay.hide, UserOverlay.overlays[overlayName], true);
		
		if(features) {
			UserOverlay.buttons[profile.profile_id] = features;
			UserOverlay.overlayActions[overlayName] = true;
			
			UserOverlay.addButtonsListeners(features, overlayName, profile.profile_id, mini);
			UserOverlay.addTooltips(features, profile.profile_id);
		}
	},
	
	filterFeatures: function (features) {
		if(features.blacklist_add != 'undefined') features.blacklist_add = null;
		if(features.blacklist_remove != 'undefined') features.blacklist_remove = null;
		if(features.test_affinity_result != 'undefined') features.test_affinity_result = null;
		if(features.sms != 'undefined') features.sms = null;
		if(features.mms != 'undefined') features.mms = null;
		if(features.text_message != 'undefined') features.text_message = null;
		if(features.content_message != 'undefined') features.content_message = null;		
		if(features.delivered_sms != 'undefined') features.delivered_sms = null;
		if(features.delivered_sms_disablement != 'undefined') features.delivered_sms_disablement = null;
		if(features.delivered_mms != 'undefined') features.delivered_mms = null;
		if(features.delivered_mms_disablement != 'undefined') features.delivered_mms_disablement = null;
		if(features.multimedia_message != 'undefined') features.multimedia_message = null;
		if(features.multimedia_message_disablement != 'undefined') features.multimedia_message_disablement = null;
		if(features.message != 'undefined') features.message = null;
		if(features.message_disablement != 'undefined') features.message_disablement = null;
		
		return features;
	},
	
	_createHeader: function (pos) {
		return ((pos == 'dn' || pos == 'dx') ? '<span class="pointer ' + pos + '">&nbsp;</span>' : '') +
			'<span class="tl"></span><span class="tr"></span>' +
			'<span class="top"></span>';
	},
	
	_createBody: function (features, profile) {
		var actions = '';
		if(features)
			for(var key in features)
				if(features[key] != null)
					actions += UserOverlay._createAction(key, features[key], profile);
		
		return '<div class="box">' +
		'<div class="actions">' + actions + '</div>' +
		'</div>';
	},
	
	_createFooter: function (pos) {
		return '<span class="bl"></span><span class="br"></span>' +
			'<span class="bottom"></span>' +
			((pos == 'up' || pos == 'sx') ? '<span class="pointer ' + pos + '">&nbsp;</span>' : '');
	},
	
	_createOverlay: function (features, profile, pos) {
		return UserOverlay._createHeader(pos) + UserOverlay._createBody(features, profile) + UserOverlay._createFooter(pos);
	},
	
	_createActionString: function (b_name, b_fn, profile) {
		return 'javascript:UserActions[\'' + b_name + '_' + (b_fn ? 'on' : 'off') + '\'](\'' + profile.profile_id + '\', \'' + profile.nick + '\'' + (b_fn ? ', \'' + b_fn + '\'' : '') + ', \'' + profile.gender + '\', \'' + profile.avatar + '\');';
	},
	
	_createAction: function (b_name, b_fn, profile) {
		return '<a id="a_' + profile.profile_id + '_' + b_name + '" href="' + UserOverlay._createActionString(b_name, b_fn, profile) + '" ' +
		'title="' + UserOverlay.buttons_title[b_name] + '" ' +
		'class="' + b_name + (UserOverlay.isSet(b_fn) ? '' : ' spento') + '"><span>' + b_name + '</span></a>';
	},
	
	addTooltips: function (features, pid) {
		for(var key in features)
			if(features[key] != null)
				UserOverlay.addTooltip('a_' + pid + '_' + key);
	},
	
	addTooltip: function (id) {
		new YAHOO.widget.Tooltip("tt_" + id, {
			context: id,
			showdelay: 100,
			hidedelay: 100,
			zIndex: 800
		});
	},
	
	isSet: function (b_fn) {
		return b_fn != '';
	},
	
	setDirection: function (overlayName, line, mini) {
		// Impostazione classe orizzontale o verticale
		YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(overlayName), 'userOverlay');
		YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(overlayName), line);
		if(mini) YAHOO.util.Dom.addClass(YAHOO.util.Dom.get(overlayName), 'min');
	},
	
	getPositionClass: function (classNames) {
		var classes = classNames.split(' ');

		for(var i=0; i<classes.length; i++)
			if(classes[i] == 'sx' || classes[i] == 'dx' || classes[i] == 'up' || classes[i] == 'dn')
				return classes[i];
		return 'up';
	},
	
	addButtonsListeners: function (features, overlayName, profileId, startStop) {
		for(var b_name in features)
			if(features[b_name] != null)
				UserOverlay.addButtonListeners(overlayName, b_name, profileId, startStop);				
	},
	
	addButtonListeners: function (overlayName, button, profileId, startStop) {
		var params = {
			overlay: UserOverlay.overlays[overlayName],
			startStop: startStop
		};
		
		YAHOO.util.Event.on('a_' + profileId + '_' + button, 'mouseover', UserOverlay.itemOver, params, true);
		YAHOO.util.Event.on('a_' + profileId + '_' + button, 'mouseout', UserOverlay.hide, params, true);		
	},
	
	getConfiguration: function (overlayName, profile, pos, mini) {
		UserActions.modified[profile.profile_id] = false;
		
		var bd = UserOverlay._createHeader(pos) +
				'<div class="box"><div class="actions"><div class="loader"></div></div></div>' +
				UserOverlay._createFooter(pos);
		UserOverlay.overlays[overlayName].setBody(bd);
		
		var callback = {
		    success: function (o) {
				var features = UserOverlay.filterFeatures(Utilities.jsonParse(o.responseText));
				
				UserOverlay.buttons[profile.profile_id] = UserOverlay.filterFeatures(features);
				bd = UserOverlay._createOverlay(features, profile, pos);
				UserOverlay.overlays[overlayName].setBody(bd);
				UserOverlay.addButtonsListeners(UserOverlay.buttons[profile.profile_id], overlayName, profile.profile_id, mini);
				UserOverlay.addTooltips(features, profile.profile_id);
				UserOverlay.overlayActions[overlayName] = true;
		    },
		    failure: function (o) {
		    	UserActions.modified[profile.profile_id] = true;
		    }
		};

		var actionString = 't_profile_id=' + profile.profile_id;
  	    var conn = YAHOO.util.Connect.asyncRequest('POST', 'http://' + conf.baseUrl + '/gui_manager/get_features', callback, actionString);
	},
	
	anchorOver: function () {
		ProfileReloader.flag = false;
		if(UserOverlay._timer) clearTimeout(UserOverlay._timer);
		if(UserOverlay._target) UserOverlay._target.hide();
		
		if(!UserOverlay.overlayActions[this.overlay.id] && UserOverlay.buttons[this.profile.profile_id]) {
			bd = UserOverlay._createOverlay(UserOverlay.buttons[this.profile.profile_id], this.profile, this.pos);
			UserOverlay.overlays[this.overlay.id].setBody(bd);	
		}
		
		else if(!UserOverlay.overlayActions[this.overlay.id] || UserActions.modified[this.profile.profile_id]) {
			UserOverlay.getConfiguration(this.overlay.id, this.profile, this.pos, this.mini);			
		}
		
		UserOverlay._target = this.overlay;
		this.overlay.show();
	},
	
	itemOver: function () {
		if(this.startStop) N.stop();
		if(UserOverlay._timer) clearTimeout(UserOverlay._timer);
	},

	hide: function () {
		if(this.startStop) N.start();
		if(UserOverlay._timer) clearTimeout(UserOverlay._timer);
		UserOverlay._timer = window.setTimeout(function () {
			ProfileReloader.flag = true;
			if(UserOverlay._target) UserOverlay._target.hide();
		}, 500);
	}
}

/* contiene gli overlay generati */
YAHOO.namespace('neo.overlay');

YAHOO.neo.overlay.generateOverlay = function (anchorId, features, profile, mini) {
	UserOverlay.create(anchorId, features, profile, mini);
}