﻿function serviceProxy(serviceUrl, type)
{
    var _I = this;
    this.serviceUrl = serviceUrl;
    // *** Call a wrapped object
    this.invoke = function (method, data, callback, error, bare)
    {
        // *** Convert input data into JSON - REQUIRES Json2.js
        var json = JSON2.stringify(data);
        // *** The service endpoint URL     
        var url = _I.serviceUrl + '/' + method;
        $.ajax({
            url: url,
            data: json,
            type: type,
            processData: false,
            contentType: "application/json",
            timeout: 100000,
            dataType: "text",  // not "json" we'll parse

            success: function (res)
            {
                if (!callback) return;
                // *** Use json library so we can fix up MS AJAX dates
                var result = JSON2.parse(res);

                // *** Bare message IS result
                if (bare)
                {
                    callback(result);
                    return;
                }

                // *** Wrapped message contains top level object node
                // *** strip it off
                for (var property in result)
                {
                    callback(result[property]);
                    break;
                }
            },
            error: function (xhr)
            {
                if (!error) return;
                if (xhr)
                {
                    if (xhr.responseText)
                    {
                        var err = xhr.statusText;
                        if (err)
                            error(err);
                        else
                            error({ Message: "Unknown server error." })
                    }
                    else
                        error({ Message: "Unknown server error." })
                    return;
                }
                else
                {
                    error({ Message: "Unkown server error." });
                    return;
                }
            }
        });
    }
}
