/*
 * @Version				1.0.0
 * @Package				AnsJsStructure
 * @Author				Giuliano Losi
 * @Creation Date		2008-10-05
 * @Last Mod Date		2008-10-05
 * @Last Mod Author		Giuliano Losi
 *
 *	<b>ChangeLog (Versione - DataRilascio)</b>
 *
 *	1.0.0 - 05/10/2008 - Giuliano Losi
 *		• Definizione metodo per l'avviso all'utenza
 *
 *	<h1>Plugin ANCF per JQuery da usare con un generico browser</h1>
 *	Plugin per la definizione delle caratteristiche del Athenae Noctua Client Framework con un generico browser.
 *	Testato con Mac Safari 2,3; Mac Firefox 2,3; Win Internet Explorer 6,7; Win Firefox 2,3; Win Safari 2,3.
 */
/* Definizione del plugin secondo */
(function($) { // Definizione dell'alias $

	/* Funzione per il caricamento dei plugin vari all'interno del sistema */
	jQuery.loadplugins = function(context) {

		//console.log(plugins);
		$.each(plugins, function(index, loader) {
			loader.loadPlugin(context);
		});
	};

	/* Funzione globale di avviso che sostituisce il classico alert */
	jQuery.showAlert = function(message) {

		alert(message); // TODO: trasformare sta cosa!!!
	};

	jQuery.addPlugin = function(selector, pluginName, options) {

		var aPlugin = new PluginLoader(selector, pluginName, options);
		plugins.push(aPlugin);
	};

	/* Funzione che aggiunge un osservatore alla lista globale */
	jQuery.addObserver = function(pluginName,bindKey,selector, eventName, handler) {

		var aBinder = new Binder(pluginName,bindKey);
		aBinder.theSelector = selector;
		aBinder.theEvent = eventName;
		aBinder.theHandler = handler;
		var uniqueKey = aBinder.uniqueKey();
		observers[uniqueKey] = aBinder;
	};

	/* Funzione che elimina osservatori da un elemento */
	jQuery.deleteObserver = function(selector, eventName, handler) {

	};

	/* Funzione che elimina osservatori da un elemento */
	jQuery.bindObservers = function(context) {
		
		$.each(observers, function(binderKey, theBinder) {
			theBinder.executeBind(context);
		});
	};

	/* Funzione che elimina osservatori da un elemento */
	jQuery.unbindObservers = function(context) {
		$('*', context).unbind();
	};

	/* Funzione che definisce */
	jQuery.handleResponseData = function(data) {
				
		/* Verifico il tipo di pagina */
		switch ($.getResponseType(data)) {

			case 'pageok':
				$.processPageResponse(data);
				break;
	
			case 'interfaceok':
				$.processInterfaceResponse(data);
				break;
	
			case 'pageko':
				// TODO
				break;
	
			case 'interfaceko':
				// TODO
				break;
	
			case 'crash':
				processCrashResponse(data);
				break;
	
			default:
				$.showAlert('ERRORE: Tipo di pagina non definita');
				break;
		}
	}

	/* Funzione che processa la risposta in caso di pagina cambiata con successo */
	jQuery.processPageResponse = function(data) {

		/* Cambio il titolo della pagina */
		$.changeTitle($.getResponseTitle(data));

		/* Cambio i metatags della pagina */
		$.reloadMetaTag($.getResponseMetas(data), true);

		/* Modifico il contenuto della pagina in base ai placeholders */
		$.reloadBodyContent($.getResponseContents(data));

		/* Aggiungo gli stili aggiuntivi */
		$.reloadStyles($.getResponseStyles(data), true);

		/* Aggiungo gli script aggiuntivi */
		$.reloadScripts($.getResponseScripts(data), true);
	}

	/*
	 * Funzione che processa la risposta in caso di richiesta d'interfaccia
	 * avvenuta con successo
	 */
	jQuery.processInterfaceResponse = function(data) {

		/* Cambio il titolo della pagina */
		$.changeTitle($.getResponseTitle(data));

		/* Cambio i metatags della pagina */
		$.reloadMetaTag($.getResponseMetas(data), false);

		/* Modifico il contenuto della pagina in base ai placeholders */
		$.reloadPlaceholdersContent($.getResponseContents(data));

		/* Aggiungo gli stili aggiuntivi */
		$.reloadStyles($.getResponseStyles(data), false);

		/* Aggiungo gli script aggiuntivi */
		$.reloadScripts($.getResponseScripts(data), false);

		$(".caller").removeClass("caller");
	}

	/* Funzione che processa la risposta in caso di pagina cambiata con successo */
	jQuery.processCrashResponse = function(data) {

		/* Cambio il titolo della pagina */
		changeTitle($.getResponseTitle(data));

		// TODO: rivedere per separare la parte di reset da quella di disegno

		/* Modifico il contenuto della pagina in base ai placeholders */
		reloadBodyContent($.getResponseContents(data));

		/* Aggiungo gli stili aggiuntivi */
		reloadStyles($.getResponseStyles(data), true);
	}

	/* Funzione che processa la risposta in caso di pagina cambiata con successo */
	jQuery.changeTitle = function(newTitle) {

		if (newTitle != "") {

			document.title = newTitle;
		}
	}

	/* */
	jQuery.reloadMetaTag = function(metas, isToReload) {

		/* Resetto di meta */
		if (isToReload) {
			$('meta').remove();
		}

		/*
		 * Per ogni descrittore che mi è stato mandato aggiungo un tag meta
		 * all'head
		 */
		$.each(metas, function(name, description) {

			var meta = document.createElement('meta');
			meta.name = description.name;
			meta.content = description.content;
			$('head').appendChild(meta);
		});
	}

	/* Metodo che ricarica tutto il body */
	jQuery.reloadBodyContent = function(placeholders) {

		/* Reinizilizzo il body */
		$.unbindObservers($('body'));
		$('body').empty();

		/*
		 * Per ogni descrittore che mi è stato mandato sostituisco il segnaposto con il nuovo html
		 */
		$.each(placeholders, function(name, description) {

			$('body').append(description.content);
		});
		$.loadplugins($('body'));
		$.bindObservers($('body'));
	}

	/* Metodo che ricarica parti della pagina */
	jQuery.reloadPlaceholdersContent = function(placeholders) {

		/*
		 * Per ogni descrittore che mi è stato mandato sostituisco il segnaposto con il nuovo html
		 */
		$.each(placeholders, function(name, description) {

			var containerId = '#' + description.name;
	        $.unbindObservers($(containerId));
			$(containerId).fadeOut(
					300,
					function() {
						$(containerId).html(description.content).fadeIn(300,main($(containerId)));
					});
		});
	}

	/* Metodo che carica gli stili in ajax */
	jQuery.reloadStyles = function(styles, isToReload) {

		/* Resetto gli Style */
		if (isToReload) {
			$("link[type='text/css']").remove();
		}
		
		/*
		 * Per ogni stile che mi è stato mandato aggiungo un tag di stile nell'head
		 */
		$.each(styles, function(name, description) {

			var style = null;
			switch (description.type) {

				case 'link':
					style = document.createElement("link");
					style.type = "text/css";
					style.rel = "stylesheet";
					style.href = description.content;
					break;
	
				case 'code':
					style = document.createElement("style");
					style.type = "text/css";
					if (style.styleSheet) {
	
						style.styleSheet.cssText = cssCode;
					} else {
	
						style.appendChild(document.createTextNode(cssCode));
					}
					break;
			}
			$('head')[0].appendChild(style);
		});
	}

	/* Metodo che carica gli script in ajax */
	jQuery.reloadScripts = function(scripts, isToReload) {

		/*
		 * Per ogni script che mi è stato mandato aggiungo net tag script in fondo al body
		 */
		$.each(scripts, function(name, description) {

			switch (description.type) {

				case 'link':
					$.getScript(description.content);
					break;
	
				case 'text':
					newScript = '<script type="text/javascript">' + description.content + '</script>';
					$('body').append(newScript);
					break;
			}
		});
	}
})(jQuery);
