﻿var serviceID = null;
var serviceURI = "http://service.0377auto.com/AutoService.asmx";
var webService = new Xphter.WebService(serviceURI);
var timeout = 30000;

function getServiceID(onInit, onError, onTimeout, operation) {
  var parameters = [];
  for (var i = getServiceID.length; i < arguments.length; i++) {
    parameters.push(arguments[i]);
  }

  if (serviceID) {
    operation && operation.apply(window, parameters);
    return;
  }

  onInit && onInit.call(window);

  var args = {
    jsonp: "jsonp" + new Date().getTime()
  };
  webService.CrossDomainCall({
    MethodName: "GetServiceID",
    Arguments: args,
    OnComplete: function () {
      var result = window[args.jsonp];
      if (result && result.success && (serviceID = result.returnValue)) {
        operation && operation.apply(window, parameters);
      } else {
        onError && onError.call(window, result && result.message || "Server Not Response");
      }
    },
    OnTimeout: function () {
      onTimeout && onTimeout.call(window);
    },
    Timeout: timeout
  });
}

function executeOperation(name, args, onInit, onComplete, onError, onTimeout, onFinally) {
  function implementation() {
    onInit && onInit.call(window);

    if (args) {
      if (!("jsonp" in args)) {
        args["jsonp"] = "jsonp" + new Date().getTime();
      }
      args["serviceID"] = serviceID;
    } else {
      args = {
        jsonp: "jsonp" + new Date().getTime(),
        serviceID: serviceID
      };
    }
    webService.CrossDomainCall({
      MethodName: name,
      Arguments: args,
      OnComplete: function () {
        var result = window[args.jsonp];
        result && (success = result.success);

        if (result && result.success) {
          onComplete && onComplete.call(window, result);
        } else {
          onError && onError.call(window, result && result.message || "Server Not Response");
        }

        onFinally && onFinally.call(window);
      },
      OnTimeout: function () {
        onTimeout && onTimeout.call(window);
        onFinally && onFinally.call(window);
      },
      Timeout: timeout
    });
  }

  if (serviceID) {
    implementation();
  } else {
    getServiceID(onInit, onError || onFinally ? function (message) {
      onError && onError.call(window, message);
      onFinally && onFinally.call(window);
    } : null, onTimeout || onFinally ? function () {
      onTimeout && onTimeout.call(window);
      onFinally && onFinally.call(window);
    } : null, implementation);
  }
}
