
/* --------------------------------------
    Ajax Request
-------------------------------------- */
dbug.enable();
var showDbug = 1;

/* queue ajax */
var requestQueue        = new Request.Queue({ stopOnFailure: false, concurrent: 1 });
var requestQueueMulti   = new Request.Queue({ stopOnFailure: false, concurrent: 9 });

var commonCallAjaxJSONRequestAddQueue = function(myParams, myOptions, concurrentRequest){

        if(showDbug) dbug.log('[commonCallAjaxRequestAddQueue] myParams : %o, myOptions : %o, concurrentRequest : %d', myParams, myOptions, concurrentRequest);

        window['queueReq'+myOptions.get('requestName')] = new Request.JSON({
            url: myOptions.get('url'),
            method: 'post',
            data: myParams.toQueryString(),
            onSuccess: function(responseJSON, responseText) {
                //if(showDbug) dbug.log('[%s] Ajax request success, return : %o', myOptions.get('requestName'), responseJSON);

                if($type(window[myOptions.get('onComplete')]) != 'function')
                {
                    dbug.error('[%s][onComplete] function %s not found !', myOptions.get('requestName'), myOptions.get('onComplete'));
                }
                window[myOptions.get('onComplete')].run([responseJSON,responseText]);
            },
            onFailure: function(xhr) {
                dbug.error('[%s] Ajax request failure !', myOptions.get('requestName'));

                var myError = 'Erreur requete ajax : ' + myOptions.get('requestName');
                alert('Error : '+myError);
                /* TODO : on error */
            }
        });

        /* use common ajax request queue */
        if(concurrentRequest == 0)
        {
            requestQueue.addRequest(myOptions.get('requestName'), window['queueReq'+myOptions.get('requestName')]);
            if(showDbug) dbug.log('[%s] Ajax request queued (one at once)', myOptions.get('requestName'));
        }
        else if(concurrentRequest == 1)
        {
            requestQueueMulti.addRequest(myOptions.get('requestName'), window['queueReq'+myOptions.get('requestName')]);
            if(showDbug) dbug.log('[%s] Ajax request queued (multi)', myOptions.get('requestName'));
        }

        window['queueReq'+myOptions.get('requestName')].send();
};

var commonCallAjaxHTMLRequestAddQueue = function(myParams, myOptions, concurrentRequest){

        if(showDbug) dbug.log('[commonCallAjaxRequestAddQueue] myParams : %o, myOptions : %o, concurrentRequest : %d', myParams, myOptions, concurrentRequest);

        window['queueReq'+myOptions.get('requestName')] = new Request.HTML({
            url: myOptions.get('url'),
            method: 'post',
            data: myParams.toQueryString(),
            evalScripts:false,
            evalResponse:false,
            onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript) {
                //if(showDbug) dbug.log('[%s] Ajax request success, return : %o', myOptions.get('requestName'), responseHTML);

                if($type(window[myOptions.get('onComplete')]) != 'function')
                {
                    dbug.error('[%s][onComplete] function %s not found !', myOptions.get('requestName'), myOptions.get('onComplete'));
                }
                window[myOptions.get('onComplete')].run([responseHTML,responseJavaScript]);
            },
            onFailure: function(xhr) {
                dbug.error('[%s] Ajax request failure !', myOptions.get('requestName'));

                var myError = 'Erreur requete ajax : ' + myOptions.get('requestName');
                alert('Error : '+myError);
                /* TODO : on error */
            }
        });

        /* use common ajax request queue */
        if(concurrentRequest == 0)
        {
            requestQueue.addRequest(myOptions.get('requestName'), window['queueReq'+myOptions.get('requestName')]);
            if(showDbug) dbug.log('[%s] Ajax request queued (one at once)', myOptions.get('requestName'));
        }
        else if(concurrentRequest == 1)
        {
            requestQueueMulti.addRequest(myOptions.get('requestName'), window['queueReq'+myOptions.get('requestName')]);
            if(showDbug) dbug.log('[%s] Ajax request queued (multi)', myOptions.get('requestName'));
        }

        window['queueReq'+myOptions.get('requestName')].send();
};

var commonCallAjaxTextRequestAddQueue = function(myParams, myOptions, concurrentRequest){

        if(showDbug) dbug.log('[commonCallAjaxRequestAddQueue] myParams : %o, myOptions : %o, concurrentRequest : %d', myParams, myOptions, concurrentRequest);

        window['queueReq'+myOptions.get('requestName')] = new Request({
            url: myOptions.get('url'),
            method: 'post',
            data: myParams.toQueryString(),
            onSuccess: function(responseText,responseXML) {
                //if(showDbug) dbug.log('[%s] Ajax request success, return : %o', myOptions.get('requestName'), responseTEXT);

                if($type(window[myOptions.get('onComplete')]) != 'function')
                {
                    dbug.error('[%s][onComplete] function %s not found !', myOptions.get('requestName'), myOptions.get('onComplete'));
                }
                window[myOptions.get('onComplete')].run([responseText]);
            },
            onFailure: function(xhr) {
                dbug.error('[%s] Ajax request failure !', myOptions.get('requestName'));

                var myError = 'Erreur requete ajax : ' + myOptions.get('requestName');
                alert('Error : '+myError);
                /* TODO : on error */
            }
        });

        /* use common ajax request queue */
        if(concurrentRequest == 0)
        {
            requestQueue.addRequest(myOptions.get('requestName'), window['queueReq'+myOptions.get('requestName')]);
            if(showDbug) dbug.log('[%s] Ajax request queued (one at once)', myOptions.get('requestName'));
        }
        else if(concurrentRequest == 1)
        {
            requestQueueMulti.addRequest(myOptions.get('requestName'), window['queueReq'+myOptions.get('requestName')]);
            if(showDbug) dbug.log('[%s] Ajax request queued (multi)', myOptions.get('requestName'));
        }

        window['queueReq'+myOptions.get('requestName')].send();
};

var commonCallAjaxRequest = function(myParams, myOptions){

    var requestName     = 'undefined';
    var requestType     = 'JSON'
    var missingOption   = 0;

    if(showDbug) dbug.log('[commonCallAjaxRequest] params : %o, options : %o', myParams, myOptions);

    if($type(myParams) == 'object')
    {
        /* check mandatory options */
        ['onComplete','url'].each(function(item){
            if(! myOptions.has(item))
            {
                dbug.error('[commonCallAjaxRequest] mandatory option not found : %s', item);
                missingOption++;
            }
        });
    }
    else if($type(myParams) == 'hash')
    {
        if(myOptions.has('requestName') && $type(myOptions.get('requestName')) == 'string') requestName = myOptions.get('requestName');
        else dbug.warn('[commonCallAjaxRequest] option requestName not defined or not a string ! ... set to default value...');

        /* check mandatory options */
        ['onComplete','url','requestName'].each(function(item){
            if(! myOptions.has(item) || $type(myOptions.get(item)) != 'string')
            {
                dbug.error('[commonCallAjaxRequest][%s] mandatory option not found or not a string : %s', requestName, item);
                missingOption++;
            }
        });

        if( myOptions.has('requestType') && myOptions.requestType == 'TEXT' )
        {
            requestType = 'TEXT';
        }
        else if( myOptions.has('requestType') && myOptions.requestType == 'HTML' )
        {
            requestType = 'HTML';
        }
    }
    else
    {
        dbug.error('[commonCallAjaxRequest] myParams (%s) must be an object or a hash !', $type(myParams));
        return false;
    }

    /* allow concurrent request ? */
    var concurrentRequest = 0;
    if(myOptions.has('concurrentRequest')) concurrentRequest = myOptions.get('concurrentRequest');

    if(missingOption == 0)
    {
        var allRequest = new Hash();

        if($type(myParams) == 'object')
        {
            var Options, Params;
            var i = 0;
            $each(myParams, function(value, key){
                Params = value;
                Options = new Hash({
                    'requestName':  key,
                    'url':          myOptions.get('url')[i],
                    'onComplete':   myOptions.get('onComplete')[i]
                });
                if( requestType == 'JSON' )
                {
                    commonCallAjaxJSONRequestAddQueue.run([Params, Options, concurrentRequest]);
                }
                else if( requestType == 'HTML' )
                {
                    commonCallAjaxHTMLRequestAddQueue.run([Params, Options, concurrentRequest]);
                }
                else
                {
                    commonCallAjaxTextRequestAddQueue.run([myParams, myOptions, concurrentRequest]);
                }
                i++;
            });
        }
        else if($type(myParams) == 'hash')
        {
            if( requestType == 'JSON' )
            {
                commonCallAjaxJSONRequestAddQueue.run([myParams, myOptions, concurrentRequest]);
            }
            else if( requestType == 'HTML' )
            {
                commonCallAjaxHTMLRequestAddQueue.run([myParams, myOptions, concurrentRequest]);
            }
            else
            {
                commonCallAjaxTextRequestAddQueue.run([myParams, myOptions, concurrentRequest]);
            }
        }
    }
};
