/**
 *  PerformAjaxRequest: functions for doing advanced ajax request
 *
 *  The classes rely on the prototype.js ( http://prototype.conio.net )
 *  and is released under the same terms as the prototype library.
 *
 *  Home: http://www.xxx.it/
 *  @version 0.?
 *  @author Alberto Dettino
 *  @license GPL
 *
 */

/*
options.onError (options)
{
	switch (options.ErrorCode)
	{
		case 404:
			options.ErrorCode += " - Pagina Non Trovata";

			break;
		default:
			PerformAjaxDefaultErrorHandler(options);
			break;
	};
}
*/

function PerformAjaxDefaultErrorHandler(options)
{
	switch (options.ErrorCode)
	{
		case 500:
		case 501:
		case 502:
		case 503:
		case 504:
		case 505:
			options.ErrorCode += " - Errore Interno Del Server";
			break;
		case 400:
		case 401:
		case 402:
		case 403:
			options.ErrorCode += " - Accesso Non Consentito";
			break;
		case 404:
			options.ErrorCode += " - Pagina Non Trovata";
			break;
		default:
			options.ErrorCode += " - Errore Sconosciuto";
			break;
	};

	alert (options.ErrorCode + "\n\n" + options.ErrorMessage);
};


function PerformAjaxRequest(action,options,callback) {
    _PerformAjaxRequestEx_(action,options,callback,false);
}

// function PerformAjaxRequestRaw(action,options,callback) {
//     _PerformAjaxRequestEx_(action,options,callback,true);
// }


// questa funzione non deve essere chiamata direttamente, utilizzare invece:
// PerformAjaxRequest (risposta codificata in un oggetto)
// PerformAjaxRequestRaw (risposta da usare cosi' com'e')
function _PerformAjaxRequestEx_(action,options,callback,isRaw)
{
	// controllo sulla conferma di azione
	if (options.Confirm) {
		var confirmText = options.Confirm;
		options.Confirm = null;

		if(!confirm(confirmText))
			return;
	}

	// initial setup
	options.Action=action;
    options.ErrorCode="";
    options.ErrorMessage="";

    // prepara i parametri della richiesta
	var richiesta="action="+action;

	// prendi i parametri della form solo se questa e' stata specificata
    if (options.FormName)
        richiesta+="&"+Form.serialize(options.FormName);

    // se presente aggiungi alla nostra richiesta altri eventuali parametri
    if (options.Parameters) {
        for (var nomeParametro in options.Parameters)
        {
            richiesta+="&" + nomeParametro + "=" + encodeURIComponent(options.Parameters[nomeParametro]);
        }
    }

	// se presente l'oggetto mappa aggiungi le dimensioni
	if (options.MapObject) {
		richiesta+="&w=" + options.MapObject.width;
		richiesta+="&h=" + options.MapObject.height;
	}

	if (!options.onError)
		options.onError = PerformAjaxDefaultErrorHandler;

	var requestOptions=
    {
        method: "post",
        postBody: richiesta,
        onSuccess: function(t)
		{
			if (isRaw) {
                // richiesta di tipo "raw": il server ci manda dei dati che
                // vogliamo interpretare cosi' come sono
                callback(options,t);
            }
            else
            {
                // analizzo il contenuto della risposta e mi comporto di conseguenza
    			// parserizza la risposta JSON
                var o=null;
                if (t.responseText=="")
                {
                    o=new Object();
                    o.status="alert";
                    o.message="XmlHttp.responseText vuoto!"
                }
                else eval("o=(" + t.responseText + ");");

    			if (o.debugMessage!=undefined) alert("DEBUG: *" + o.debugMessage + "*");

				if (o.popupURL) {
					var opt = { resize: 1 };
					Global.openPopup(o.popupURL,opt);
				}

                // gestione standard del dato di ritorno
       			switch(o.status)
       			{
                    case "sessiontimeout":
                        options.ErrorCode="sessiontimeout";
                        options.ErrorMessage="Sessione scaduta!";
                        if (o.redirectURL) {
                            top.location.href=o.redirectURL;
							if(window.opener) window.close();
						}else{
	                        if(options.onError)
								options.onError(options);
						}
                        break;
                        
					case "error":
						if(options.onError) options.onError(options);
                        break;
                        
                    case "internalerror":
                        options.ErrorCode=500;
                        options.ErrorMessage=o.message;
                        if(options.onError) options.onError(options);
						else PerformAjaxDefaultErrorHandler(options);
                        
					case "alert":
						if (o.message) alert(o.message);
                        break;
/*
					case "validationerror":
						var returnAlertString = "";
						for (var i=0; i<o.rules.length; i++)
							returnAlertString += "- " + o.rules[i].message + "\n";
						alert( "Errore Validazione:\n" + returnAlertString );
						break;
*/				
					default:
						try{
							callback(options,t,o);
						}catch(e){
							alert (e.message);
						}
                        break;
                }
            }
            
            if (options.onAfterRequest) options.onAfterRequest(options,t);
            options.Parameters={};
         },

	    on404: function(t)
		{
			options.ErrorCode = parseInt(t.status);
			options.ErrorMessage = "File \"" + options.PageCallback + "\" inesistente";

            if (options.onError) options.onError(options);
            
            // se presente esegui l'azione dopo la richiesta
			if (options.onAfterRequest) options.onAfterRequest(options,t);
			options.Parameters={};
	    },

	    onFailure: function(t)
		{
			var errorMessage = String(t.responseText).stripTags();
			var errorArray = errorMessage.split("|");
			if (errorArray.length == 1)
			{
				options.ErrorMessage = "";
	            options.ErrorCode = parseInt(t.status);
				var errorLines = errorMessage.split("\n");
				for( var i=2; i<errorLines.length; i++)
					options.ErrorMessage += errorLines[i] + "\n";
			}
			else
			{
				options.ErrorCode = "";
				var errorLines = errorArray[0].split("\n");
				for( var i=1; i<errorLines.length; i++)
		            options.ErrorCode = parseInt(errorLines[i]);

				options.ErrorMessage = errorArray[1];
			}

            if (options.onError) options.onError(options);

            // se presente esgui l'azione dopo la richiesta
			if (options.onAfterRequest) options.onAfterRequest(options,t);
			options.Parameters={};
		}

    };

	// se presente esgui l'azione prima della richiesta
    if (options.onBeforeRequest) options.onBeforeRequest(options);
    
    // esegui la richiesta
	new Ajax.Request(options.PageCallback, requestOptions);
}
