﻿// *** Generic Service Proxy class that can be used to 
// *** call JSON Services generically using jQuery
// *** Depends on JSON2 modified for MS Ajax usage
// *** Depends on errorHandling.js for OnServerErrorHandler object
function ServiceProxy(serviceUrl)
{
    var _I = this;
    this.ServiceURL = serviceUrl;
    
    //IF NO ERROR HANDLER IS PROVIDED, USE DEFAULT
    this.OnErrorHandlerDefault = OnServerErrorHandler;
    
    this.OnSuccessHandler = function(data, textStatus, settings)
    {
        if (!settings.success) { return; }

        // *** Use json library so we can fix up MS AJAX dates
        //var result = TryJsonParse(data);
        
        //TODO: figure out to determine if data is already a JSON object
        var result = data;
     
        //WHEN A SUCCESSFUL RESULT HAS AN ERROR THROWN BY SERVICE
        if(result.ErrorId)
        {
            //alert("OnSuccessHandler ERROR:\n" + JSON.stringify(result));
            
            if(settings.error)
            {
                settings.error(result, textStatus);
            }
            else
            {
                _I.OnErrorHandlerDefault(result, textStatus);
            }
                            
            return;            
        }
        
        return settings.success(result, textStatus); 
    }
    
    // *** Call a wrapped object
    this.invoke = function(options) 
    {
        // Default settings
        var settings = 
        {
            bare: false,
            beforeSend: null,
            complete: null,
            contentType: "application/json",
            data: null,
            dataType: "text",
            error: null,
            processData: false,
            serviceMethod: '',
            success: null,
            timeout: 500,
            type: "POST",
            doStringify: true
        };

        if(options) 
        {
            $.extend(settings, options);
        }

        // *** Convert input data into JSON - REQUIRES Json2.js
        var data = (settings.doStringify) ? JSON.stringify(settings.data) : settings.data;

        // *** The service endpoint URL
        var url = _I.ServiceURL + "/" + settings.serviceMethod;

        //alert("ajax url: " + url);
        //alert(data);
        
        $.ajax(
        {
            type: settings.type,
            contentType: settings.contentType,
            url: url,
            data: data,
            dataType: settings.dataType,
            processData: settings.processData,
            timeout: settings.timeout,
            success: function(data, textStatus)
            {
                 _I.OnSuccessHandler(data, textStatus, settings);
            },
            error: function(XMLHttpRequest, textStatus)
            {
                if(settings.error)
                {
                    settings.error(XMLHttpRequest, textStatus);
                }
                else
                {
                    _I.OnErrorHandlerDefault(XMLHttpRequest, textStatus);
                }
            },
            complete: settings.complete,
            beforeSend : settings.beforeSend
        });
    };
    
    // *** Call a wrapped object
    this.invokeP = function(options) 
    {
        // Default settings
        var settings = 
        {
            bare: false,
            beforeSend: null,
            complete: null,
            data: null,
            error: null,
            serviceMethod: '',
            success: null,
            timeout: 10,
            doStringify: true
        };

        if(options) 
        {
            $.extend(settings, options);
        }

        // *** Convert input data into JSON - REQUIRES Json2.js
        var data = (settings.doStringify) ? JSON.stringify(settings.data) : settings.data;

        // *** The service endpoint URL
        var url = _I.ServiceURL + "/" + settings.serviceMethod + "?callbackName=?";

        //alert("jsonp url: " + url);
        
        $.jsonp(
        {
            url: url,
            data: data,
            timeout: settings.timeout,
            success: function(data, textStatus)
            {
                 _I.OnSuccessHandler(data, textStatus, settings);
            },
            error: function(XMLHttpRequest, textStatus)
            {
                if(settings.error)
                {
                    settings.error(XMLHttpRequest, textStatus);
                }
                else
                {
                    _I.OnErrorHandlerDefault(XMLHttpRequest, textStatus);
                }
            },
            complete: settings.complete,
            beforeSend : settings.beforeSend
        });
    };    
}

function TryJsonParse(data)
{
    var results;
    
    try
    {
        results = JSON.parse(data);
    }
    catch(err)
    {
        if(err == 'SyntaxError: JSON.parse')
        {
            results = data;
        }
    }
    
    return results;
}
